/* ItemEntryGenerator.java
*
* Copyright (c) 2007, Aberystwyth University
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* - Neither the name of the Centre for Advanced Software and
* Intelligent Systems (CASIS) nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
package org.dspace.sword;
import org.dspace.content.Bitstream;
import org.dspace.content.BitstreamFormat;
import org.dspace.content.Bundle;
import org.dspace.content.DCDate;
import org.dspace.content.DCValue;
import org.dspace.core.ConfigurationManager;
import org.dspace.handle.HandleManager;
import org.purl.sword.atom.Content;
import org.purl.sword.atom.ContentType;
import org.purl.sword.atom.InvalidMediaTypeException;
import org.purl.sword.atom.Link;
import org.purl.sword.atom.Rights;
import org.purl.sword.atom.Summary;
import org.purl.sword.atom.Title;
import org.apache.log4j.Logger;
import java.sql.SQLException;
/**
* @author Richard Jones
*
* Class to generate an ATOM Entry document for a DSpace Item
*/
public class ItemEntryGenerator extends DSpaceATOMEntry
{
/** logger */
private static Logger log = Logger.getLogger(ItemEntryGenerator.class);
protected ItemEntryGenerator(SWORDService service)
{
super(service);
}
/**
* Add all the subject classifications from the bibliographic
* metadata.
*
*/
protected void addCategories()
{
DCValue[] dcv = item.getMetadata("dc.subject.*");
if (dcv != null)
{
for (int i = 0; i < dcv.length; i++)
{
entry.addCategory(dcv[i].value);
}
}
}
/**
* Set the content type that DSpace received. This is just
* "application/zip" in this default implementation.
*
*/
protected void addContentElement()
throws DSpaceSWORDException
{
// get the things we need out of the service
SWORDUrlManager urlManager = swordService.getUrlManager();
try
{
if (!this.deposit.isNoOp())
{
String handle = "";
if (item.getHandle() != null)
{
handle = item.getHandle();
}
if (handle != null && !"".equals(handle))
{
boolean keepOriginal = ConfigurationManager.getBooleanProperty("sword.keep-original-package");
String swordBundle = ConfigurationManager.getProperty("sword.bundle.name");
if (swordBundle == null || "".equals(swordBundle))
{
swordBundle = "SWORD";
}
// if we keep the original, then expose this as the content element
// otherwise, expose the unpacked version
if (keepOriginal)
{
Content con = new Content();
Bundle[] bundles = item.getBundles(swordBundle);
if (bundles.length > 0)
{
Bitstream[] bss = bundles[0].getBitstreams();
for (int i = 0; i < bss.length; i++)
{
BitstreamFormat bf = bss[i].getFormat();
String format = "application/octet-stream";
if (bf != null)
{
format = bf.getMIMEType();
}
con.setType(format);
// calculate the bitstream link.
String bsLink = urlManager.getBitstreamUrl(bss[i]);
con.setSource(bsLink);
entry.setContent(con);
}
}
}
else
{
// return a link to the DSpace entry page
Content content = new Content();
content.setType("text/html");
content.setSource(HandleManager.getCanonicalForm(handle));
entry.setContent(content);
}
}
}
}
catch (InvalidMediaTypeException e)
{
// do nothing; we'll live without the content type declaration!
}
catch (SQLException e)
{
log.error("caught exception: ", e);
throw new DSpaceSWORDException(e);
}
}
/**
* Add the identifier for the item. If the item object has
* a handle already assigned, this is used, otherwise, the
* passed handle is used. It is set in the form that
* they can be used to access the resource over http (i.e.
* a real URL).
*/
protected void addIdentifier()
{
// it's possible that the item hasn't been assigned a handle yet
if (!this.deposit.isNoOp())
{
String handle = "";
if (item.getHandle() != null)
{
handle = item.getHandle();
}
if (handle != null && !"".equals(handle))
{
entry.setId(HandleManager.getCanonicalForm(handle));
return;
}
}
// if we get this far, then we just use the dspace url as the
// property
String cfg = ConfigurationManager.getProperty("dspace.url");
entry.setId(cfg);
// FIXME: later on we will maybe have a workflow page supplied
// by the sword interface?
}
/**
* Add links associated with this item.
*
*/
protected void addLinks()
throws DSpaceSWORDException
{
SWORDUrlManager urlManager = swordService.getUrlManager();
try
{
// if there is no handle, we can't generate links
String handle = "";
if (item.getHandle() != null)
{
handle = item.getHandle();
}
else
{
return;
}
String base = ConfigurationManager.getProperty("dspace.url");
// link to all the files in the item
Bundle[] bundles = item.getBundles("ORIGINAL");
for (int i = 0; i < bundles.length ; i++)
{
Bitstream[] bss = bundles[i].getBitstreams();
for (int j = 0; j < bss.length; j++)
{
Link link = new Link();
String url = urlManager.getBitstreamUrl(bss[j]);
link.setHref(url);
link.setRel("part");
BitstreamFormat bsf = bss[j].getFormat();
if (bsf != null)
{
link.setType(bsf.getMIMEType());
}
entry.addLink(link);
}
}
// link to the item splash page
Link splash = new Link();
splash.setHref(HandleManager.getCanonicalForm(handle));
splash.setRel("alternate");
splash.setType("text/html");
entry.addLink(splash);
}
catch (SQLException e)
{
throw new DSpaceSWORDException(e);
}
}
/**
* Add the date of publication from the bibliographic metadata
*
*/
protected void addPublishDate()
{
DCValue[] dcv = item.getMetadata("dc.date.issued");
if (dcv != null)
{
if (dcv.length == 1)
{
entry.setPublished(dcv[0].value);
}
}
}
/**
* Add rights information. This attaches an href to the URL
* of the item's licence file
*
*/
protected void addRights()
throws DSpaceSWORDException
{
SWORDUrlManager urlManager = swordService.getUrlManager();
try
{
String handle = this.item.getHandle();
// if there's no handle, we can't give a link
if (handle == null || "".equals(handle))
{
return;
}
String base = ConfigurationManager.getProperty("dspace.url");
// if there's no base URL, we are stuck
if (base == null)
{
return;
}
StringBuilder rightsString = new StringBuilder();
Bundle[] bundles = item.getBundles("LICENSE");
for (int i = 0; i < bundles.length; i++)
{
Bitstream[] bss = bundles[i].getBitstreams();
for (int j = 0; j < bss.length; j++)
{
String url = urlManager.getBitstreamUrl(bss[j]);
rightsString.append(url + " ");
}
}
Rights rights = new Rights();
rights.setContent(rightsString.toString());
rights.setType(ContentType.TEXT);
entry.setRights(rights);
}
catch (SQLException e)
{
throw new DSpaceSWORDException(e);
}
}
/**
* Add the summary/abstract from the bibliographic metadata
*
*/
protected void addSummary()
{
DCValue[] dcv = item.getMetadata("dc.description.abstract");
if (dcv != null)
{
for (int i = 0; i < dcv.length; i++)
{
Summary summary = new Summary();
summary.setContent(dcv[i].value);
summary.setType(ContentType.TEXT);
entry.setSummary(summary);
}
}
}
/**
* Add the title from the bibliographic metadata
*
*/
protected void addTitle()
{
DCValue[] dcv = item.getMetadata("dc.title");
if (dcv != null)
{
for (int i = 0; i < dcv.length; i++)
{
Title title = new Title();
title.setContent(dcv[i].value);
title.setType(ContentType.TEXT);
entry.setTitle(title);
}
}
}
/**
* Add the date that this item was last updated
*
*/
protected void addLastUpdatedDate()
{
String config = ConfigurationManager.getProperty("sword.updated.field");
DCValue[] dcv = item.getMetadata(config);
if (dcv != null)
{
if (dcv.length == 1)
{
DCDate dcd = new DCDate(dcv[0].value);
entry.setUpdated(dcd.toString());
}
}
}
}