📄 resultmerger.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 + -