Package org.dspace.sword

Source Code of org.dspace.sword.ItemEntryGenerator

/* 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());
      }
    }
  }
}
TOP

Related Classes of org.dspace.sword.ItemEntryGenerator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.