OAI-PMH is an XML based protocol for metadata exchange using HTTP as the transport layer. An OAI-PMH system consists of two parts, a repository on the one and the harvester on the other end. The repository is an HTTP accessible server that exposes metadata to its client, the harvester.
OAI-PMH repositories will be accessed using URLs of the form:
<OAI-PMH server> + <OAI-PMH mount point> + <OAI-PMH Repository>
Step 1: Configure the URL of the OAI-PMH server
The property to configure the OAI-PMH server URL can be found in
Step 2: Configure the OAI-PMH mount point
The property to configure the OAI-PMH mount point can be found in
Step 3: Configure the OAI-PMH default repository
In case the repository is not included in the URL, the OAI-PMH default repository will be selected.
The property to configure the OAI-PMH default repository can be found in
Step 4: Allow access to OAI-PMH mount point
Make sure that the OAI-PMH mount point is accessible. For example, if the OAI-PMH mount point has been set to /oaipmh, the following two lines
<sec:intercept-url pattern="/oaipmh/**" method="GET" access="ROLE_ANONYMOUS"/> <sec:intercept-url pattern="/oaipmh/**" method="POST" access="ROLE_ANONYMOUS"/>
should be present in
Note that the OAI-PMH specification demands both GET and POST requests and that it does not feature any access restrictions. If you need to restrict access to OAI-PMH consider using Spring security or an iptables approach.
Step 5: Optionally configure OAI-PMH sets
The OAI-PMH standard allow you to define sets. This can be used to filter data in your repository.
An OAI-PMH set will be defined by a name, unique setSpec, optional description and a filter.
The filters will be applied to the content of the published xml based elements and may contain one
or more filter criteria. You can also define more than one filter for a specific set.
Generally an OAI-PMH record is in the set if all set filters matches. A filter matches if any of
the filter criteria matches. The filter criteria may be:
Set definition configuration syntax:
set.<set-id>.setSpec = setSpec value set.<set-id>.name = set name value set.<set-id>.description = optional set description set.<set-id>.filter.<filter-id>.flavor = set filter element flavor set.<set-id>.filter.<filter-id>.[<criteria-id>.]<criterion> = set filter criterion value # criteria-id should be set, if you provide more than one criteria for a filter
Example configuration for a set definition with one filter and one criterion:
set.public.setSpec = public set.public.name = Public Recordings set.public.filter.1.flavor = security/xacml+episode set.public.filter.1.contains = >ROLE_ANONYMOUS</
The OAI-PMH records in the set public contain the role ROLE_ANONYMOUS in the published episode ACL.
Example configuration for a set definition with two filters and one or more criteria:
set.openvideo.setSpec = open set.openvideo.name = Recordings with an open non commercial license set.openvideo.filter.1.flavor = security/xacml+episode set.openvideo.filter.1.contains = >ROLE_ANONYMOUS</ set.openvideo.filter.2.flavor = dublincore/episode set.openvideo.filter.2.0.contains = license>CC0</ set.openvideo.filter.2.1.contains = license>CC-BY</ set.openvideo.filter.2.2.contains = license>CC-BY-SA</ set.openvideo.filter.2.3.contains = license>CC-BY-NC</ set.openvideo.filter.2.4.contains = license>CC-BY-NC-SA</
The OAI-PMH records in the set "open" contain the role ROLE_ANONYMOUS in the published episode ACL
and a CC0 or CC-BY derivate license without ND attribute.
You can also define the second filter as one
match criterion like:
set.openvideo.filter.2.match = license>CC[0-](?:BY(?:-(?:(?!ND)[^-<]+))*)?<
match criterion tests are more CPU intensive as