📄 qdccrosswalk.java
字号:
* * dc.coverage.temporal = <dcterms:temporal /> */ private void init() throws CrosswalkException, IOException { if (inited) return; inited = true; myName = getPluginInstanceName(); if (myName == null) throw new CrosswalkInternalException("Cannot determine plugin name, "+ "You must use PluginManager to instantiate QDCCrosswalk so the instance knows its name."); // grovel DSpace configuration for namespaces List nsList = new ArrayList(); Enumeration pe = ConfigurationManager.propertyNames(); String propname = CONFIG_PREFIX + ".namespace."+ myName +"."; while (pe.hasMoreElements()) { String key = (String)pe.nextElement(); if (key.startsWith(propname)) nsList.add(Namespace.getNamespace(key.substring(propname.length()), ConfigurationManager.getProperty(key))); } nsList.add(Namespace.XML_NAMESPACE); namespaces = (Namespace[])nsList.toArray(new Namespace[nsList.size()]); // get XML schemaLocation fragment from config schemaLocation = ConfigurationManager.getProperty(CONFIG_PREFIX + ".schemaLocation."+ myName); // read properties String cmPropName = CONFIG_PREFIX+".properties."+myName; String propsFilename = ConfigurationManager.getProperty(cmPropName); if (propsFilename == null) throw new CrosswalkInternalException("Configuration error: "+ "No properties file configured for QDC crosswalk named \""+myName+"\""); String parent = ConfigurationManager.getProperty("dspace.dir") + File.separator + "config" + File.separator; File propsFile = new File(parent, propsFilename); Properties qdcProps = new Properties(); qdcProps.load(new FileInputStream(propsFile)); // grovel properties to initialize qdc->element and element->qdc maps. // evaluate the XML fragment with a wrapper including namespaces. String postlog = "</wrapper>"; StringBuffer prologb = new StringBuffer("<wrapper"); for (int i = 0; i < namespaces.length; ++i) { prologb.append(" xmlns:"); prologb.append(namespaces[i].getPrefix()); prologb.append("=\""); prologb.append(namespaces[i].getURI()); prologb.append("\""); } prologb.append(">"); String prolog = prologb.toString(); pe = qdcProps.propertyNames(); while (pe.hasMoreElements()) { String qdc = (String)pe.nextElement(); String val = qdcProps.getProperty(qdc); try { Document d = builder.build(new StringReader(prolog+val+postlog)); Element element = (Element)d.getRootElement().getContent(0); qdc2element.put(qdc, element); element2qdc.put(makeQualifiedTagName(element), qdc); log.debug("Building Maps: qdc=\""+qdc+"\", element=\""+element.toString()+"\""); } catch (org.jdom.JDOMException je) { throw new CrosswalkInternalException("Failed parsing XML fragment in properties file: \""+prolog+val+postlog+"\": "+je.toString()); } } } public Namespace[] getNamespaces() { try { init(); } catch (Exception e) { } return namespaces; } public String getSchemaLocation() { try { init(); } catch (Exception e) { } return schemaLocation; } /** * Returns object's metadata in MODS format, as XML structure node. */ public List disseminateList(DSpaceObject dso) throws CrosswalkException, IOException, SQLException, AuthorizeException { if (dso.getType() != Constants.ITEM) throw new CrosswalkObjectNotSupported("QDCCrosswalk can only crosswalk an Item."); Item item = (Item)dso; init(); DCValue[] dc = item.getMetadata(Item.ANY, Item.ANY, Item.ANY, Item.ANY); List result = new ArrayList(dc.length); for (int i = 0; i < dc.length; i++) { // Compose qualified DC name - schema.element[.qualifier] // e.g. "dc.title", "dc.subject.lcc", "lom.Classification.Keyword" String qdc = dc[i].schema+"."+ ((dc[i].qualifier == null) ? dc[i].element : (dc[i].element + "." + dc[i].qualifier)); Element elt = (Element)qdc2element.get(qdc); // only complain about missing elements in the DC schema: if (elt == null) { if (dc[i].schema.equals(MetadataSchema.DC_SCHEMA)) log.warn("WARNING: "+myName+": No QDC mapping for \"" + qdc+"\""); } else { Element qe = (Element)elt.clone(); qe.setText(dc[i].value); if (dc[i].language != null) qe.setAttribute("lang", dc[i].language, Namespace.XML_NAMESPACE); result.add(qe); } } return result; } public Element disseminateElement(DSpaceObject dso) throws CrosswalkException, IOException, SQLException, AuthorizeException { Element root = new Element("qualifieddc", DCTERMS_NS); root.addContent(disseminateList(dso)); return root; } public boolean canDisseminate(DSpaceObject dso) { return true; } public void ingest(Context context, DSpaceObject dso, Element root) throws CrosswalkException, IOException, SQLException, AuthorizeException { init(); // NOTE: don't bother comparing namespace on root element // because DCMI doesn't specify one, and every app uses its // own.. just give up in the face of this madness and accept // anything with the right name. if (!(root.getName().equals("qualifieddc"))) throw new MetadataValidationException("Wrong root element for Qualified DC: "+root.toString()); ingest(context, dso, root.getChildren()); } public void ingest(Context context, DSpaceObject dso, List ml) throws CrosswalkException, IOException, SQLException, AuthorizeException { init(); // for now, forget about any targets but item. if (dso.getType() != Constants.ITEM) throw new CrosswalkInternalException("Wrong target object type, QDCCrosswalk can only crosswalk to an Item."); Item item = (Item)dso; Iterator mi = ml.iterator(); while (mi.hasNext()) { Element me = (Element)mi.next(); String key = makeQualifiedTagName(me); // if the root element gets passed here, recurse: if (me.getName().equals("qualifieddc")) ingest(context, dso, me.getChildren()); else if (element2qdc.containsKey(key)) { String qdc[] = ((String)element2qdc.get(key)).split("\\."); // get language - prefer xml:lang, accept lang. String lang = me.getAttributeValue("lang", Namespace.XML_NAMESPACE); if (lang == null) lang = me.getAttributeValue("lang"); if (qdc.length == 3) item.addMetadata(qdc[0], qdc[1], qdc[2], lang, me.getText()); else if (qdc.length == 2) item.addMetadata(qdc[0], qdc[1], null, lang, me.getText()); else throw new CrosswalkInternalException("Unrecognized format in QDC element identifier for key=\""+key+"\", qdc=\""+(String)element2qdc.get(key)+"\""); } else log.warn("WARNING: "+myName+": No mapping for Element=\"" + key+"\" to qdc."); } } public boolean preferList() { return true; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -