/** * 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.Abdera; import org.apache.abdera.i18n.iri.IRI; import org.apache.abdera.model.Entry; import org.apache.abdera.model.Feed; import org.apache.abdera.model.Link; import org.dspace.content.*; import org.dspace.core.*; import org.swordapp.server.SwordError; import org.swordapp.server.SwordServerException; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; import java.util.Date; import java.util.List; import java.util.Map; public class FeedContentDisseminator extends AbstractSimpleDC implements SwordContentDisseminator { public InputStream disseminate(Context context, Item item) throws DSpaceSwordException, SwordError, SwordServerException { try { Abdera abdera = new Abdera(); Feed feed = abdera.newFeed(); this.addMetadata(feed, item); List<Bundle> bundles = item.getBundles(); for (Bundle bundle : bundles) { if (Constants.CONTENT_BUNDLE_NAME.equals(bundle.getName())) { List<Bitstream> bitstreams = bundle .getBitstreams(); for (Bitstream bitstream : bitstreams) { Entry entry = feed.addEntry(); this.populateEntry(context, entry, bitstream); } } } ByteArrayOutputStream baos = new ByteArrayOutputStream(); feed.writeTo(baos); return new ByteArrayInputStream(baos.toByteArray()); } catch (IOException e) { throw new DSpaceSwordException(e); } } private void addMetadata(Feed feed, Item item) { SimpleDCMetadata md = this.getMetadata(item); /* not necessary ... Map<String, String> dc = md.getDublinCore(); for (String element : dc.keySet()) { String value = dc.get(element); feed.addSimpleExtension(new QName(UriRegistry.DC_NAMESPACE, element), value); } */ Map<String, String> atom = md.getAtom(); for (String element : atom.keySet()) { if ("author".equals(element)) { feed.addAuthor(atom.get(element)); } } // ensure that the feed has one author or more if (feed.getAuthors().size() == 0) { feed.addAuthor(ConfigurationManager.getProperty("dspace.name")); } } private void populateEntry(Context context, Entry entry, Bitstream bitstream) throws DSpaceSwordException { BitstreamFormat format = null; try { format = bitstream.getFormat(context); } catch (SQLException e) { throw new DSpaceSwordException(e); } String contentType = null; if (format != null) { contentType = format.getMIMEType(); } SwordUrlManager urlManager = new SwordUrlManager( new SwordConfigurationDSpace(), context); String bsUrl = urlManager.getBitstreamUrl(bitstream); entry.setId(bsUrl); entry.setTitle(bitstream.getName()); String desc = bitstream.getDescription(); if ("".equals(desc) || desc == null) { desc = bitstream.getName(); } entry.setSummary(desc); entry.setUpdated(new Date()); // required, though content is spurious // add an edit-media link for the bitstream ... Abdera abdera = new Abdera(); Link link = abdera.getFactory().newLink(); link.setHref(urlManager.getActionableBitstreamUrl(bitstream)); link.setMimeType(contentType); link.setRel("edit-media"); entry.addLink(link); // set the content of the bitstream entry.setContent(new IRI(bsUrl), contentType); } public boolean disseminatesContentType(String contentType) throws DSpaceSwordException, SwordError, SwordServerException { return "application/atom+xml".equals(contentType) || "application/atom+xml;type=feed".equals(contentType); } public boolean disseminatesPackage(String contentType) throws DSpaceSwordException, SwordError, SwordServerException { // we're just going to ignore packaging formats here return true; } public void setContentType(String contentType) { // we just return the one format, so ignore this } public void setPackaging(String packaging) { // we just return the one format, so ignore this } public String getContentType() { return "application/atom+xml;type=feed"; } public String getPackaging() { // no packaging return null; } }