Package org.apache.padaf.xmpbox

Source Code of org.apache.padaf.xmpbox.BuildPDFExtensionSchemaHelper

/*****************************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*
****************************************************************************/

package org.apache.padaf.xmpbox;

import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.List;

import org.apache.padaf.xmpbox.parser.XMLPropertiesDescriptionManager;
import org.apache.padaf.xmpbox.parser.XMLValueTypeDescriptionManager;
import org.apache.padaf.xmpbox.schema.PDFAExtensionSchema;
import org.apache.padaf.xmpbox.schema.PropertyExtensionDefinition;
import org.apache.padaf.xmpbox.schema.PropertyType;
import org.apache.padaf.xmpbox.schema.SchemaDescription;
import org.apache.padaf.xmpbox.schema.SchemaExtensionDefinition;
import org.apache.padaf.xmpbox.schema.XMPSchema;
import org.apache.padaf.xmpbox.type.BadFieldValueException;
import org.apache.padaf.xmpbox.type.PropertyDescription;
import org.apache.padaf.xmpbox.type.ValueTypeDescription;


/**
*
* This class help you to build a PDF/A extension schema description thanks to
* annotation present in annotations included in the schema class representation
*
* @author a183132
*
*/
public class BuildPDFExtensionSchemaHelper {

  /**
   * According to check-style, Utility classes should not have a public or
   * default constructor.
   */
  protected BuildPDFExtensionSchemaHelper() {
  };

  /**
   * Build automatically Schema description with annotations and data present
   * in schema class and include it in the PDF/A Extension Schema NOTE : If
   * metadata given not contains a PDF/A Extension Schema, this function add
   * one automatically.
   *
   * @param metadata
   *            The concerned metadata in which include Schema Description
   *            inside the PDF/A Extension Schema
   * @param schema
   *            The specific schema concerned by the description building
   * @throws BuildPDFAExtensionSchemaDescriptionException
   *             When failed to load or treat data from XML Descriptions files
   *             or in Schema Class
   */
  public static void includePDFAExtensionDefinition(XMPMetadata metadata,
      XMPSchema schema)
      throws BuildPDFAExtensionSchemaDescriptionException {
    PDFAExtensionSchema ext = metadata.getPDFExtensionSchema();
    Class<? extends XMPSchema> classSchem = schema.getClass();
    if (ext == null) {
      ext = metadata.createAndAddPDFAExtensionSchemaWithDefaultNS();
    }
    Field[] fields;
    fields = classSchem.getFields();
    SchemaExtensionDefinition schemDefAnnot;
    PropertyExtensionDefinition propExtDefAnnot;
    PropertyType propTypeAnnot;
    String propName = null;
    String propDesc;
    List<PropertyDescription> xmlPropDesc = null;
    if (classSchem.isAnnotationPresent(SchemaExtensionDefinition.class)) {
      schemDefAnnot = classSchem
          .getAnnotation(SchemaExtensionDefinition.class);
      // Try to find and load XML Properties Descriptions file path
      if (!schemDefAnnot.property_descriptions().equals("")) {
        XMLPropertiesDescriptionManager propManag = new XMLPropertiesDescriptionManager();
        propManag.loadListFromXML(classSchem, schemDefAnnot
            .property_descriptions());
        xmlPropDesc = propManag.getPropertiesDescriptionList();
      }
      SchemaDescription desc = ext.createSchemaDescription();
      desc.setSchemaValue(schemDefAnnot.schema());
      desc.setNameSpaceURIValue(schema.getNamespaceValue());
      desc.setPrefixValue(schema.getPrefix());
      ext.addSchemaDescription(desc);
      // Try to find and load XML ValueType Description file path
      if (!schemDefAnnot.valueType_description().equals("")) {
        XMLValueTypeDescriptionManager valTypesManag = new XMLValueTypeDescriptionManager();
        valTypesManag.loadListFromXML(classSchem, schemDefAnnot
            .valueType_description());
        addValueTypesToSchem(metadata, desc, valTypesManag
            .getValueTypesDescriptionList());
      }
      for (Field field : fields) {
        if (field
            .isAnnotationPresent(PropertyExtensionDefinition.class)
            && field.isAnnotationPresent(PropertyType.class)) {
          try {
            propName = (String) field.get(propName);
          } catch (Exception e) {
            throw propertyDescriptionError(
                classSchem.getName(),
                field.getName(),
                "Couldn't read content, please check accessibility and declaration of field associated",
                e);
          }
          propExtDefAnnot = field
              .getAnnotation(PropertyExtensionDefinition.class);
          propTypeAnnot = field.getAnnotation(PropertyType.class);
          try {
            if (xmlPropDesc != null) {
              Iterator<PropertyDescription> it = xmlPropDesc
                  .iterator();
              PropertyDescription tmp;
              propDesc = null;
              while (it.hasNext() && (propDesc == null)) {
                tmp = it.next();
                if (tmp.getPropertyName().equals(propName)) {
                  propDesc = tmp.getDescription();
                }
              }

            } else {
              propDesc = propExtDefAnnot.propertyDescription();
            }
            if ((propDesc == null) || propDesc.equals("")) {
              propDesc = "Not documented description";
            }
            desc.addProperty(propName,
                propTypeAnnot.propertyType(), propExtDefAnnot
                    .propertyCategory(), propDesc);
          } catch (BadFieldValueException e) {
            throw propertyDescriptionError(classSchem.getName(),
                propName, "Wrong value for property Category",
                e);
          }
        }
      }
    } else {
      throw schemaDescriptionError(classSchem.getName(),
          "Couldn't find SchemaExtensionDefinition annotation.");
    }
    /*
     * try { SaveMetadataHelper.serialize(ext, System.out); } catch
     * (TransformException e) { e.printStackTrace(); }
     */
  }

  /**
   * Add Value Types description which must be associated to the Schema
   * Description
   *
   * @param metadata
   *            Metadata concerned by this Schema Declaration
   * @param desc
   *            The Description Schema under construction
   * @param vTypes
   *            The Value Types list which must be added
   */
  protected static void addValueTypesToSchem(XMPMetadata metadata,
      SchemaDescription desc, List<ValueTypeDescription> vTypes) {
    for (ValueTypeDescription valueTypeDescription : vTypes) {
      desc.addValueType(valueTypeDescription.getType(),
          valueTypeDescription.getNamespaceURI(),
          valueTypeDescription.getPrefix(), valueTypeDescription
              .getDescription(), valueTypeDescription
              .getPDFAFieldsAssocied(metadata));

    }
  }

  /**
   * An helper to build a formated error message for schema Description errors
   *
   * @param classSchem
   *            Name of schema where errors are occured
   * @param details
   *            Error details
   * @return Exception with formated error message
   */
  protected static BuildPDFAExtensionSchemaDescriptionException schemaDescriptionError(
      String classSchem, String details) {
    StringBuilder sb = new StringBuilder(80);
    sb
        .append(
            "Error while building PDF/A Extension Schema description for '")
        .append(classSchem).append("' schema : ").append(details);
    return new BuildPDFAExtensionSchemaDescriptionException(sb.toString());
  }

  /**
   * An helper to build a formated error message for properties Description
   * errors
   *
   * @param classSchem
   *            Name of schema which include the bad property description
   * @param propName
   *            Name of property where a problem has occured
   * @param details
   *            Error details
   * @param e
   *            Original thrown Exception
   * @return Exception with formated error message
   */
  protected static BuildPDFAExtensionSchemaDescriptionException propertyDescriptionError(
      String classSchem, String propName, String details, Throwable e) {
    StringBuilder sb = new StringBuilder(80);
    sb
        .append(
            "Error while building PDF/A Extension Schema description for '")
        .append(classSchem).append("' schema, Failed to treat '")
        .append(propName).append("' property : ").append(details);
    return new BuildPDFAExtensionSchemaDescriptionException(sb.toString(),
        e);
  }

}
TOP

Related Classes of org.apache.padaf.xmpbox.BuildPDFExtensionSchemaHelper

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.