/** * 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.dspace.importer.external.metadatamapping.MetadataFieldConfig; import org.dspace.importer.external.metadatamapping.MetadataFieldMapping; import org.dspace.importer.external.metadatamapping.MetadatumDTO; import java.util.Collection; import java.util.LinkedList; import java.util.List; /** * Wrapper class used to accommodate for the possibility of correlations between multiple MetadatumContributor objects * @author Philip Vissenaekens (philip at atmire dot com) */ public class CombinedMetadatumContributor<T> implements MetadataContributor<T> { private MetadataFieldConfig field; private LinkedList<MetadataContributor> metadatumContributors; private String separator; private MetadataFieldMapping<T,MetadataContributor<T>> metadataFieldMapping; /** * Initialize an empty CombinedMetadatumContributor object */ public CombinedMetadatumContributor() { } /** * * * @param field {@link org.dspace.importer.external.metadatamapping.MetadataFieldConfig} used in mapping * @param metadatumContributors A list of MetadataContributor * @param separator A separator used to differentiate between different values */ public CombinedMetadatumContributor(MetadataFieldConfig field, List<MetadataContributor> metadatumContributors, String separator) { this.field = field; this.metadatumContributors = (LinkedList<MetadataContributor>) metadatumContributors; this.separator = separator; } /** * Set the metadatafieldMapping used in the transforming of a record to actual metadata * * @param metadataFieldMapping the new mapping. */ @Override public void setMetadataFieldMapping(MetadataFieldMapping<T, MetadataContributor<T>> metadataFieldMapping) { this.metadataFieldMapping = metadataFieldMapping; for (MetadataContributor metadatumContributor : metadatumContributors) { metadatumContributor.setMetadataFieldMapping(metadataFieldMapping); } } /** * a separate Metadatum object is created for each index of Metadatum returned from the calls to * MetadatumContributor.contributeMetadata(t) for each MetadatumContributor in the metadatumContributors list. * We assume that each contributor returns the same amount of Metadatum objects * * @param t the object we are trying to translate * @return a collection of metadata composed by each MetadataContributor */ @Override public Collection<MetadatumDTO> contributeMetadata(T t) { List<MetadatumDTO> values=new LinkedList<>(); LinkedList<LinkedList<MetadatumDTO>> metadatumLists = new LinkedList<>(); for (MetadataContributor metadatumContributor : metadatumContributors) { LinkedList<MetadatumDTO> metadatums = (LinkedList<MetadatumDTO>) metadatumContributor.contributeMetadata(t); metadatumLists.add(metadatums); } for (int i = 0; i<metadatumLists.getFirst().size();i++) { StringBuilder value = new StringBuilder(); for (LinkedList<MetadatumDTO> metadatums : metadatumLists) { value.append(metadatums.get(i).getValue()); if (!metadatums.equals(metadatumLists.getLast())) { value.append(separator); } } values.add(metadataFieldMapping.toDCValue(field, value.toString())); } return values; } /** * Return the MetadataFieldConfig used while retrieving MetadatumDTO * * @return MetadataFieldConfig */ public MetadataFieldConfig getField() { return field; } /** * Setting the MetadataFieldConfig * * @param field MetadataFieldConfig used while retrieving MetadatumDTO */ public void setField(MetadataFieldConfig field) { this.field = field; } /** * Return the List of MetadataContributor objects set to this class * * @return metadatumContributors, list of MetadataContributor */ public LinkedList<MetadataContributor> getMetadatumContributors() { return metadatumContributors; } /** * Set the List of MetadataContributor objects set to this class * * @param metadatumContributors A list of MetadatumContributor classes */ public void setMetadatumContributors(LinkedList<MetadataContributor> metadatumContributors) { this.metadatumContributors = metadatumContributors; } /** * Return the separator used to differentiate between distinct values * * @return the separator used to differentiate between distinct values */ public String getSeparator() { return separator; } /** * Set the separator used to differentiate between distinct values * * @param separator * separator used to differentiate between distinct values */ public void setSeparator(String separator) { this.separator = separator; } }