private Object getChildTextValue(final Node node) { for (Node child : asIterable(node.getChildNodes())) { if (XMP.NS_RDF.equals(child.getNamespaceURI()) && "Alt".equals(child.getLocalName())) { for (Node alternative : asIterable(child.getChildNodes())) { if (XMP.NS_RDF.equals(alternative.getNamespaceURI()) && "li".equals(alternative.getLocalName())) { NamedNodeMap attributes = alternative.getAttributes(); Node key = attributes.getNamedItem("xml:lang"); alternatives.put(key == null ? null : key.getTextContent(), getChildTextValue(alternative)); for (Node sequence : asIterable(child.getChildNodes())) { if (XMP.NS_RDF.equals(sequence.getNamespaceURI()) && "li".equals(sequence.getLocalName())) { Object value = getChildTextValue(sequence); seq.add(value); if (isResourceType(node)) { return parseAsResource(node);
String toolkit = getToolkit(document); Node rdfRoot = document.getElementsByTagNameNS(XMP.NS_RDF, "RDF").item(0); NodeList descriptions = document.getElementsByTagNameNS(XMP.NS_RDF, "Description"); return parseDirectories(rdfRoot, descriptions, toolkit);
private RDFDescription parseAsResource(Node node) { // See: http://www.w3.org/TR/REC-rdf-syntax/#section-Syntax-parsetype-resource List<Entry> entries = new ArrayList<Entry>(); for (Node child : asIterable(node.getChildNodes())) { if (child.getNodeType() != Node.ELEMENT_NODE) { continue; } entries.add(new XMPEntry(child.getNamespaceURI() + child.getLocalName(), child.getLocalName(), getChildTextValue(child))); } return new RDFDescription(entries); }
@Test public void testRDFSeq() throws IOException { Directory directory = createReader().read(getResourceAsIIS("/xmp/rdf-seq-example.xml")); assertEquals(1, directory.size()); assertThat(directory.getEntryById("http://purl.org/dc/elements/1.1/subject"), hasValue(Arrays.asList("XMP", "metadata", "ISO standard"))); }
@Override protected XMPReader createReader() { return new XMPReader(); }
private void parseAttributesForKnownElements(Map<String, List<Entry>> subdirs, Node desc) { // NOTE: NamedNodeMap does not have any particular order... NamedNodeMap attributes = desc.getAttributes(); for (Node attr : asIterable(attributes)) { if (!XMP.ELEMENTS.contains(attr.getNamespaceURI())) { continue; } List<Entry> dir = subdirs.get(attr.getNamespaceURI()); if (dir == null) { dir = new ArrayList<Entry>(); subdirs.put(attr.getNamespaceURI(), dir); } dir.add(new XMPEntry(attr.getNamespaceURI() + attr.getLocalName(), attr.getLocalName(), attr.getNodeValue())); } }
NodeList descriptions = document.getElementsByTagNameNS(XMP.NS_RDF, "Description"); return parseDirectories(rdfRoot, descriptions);
@Test public void testRDFBag() throws IOException { Directory directory = createReader().read(getResourceAsIIS("/xmp/rdf-bag-example.xml")); assertEquals(1, directory.size()); assertThat(directory.getEntryById("http://purl.org/dc/elements/1.1/subject"), hasValue(Arrays.asList("XMP", "metadata", "ISO standard"))); // Order does not matter }
private RDFDescription parseAsResource(Node node) { // See: http://www.w3.org/TR/REC-rdf-syntax/#section-Syntax-parsetype-resource List<Entry> entries = new ArrayList<Entry>(); for (Node child : asIterable(node.getChildNodes())) { if (child.getNodeType() != Node.ELEMENT_NODE) { continue; } entries.add(new XMPEntry(child.getNamespaceURI() + child.getLocalName(), child.getLocalName(), getChildTextValue(child))); } return new RDFDescription(entries); }
@Override protected XMPReader createReader() { return new XMPReader(); }
private void parseAttributesForKnownElements(Map<String, List<Entry>> subdirs, Node desc) { // NOTE: NamedNodeMap does not have any particular order... NamedNodeMap attributes = desc.getAttributes(); for (Node attr : asIterable(attributes)) { if (!XMP.ELEMENTS.contains(attr.getNamespaceURI())) { continue; } List<Entry> dir = subdirs.get(attr.getNamespaceURI()); if (dir == null) { dir = new ArrayList<Entry>(); subdirs.put(attr.getNamespaceURI(), dir); } dir.add(new XMPEntry(attr.getNamespaceURI() + attr.getLocalName(), attr.getLocalName(), attr.getNodeValue())); } }
@Test public void testCompoundDirectoryContentDC() throws IOException { Directory directory = createReader().read(getDataAsIIS()); assertThat(directory, instanceOf(CompoundDirectory.class)); CompoundDirectory compound = (CompoundDirectory) directory; // dc|http://purl.org/dc/elements/1.1/ Directory dc = compound.getDirectory(2); assertEquals(2, dc.size()); assertThat(dc.getEntryById("http://purl.org/dc/elements/1.1/description"), hasValue(Collections.singletonMap("x-default", "Picture 71146"))); assertThat(dc.getEntryById("http://purl.org/dc/elements/1.1/format"), hasValue("image/jpeg")); }
private XMPDirectory parseDirectories(final Node pParentNode, NodeList pNodes, String toolkit) { Map<String, List<Entry>> subdirs = new LinkedHashMap<String, List<Entry>>(); for (Node desc : asIterable(pNodes)) { if (desc.getParentNode() != pParentNode) { continue; parseAttributesForKnownElements(subdirs, desc); for (Node node : asIterable(desc.getChildNodes())) { if (node.getNodeType() != Node.ELEMENT_NODE) { continue; if (isResourceType(node)) { value = parseAsResource(node); parseAttributesForKnownElements(subsubdirs, node); value = getChildTextValue(node);
private RDFDescription parseAsResource(Node node) { // See: http://www.w3.org/TR/REC-rdf-syntax/#section-Syntax-parsetype-resource List<Entry> entries = new ArrayList<Entry>(); for (Node child : asIterable(node.getChildNodes())) { if (child.getNodeType() != Node.ELEMENT_NODE) { continue; } entries.add(new XMPEntry(child.getNamespaceURI() + child.getLocalName(), child.getLocalName(), getChildTextValue(child))); } return new RDFDescription(entries); }
String toolkit = getToolkit(document); Node rdfRoot = document.getElementsByTagNameNS(XMP.NS_RDF, "RDF").item(0); NodeList descriptions = document.getElementsByTagNameNS(XMP.NS_RDF, "Description"); return parseDirectories(rdfRoot, descriptions, toolkit);
private void parseAttributesForKnownElements(Map<String, List<Entry>> subdirs, Node desc) { // NOTE: NamedNodeMap does not have any particular order... NamedNodeMap attributes = desc.getAttributes(); for (Node attr : asIterable(attributes)) { if (!XMP.ELEMENTS.contains(attr.getNamespaceURI())) { continue; } List<Entry> dir = subdirs.get(attr.getNamespaceURI()); if (dir == null) { dir = new ArrayList<Entry>(); subdirs.put(attr.getNamespaceURI(), dir); } dir.add(new XMPEntry(attr.getNamespaceURI() + attr.getLocalName(), attr.getLocalName(), attr.getNodeValue())); } }
@Test public void testRDFAttributeSyntaxCompoundDirectoryContentDC() throws IOException { Directory directory = createReader().read(getResourceAsIIS("/xmp/rdf-attribute-shorthand.xml")); assertThat(directory, instanceOf(CompoundDirectory.class)); CompoundDirectory compound = (CompoundDirectory) directory; // dc|http://purl.org/dc/elements/1.1/ Directory dc = getDirectoryByNS(compound, XMP.NS_DC); assertEquals(1, dc.size()); assertThat(dc.getEntryById("http://purl.org/dc/elements/1.1/format"), hasValue("image/jpeg")); }