/** * 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; import org.apache.log4j.Logger; import org.dspace.importer.external.metadatamapping.contributor.MetadataContributor; import org.dspace.importer.external.metadatamapping.transform.MetadataProcessorService; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Map; /** * Abstract class that implements {@link MetadataFieldMapping} * This class adds a default implementation for the MetadataFieldMapping methods * * @author Roeland Dillen (roeland at atmire dot com) */ public abstract class AbstractMetadataFieldMapping<RecordType> implements MetadataFieldMapping<RecordType, MetadataContributor<RecordType>> { private Map<MetadataFieldConfig, MetadataContributor<RecordType>> metadataFieldMap; /** * log4j logger */ private static Logger log = Logger.getLogger(AbstractMetadataFieldMapping.class); /* A map containing what processing has to be done on a given metadataFieldConfig. * The processing of a value is used to determine the actual value that will be returned used. */ private Map<MetadataFieldConfig, MetadataProcessorService> metadataProcessorMap; /** * Set a map of metadataprocessors. This map is used to process metadata to make it more compliant for certain metadata fields * @param metadataProcessorMap the new map. */ public void setMetadataProcessorMap(Map<MetadataFieldConfig, MetadataProcessorService> metadataProcessorMap) { this.metadataProcessorMap = metadataProcessorMap; } /** * Return the metadataProcessor used to update values to make them more compliant for certain goals * @param metadataField to retrieve processor for * @return metadataProcessor */ public MetadataProcessorService getMetadataProcessor(MetadataFieldConfig metadataField) { if(metadataProcessorMap != null) { return metadataProcessorMap.get(metadataField); }else{ return null; } } /** * @param field MetadataFieldConfig representing what to map the value to * @param value The value to map to a MetadatumDTO * @return A metadatumDTO created from the field and value */ public MetadatumDTO toDCValue(MetadataFieldConfig field, String value) { MetadatumDTO dcValue = new MetadatumDTO(); if (field == null) return null; MetadataProcessorService metadataProcessor = getMetadataProcessor(field); if(metadataProcessor != null) { value = metadataProcessor.processMetadataValue(value); } dcValue.setValue(value); dcValue.setElement(field.getElement()); dcValue.setQualifier(field.getQualifier()); dcValue.setSchema(field.getSchema()); return dcValue; } /** * Retrieve the metadataFieldMap set to this class * @return a map representing the metadataFieldMap */ public Map<MetadataFieldConfig, MetadataContributor<RecordType>> getMetadataFieldMap() { return metadataFieldMap; } /** Defines which metadatum is mapped on which metadatum. Note that while the key must be unique it * only matters here for postprocessing of the value. The mapped MetadatumContributor has full control over * what metadatafield is generated. * @param metadataFieldMap The map containing the link between retrieve metadata and metadata that will be set to the item. */ public void setMetadataFieldMap(Map<MetadataFieldConfig, MetadataContributor<RecordType>> metadataFieldMap) { this.metadataFieldMap = metadataFieldMap; for(MetadataContributor<RecordType> mc:metadataFieldMap.values()){ mc.setMetadataFieldMapping(this); } } /** * Loop over the MetadataContributors and return their concatenated retrieved metadatumDTO objects * @param record Used to retrieve the MetadatumDTO * @return Lit of metadatumDTO */ @Override public Collection<MetadatumDTO> resultToDCValueMapping(RecordType record) { List<MetadatumDTO> values=new LinkedList<MetadatumDTO>(); for(MetadataContributor<RecordType> query:getMetadataFieldMap().values()){ try { values.addAll(query.contributeMetadata(record)); } catch (Exception e) { log.error("Error", e); } } return values; } }