/**
* 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.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.swordapp.server.Deposit;
import org.swordapp.server.DepositReceipt;
import org.swordapp.server.SwordConfiguration;
import org.swordapp.server.SwordError;
import org.swordapp.server.UriRegistry;
import edu.unc.lib.dl.acl.util.GroupsThreadStore;
import edu.unc.lib.dl.cdr.sword.server.SwordConfigurationImpl;
import edu.unc.lib.dl.cdr.sword.server.util.DepositReportingUtil;
import edu.unc.lib.dl.fedora.PID;
import edu.unc.lib.dl.util.DepositMethod;
import edu.unc.lib.dl.util.DepositStatusFactory;
import edu.unc.lib.dl.util.PackagingType;
import edu.unc.lib.dl.util.RedisWorkerConstants.DepositAction;
import edu.unc.lib.dl.util.RedisWorkerConstants.DepositField;
import edu.unc.lib.dl.util.RedisWorkerConstants.DepositState;
import edu.unc.lib.dl.util.RedisWorkerConstants.Priority;
public abstract class AbstractDepositHandler implements DepositHandler {
private static final Logger log = LoggerFactory.getLogger(AbstractDepositHandler.class);
@Autowired
protected DepositReportingUtil depositReportingUtil;
@Autowired
private DepositStatusFactory depositStatusFactory;
@Autowired
private File depositsDirectory;
private Collection<String> overridePermissionGroups = null;
public DepositStatusFactory getDepositStatusFactory() {
return depositStatusFactory;
}
public void setDepositStatusFactory(DepositStatusFactory depositStatusFactory) {
this.depositStatusFactory = depositStatusFactory;
}
public Collection<String> getOverridePermissionGroups() {
return overridePermissionGroups;
}
public void setOverridePermissionGroups(
Collection<String> overridePermissionGroups) {
this.overridePermissionGroups = overridePermissionGroups;
}
public File getDepositsDirectory() {
return depositsDirectory;
}
public void setDepositsDirectory(File depositsDirectory) {
this.depositsDirectory = depositsDirectory;
}
public File makeNewDepositDirectory(String uuid) {
File f = new File(getDepositsDirectory(), uuid);
f.mkdir();
return f;
}
public DepositReportingUtil getDepositReportingUtil() {
return depositReportingUtil;
}
public void setDepositReportingUtil(DepositReportingUtil depositReportingUtil) {
this.depositReportingUtil = depositReportingUtil;
}
protected DepositReceipt buildReceipt(PID depositID, SwordConfiguration config) throws SwordError {
DepositReceipt receipt = depositReportingUtil.retrieveDepositReceipt(depositID,
(SwordConfigurationImpl) config);
return receipt;
}
protected void registerDeposit(PID depositPid, PID destination, Deposit deposit,
PackagingType type, Priority priority, String depositor, String owner, Map<String, String> extras)
throws SwordError {
Map<String, String> chkstatus = this.depositStatusFactory.get(depositPid.getUUID());
if(chkstatus != null && !chkstatus.isEmpty()) throw new SwordError(UriRegistry.ERROR_BAD_REQUEST, 400, "Duplicate request, repository already has deposit "+depositPid);
Map<String, String> status = new HashMap<String, String>();
status.putAll(extras);
// generic deposit fields
status.put(DepositField.uuid.name(), depositPid.getUUID());
status.put(DepositField.submitTime.name(), String.valueOf(System.currentTimeMillis()));
status.put(DepositField.fileMimetype.name(), deposit.getMimeType());
status.put(DepositField.depositorName.name(), owner);
status.put(DepositField.depositorEmail.name(), GroupsThreadStore.getEmail());
status.put(DepositField.containerId.name(), destination.getPid());
status.put(DepositField.depositMethod.name(), DepositMethod.SWORD13.getLabel());
status.put(DepositField.packagingType.name(), type.getUri());
status.put(DepositField.depositMd5.name(), deposit.getMd5());
try {
if (deposit.getFilename() != null) {
status.put(DepositField.fileName.name(), URLDecoder.decode(deposit.getFilename(), "UTF-8"));
}
if (deposit.getSlug() != null) {
status.put(DepositField.depositSlug.name(), URLDecoder.decode(deposit.getSlug(), "UTF-8"));
}
} catch (UnsupportedEncodingException e) {
log.warn("Unable to properly decode value to UTF-8", e);
status.put(DepositField.fileName.name(), deposit.getFilename());
status.put(DepositField.depositSlug.name(), deposit.getSlug());
}
if (priority != null) {
status.put(DepositField.priority.name(), priority.name());
}
String permGroups = null;
if (this.getOverridePermissionGroups() != null) {
permGroups = StringUtils.join(this.getOverridePermissionGroups(), ';');
} else {
permGroups = StringUtils.join(GroupsThreadStore.getGroups(), ';');
}
status.put(DepositField.permissionGroups.name(), permGroups);
status.put(DepositField.state.name(), DepositState.unregistered.name());
status.put(DepositField.actionRequest.name(), DepositAction.register.name());
Set<String> nulls = new HashSet<String>();
for(String key : status.keySet()) {
if(status.get(key) == null) nulls.add(key);
}
for(String key : nulls) status.remove(key);
this.depositStatusFactory.save(depositPid.getUUID(), status);
log.info(status.toString());
}
}