/**
* 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.content.crosswalk;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.ArrayUtils;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.DSpaceObject;
import org.dspace.content.packager.PackageDisseminator;
import org.dspace.content.packager.PackageException;
import org.dspace.content.packager.PackageParameters;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.core.factory.CoreServiceFactory;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
/**
* METS dissemination crosswalk
* <p>
* Produces a METS manifest for the DSpace item as a metadata
* description -- intended to work within an application like the
* OAI-PMH server.
*
* @author Larry Stone
* @version $Revision$
*/
public class METSDisseminationCrosswalk
implements DisseminationCrosswalk
{
// Plugin Name of METS packager to use for manifest;
// maybe make this configurable.
private static final String METS_PACKAGER_PLUGIN = "METS";
/**
* MODS namespace.
*/
public static final Namespace MODS_NS =
Namespace.getNamespace("mods", "http://www.loc.gov/mods/v3");
private static final Namespace XLINK_NS =
Namespace.getNamespace("xlink", "http://www.w3.org/TR/xlink");
/** METS namespace -- includes "mets" prefix for use in XPaths */
private static final Namespace METS_NS = Namespace
.getNamespace("mets", "http://www.loc.gov/METS/");
private static final Namespace namespaces[] = { METS_NS, MODS_NS, XLINK_NS };
/** URL of METS XML Schema */
private static final String METS_XSD = "http://www.loc.gov/standards/mets/mets.xsd";
private static final String schemaLocation =
METS_NS.getURI()+" "+METS_XSD;
@Override
public Namespace[] getNamespaces()
{
return (Namespace[]) ArrayUtils.clone(namespaces);
}
@Override
public String getSchemaLocation()
{
return schemaLocation;
}
@Override
public List<Element> disseminateList(Context context, DSpaceObject dso)
throws CrosswalkException,
IOException, SQLException, AuthorizeException
{
List<Element> result = new ArrayList<Element>(1);
result.add(disseminateElement(context, dso));
return result;
}
@Override
public Element disseminateElement(Context context, DSpaceObject dso)
throws CrosswalkException,
IOException, SQLException, AuthorizeException
{
if (!canDisseminate(dso))
{
throw new CrosswalkObjectNotSupported("METSDisseminationCrosswalk cannot disseminate a DSpaceObject of type: " + Constants.typeText[dso.getType()]);
}
PackageDisseminator dip = (PackageDisseminator)
CoreServiceFactory.getInstance().getPluginService().getNamedPlugin(PackageDisseminator.class, METS_PACKAGER_PLUGIN);
if (dip == null)
{
throw new CrosswalkInternalException("Cannot find a disseminate plugin for package=" + METS_PACKAGER_PLUGIN);
}
try
{
// Set the manifestOnly=true param so we just get METS document (and not content files, etc)
PackageParameters pparams = new PackageParameters();
pparams.put("manifestOnly", "true");
// Create a temporary file to disseminate into
String tempDirectory = (ConfigurationManager.getProperty("upload.temp.dir") != null)
? ConfigurationManager.getProperty("upload.temp.dir") : System.getProperty("java.io.tmpdir");
File tempFile = File.createTempFile("METSDissemination" + dso.hashCode(), null, new File(tempDirectory));
tempFile.deleteOnExit();
// Disseminate METS to temp file
dip.disseminate(context, dso, pparams, tempFile);
try
{
//Return just the root Element of the METS file
SAXBuilder builder = new SAXBuilder();
Document metsDocument = builder.build(tempFile);
return metsDocument.getRootElement();
}
catch (JDOMException je)
{
throw new MetadataValidationException("Error parsing METS (see wrapped error message for more details) ",je);
}
}
catch (PackageException pe)
{
throw new CrosswalkInternalException("Failed making METS manifest in packager (see wrapped error message for more details) ",pe);
}
}
@Override
public boolean canDisseminate(DSpaceObject dso)
{
//can disseminate most types of DSpaceObjects (Site, Community, Collection, Item)
if(dso.getType()==Constants.SITE ||
dso.getType()==Constants.COMMUNITY ||
dso.getType()==Constants.COLLECTION ||
dso.getType()==Constants.ITEM)
{
return true;
}
else
return false;
}
@Override
public boolean preferList()
{
return false;
}
}