/**
* Copyright 2008 The University of North Carolina at Chapel Hill
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package edu.unc.lib.dl.cdr.sword.server.deposit;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.swordapp.server.Deposit;
import org.swordapp.server.DepositReceipt;
import org.swordapp.server.SwordConfiguration;
import org.swordapp.server.SwordError;
import edu.unc.lib.dl.fedora.PID;
import edu.unc.lib.dl.util.ErrorURIRegistry;
import edu.unc.lib.dl.util.MetsHeaderScanner;
import edu.unc.lib.dl.util.PackagingType;
import edu.unc.lib.dl.util.RedisWorkerConstants.DepositField;
import edu.unc.lib.dl.util.RedisWorkerConstants.Priority;
public class CDRMETSDepositHandler extends AbstractDepositHandler {
private static Logger log = Logger.getLogger(CDRMETSDepositHandler.class);
@Override
public DepositReceipt doDeposit(PID destination, Deposit deposit, PackagingType type, Priority priority,
SwordConfiguration config, String depositor, String owner) throws SwordError {
if (log.isDebugEnabled()) {
log.debug("Preparing to perform a CDR METS deposit to " + destination.getPid());
log.debug("Working with temporary file: "+ deposit.getFile().getAbsolutePath());
}
// extract info from METS header
MetsHeaderScanner scanner = new MetsHeaderScanner();
try {
scanner.scan(deposit.getFile(), deposit.getFilename());
} catch (Exception e1) {
throw new SwordError(ErrorURIRegistry.INGEST_EXCEPTION, 400, "Unable to parse your METS file: "+deposit.getFilename(), e1);
}
PID depositPID = scanner.getObjID();
if(depositPID == null) {
UUID depositUUID = UUID.randomUUID();
depositPID = new PID("uuid:"+depositUUID.toString());
}
File dir = makeNewDepositDirectory(depositPID.getUUID());
// drop upload in data directory
try {
File data = new File(dir, "data");
data.mkdir();
FileUtils.moveFile(deposit.getFile(), new File(data, deposit.getFilename()));
} catch (IOException e) {
throw new SwordError(ErrorURIRegistry.INGEST_EXCEPTION, 500, "Unable to create your deposit bag: "+depositPID.getPid(), e);
}
// METS specific fields
Map<String, String> status = new HashMap<String, String>();
status.put(DepositField.metsProfile.name(), scanner.getProfile());
status.put(DepositField.metsType.name(), scanner.getType());
status.put(DepositField.createTime.name(), scanner.getCreateDate());
status.put(DepositField.intSenderDescription.name(), StringUtils.join(scanner.getNames(), ','));
registerDeposit(depositPID, destination, deposit, type, priority, depositor, owner, status);
return buildReceipt(depositPID, config);
}
}