/* DSpaceATOMEntry.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.DSpaceObject; import org.dspace.content.Item; import org.dspace.core.ConfigurationManager; import org.purl.sword.base.SWORDEntry; import org.purl.sword.base.Deposit; import org.purl.sword.atom.Author; import org.purl.sword.atom.Contributor; import org.purl.sword.atom.Generator; import org.apache.log4j.Logger; /** * Class to represent a DSpace Item as an ATOM Entry. This * handles the objects in a default way, but the intention is * for you to be able to extend the class with your own * representation if necessary. * * @author Richard Jones * */ public abstract class DSpaceATOMEntry { private static Logger log = Logger.getLogger(DSpaceATOMEntry.class); /** the SWORD ATOM entry which this class effectively decorates */ protected SWORDEntry entry; /** the item this ATOM entry represents */ protected Item item = null; /** The bitstream this ATOM entry represents */ protected Bitstream bitstream = null; /** the deposit result */ protected DepositResult result = null; /** sword service implementation */ protected SWORDService swordService; /** the original deposit */ protected Deposit deposit = null; /** * Create a new atom entry object around the given service * * @param service */ protected DSpaceATOMEntry(SWORDService service) { this.swordService = service; } /** * Reset all the internal variables of the class to their original values */ public void reset() { this.entry = new SWORDEntry(); this.item = null; this.bitstream = null; this.result = null; this.deposit = null; } /** * get the sword entry for the given dspace object. In this case, we should be * responding to requests for the media link, so this method will throw an error * unless the dspace object is an instance of the Bitstream * * @param dso * @return * @throws DSpaceSWORDException */ public SWORDEntry getSWORDEntry(DSpaceObject dso) throws DSpaceSWORDException { // reset the object, just in case this.reset(); // NOTE: initially this exists just for the purposes of responding to media-link // requests, so should only ever respond to entries on Bitstreams if (dso instanceof Bitstream) { this.bitstream = (Bitstream) dso; } else { throw new DSpaceSWORDException("Can only recover a sword entry for a bitstream via this method"); } this.constructEntry(); return entry; } /** * Construct the SWORDEntry object which represents the given * item with the given handle. An argument as to whether this * is a NoOp request is required because in that event the * assigned identifier for the item will not be added to the * SWORDEntry as it will be invalid. * * @param result the result of the deposit operation * @param deposit the original deposit request * @return the SWORDEntry for the item */ public SWORDEntry getSWORDEntry(DepositResult result, Deposit deposit) throws DSpaceSWORDException { this.reset(); this.entry = new SWORDEntry(); this.item = result.getItem(); this.bitstream = result.getBitstream(); this.result = result; this.deposit = deposit; this.constructEntry(); return entry; } /** * Construct the entry * * @throws DSpaceSWORDException */ protected void constructEntry() throws DSpaceSWORDException { // set the generator this.addGenerator(); // add the authors to the sword entry this.addAuthors(); // add the category information to the sword entry this.addCategories(); // add a content element to the sword entry this.addContentElement(); // add a packaging element to the sword entry this.addPackagingElement(); // add contributors (authors plus any other bits) to the sword entry this.addContributors(); // add the identifier for the item, if the id is going // to be valid by the end of the request this.addIdentifier(); // add any appropriate links this.addLinks(); // add the publish date this.addPublishDate(); // add the rights information this.addRights(); // add the summary of the item this.addSummary(); // add the title of the item this.addTitle(); // add the date on which the entry was last updated this.addLastUpdatedDate(); // set the treatment this.addTreatment(); } /** * Add deposit treatment text */ protected void addTreatment() { if (result != null) { entry.setTreatment(result.getTreatment()); } } /** * add the generator field content */ protected void addGenerator() { boolean identify = ConfigurationManager.getBooleanProperty("sword.identify-version"); SWORDUrlManager urlManager = swordService.getUrlManager(); String softwareUri = urlManager.getGeneratorUrl(); if (identify) { Generator generator = new Generator(); generator.setUri(softwareUri); generator.setVersion(SWORDProperties.VERSION); entry.setGenerator(generator); } } /** * set the packaging format of the deposit */ protected void addPackagingElement() { if (deposit != null) { entry.setPackaging(deposit.getPackaging()); } } /** * add the author names from the bibliographic metadata. Does * not supply email addresses or URIs, both for privacy, and * because the data is not so readily available in DSpace. * */ protected void addAuthors() { if (deposit != null) { String username = this.deposit.getUsername(); Author author = new Author(); author.setName(username); entry.addAuthors(author); } } /** * Add the list of contributors to the item. This will include * the authors, and any other contributors that are supplied * in the bibliographic metadata * */ protected void addContributors() { if (deposit != null) { String obo = deposit.getOnBehalfOf(); if (obo != null) { Contributor cont = new Contributor(); cont.setName(obo); entry.addContributor(cont); } } } /** * Add all the subject classifications from the bibliographic * metadata. * */ abstract void addCategories() throws DSpaceSWORDException; /** * Set the content type that DSpace received. This is just * "application/zip" in this default implementation. * */ abstract void addContentElement() throws DSpaceSWORDException; /** * 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). */ abstract void addIdentifier() throws DSpaceSWORDException; /** * Add links associated with this item. * */ abstract void addLinks() throws DSpaceSWORDException; /** * Add the date of publication from the bibliographic metadata * */ abstract void addPublishDate() throws DSpaceSWORDException; /** * Add rights information. This attaches an href to the URL * of the item's licence file * */ abstract void addRights() throws DSpaceSWORDException; /** * Add the summary/abstract from the bibliographic metadata * */ abstract void addSummary() throws DSpaceSWORDException; /** * Add the title from the bibliographic metadata * */ abstract void addTitle() throws DSpaceSWORDException; /** * Add the date that this item was last updated * */ abstract void addLastUpdatedDate() throws DSpaceSWORDException; }