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
46   * series ACLs.
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 }