Skip to content
Snippets Groups Projects
Commit 60f6d7f0 authored by Andreas Romeyke's avatar Andreas Romeyke
Browse files

- added more javadoc comments

- minor, fixed indentation
parent b8a632ce
Branches
Tags
No related merge requests found
package org.slub.rosetta.dps.repository.plugin.storage.nfs;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
......@@ -17,126 +17,171 @@ import com.exlibris.digitool.common.dnx.DnxSection;
import com.exlibris.digitool.common.dnx.DnxSectionRecord;
import com.exlibris.dps.repository.plugin.storage.nfs.NFSStoragePlugin;
import com.exlibris.digitool.common.storage.Fixity;
import com.exlibris.digitool.common.storage.Fixity.FixityAlgorithm;
/**
* SLUBStoragePlugin
* writes all IEs, files and so on into the same dir under yyyy/mm/dd/IEpid/
*
* HINT: this plugin is *only* useful to store AIPs (IEs + files) in
* permanent storage. Otherwise it could not detect the IE-PID and
* will report an error.
*
* the fixities will only be checked if files are stored (storeEntity()),
* because the Rosetta API does not give enough information about available
* fixities by calling retrieveEntity() to read files, because only
* a string containing the path is given.
*
* Please note, that all undocumented codelines are in most cases copied from
* com.exlibris.dps.repository.plugin.storage.nfs.NFSStoragePlugin and I am
* unable to find full documentation.
*
* @author andreas.romeyke@slub-dresden.de (Andreas Romeyke)
* @see com.exlibris.dps.repository.plugin.storage.nfs.NFSStoragePlugin
*/
public class SLUBStoragePlugin extends NFSStoragePlugin {
private static final String DIR_ROOT = "DIR_ROOT";
private static final ExLogger log = ExLogger.getExLogger(SLUBStoragePlugin.class);
public SLUBStoragePlugin() {
super();
log.info("SLUBStoragePlugin instantiated");
private static final String DIR_ROOT = "DIR_ROOT"; /** {@inheritDoc} */
private static final ExLogger log = ExLogger.getExLogger(SLUBStoragePlugin.class);
public SLUBStoragePlugin() {
super();
log.info("SLUBStoragePlugin instantiated");
}
/** retrieves a list of available checksum fixities
* @param storedEntityMetaData storedEntityMetaData
* @return list of available fixities
*/
protected List<Fixity> getAvailableFixities(StoredEntityMetaData storedEntityMetaData) {
List<Fixity> fixities = storedEntityMetaData.getFixities();
for (Iterator<Fixity> iter = fixities.iterator(); iter.hasNext(); ) {
Fixity element = iter.next();
log.info("getAvailableFixities fixity=" + element.toString() );
}
return fixities;
}
/** copied from NFS Storage Plugin, enhanced with debugging info,
* stores InputStream on Storage in given format and does fixity check
* if written sucessfully
* @param is InputStream
* @param storedEntityMetadata storedEntityMetaData
* @return relative path to file
*/
@Override
public String storeEntity(InputStream is, StoredEntityMetaData storedEntityMetadata) throws Exception {
log.info("SLUBStoragePlugin.storeEntity() called");
String fileName = createFileName(storedEntityMetadata);
log.info("SLUBStoragePlugin.storeEntity() fileName="+fileName);
String relativeDirectoryPath = getStreamRelativePath(storedEntityMetadata);
log.info("SLUBStoragePlugin.storeEntity() relativeDirectoryPath="+relativeDirectoryPath);
File destFile = getStreamDirectory(relativeDirectoryPath, fileName);
log.info("SLUBStoragePlugin.storeEntity() destfile.getAbsolutePath()="+destFile.getAbsolutePath());
// debug
// List<Fixity> fixities = getAvailableFixities( storedEntityMetadata );
// better move/link
if (canHandleSourcePath(storedEntityMetadata.getCurrentFilePath())) {
is.close(); // close input stream so that 'move' can work, we don't use it anyway
copyStream(storedEntityMetadata.getCurrentFilePath(), destFile.getAbsolutePath());
}
// default way - copy from input stream
else {
IOUtil.copy(is, new FileOutputStream(destFile));
}
String storedEntityIdentifier = relativeDirectoryPath + File.separator + fileName;
log.info("SLUBStoragePlugin.storeEntity() storedEntityIdentifier="+storedEntityIdentifier);
// check if stored correctly
if(!checkFixity(storedEntityMetadata.getFixities(), storedEntityIdentifier)) {
log.error("error, SLUBStoragePlugin.storeEntity() has written corrupted files (checked via checkFixity()), storedEntityIdentifier="+storedEntityIdentifier);
deleteEntity(storedEntityIdentifier); // delete corrupt files
return null;
}
/** copied from NFS Storage Plugin, enhanced with debugging info */
@Override
public String storeEntity(InputStream is, StoredEntityMetaData storedEntityMetadata) throws Exception {
log.info("SLUBStoragePlugin.storeEntity() called");
String fileName = createFileName(storedEntityMetadata);
log.info("SLUBStoragePlugin.storeEntity() fileName="+fileName);
String relativeDirectoryPath = getStreamRelativePath(storedEntityMetadata);
log.info("SLUBStoragePlugin.storeEntity() relativeDirectoryPath="+relativeDirectoryPath);
File destFile = getStreamDirectory(relativeDirectoryPath, fileName);
log.info("SLUBStoragePlugin.storeEntity() destfile.getAbsolutePath()="+destFile.getAbsolutePath());
// better move/link
if (canHandleSourcePath(storedEntityMetadata.getCurrentFilePath())) {
is.close(); // close input stream so that 'move' can work, we don't use it anyway
copyStream(storedEntityMetadata.getCurrentFilePath(), destFile.getAbsolutePath());
}
// default way - copy from input stream
else {
IOUtil.copy(is, new FileOutputStream(destFile));
}
String storedEntityIdentifier = relativeDirectoryPath + File.separator + fileName;
log.info("SLUBStoragePlugin.storeEntity() storedEntityIdentifier="+storedEntityIdentifier);
if(!checkFixity(storedEntityMetadata.getFixities(), storedEntityIdentifier)) {
deleteEntity(storedEntityIdentifier); // delete corrupt files
return null;
}
// return only relative (not absolute) path
return storedEntityIdentifier;
// return only relative (not absolute) path
return storedEntityIdentifier;
}
/** prepare right path
* path should be of form yyyy/MM/dd/IE-PID/
* we need to findout the associated dnx document (IE),
* get the creation date of the IE/SIP
* and get the IE PID of the associated IE.
* @param storedEntityMetaData StoredEntityMetaData
* @return calculated relative path as String
* returns the path as string
*/
protected String getStreamRelativePath(StoredEntityMetaData storedEntityMetaData ) throws Exception {
log.info("SLUBStoragePlugin AAB");
String relativeDirectoryPath = File.separator;
// get IE PID by calling IE-DNX record and search for ""internalIdentifierType" == "PID"
DnxDocument iedoc = storedEntityMetaData.getIeDnx();
String entitytype = storedEntityMetaData.getEntityType().name();
DnxSection iesec = iedoc.getSectionById("internalIdentifier");
if (null == iesec) {
log.error ("SLUBStoragePlugin.getStreamRelativePath no section in entity of type "+entitytype +" with 'internalIdentfier' in associated iedoc found, do you use plugin for others than permanent data? You should not!");
throw new Exception("error, no section in entity of type "+entitytype +" with 'internalIdentfier' in associated iedoc found, do you use plugin for others than permanent data? You should not!");
}
String iepid = null;
log.info ("SLUBStoragePlugin.getStreamRelativePath iesec="+iesec.toString() );
List<DnxSectionRecord> records = iesec.getRecordList();
for (Iterator<DnxSectionRecord> iter = records.iterator(); iter.hasNext(); ) {
DnxSectionRecord element = iter.next();
if (element.getKeyById("internalIdentifierType").getValue().equals("PID")) {
iepid = element.getKeyById("internalIdentifierValue").getValue(); // found IEPID
break;
}
}
/** prepare right path
* path should be of form yyyy/MM/dd/IE-PID/
* we need to findout the associated dnx document (IE),
* get the creation date of the IE/SIP
* and get the IE PID of the associated IE.
* returns the path as string
*/
protected String getStreamRelativePath(StoredEntityMetaData storedEntityMetaData ) throws Exception {
log.info("SLUBStoragePlugin AAB");
String relativeDirectoryPath = File.separator;
// get IE PID by calling IE-DNX record and search for ""internalIdentifierType" == "PID"
DnxDocument iedoc = storedEntityMetaData.getIeDnx();
String entitytype = storedEntityMetaData.getEntityType().name();
DnxSection iesec = iedoc.getSectionById("internalIdentifier");
if (null == iesec) {
log.error ("SLUBStoragePlugin.getStreamRelativePath no section in entity of type "+entitytype +" with 'internalIdentfier' in associated iedoc found, do you use plugin for others than permanent data? You should not!");
throw new Exception("error, no section in entity of type "+entitytype +" with 'internalIdentfier' in associated iedoc found, do you use plugin for others than permanent data? You should not!");
}
String iepid = null;
log.info ("SLUBStoragePlugin.getStreamRelativePath iesec="+iesec.toString() );
List<DnxSectionRecord> records = iesec.getRecordList();
for (Iterator<DnxSectionRecord> iter = records.iterator(); iter.hasNext(); ) {
DnxSectionRecord element = iter.next();
if (element.getKeyById("internalIdentifierType").getValue().equals("PID")) {
iepid = element.getKeyById("internalIdentifierValue").getValue();
break;
}
}
// raise Exception if iepid is null
if (null == iepid) {
log.error ("SLUBStoragePlugin.getStreamRelativePath iesec="+iesec.toString() );
throw new Exception("error, could not get IEPID for storedEntityMetaData:"+storedEntityMetaData.toString() +" of type " + entitytype);
}
log.info("SLUBStoragePlugin.getStreamRelativePath iepid=" + iepid + " (entitytype="+ entitytype +")");
// get creationDate of "objectCharacteristics"
String datestring = iedoc.getSectionKeyValue("objectCharacteristics", "creationDate");
Calendar date = Calendar.getInstance();
// date ist there stored in format (example): 2014-01-15 14:28:01
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setLenient(false); /* if parse errors, do not guess about */
Date d = sdf.parse(datestring);
date.setTime(d);
log.info("SLUBStoragePlugin.getStreamRelativePath creation Date read=" + datestring + " parsed=" + date.toString());
relativeDirectoryPath = relativeDirectoryPath + new SimpleDateFormat("yyyy").format(d);
relativeDirectoryPath = relativeDirectoryPath + File.separator;
relativeDirectoryPath = relativeDirectoryPath + new SimpleDateFormat("MM").format(d);
relativeDirectoryPath = relativeDirectoryPath + File.separator;
relativeDirectoryPath = relativeDirectoryPath + new SimpleDateFormat("dd").format(d);
relativeDirectoryPath = relativeDirectoryPath + File.separator;
relativeDirectoryPath = relativeDirectoryPath + iepid;
relativeDirectoryPath = relativeDirectoryPath + File.separator;
log.info("SLUBStoragePlugin.getStreamRelativePath relativeDirectoryPath=" + relativeDirectoryPath);
return relativeDirectoryPath;
// raise Exception if IEPID is null
if (null == iepid) {
log.error ("SLUBStoragePlugin.getStreamRelativePath iesec="+iesec.toString() );
throw new Exception("error, could not get IEPID for storedEntityMetaData:"+storedEntityMetaData.toString() +" of type " + entitytype);
}
/** copied from NFS Storage Plugin, enhanced with debugging info */
protected File getStreamDirectory(String path, String fileName) {
File newDir = new File(parameters.get(DIR_ROOT) + File.separator + path);
log.info("SLUBStoragePlugin.getStreamDirectory path=" + path);
log.info("SLUBStoragePlugin.getStreamDirectory fileName=" + fileName);
log.info("SLUBStoragePlugin.getStreamDirectory newDir.getAbsolutePath()=" + newDir.getAbsolutePath());
boolean arecreated = newDir.mkdirs();
log.info("SLUBStoragePlugin.getStreamDirectory newDir.mkdirs(), directories are created:" + arecreated);
return new File(newDir.getAbsolutePath() + File.separator + fileName);
log.info("SLUBStoragePlugin.getStreamRelativePath iepid=" + iepid + " (entitytype="+ entitytype +")");
// get creationDate of "objectCharacteristics"
String datestring = iedoc.getSectionKeyValue("objectCharacteristics", "creationDate");
Calendar date = Calendar.getInstance();
// date ist there stored in format (example): 2014-01-15 14:28:01
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setLenient(false); /* if parse errors, do not guess about */
Date d = sdf.parse(datestring);
date.setTime(d);
log.info("SLUBStoragePlugin.getStreamRelativePath creation Date read=" + datestring + " parsed=" + date.toString());
// now create path in format /yyyy/MM/dd/IEPID/
relativeDirectoryPath = relativeDirectoryPath + new SimpleDateFormat("yyyy").format(d);
relativeDirectoryPath = relativeDirectoryPath + File.separator;
relativeDirectoryPath = relativeDirectoryPath + new SimpleDateFormat("MM").format(d);
relativeDirectoryPath = relativeDirectoryPath + File.separator;
relativeDirectoryPath = relativeDirectoryPath + new SimpleDateFormat("dd").format(d);
relativeDirectoryPath = relativeDirectoryPath + File.separator;
relativeDirectoryPath = relativeDirectoryPath + iepid;
relativeDirectoryPath = relativeDirectoryPath + File.separator;
log.info("SLUBStoragePlugin.getStreamRelativePath relativeDirectoryPath=" + relativeDirectoryPath);
return relativeDirectoryPath;
}
/** copied from NFS Storage Plugin, enhanced with debugging info,
* this combines full file path and creates parent directories if needed {@inheritDoc}
*/
protected File getStreamDirectory(String path, String fileName) {
File newDir = new File(parameters.get(DIR_ROOT) + File.separator + path);
log.info("SLUBStoragePlugin.getStreamDirectory path=" + path);
log.info("SLUBStoragePlugin.getStreamDirectory fileName=" + fileName);
log.info("SLUBStoragePlugin.getStreamDirectory newDir.getAbsolutePath()=" + newDir.getAbsolutePath());
boolean arecreated = newDir.mkdirs();
log.info("SLUBStoragePlugin.getStreamDirectory newDir.mkdirs(), directories are created:" + arecreated);
return new File(newDir.getAbsolutePath() + File.separator + fileName);
}
/** copied from NFS Storage Plugin, enhanced with debugging info, {@inheritDoc} */
private boolean canHandleSourcePath(String srcPath) {
try {
File file = new File(srcPath);
return file.canRead();
}
/** copied from NFS Storage Plugin, enhanced with debugging info */
private boolean canHandleSourcePath(String srcPath) {
try {
File file = new File(srcPath);
return file.canRead();
}
catch (Exception e) {
return false;
}
catch (Exception e) {
return false;
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment