/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE file at the root of the source * tree and available online at * * https://github.com/keeps/roda */ package org.roda.core.plugins.plugins.ingest; import java.util.List; import java.util.Optional; import org.roda.core.data.common.RodaConstants; import org.roda.core.data.exceptions.AlreadyExistsException; import org.roda.core.data.exceptions.AuthorizationDeniedException; import org.roda.core.data.exceptions.GenericException; import org.roda.core.data.exceptions.NotFoundException; import org.roda.core.data.exceptions.RequestNotValidException; import org.roda.core.data.v2.ip.AIP; import org.roda.core.data.v2.ip.AIPState; import org.roda.core.data.v2.ip.Permissions; import org.roda.core.data.v2.ip.Representation; import org.roda.core.model.ModelService; import org.roda.core.storage.ContentPayload; import org.roda.core.storage.StringContentPayload; import org.roda.core.storage.fs.FSPathContentPayload; import org.roda_project.commons_ip.model.IPFile; import org.roda_project.commons_ip.model.IPRepresentation; import org.roda_project.commons_ip.model.SIP; import org.roda_project.commons_ip.model.impl.bagit.BagitUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class BagitToAIPPluginUtils { private static final Logger LOGGER = LoggerFactory.getLogger(BagitToAIPPluginUtils.class); private static final String METADATA_TYPE = "key-value"; private static final String METADATA_VERSION = null; private BagitToAIPPluginUtils() { // do nothing } public static AIP bagitToAip(SIP bagit, ModelService model, String metadataFilename, List<String> ingestSIPIds, String ingestJobId, Optional<String> computedParentId, String createdBy) throws RequestNotValidException, NotFoundException, GenericException, AlreadyExistsException, AuthorizationDeniedException { String metadataAsString = BagitUtils .generateMetadataFile(bagit.getDescriptiveMetadata().get(0).getMetadata().getPath()); ContentPayload metadataAsPayload = new StringContentPayload(metadataAsString); AIPState state = AIPState.INGEST_PROCESSING; Permissions permissions = new Permissions(); boolean notify = false; String aipType = RodaConstants.AIP_TYPE_MIXED; AIP aip = model.createAIP(state, computedParentId.orElse(null), aipType, permissions, ingestSIPIds, ingestJobId, notify, createdBy); model.createDescriptiveMetadata(aip.getId(), metadataFilename, metadataAsPayload, METADATA_TYPE, METADATA_VERSION, notify); boolean original = true; String representationType = RodaConstants.REPRESENTATION_TYPE_MIXED; for (IPRepresentation irep : bagit.getRepresentations()) { Representation rep = model.createRepresentation(aip.getId(), irep.getRepresentationID(), original, representationType, notify); for (IPFile bagFile : irep.getData()) { ContentPayload payload = new FSPathContentPayload(bagFile.getPath()); model.createFile(aip.getId(), rep.getId(), bagFile.getRelativeFolders(), bagFile.getFileName(), payload, notify); } } model.notifyAipCreated(aip.getId()); return model.retrieveAIP(aip.getId()); } }