All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.purl.sword.base.DepositResponse Maven / Gradle / Ivy

There is a newer version: 1.8.3
Show newest version
/**
 * Copyright (c) 2009, 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.purl.sword.base;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

import java.util.Properties;
import org.apache.log4j.Logger;

import nu.xom.Builder;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.ParsingException;
import nu.xom.Serializer;

/**
 * Represents a deposit response. This holds the SWORD Entry element. 
 * 
 * @author Stuart Lewis
 * @author Neil Taylor
 *
 */
public class DepositResponse 
{
   /** The entry returned in the response */
   private SWORDEntry entry; 

   /** The HTTP Response code */
   private int httpResponse;
   
   /** The value to set in the Location header (typically the atom edit link) */
   private String location;

   /** Logger */
   private static Logger log = Logger.getLogger(DepositResponse.class);

   /**
    * Create a new response with the specified http code. 
    * 
    * @param httpResponse Response code. 
    */
   public DepositResponse( int httpResponse ) 
   {
      entry = new SWORDEntry();  
      this.httpResponse = httpResponse;
      location = null;
   }

   /**
    * Set the entry element for this response. 
    * 
    * @param entry The SWORD Entry. 
    */
   public void setEntry( SWORDEntry entry )
   {
      this.entry = entry;
   }

   /**
    * Get the SWORD Entry
    *
    * @return The entry
    */
   public SWORDEntry getEntry( )
   {
      return entry;
   }

   /**
    * Get the SWORD Entry as an error document
    *
    * @return The error document
    * @throws SWORDException If this DespositResponse does not contain a
    *                        SWORDErrorDocumentTest. If this is thrown, then
    *                        the document stores an Entry. 
    */
   public SWORDErrorDocument getErrorDocument( )
   throws SWORDException
   {
       if( entry instanceof SWORDErrorDocument)
       {
          return (SWORDErrorDocument)entry;
       }

       throw new SWORDException("Requested document is not an Error Document.");
   }

   /**
    * Retrieve the HTTP Response code. 
    * 
    * @return The response code. 
    */
   public int getHttpResponse() {
      return httpResponse;
   }

   /**
    * Set the HTTP Response code. 
    * 
    * @param httpResponse The code. 
    */
   public void setHttpResponse(int httpResponse) {
      this.httpResponse = httpResponse;
   }

   /**
    * Retrieve the Location header.
    * 
    * @return The Location header
    */
   public String getLocation() {
      return location;
   }

   /**
    * Set the HTTP Location header. 
    * 
    * @param location The Location header. 
    */
   public void setLocation(String location) {
      this.location = location;
   }

   /**
    * Marshall the data in the enclosed SWORD Entry. 
    * 
    * @return The string representation. Null if there was an error. 
    */
   public String marshall( )
   {
      try 
      {
         ByteArrayOutputStream stream = new ByteArrayOutputStream();
         Serializer serializer = new Serializer(stream, "UTF-8");
         serializer.setIndent(3);

         if( entry != null ) 
         {
            Document doc = new Document(entry.marshall());
            serializer.write(doc);  
            log.info(stream.toString());
            return stream.toString();
         }
      }
      catch (IOException ex) 
      {
         log.error(ex.getMessage()); 
      }

      return null;   // default return value. 
   }

   /**
    * Unmarshall the specified XML data into a SWORD Entry. 
    * 
    * @param xml The XML data as a string. 
    * @throws UnmarshallException If there was an error unmarshalling the data. 
    */
   public void unmarshall(String xml) throws UnmarshallException
   {
      unmarshall(xml, null);
   }

   public SwordValidationInfo unmarshall(String xml, Properties validationContext)
   throws UnmarshallException
   {
      try
      {  
         Builder builder = new Builder(); 
         Document doc = builder.build(xml, Namespaces.NS_ATOM);
         Element root = doc.getRootElement(); 

         entry = new SWORDEntry( );
         return entry.unmarshall(root, validationContext);
      }
      catch( ParsingException ex )
      {
         throw new UnmarshallException("Unable to parse the XML", ex );
      }
      catch( IOException ex )
      {
         throw new UnmarshallException("Error acessing the file?", ex);
      }	   
   }

   public void unmarshallErrorDocument(String xml)
   throws UnmarshallException
   {
      unmarshallErrorDocument(xml, null);
   }

   /**
    * Unmarshall the specified XML data into a SWORD error document. 
    * 
    * @param xml The XML data as a string. 
    * @throws UnmarshallException If there was an error unmarshalling the data. 
    */
   public SwordValidationInfo unmarshallErrorDocument(String xml,
                                       Properties validationContext )
   throws UnmarshallException
   {
      try
      {  
         Builder builder = new Builder(); 
         Document doc = builder.build(xml, Namespaces.NS_SWORD);
         Element root = doc.getRootElement(); 

         SWORDErrorDocument sed = new SWORDErrorDocument();
         SwordValidationInfo info = sed.unmarshall(root, validationContext);
         entry = sed;
         return info;
      }
      catch( ParsingException ex )
      {
         throw new UnmarshallException("Unable to parse the XML", ex );
      }
      catch( IOException ex )
      {
         throw new UnmarshallException("Error acessing the file?", ex);
      }	   
   }

   /**
    * Retrieve a string representation of this data. This is equivalent to 
    * calling unmarshall(). 
    * 
    * @return The marshalled data. 
    */
   public String toString() 
   {
      return marshall();
   }  

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy