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
48 public class MatterhornInlinedMetadataProvider implements MetadataProvider {
49 private static final URL SCHEMA_URL = url("http://www.opencastproject.org/oai/matterhorn-inlined.xsd");
50 private static final URI NAMESPACE_URI = uri("http://www.opencastproject.org/oai/matterhorn-inlined");
51
52 private static final MetadataFormat METADATA_FORMAT = new MetadataFormat() {
53 @Override
54 public String getPrefix() {
55 return "matterhorn-inlined";
56 }
57
58 @Override
59 public URL getSchema() {
60 return SCHEMA_URL;
61 }
62
63 @Override
64 public URI getNamespace() {
65 return NAMESPACE_URI;
66 }
67 };
68
69 private static final Optional<String> NS_URI = Optional.of(NAMESPACE_URI.toString());
70
71 @Override
72 public MetadataFormat getMetadataFormat() {
73 return METADATA_FORMAT;
74 }
75
76 @Override
77 public Element createMetadata(OaiPmhRepository repository, final SearchResultItem item, Optional<String> set) {
78 XmlGen xml = new XmlGen(Optional.<String>empty()) {
79 @Override
80 public Element create() {
81 List<Node> inlinedNodes = Collections.list(parse(Optional.ofNullable(item.getMediaPackageXml())));
82 for (SearchResultElementItem elementItem : item.getElements()) {
83 inlinedNodes.add($e(elementItem.getType(), NS_URI,
84 $a("type", elementItem.getFlavor()),
85 parse(Optional.ofNullable(elementItem.getXml()))));
86 }
87 return $e("inlined", NS_URI, inlinedNodes);
88 }
89
90 private Node parse(Optional<String> xml) {
91 if (xml.isPresent()) {
92 for (final Document d : XmlUtil.parseNs(xml.get()).right()) {
93 return d.getDocumentElement();
94 }
95 }
96 return nodeZero();
97 }
98 };
99 return xml.create();
100 }
101
102 }