/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.importer.external.metadatamapping.contributor;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMText;
import org.apache.axiom.om.xpath.AXIOMXPath;
import org.dspace.importer.external.metadatamapping.MetadataFieldConfig;
import org.dspace.importer.external.metadatamapping.MetadataFieldMapping;
import org.dspace.importer.external.metadatamapping.MetadatumDTO;
import org.jaxen.JaxenException;
import org.springframework.beans.factory.annotation.Required;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* Metadata contributor that takes an axiom OMElement and turns it into a metadatum
* @author Roeland Dillen (roeland at atmire dot com)
*/
public class SimpleXpathMetadatumContributor implements MetadataContributor<OMElement> {
private MetadataFieldConfig field;
/**
* Return prefixToNamespaceMapping
* @return a prefixToNamespaceMapping map
*/
public Map<String, String> getPrefixToNamespaceMapping() {
return prefixToNamespaceMapping;
}
private MetadataFieldMapping<OMElement,MetadataContributor<OMElement>> metadataFieldMapping;
/**
* Return metadataFieldMapping
* @return MetadataFieldMapping
*/
public MetadataFieldMapping<OMElement,MetadataContributor<OMElement>> getMetadataFieldMapping() {
return metadataFieldMapping;
}
/**
* Set the metadataFieldMapping of this SimpleXpathMetadatumContributor
* @param metadataFieldMapping the new mapping.
*/
public void setMetadataFieldMapping(MetadataFieldMapping<OMElement,MetadataContributor<OMElement>> metadataFieldMapping) {
this.metadataFieldMapping = metadataFieldMapping;
}
/**
* Set the prefixToNamespaceMapping for this object,
* @param prefixToNamespaceMapping the new mapping.
*/
@Resource(name="isiFullprefixMapping")
public void setPrefixToNamespaceMapping(Map<String, String> prefixToNamespaceMapping) {
this.prefixToNamespaceMapping = prefixToNamespaceMapping;
}
private Map<String,String> prefixToNamespaceMapping;
/**
* Initialize SimpleXpathMetadatumContributor with a query, prefixToNamespaceMapping and MetadataFieldConfig
* @param query
* query string
* @param prefixToNamespaceMapping
* metadata prefix to namespace mapping
* @param field
* <a href="https://github.com/DSpace/DSpace/tree/master/dspace-api/src/main/java/org/dspace/importer/external#metadata-mapping-">MetadataFieldConfig</a>
*/
public SimpleXpathMetadatumContributor(String query, Map<String, String> prefixToNamespaceMapping, MetadataFieldConfig field) {
this.query = query;
this.prefixToNamespaceMapping = prefixToNamespaceMapping;
this.field = field;
}
/**
* Empty constructor for SimpleXpathMetadatumContributor
*/
public SimpleXpathMetadatumContributor() {
}
private String query;
/**
* Return the MetadataFieldConfig used while retrieving MetadatumDTO
* @return MetadataFieldConfig
*/
public MetadataFieldConfig getField() {
return field;
}
/**
* Setting the MetadataFieldConfig
* @param field MetadataFieldConfig used while retrieving MetadatumDTO
*/
@Required
public void setField(MetadataFieldConfig field) {
this.field = field;
}
/**
* Return query used to create an xpathExpression on, this query is used to
* @return the query this instance is based on
*/
public String getQuery() {
return query;
}
@Required
public void setQuery(String query) {
this.query = query;
}
/**
* Retrieve the metadata associated with the given object.
* Depending on the retrieved node (using the query), different types of values will be added to the MetadatumDTO list
* @param t A class to retrieve metadata from.
* @return a collection of import records. Only the identifier of the found records may be put in the record.
*/
@Override
public Collection<MetadatumDTO> contributeMetadata(OMElement t) {
List<MetadatumDTO> values=new LinkedList<>();
try {
AXIOMXPath xpath=new AXIOMXPath(query);
for(String ns:prefixToNamespaceMapping.keySet()){
xpath.addNamespace(prefixToNamespaceMapping.get(ns),ns);
}
List<Object> nodes=xpath.selectNodes(t);
for(Object el:nodes)
if(el instanceof OMElement)
values.add(metadataFieldMapping.toDCValue(field, ((OMElement) el).getText()));
else if(el instanceof OMAttribute){
values.add(metadataFieldMapping.toDCValue(field, ((OMAttribute) el).getAttributeValue()));
} else if(el instanceof String){
values.add(metadataFieldMapping.toDCValue(field, (String) el));
} else if(el instanceof OMText)
values.add(metadataFieldMapping.toDCValue(field, ((OMText) el).getText()));
else
{
System.err.println("node of type: "+el.getClass());
}
return values;
} catch (JaxenException e) {
System.err.println(query);
throw new RuntimeException(e);
}
}
}