View Javadoc
1   /*
2    * Licensed to The Apereo Foundation under one or more contributor license
3    * agreements. See the NOTICE file distributed with this work for additional
4    * information regarding copyright ownership.
5    *
6    *
7    * The Apereo Foundation licenses this file to you under the Educational
8    * Community License, Version 2.0 (the "License"); you may not use this file
9    * except in compliance with the License. You may obtain a copy of the License
10   * at:
11   *
12   *   http://opensource.org/licenses/ecl2.txt
13   *
14   * Unless required by applicable law or agreed to in writing, software
15   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
17   * License for the specific language governing permissions and limitations under
18   * the License.
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   * The matterhorn-inlined metadata provider provides whole media packages, series and episode DublinCores and series ACLs.
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 }