/** * 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.sword2; import org.apache.abdera.i18n.iri.IRI; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.DCValue; import org.dspace.content.Item; import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; import org.apache.log4j.Logger; import org.swordapp.server.DepositReceipt; import org.swordapp.server.SwordError; import org.swordapp.server.SwordServerException; import org.swordapp.server.UriRegistry; import java.sql.SQLException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author Richard Jones * * Class to generate an ATOM Entry document for a DSpace Item */ public class ReceiptGenerator { /** logger */ private static Logger log = Logger.getLogger(ReceiptGenerator.class); protected DepositReceipt createFileReceipt(Context context, DepositResult result, SwordConfigurationDSpace config) throws DSpaceSwordException, SwordError, SwordServerException { SwordUrlManager urlManager = config.getUrlManager(context, config); DepositReceipt receipt = new DepositReceipt(); receipt.setLocation(new IRI(urlManager.getActionableBitstreamUrl(result.getOriginalDeposit()))); receipt.setEmpty(true); return receipt; } protected DepositReceipt createReceipt(Context context, DepositResult result, SwordConfigurationDSpace config) throws DSpaceSwordException, SwordError, SwordServerException { return this.createReceipt(context, result, config, false); } /** * Construct the entry * * @throws DSpaceSwordException */ protected DepositReceipt createReceipt(Context context, DepositResult result, SwordConfigurationDSpace config, boolean mediaResource) throws DSpaceSwordException, SwordError, SwordServerException { SwordUrlManager urlManager = config.getUrlManager(context, config); DepositReceipt receipt = new DepositReceipt(); receipt.setAtomStatementURI(urlManager.getAtomStatementUri(result.getItem())); receipt.setOREStatementURI(urlManager.getOreStatementUri(result.getItem())); receipt.setEditIRI(urlManager.getEditIRI(result.getItem())); receipt.setSplashUri(urlManager.getSplashUrl(result.getItem())); receipt.setSwordEditIRI(urlManager.getEditIRI(result.getItem())); receipt.setTreatment(result.getTreatment()); receipt.setContent(urlManager.getContentUrl(result.getItem()), "application/zip"); receipt.addEditMediaIRI(urlManager.getContentUrl(result.getItem()), "application/zip"); receipt.setMediaFeedIRI(urlManager.getMediaFeedUrl(result.getItem())); receipt.setLastModified(result.getItem().getLastModified()); if (mediaResource) { receipt.setLocation(urlManager.getContentUrl(result.getItem())); } else { receipt.setLocation(urlManager.getEditIRI(result.getItem())); } Bitstream od = result.getOriginalDeposit(); if (od != null) { // note here that we don't provide an actionable url receipt.setOriginalDeposit(urlManager.getActionableBitstreamUrl(od), od.getFormat().getMIMEType()); } Map<String, String> derived = new HashMap<String, String>(); List<Bitstream> drs = result.getDerivedResources(); if (drs != null) { for (Bitstream bs : result.getDerivedResources()) { // here we provide actionable urls for the parts of the resource derived.put(urlManager.getActionableBitstreamUrl(bs), bs.getFormat().getMIMEType()); } } receipt.setDerivedResources(derived); // add the category information to the sword entry this.addCategories(result, receipt); // add the publish date this.addPublishDate(result, receipt); // add the item's metadata SwordEntryDisseminator disseminator = SwordDisseminatorFactory.getEntryInstance(); disseminator.disseminate(context, result.getItem(), receipt); try { StringBuilder rightsString = new StringBuilder(); Bundle[] bundles = result.getItem().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 + " "); } } receipt.getWrappedEntry().setRights(rightsString.toString()); } catch (SQLException e) { throw new DSpaceSwordException(e); } // add the date on which the entry was last updated this.addLastUpdatedDate(result, receipt); // do this from configuration receipt.setPackaging(config.getDisseminatePackaging()); return receipt; } /** * Construct the entry * * @throws DSpaceSwordException */ protected DepositReceipt createReceipt(Context context, Item item, SwordConfigurationDSpace config) throws DSpaceSwordException, SwordError, SwordServerException { SwordUrlManager urlManager = config.getUrlManager(context, config); DepositReceipt receipt = new DepositReceipt(); receipt.setAtomStatementURI(urlManager.getAtomStatementUri(item)); receipt.setOREStatementURI(urlManager.getOreStatementUri(item)); receipt.setEditIRI(urlManager.getEditIRI(item)); receipt.setLocation(urlManager.getEditIRI(item)); receipt.setSplashUri(urlManager.getSplashUrl(item)); receipt.setSwordEditIRI(urlManager.getEditIRI(item)); receipt.setContent(urlManager.getContentUrl(item), "application/zip"); receipt.addEditMediaIRI(urlManager.getContentUrl(item), "application/zip"); receipt.setMediaFeedIRI(urlManager.getMediaFeedUrl(item)); receipt.setLastModified(item.getLastModified()); // add the category information to the sword entry this.addCategories(item, receipt); // add the publish date this.addPublishDate(item, receipt); // add the item's metadata SwordEntryDisseminator disseminator = SwordDisseminatorFactory.getEntryInstance(); disseminator.disseminate(context, item, receipt); try { 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 + " "); } } receipt.getWrappedEntry().setRights(rightsString.toString()); } catch (SQLException e) { throw new DSpaceSwordException(e); } // add the date on which the entry was last updated this.addLastUpdatedDate(item, receipt); // do this from configuration receipt.setPackaging(config.getDisseminatePackaging()); return receipt; } private void addMetadata(DepositResult result, DepositReceipt receipt) { } /** * Add all the subject classifications from the bibliographic * metadata. * */ protected void addCategories(DepositResult result, DepositReceipt receipt) { DCValue[] dcv = result.getItem().getMetadata("dc.subject.*"); if (dcv != null) { for (int i = 0; i < dcv.length; i++) { receipt.getWrappedEntry().addCategory(UriRegistry.DC_NAMESPACE, dcv[i].value, dcv[i].value); } } } protected void addCategories(Item item, DepositReceipt receipt) { DCValue[] dcv = item.getMetadata("dc.subject.*"); if (dcv != null) { for (int i = 0; i < dcv.length; i++) { receipt.getWrappedEntry().addCategory(UriRegistry.DC_NAMESPACE, dcv[i].value, dcv[i].value); } } } /** * Add the date of publication from the bibliographic metadata * */ protected void addPublishDate(DepositResult result, DepositReceipt receipt) { DCValue[] dcv = result.getItem().getMetadata("dc.date.issued"); if (dcv != null && dcv.length == 1) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date published = sdf.parse(dcv[0].value); receipt.getWrappedEntry().setPublished(published); } catch (ParseException e) { // we tried, but never mind return; } } } protected void addPublishDate(Item item, DepositReceipt receipt) { DCValue[] dcv = item.getMetadata("dc.date.issued"); if (dcv != null && dcv.length == 1) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date published = sdf.parse(dcv[0].value); receipt.getWrappedEntry().setPublished(published); } catch (ParseException e) { // we tried, but never mind return; } } } /** * Add the date that this item was last updated * */ protected void addLastUpdatedDate(DepositResult result, DepositReceipt receipt) { String config = ConfigurationManager.getProperty("swordv2-server", "updated.field"); DCValue[] dcv = result.getItem().getMetadata(config); if (dcv != null && dcv.length == 1) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date updated = sdf.parse(dcv[0].value); receipt.getWrappedEntry().setUpdated(updated); } catch (ParseException e) { // we tried, but never mind return; } } } protected void addLastUpdatedDate(Item item, DepositReceipt receipt) { String config = ConfigurationManager.getProperty("swordv2-server", "updated.field"); DCValue[] dcv = item.getMetadata(config); if (dcv != null && dcv.length == 1) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date updated = sdf.parse(dcv[0].value); receipt.getWrappedEntry().setUpdated(updated); } catch (ParseException e) { // we tried, but never mind return; } } } }