Package org.purl.sword.atom

Source Code of org.purl.sword.atom.Link

/**
* Copyright (c) 2008-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.atom;

import java.util.ArrayList;
import java.util.Properties;
import nu.xom.Attribute;
import nu.xom.Element;

import org.apache.log4j.Logger;
import org.purl.sword.base.Namespaces;
import org.purl.sword.base.SwordElementInterface;
import org.purl.sword.base.SwordValidationInfo;
import org.purl.sword.base.SwordValidationInfoType;
import org.purl.sword.base.UnmarshallException;
import org.purl.sword.base.XmlElement;
import org.purl.sword.base.XmlName;

/**
* Represents an ATOM Link element.
*
* @author Neil Taylor
*/
public class Link extends XmlElement implements SwordElementInterface
{
  /**
   * Label for the href attribute.
   */
  public static final String ATTRIBUTE_HREF = "href";

  /**
   * Label for the rel attribute.
   */
  public static final String ATTRIBUTE_REL = "rel";

  /**
   * Label for the type attribute.
   */
  public static final String ATTRIBUTE_TYPE = "type";

  /**
   * Label for the hreflang attribute.
   */
  public static final String ATTRIBUTE_HREF_LANG = "hreflang";

  /**
   * Label for the title attribute.
   */
  public static final String ATTRIBUTE_TITLE = "title";

    /**
     * Label for the length attribute.
     */
    public static final String ATTRIBUTE_LENGTH = "length";
 
   /**
  * Local name for the element.
  */
   @Deprecated
   public static final String ELEMENT_NAME = "link";
  
   /**
    * Stores the href.
    */
   private String href;

   /**
    * Stores the Rel attribute.
    */
   private String rel;

   /**
    * Stores the type.
    */
   private String type;

   /**
    * Stores the HREF lang.
    */
   private String hreflang;

   /**
    * Stores the title.
    */
   private String title;

   /**
    * Stores the length.
    */
   private String length;

   /**
    * Stores the content.
    */
   private String content;

   /**
    * The logger.
    */
   private static Logger log = Logger.getLogger(Link.class);

   private static final XmlName XML_NAME = new XmlName(
           Namespaces.PREFIX_ATOM, "link", Namespaces.NS_ATOM);

   /**
    * Create a new instance and set prefix and local name to 'atom' and 'link',
    * respectively.
    */
   public Link()
   {
      super(XML_NAME);
   }

   public static XmlName elementName()
   {
       return XML_NAME;
   }

   /**
    * Mashall the data stored in this object into Element objects.
    *
    * @return An element that holds the data associated with this object.
    */
   public Element marshall()
   {
      Element element = new Element(getQualifiedName(), xmlName.getNamespace());

      if( content != null )
      {
         element.appendChild(content);
      }

      if( href != null )
      {
         Attribute hrefAttribute = new Attribute(ATTRIBUTE_HREF, href);
         element.addAttribute(hrefAttribute);
      }

      if( rel != null )
      {
         Attribute relAttribute = new Attribute(ATTRIBUTE_REL, rel);
         element.addAttribute(relAttribute);
      }

      if( type != null )
      {
         Attribute typeAttribute = new Attribute(ATTRIBUTE_TYPE, type);
         element.addAttribute(typeAttribute);
      }

      if( hreflang != null )
      {
         Attribute hreflangAttribute = new Attribute(ATTRIBUTE_HREF_LANG, hreflang);
         element.addAttribute(hreflangAttribute);
      }

      if( title != null )
      {
         Attribute titleAttribute = new Attribute(ATTRIBUTE_TITLE, title);
         element.addAttribute(titleAttribute);
      }

      if( length != null )
      {
         Attribute lengthAttribute = new Attribute(ATTRIBUTE_LENGTH, length);
         element.addAttribute(lengthAttribute);
      }

      return element;
   }

   /**
    * Unmarshall the contents of the Link element into the internal data objects
    * in this object.
    *
    * @param link The Link element to process.
    *
    * @throws UnmarshallException If the element does not contain an ATOM link
    *         element, or if there is a problem processing the element or any
    *         subelements.
    */
   public void unmarshall(Element link)
   throws UnmarshallException
   {
      unmarshall(link, null);
   }

  
   public SwordValidationInfo unmarshall(Element link, Properties validationProperties)
   throws UnmarshallException
   {
      if( ! isInstanceOf(link, xmlName) )
      {
         return handleIncorrectElement(link, validationProperties);
      }

      ArrayList<SwordValidationInfo> validationItems = new ArrayList<SwordValidationInfo>();
      ArrayList<SwordValidationInfo> attributeItems = new ArrayList<SwordValidationInfo>();

      try
      {
         // get the attributes
         int attributeCount = link.getAttributeCount();
         Attribute attribute = null;
         for( int i = 0; i < attributeCount; i++ )
         {
            attribute = link.getAttribute(i);
            if( ATTRIBUTE_HREF.equals(attribute.getQualifiedName()))
            {
               href = attribute.getValue();
               if( validationProperties != null)
               {
                   attributeItems.add(createValidAttributeInfo(ATTRIBUTE_HREF, href));
               }
            }
            else if( ATTRIBUTE_REL.equals(attribute.getQualifiedName()))
            {
               rel = attribute.getValue();
               if( validationProperties != null)
               {
                   attributeItems.add(createValidAttributeInfo(ATTRIBUTE_REL, rel));
               }
            }
            else if( ATTRIBUTE_TYPE.equals(attribute.getQualifiedName()))
            {
               type = attribute.getValue();
               if( validationProperties != null)
               {
                   attributeItems.add(createValidAttributeInfo(ATTRIBUTE_TYPE, type));
               }
            }
            else if( ATTRIBUTE_HREF_LANG.equals(attribute.getQualifiedName()))
            {
               hreflang = attribute.getValue();
               if( validationProperties != null)
               {
                   attributeItems.add(createValidAttributeInfo(ATTRIBUTE_HREF_LANG, hreflang));
               }
            }
            else if( ATTRIBUTE_TITLE.equals(attribute.getQualifiedName()))
            {
               title = attribute.getValue();
               if( validationProperties != null)
               {
                   attributeItems.add(createValidAttributeInfo(ATTRIBUTE_TITLE, title));
               }
            }
            else if( ATTRIBUTE_LENGTH.equals(attribute.getQualifiedName()))
            {
               length = attribute.getValue();
               if( validationProperties != null)
               {
                   attributeItems.add(createValidAttributeInfo(ATTRIBUTE_LENGTH, length));
               }
            }
            else
            {
               XmlName attributeName = new XmlName(attribute);

               SwordValidationInfo unknown = new SwordValidationInfo(xmlName,
                       attributeName,
                       SwordValidationInfo.UNKNOWN_ATTRIBUTE,
                       SwordValidationInfoType.INFO);
               unknown.setContentDescription(attribute.getValue());
               attributeItems.add(unknown);
            }
         }

         if( link.getChildCount() > 0 )
         {
             SwordValidationInfo content = new SwordValidationInfo(xmlName,
                     "This element has content, but it is not used by SWORD",
                     SwordValidationInfoType.INFO);
             validationItems.add(content);
         }

      }
      catch( Exception ex )
      {
         log.error("Unable to parse an element in Link: " + ex.getMessage());
         throw new UnmarshallException("Unable to parse element in link", ex);
      }

      SwordValidationInfo result = null;
      if( validationProperties != null )
      {
          result = validate(validationItems, attributeItems, validationProperties);
      }
      return result;
   }

   public SwordValidationInfo validate(Properties validationContext)
   {
      return validate(null, null, validationContext);
   }

   public SwordValidationInfo validate(ArrayList<SwordValidationInfo> elements,
           ArrayList<SwordValidationInfo> attributes,
           Properties validationContext)
   {
       boolean validateAll = (elements == null);

       SwordValidationInfo result = new SwordValidationInfo(xmlName);

       if( href == null )
       {
          XmlName attributeName = new XmlName(xmlName.getPrefix(),
                       ATTRIBUTE_HREF,
                       xmlName.getNamespace());

          SwordValidationInfo item = new SwordValidationInfo(xmlName, attributeName,
                  SwordValidationInfo.MISSING_ATTRIBUTE_WARNING,
                  SwordValidationInfoType.ERROR);
          result.addAttributeValidationInfo(item);
       }

       if( validateAll )
       {
          if( href != null )
          {
              result.addAttributeValidationInfo(createValidAttributeInfo(ATTRIBUTE_HREF, href));
          }

          if( rel != null )
          {
              result.addAttributeValidationInfo(createValidAttributeInfo(ATTRIBUTE_REL, rel));
          }

          if( type != null )
          {
              result.addAttributeValidationInfo(createValidAttributeInfo(ATTRIBUTE_TYPE, type));
          }

          if( hreflang != null )
          {
              result.addAttributeValidationInfo(createValidAttributeInfo(ATTRIBUTE_HREF_LANG, hreflang));
          }

          if( title != null )
          {
              result.addAttributeValidationInfo(createValidAttributeInfo(ATTRIBUTE_TITLE, title));
          }

          if( length != null )
          {
              result.addAttributeValidationInfo(createValidAttributeInfo(ATTRIBUTE_LENGTH, length));
          }
         
       }

       result.addUnmarshallValidationInfo(elements, attributes);
       return result;
   }

   /**
    * Get the HREF attribute.
    *
    * @return The HREF.
    */
   public String getHref() {
      return href;
   }

   /**
    * Set the HREF attribute.
    *
    * @param href The href.
    */
   public void setHref(String href) {
      this.href = href;
   }

   /**
    * Get the Rel attribute.
    *
    * @return The Rel.
    */
   public String getRel() {
      return rel;
   }

   /**
    * Set the Rel attribute.
    *
    * @param rel The Rel.
    */
   public void setRel(String rel) {
      this.rel = rel;
   }

   /**
    * Get the type.
    *
    * @return The type.
    */
   public String getType() {
      return type;
   }

   /**
    * Set the type.
    * @param type The type.
    */
   public void setType(String type) {
      this.type = type;
   }

   /**
    * Get the HREF Lang attribute.
    *
    * @return The HREF Lang.
    */
   public String getHreflang() {
      return hreflang;
   }

   /**
    * Set the HREF Lang attribute.
    *
    * @param hreflang The HREF Lang.
    */
   public void setHreflang(String hreflang) {
      this.hreflang = hreflang;
   }

   /**
    * Get the title.
    *
    * @return The title.
    */
   public String getTitle() {
      return title;
   }

   /**
    * Set the title.
    *
    * @param title The title.
    */
   public void setTitle(String title) {
      this.title = title;
   }

   /**
    * Get the length.
    *
    * @return The length.
    */
   public String getLength() {
      return length;
   }

   /**
    * Set the length.
    *
    * @param length The length.
    */
   public void setLength(String length) {
      this.length = length;
   }

   /**
    * Get the content.
    *
    * @return The content.
    */
   public String getContent() {
      return content;
   }

   /**
    * Set the content.
    *
    * @param content The content.
    */
   public void setContent(String content) {
      this.content = content;
   }
  
   public String toString()
   {
      return "Link -" +
      " href: " + getHref() +
      " hreflang: " + getHreflang() +
      " title: " + getTitle() +
      " rel: " + getRel() +
      " content: " + getContent() +
      " type: " + getType() +
      " length: " + getLength();
   }

}
TOP

Related Classes of org.purl.sword.atom.Link

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.