⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 resultmerger.java

📁 数字图书馆的互操作接口
💻 JAVA
字号:
package dli2fe.helpers;/** * Title:        Digial Library Interoperable Interface Fudan Edition * Description:  This project contains all the classes required for DLI2FE interface. Developers use these classes to implement the wrapper and client side codes. The basic functions of DLI2FE is as follows: * Search: Search a digital library source site. * Metadata: Fetch metadata for a site. * ResultAccess: Get results for a given query. * DLI2FE uses Dublin Core as the basic attribute model, DAV/DASL as the general XML-based query language and CORBA as distributed object transportation mechanism. * Copyright:    Copyright (c) 2001 * Company:      Fudan University * @author Carl Tao * @version 1.0 */import java.util.*;import dli2fe.DLI2FEException;import dli2fe.sample.MultimediaMeta;import dli2fe.xml.*;import org.w3c.dom.*;import dli2fe.DAV;public class ResultMerger {  Vector results;         // 每个元素都是Vector, 以存储某个属性可能不止一个的返回值                          // 元素缺省按照多媒体的返回结果排序,如果没有,按照元数据库结果排序  XMLObject xmlResults;   // 按照XML组装的结果集  Vector elements;     // 按照DID组织的Hashtable,每个的值指向结果集中相应的结果文档Element  int numDocs;  public ResultMerger(MultimediaMeta container, XMLObject xmlPropList, MMQueryHelper mmqh, MetaQueryHelper mqh) throws DLI2FEException {    elements = new Vector();    Vector attrs = analyzePropList(xmlPropList);    if (mmqh==null && mqh==null)      throw new DLI2FEException(DLI2FEException.ILLEGAL_METHOD_EXC, "Unknown internal error: null result sets");    xmlResults = new XMLObject("<SearchResult xmlns='http://www.cs.fudan.edu.cn/DLI2FE/1.0#' xmlns:" +      MultimediaMeta.shortNamespace + "='" + MultimediaMeta.Namespace + "' xmlns:" + container.getShortMetaNamespace() +      "='" + container.getMetaNamespace() + "'></SearchResult>");    Vector result = new Vector();     // 先以一个Vector(同属性重复)的Vector(一个结果文档的多个属性)的Vector(若干返回文档)保存结果    // 如果多媒体返回结果不为空    if (mmqh != null) {      Vector listDID = mmqh.getListDID();      for (int i=0; i<listDID.size(); i++) {        int did = ((Integer)listDID.elementAt(i)).intValue();        Vector metaRes = null;        if (mqh!=null && (metaRes = mqh.getResultForDID(did)) == null)          continue;        Vector oneDoc = new Vector();        oneDoc.add(new Integer(did));        result.add(oneDoc);        int mmOffset = 0;        for (int j=0; j<attrs.size(); j++) {          if (((String)attrs.elementAt(j)).startsWith(MultimediaMeta.shortNamespace + ":")) {            MMQueryHelper mmqh1 = new MMQueryHelper(container.getMMQueryURL());            mmqh1.getIdmms(did);            Vector mmIdmms = mmqh1.getResults();            oneDoc.add(mmIdmms);            mmOffset = 1;          } else {            int realOffset = j - mmOffset;    // real position in the meta result            if (metaRes == null || metaRes.size()<=realOffset)              throw new DLI2FEException(DLI2FEException.SERVER_ERROR_EXC, "Internal error: no meta result generated");            oneDoc.add(metaRes.elementAt(realOffset));          }        }      }    // 如果未进行多媒体查询    } else {      Iterator it = mqh.getResultDIDSet().iterator();      while (it.hasNext()) {        int did = ((Integer)it.next()).intValue();        Vector metaRes = mqh.getResultForDID(did);        Vector oneDoc = new Vector();        oneDoc.add(new Integer(did));        result.add(oneDoc);        int mmOffset = 0;        for (int j=0; j<attrs.size(); j++) {          if (((String)attrs.elementAt(j)).startsWith(MultimediaMeta.shortNamespace + ":")) {            MMQueryHelper mmqh1 = new MMQueryHelper(container.getMMQueryURL());            mmqh1.getIdmms(did);            Vector mmIdmms = mmqh1.getResults();            oneDoc.add(mmIdmms);            mmOffset = 1;          } else {            int realOffset = j - mmOffset;    // real position in the meta result            if (metaRes == null || metaRes.size()<=realOffset)              throw new DLI2FEException(DLI2FEException.SERVER_ERROR_EXC, "Internal error: no meta result generated");            oneDoc.add(metaRes.elementAt(realOffset));          }        }      }    }    buildXMLResult(container, attrs, result);  }  public XMLObject getXMLResult() {    return xmlResults;  }  public Vector getElementsTable() {    return elements;  }  public int getNumDocs() {    return numDocs;  }  Vector analyzePropList(XMLObject propList) {    NodeList nodes = propList.getElement().getElementsByTagName("*");    Vector attrs = new Vector();    for (int i = 0; i < nodes.getLength(); i++) {      if ("prop".equals(nodes.item(i).getLocalName()))        attrs.add(nodes.item(i).getFirstChild().getNodeName());      else        attrs.add(nodes.item(i).getNodeName());    }    return attrs;  }  void buildXMLResult(MultimediaMeta container, Vector vecProp, Vector vecResult) {    Document doc = xmlResults.getDocument();    Element searchResult = xmlResults.getElement();    numDocs = vecResult.size();    for (int i=0; i<vecResult.size(); i++) {      Vector vecOneDoc = (Vector)vecResult.elementAt(i);      Element oneDoc = doc.createElement("doc");      searchResult.appendChild(oneDoc);      oneDoc.appendChild(DOMUtil.createTextNode(doc, DAV.Namespace, "DID", ((Integer)vecOneDoc.elementAt(0)).toString()));      elements.add(oneDoc);      Element propList = doc.createElement("propList");      oneDoc.appendChild(propList);      for (int j=1; j<vecOneDoc.size(); j++) {        Vector values = (Vector)vecOneDoc.elementAt(j);        String namespace = null;        String attrName = (String)vecProp.elementAt(j-1);        if (attrName.startsWith(container.shortNamespace + ":"))          namespace = container.Namespace;        else          namespace = container.getMetaNamespace();        for (int k=0; k<values.size(); k++) {          propList.appendChild(DOMUtil.createTextNode(doc, namespace, attrName, (String)values.elementAt(k)));        }      }    }  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -