/** * 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.versioning; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.*; import org.dspace.content.service.BitstreamService; import org.dspace.content.service.BundleService; import org.dspace.content.service.ItemService; import org.dspace.core.Context; import org.dspace.storage.bitstore.service.BitstreamStorageService; import org.springframework.beans.factory.annotation.Autowired; import java.io.IOException; import java.sql.SQLException; import java.util.List; import java.util.Set; import org.dspace.authorize.ResourcePolicy; /** * * * @author Fabio Bolognesi (fabio at atmire dot com) * @author Mark Diggory (markd at atmire dot com) * @author Ben Bosman (ben at atmire dot com) */ public abstract class AbstractVersionProvider { private Set<String> ignoredMetadataFields; @Autowired(required = true) protected AuthorizeService authorizeService; @Autowired(required = true) protected BitstreamService bitstreamService; @Autowired(required = true) protected BitstreamStorageService bitstreamStorageService; @Autowired(required = true) protected BundleService bundleService; @Autowired(required = true) protected ItemService itemService; protected void copyMetadata(Context context, Item itemNew, Item nativeItem) throws SQLException { List<MetadataValue> md = itemService.getMetadata(nativeItem, Item.ANY, Item.ANY, Item.ANY, Item.ANY); for (MetadataValue aMd : md) { MetadataField metadataField = aMd.getMetadataField(); MetadataSchema metadataSchema = metadataField.getMetadataSchema(); String unqualifiedMetadataField = metadataSchema.getName() + "." + metadataField.getElement(); if(getIgnoredMetadataFields().contains(metadataField.toString('.')) || getIgnoredMetadataFields().contains(unqualifiedMetadataField + "." + Item.ANY)) { //Skip this metadata field continue; } itemService.addMetadata(context, itemNew, metadataField, aMd.getLanguage(), aMd.getValue(), aMd.getAuthority(), aMd.getConfidence()); } } protected void createBundlesAndAddBitstreams(Context c, Item itemNew, Item nativeItem) throws SQLException, AuthorizeException, IOException { for(Bundle nativeBundle : nativeItem.getBundles()) { Bundle bundleNew = bundleService.create(c, itemNew, nativeBundle.getName()); // DSpace knows several types of resource policies (see the class // org.dspace.authorize.ResourcePolicy): Submission, Workflow, Custom // and inherited. Submission, Workflow and Inherited policies will be // set automatically as neccessary. We need to copy the custom policies // only to preserve customly set policies and embargos (which are // realized by custom policies with a start date). List<ResourcePolicy> bundlePolicies = authorizeService.findPoliciesByDSOAndType(c, nativeBundle, ResourcePolicy.TYPE_CUSTOM); authorizeService.addPolicies(c, bundlePolicies, bundleNew); for(Bitstream nativeBitstream : nativeBundle.getBitstreams()) { Bitstream bitstreamNew = createBitstream(c, nativeBitstream); bundleService.addBitstream(c, bundleNew, bitstreamNew); // NOTE: bundle.addBitstream() causes Bundle policies to be inherited by default. // So, we need to REMOVE any inherited TYPE_CUSTOM policies before copying over the correct ones. authorizeService.removeAllPoliciesByDSOAndType(c, bitstreamNew, ResourcePolicy.TYPE_CUSTOM); // Now, we need to copy the TYPE_CUSTOM resource policies from old bitstream // to the new bitstream, like we did above for bundles List<ResourcePolicy> bitstreamPolicies = authorizeService.findPoliciesByDSOAndType(c, nativeBitstream, ResourcePolicy.TYPE_CUSTOM); authorizeService.addPolicies(c, bitstreamPolicies, bitstreamNew); if(nativeBundle.getPrimaryBitstream() != null && nativeBundle.getPrimaryBitstream().equals(nativeBitstream)) { bundleNew.setPrimaryBitstreamID(bitstreamNew); } bitstreamService.update(c, bitstreamNew); } } } protected Bitstream createBitstream(Context context, Bitstream nativeBitstream) throws AuthorizeException, SQLException, IOException { Bitstream newBitstream = bitstreamStorageService.clone(context, nativeBitstream); List<MetadataValue> bitstreamMeta = bitstreamService.getMetadata(nativeBitstream, Item.ANY, Item.ANY, Item.ANY, Item.ANY); for (MetadataValue value : bitstreamMeta) { bitstreamService.addMetadata(context, newBitstream, value.getMetadataField(), value.getLanguage(), value.getValue(), value.getAuthority(), value.getConfidence()); } return newBitstream; } public void setIgnoredMetadataFields(Set<String> ignoredMetadataFields) { this.ignoredMetadataFields = ignoredMetadataFields; } public Set getIgnoredMetadataFields() { return ignoredMetadataFields; } }