1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.opencastproject.oaipmh.matterhorn;
22
23 import static org.opencastproject.util.UrlSupport.uri;
24 import static org.opencastproject.util.UrlSupport.url;
25
26 import org.opencastproject.oaipmh.persistence.SearchResultElementItem;
27 import org.opencastproject.oaipmh.persistence.SearchResultItem;
28 import org.opencastproject.oaipmh.server.MetadataFormat;
29 import org.opencastproject.oaipmh.server.MetadataProvider;
30 import org.opencastproject.oaipmh.server.OaiPmhRepository;
31 import org.opencastproject.oaipmh.util.XmlGen;
32 import org.opencastproject.util.XmlUtil;
33 import org.opencastproject.util.data.Collections;
34
35 import org.w3c.dom.Document;
36 import org.w3c.dom.Element;
37 import org.w3c.dom.Node;
38
39 import java.net.URI;
40 import java.net.URL;
41 import java.util.List;
42 import java.util.Optional;
43
44
45
46
47 public class MatterhornInlinedMetadataProvider implements MetadataProvider {
48 private static final URL SCHEMA_URL = url("http://www.opencastproject.org/oai/matterhorn-inlined.xsd");
49 private static final URI NAMESPACE_URI = uri("http://www.opencastproject.org/oai/matterhorn-inlined");
50
51 private static final MetadataFormat METADATA_FORMAT = new MetadataFormat() {
52 @Override
53 public String getPrefix() {
54 return "matterhorn-inlined";
55 }
56
57 @Override
58 public URL getSchema() {
59 return SCHEMA_URL;
60 }
61
62 @Override
63 public URI getNamespace() {
64 return NAMESPACE_URI;
65 }
66 };
67
68 private static final Optional<String> NS_URI = Optional.of(NAMESPACE_URI.toString());
69
70 @Override
71 public MetadataFormat getMetadataFormat() {
72 return METADATA_FORMAT;
73 }
74
75 @Override
76 public Element createMetadata(OaiPmhRepository repository, final SearchResultItem item, Optional<String> set) {
77 XmlGen xml = new XmlGen(Optional.<String>empty()) {
78 @Override
79 public Element create() {
80 List<Node> inlinedNodes = Collections.list(parse(Optional.ofNullable(item.getMediaPackageXml())));
81 for (SearchResultElementItem elementItem : item.getElements()) {
82 inlinedNodes.add($e(elementItem.getType(), NS_URI,
83 $a("type", elementItem.getFlavor()),
84 parse(Optional.ofNullable(elementItem.getXml()))));
85 }
86 return $e("inlined", NS_URI, inlinedNodes);
87 }
88
89 private Node parse(Optional<String> xml) {
90 if (xml.isPresent()) {
91 for (final Document d : XmlUtil.parseNs(xml.get()).right()) {
92 return d.getDocumentElement();
93 }
94 }
95 return nodeZero();
96 }
97 };
98 return xml.create();
99 }
100
101 }