You are viewing a plain text version of this content. The canonical link for it is here.
Posted to torque-dev@db.apache.org by tf...@apache.org on 2013/04/04 09:44:53 UTC

svn commit: r1464334 - in /db/torque/torque4/trunk/torque-generator/src/main: java/org/apache/torque/generator/configuration/ java/org/apache/torque/generator/configuration/source/ java/org/apache/torque/generator/control/ java/org/apache/torque/genera...

Author: tfischer
Date: Thu Apr  4 07:44:52 2013
New Revision: 1464334

URL: http://svn.apache.org/r1464334
Log:
TORQUE-273 implement loading the model from the source graph

Modified:
    db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/UnitConfiguration.java
    db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/UnitConfigurationReader.java
    db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/source/SourceConfigurationTags.java
    db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/source/SourceSaxHandler.java
    db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/control/Controller.java
    db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/control/ControllerHelper.java
    db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceProcessConfiguration.java
    db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/NoSuchPropertyException.java
    db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyAccess.java
    db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyNotReadableException.java
    db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyNotWriteableException.java
    db/torque/torque4/trunk/torque-generator/src/main/resources/org/apache/torque/generator/configuration/configuration.xsd

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/UnitConfiguration.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/UnitConfiguration.java?rev=1464334&r1=1464333&r2=1464334&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/UnitConfiguration.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/UnitConfiguration.java Thu Apr  4 07:44:52 2013
@@ -85,6 +85,13 @@ public class UnitConfiguration
     private String defaultOutputEncoding = null;
 
     /**
+     * The class loader to use by the generator when accessing the templates
+     * or classes defined within the templates.
+     * If null, the class loader of the torque generator classes is used.
+     */
+    private ClassLoader classLoader;
+
+    /**
      * Returns the configuration of the outlets in this generation unit.
      *
      * @return the outlet configuration, not null.
@@ -476,6 +483,31 @@ public class UnitConfiguration
     }
 
     /**
+     * Returns the class loader to use by the generator when accessing
+     * the templates or classes defined within the templates.
+     *
+     * @return the class loader for the templates, or null if the standard
+     *         class loader of the torque generator classes is used.
+     */
+    public ClassLoader getClassLoader()
+    {
+        return classLoader;
+    }
+
+    /**
+     * Sets the class loader to use by the generator when accessing
+     * the templates or classes defined within the templates.
+     *
+     * @param classLoader the class loader for the templates,
+     *        or null if the standard class loader
+     *        of the torque generator classes should be used.
+     */
+    public void setClassLoader(ClassLoader classLoader)
+    {
+        this.classLoader = classLoader;
+    }
+
+    /**
      * Checks whether the unit configuration is fully initialized.
      *
      * @return true if the unit configuration is fully initialized,

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/UnitConfigurationReader.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/UnitConfigurationReader.java?rev=1464334&r1=1464333&r2=1464334&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/UnitConfigurationReader.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/UnitConfigurationReader.java Thu Apr  4 07:44:52 2013
@@ -95,6 +95,7 @@ class UnitConfigurationReader
                 unitDescriptor.getProjectPaths().getWorkDirectory());
         unitConfiguration.setOverrideSourceProvider(
                 unitDescriptor.getOverrideSourceProvider());
+        unitConfiguration.setClassLoader(unitDescriptor.getClassLoader());
 
         ConfigurationProvider configurationProvider
             = createConfigurationProvider(unitDescriptor);

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/source/SourceConfigurationTags.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/source/SourceConfigurationTags.java?rev=1464334&r1=1464333&r2=1464334&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/source/SourceConfigurationTags.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/source/SourceConfigurationTags.java Thu Apr  4 07:44:52 2013
@@ -40,6 +40,9 @@ public final class SourceConfigurationTa
     /** Attribute name for the "skipDecider" attribute. */
     public static final String SKIP_DECIDER_ARRTIBUTE = "skipDecider";
 
+    /** Attribute name for the "modelRootClass" attribute. */
+    public static final String MODEL_ROOT_CLASS_ATTRIBUTE = "modelRootClass";
+
     /** Attribute name for the "format" attribute. */
     public static final String FORMAT_ATTRIBUTE = "format";
 

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/source/SourceSaxHandler.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/source/SourceSaxHandler.java?rev=1464334&r1=1464333&r2=1464334&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/source/SourceSaxHandler.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/source/SourceSaxHandler.java Thu Apr  4 07:44:52 2013
@@ -20,6 +20,7 @@ package org.apache.torque.generator.conf
  */
 
 import static org.apache.torque.generator.configuration.source.SourceConfigurationTags.ELEMENTS_ATTRIBUTE;
+import static org.apache.torque.generator.configuration.source.SourceConfigurationTags.MODEL_ROOT_CLASS_ATTRIBUTE;
 import static org.apache.torque.generator.configuration.source.SourceConfigurationTags.SKIP_DECIDER_ARRTIBUTE;
 import static org.apache.torque.generator.configuration.source.SourceConfigurationTags.SOURCE_TAG;
 import static org.apache.torque.generator.configuration.source.SourceConfigurationTags.TRANSFORMER_TAG;
@@ -53,7 +54,10 @@ public abstract class SourceSaxHandler e
     /** The known configuration handlers. */
     private ConfigurationHandlers configurationHandlers;
 
-    /** The source process configuration. */
+    /**
+     * How a source should be processed between obtaining the original source
+     * and feeding it to the outlets.
+     */
     private SourceProcessConfiguration sourceProcessConfiguration;
 
     /**
@@ -134,6 +138,9 @@ public abstract class SourceSaxHandler e
                 sourceProcessConfiguration.setSkipDecider(
                         attributes.getValue(SKIP_DECIDER_ARRTIBUTE),
                         unitDescriptor);
+                sourceProcessConfiguration.setModelRootClass(
+                        attributes.getValue(MODEL_ROOT_CLASS_ATTRIBUTE),
+                        unitDescriptor);
             }
             catch (ConfigurationException e)
             {

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/control/Controller.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/control/Controller.java?rev=1464334&r1=1464333&r2=1464334&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/control/Controller.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/control/Controller.java Thu Apr  4 07:44:52 2013
@@ -24,8 +24,11 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 
 import org.apache.commons.logging.Log;
@@ -53,6 +56,7 @@ import org.apache.torque.generator.sourc
 import org.apache.torque.generator.source.SourceProcessConfiguration;
 import org.apache.torque.generator.source.SourceProvider;
 import org.apache.torque.generator.source.SourceTransformerDefinition;
+import org.apache.torque.generator.source.model.PropertyAccess;
 import org.apache.torque.generator.source.skipDecider.SkipDecider;
 import org.apache.torque.generator.source.transform.SourceTransformer;
 import org.apache.torque.generator.source.transform.SourceTransformerException;
@@ -66,6 +70,12 @@ public class Controller
     private static Log log = LogFactory.getLog(Controller.class);
 
     /**
+     * The field name in the model which is filled if tthe sttribute name
+     * <code>null</code> appears in the source graph.
+     */
+    public static final String NULL_ATTRIBUTE_FIELD_NAME = "value";
+
+    /**
      * All known ExistingTargetStrategies.
      * TODO: move to a better place.
      */
@@ -257,6 +267,8 @@ public class Controller
         controllerState.setSourceFile(source.getSourceFile());
         SourceProcessConfiguration sourceProcessConfiguration
                 = output.getSourceProcessConfiguration();
+        Object modelRoot = sourceProcessConfiguration.getModelRoot();
+        fillModelRoot(modelRoot, rootElement, unitConfiguration);
         rootElement = transformSource(
                 rootElement,
                 sourceProcessConfiguration.getTransformerDefinitions(),
@@ -286,6 +298,111 @@ public class Controller
     }
 
     /**
+     * Constructs the model from the source graph. This is done by recursively
+     * walking through the source graph and setting the fields corresponding
+     * to the names of the attributes resp. child elements.
+     *
+     * @param modelRoot the root object to fill, not null.
+     * @param rootSourceElement the root source element to traverse, not null.
+     * @param unitConfiguration the unit configuration, not null.
+     *
+     * @throws SourceException if filling the source graph fails, e.g. if
+     *         an attribute name or element name has no corresponding
+     *         field in a model element.
+     */
+    private void fillModelRoot(
+                Object modelRoot,
+                SourceElement rootSourceElement,
+                UnitConfiguration unitConfiguration)
+            throws SourceException
+    {
+        if (modelRoot == null) {
+            return;
+        }
+        fillModelElement(
+                modelRoot,
+                rootSourceElement,
+                unitConfiguration,
+                new HashMap<SourceElement, Object>());
+
+    }
+
+    /**
+     * Constructs a part of the model from a part of the source graph.
+     * This is done by recursively walking through the source graph
+     * and setting the fields corresponding to the names of the attributes
+     * resp. child elements.
+     *
+     * @param modelElement the model object to fill, not null.
+     * @param sourceElement the source element corresponding to the
+     *        model object, not null.
+     * @param unitConfiguration the unit configuration, not null.
+     * @param alreadyMapped a map of already mapped source elements,
+     *        mapped to the corresponding model elements.
+     *
+     * @throws SourceException if filling the source graph fails, e.g. if
+     *         an attribute name or element name has no corresponding
+     *         field in a model element.
+     */
+    private void fillModelElement(
+                Object modelElement,
+                SourceElement sourceElement,
+                UnitConfiguration unitConfiguration,
+                Map<SourceElement, Object> alreadyMapped)
+            throws SourceException
+    {
+        for (String attributeName : sourceElement.getAttributeNames())
+        {
+            if (attributeName == null)
+            {
+                attributeName = NULL_ATTRIBUTE_FIELD_NAME;
+            }
+            Object attributeValue = sourceElement.getAttribute(attributeName);
+            PropertyAccess propertyAccess = new PropertyAccess(
+                    modelElement,
+                    attributeName);
+            propertyAccess.setProperty(attributeValue);
+        }
+        for (SourceElement child : sourceElement.getChildren()) {
+            String propertyName = sourceElement.getName();
+            PropertyAccess propertyAccess = new PropertyAccess(
+                    modelElement,
+                    propertyName);
+            Object childModelElement = alreadyMapped.get(child);
+            if (childModelElement != null) {
+                propertyAccess.setProperty(childModelElement);
+                continue;
+            }
+            if (Collection.class.isAssignableFrom(
+                    propertyAccess.getPropertyType()))
+            {
+                childModelElement = ControllerHelper.getInstance(
+                        propertyAccess.getFirstGenericTypeArgument().getName(),
+                        unitConfiguration);
+            }
+            else if (propertyAccess.getPropertyType().isArray())
+            {
+                childModelElement = ControllerHelper.getInstance(
+                        propertyAccess.getPropertyType().getComponentType().getName(),
+                        unitConfiguration);
+            }
+            else
+            {
+                childModelElement = ControllerHelper.getInstance(
+                        propertyAccess.getPropertyType().getName(),
+                        unitConfiguration);
+            }
+            propertyAccess.setProperty(childModelElement);
+            alreadyMapped.put(child, childModelElement);
+            fillModelElement(
+                    childModelElement,
+                    child,
+                    unitConfiguration,
+                    alreadyMapped);
+        }
+    }
+
+    /**
      * Creates the output file name and sets it in the output.
      * The filename is calculated either by the filenameConfigurator in
      * <code>output</code> or is given explicitly (in the latter case

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/control/ControllerHelper.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/control/ControllerHelper.java?rev=1464334&r1=1464333&r2=1464334&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/control/ControllerHelper.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/control/ControllerHelper.java Thu Apr  4 07:44:52 2013
@@ -21,7 +21,9 @@ package org.apache.torque.generator.cont
 
 import java.io.File;
 
+import org.apache.torque.generator.configuration.ClassHelper;
 import org.apache.torque.generator.configuration.UnitConfiguration;
+import org.apache.torque.generator.source.SourceException;
 
 /**
  * Helper methods for the controller.
@@ -60,5 +62,55 @@ public final class ControllerHelper
         return outputFile;
     }
 
-
+    /**
+     * Creates an instance of a class.
+     *
+     * @param className the fully qualified name of the class to instantiate.
+     * @param unitDescriptor The description of the generation unit, not null.
+     *
+     * @throws SourceException if the class cannot be instantiated.
+     */
+    public static Object getInstance(
+                    String className,
+                    UnitConfiguration unitConfiguration)
+            throws SourceException
+    {
+        if (className == null)
+        {
+            return null;
+        }
+        Object result;
+        try
+        {
+            ClassLoader classLoader = unitConfiguration.getClassLoader();
+            if (classLoader == null)
+            {
+                classLoader = ClassHelper.class.getClassLoader();
+            }
+            Class<?> clazz = Class.forName(className, true, classLoader);
+            result = clazz.newInstance();
+        }
+        catch (ClassNotFoundException e)
+        {
+            throw new SourceException("The class "
+                         + className
+                         + " could not be found.",
+                    e);
+        }
+        catch (IllegalAccessException e)
+        {
+            throw new SourceException("Instantiating "
+                        + className
+                        + " is not allowed",
+                    e);
+        }
+        catch (InstantiationException e)
+        {
+            throw new SourceException("The class "
+                        + className
+                        + " has no standard constructor.",
+                    e);
+        }
+        return result;
+    }
 }

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceProcessConfiguration.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceProcessConfiguration.java?rev=1464334&r1=1464333&r2=1464334&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceProcessConfiguration.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceProcessConfiguration.java Thu Apr  4 07:44:52 2013
@@ -30,7 +30,7 @@ import org.apache.torque.generator.confi
 import org.apache.torque.generator.source.skipDecider.SkipDecider;
 
 /**
- * Contains the configuration how a source should be processed between
+ * Contains the information how a source should be processed between
  * obtaining the original source and feeding it to the outlets.
  *
  * @version $Id$
@@ -49,6 +49,12 @@ public class SourceProcessConfiguration
     private SkipDecider skipDecider;
 
     /**
+     * The model class instance attached to the root of the source,
+     * or null if none exists.
+     */
+    private Object modelRoot;
+
+    /**
      * Sets the start element path.
      *
      * @param startElementsPath the path to the elements which are used
@@ -91,6 +97,33 @@ public class SourceProcessConfiguration
     }
 
     /**
+     * Sets and instantiates the model root class instance.
+     *
+     * @param modelRootClass the fully qualified name of a class
+     *        which contains the root class of the source model.
+     * @param unitDescriptor The description of the generation unit, not null.
+     *
+     * @throws SourceException if the class cannot be instantiated.
+     */
+    public void setModelRootClass(
+                String modelRootClass,
+                UnitDescriptor unitDescriptor)
+            throws ConfigurationException
+    {
+        if (modelRootClass != null)
+        {
+            this.modelRoot = ClassHelper.getInstance(
+                    modelRootClass,
+                    null,
+                    unitDescriptor);
+        }
+        else
+        {
+            this.modelRoot = null;
+        }
+    }
+
+    /**
      * Sets the transformer definitions.
      *
      * @param transformerDefinitions the transformer definitions, or null
@@ -144,4 +177,17 @@ public class SourceProcessConfiguration
     {
         return skipDecider;
     }
+
+    /**
+     * Returns the model root instance.
+     * This is the instance of the class equivalent to the root node of
+     * the source graph. The instance is not yet filled.
+     *
+     * @return the model root instance, or null if no model root class is
+     *         defined.
+     */
+    public Object getModelRoot()
+    {
+       return modelRoot;
+    }
 }

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/NoSuchPropertyException.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/NoSuchPropertyException.java?rev=1464334&r1=1464333&r2=1464334&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/NoSuchPropertyException.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/NoSuchPropertyException.java Thu Apr  4 07:44:52 2013
@@ -21,8 +21,23 @@ package org.apache.torque.generator.sour
 
 import org.apache.torque.generator.source.SourceException;
 
+/**
+ * Indicates that an attempt was made to access a property which does not exist.
+ *
+ * @version $Id: $
+ */
 public class NoSuchPropertyException extends SourceException
 {
+    /** Serial Version UID. */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructor.
+     *
+     * @param target the object on which the property was unsuccessfully
+     *        accessed.
+     * @param name the name of the property which was unsuccessfully accessed.
+     */
     public NoSuchPropertyException(Object target, String name)
     {
         super("Neither public field nor public getter/setter"
@@ -32,6 +47,11 @@ public class NoSuchPropertyException ext
                 + target.getClass().getName());
     }
 
+    /**
+     * Constructor.
+     *
+     * @param message The exception message.
+     */
     protected NoSuchPropertyException(String message)
     {
         super(message);

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyAccess.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyAccess.java?rev=1464334&r1=1464333&r2=1464334&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyAccess.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyAccess.java Thu Apr  4 07:44:52 2013
@@ -45,21 +45,44 @@ import org.apache.torque.generator.sourc
  */
 public class PropertyAccess
 {
+    /** The object on which the property should be accessed, not null. */
     private Object target;
 
+    /** The name of the property to access, not null. */
     private String propertyName;
 
+    /**
+     * The public field corresponding to the property name,
+     * or null if no such field exists.
+     */
     private Field field;
 
+    /**
+     * The public write method corresponding to the property name,
+     * or null if a field with the property name exists
+     * or if no such write method exists.
+     */
     private Method writeMethod;
 
+    /**
+     * The public read method corresponding to the property name,
+     * or null if a field with the property name exists
+     * or if no such read method exists.
+     */
     private Method readMethod;
 
     /**
+     * Constructs a reflection access to a property of an object.
+     * The property is assumed to be a public field, or if no such field exists
+     * on the target object, by getters and setters using the java beans
+     * naming conventions.
+     * It is not an error to call this constructor on fields which do not exist.
+     *
+     * @param target the target object, not null.
+     * @param propertyName the name of the property, not null.
      *
-     * @param target
-     * @param propertyName
-     * @throws SourceException
+     * @throws SourceException if reflection access to fields or methods fails.
+     * @throws NullPointerException if target or propertyName are null.
      */
     public PropertyAccess(Object target, String propertyName)
             throws SourceException
@@ -77,7 +100,8 @@ public class PropertyAccess
         this.field = determinePublicField(target, propertyName);
         if (this.field == null)
         {
-            PropertyDescriptor propertyDescriptor = determinePropertyDescriptor(target, propertyName);
+            PropertyDescriptor propertyDescriptor
+                    = determinePropertyDescriptor(target, propertyName);
             if (propertyDescriptor != null)
             {
                 this.readMethod = propertyDescriptor.getReadMethod();
@@ -93,7 +117,7 @@ public class PropertyAccess
      * @param target the target object, not null.
      * @param name the name of the field, not null.
      * @return the field if a public field with the given name exists,
-     *         or null if no public filed with the given name exists.
+     *         or null if no public field with the given name exists.
      *
      * @throws SourceException if security settings prevent reading the field
      *         of the object.
@@ -125,6 +149,19 @@ public class PropertyAccess
         return null;
     }
 
+    /**
+     * Returns the property descriptor of the class of the object
+     * <code>target</code> with name <code>name</code>.
+     *
+     * @param target the target object, not null.
+     * @param name the name of the field, not null.
+     * @return the field if a public getter or setter corresponding to
+     *         the property name exists, or null if no such getter
+     *         and setter exists.
+     *
+     * @throws SourceException if security settings prevent reading the field
+     *         of the object.
+     */
     private static PropertyDescriptor determinePropertyDescriptor(
                 Object target,
                 String name)
@@ -150,6 +187,21 @@ public class PropertyAccess
         }
     }
 
+    /**
+     * Sets the property on the target object to a given value.
+     * If the property is an array and value is not an array, value is set
+     * as a member of the array.
+     * If the property is a collection and value is not a collection,
+     * value is added to the collection.
+     * In all other cases, the field is set to the value.
+     *
+     * @param value the value to set the property to.
+     *
+     * @throws SourceException if the property cannot be set.
+     *         Common reasons for such an exception are that the property
+     *         does not exist at all, or is not writeable, or value has the
+     *         wrong class.
+     */
     public void setProperty(Object value)
             throws SourceException
     {
@@ -164,7 +216,7 @@ public class PropertyAccess
                     && (value == null
                         || !Collection.class.isAssignableFrom(value.getClass())))
             {
-                setMemberinCollectionField(value);
+                setMemberinCollectionProperty(value);
             }
             else
             {
@@ -184,7 +236,7 @@ public class PropertyAccess
                     && (value == null
                         || !Collection.class.isAssignableFrom(value.getClass())))
             {
-                setMemberinCollectionField(value);
+                setMemberinCollectionProperty(value);
             }
             else
             {
@@ -199,7 +251,7 @@ public class PropertyAccess
                 && (value == null
                     || !Collection.class.isAssignableFrom(value.getClass())))
             {
-                setMemberinCollectionField(value);
+                setMemberinCollectionProperty(value);
                 return;
             }
             throw new PropertyNotWriteableException(target, propertyName);
@@ -210,6 +262,17 @@ public class PropertyAccess
         }
     }
 
+    /**
+     * Sets the property on the target object to a given value.
+     * Arrays and Lists are not treated specially.
+     *
+     * @param value the value to set the property to.
+     *
+     * @throws SourceException if the property cannot be set.
+     *         Common reasons for such an exception are that the property
+     *         does not exist at all, or is not writeable, or value has the
+     *         wrong class.
+     */
     public void setPropertyStrict(Object value)
             throws SourceException
     {
@@ -233,6 +296,16 @@ public class PropertyAccess
         }
     }
 
+    /**
+     * Sets the field on the target object to a given value.
+     * Arrays and Lists are not treated specially.
+     * This method should only be called if the member field is not null.
+     *
+     * @param value the value to set the property to.
+     *
+     * @throws SourceException if the property cannot be set.
+     *         A common reason is that value has the wrong class.
+     */
     private void setPropertyStrictUsingField(Object value)
             throws SourceException
     {
@@ -264,6 +337,17 @@ public class PropertyAccess
         }
     }
 
+    /**
+     * Sets the property on the target object to a given value using the setter
+     * method.
+     * Arrays and Lists are not treated specially.
+     * This method should only be called if the writeMethod field is not null.
+     *
+     * @param value the value to set the property to.
+     *
+     * @throws SourceException if the property cannot be set.
+     *         A common reason is that value has the wrong class.
+     */
     private void setPropertyStrictUsingSetter(Object value)
             throws SourceException
     {
@@ -297,6 +381,15 @@ public class PropertyAccess
         }
     }
 
+    /**
+     * Returns the value of the property.
+     *
+     * @return the value of the property.
+     *
+     * @throws SourceException if the property is not readable.
+     *         A common reason for this is that no public field and no getter
+     *         exists with the given name.
+     */
     public Object getProperty() throws SourceException {
         if (field != null) {
             return getPropertyUsingField();
@@ -307,6 +400,15 @@ public class PropertyAccess
         }
     }
 
+    /**
+     * Returns the value of the property by accessing the field of the target.
+     *
+     * @return the value of the property.
+     *
+     * @throws SourceException if the property is not readable.
+     *         A common reason for this is that no public field exists
+     *         with the given name.
+     */
     private Object getPropertyUsingField() throws SourceException
     {
         try
@@ -323,6 +425,16 @@ public class PropertyAccess
         }
     }
 
+    /**
+     * Returns the value of the property by accessing the getter method
+     * of the property.
+     *
+     * @return the value of the property.
+     *
+     * @throws SourceException if the property is not readable.
+     *         A common reason for this is that no public getter exists
+     *         with the corresponding name.
+     */
     private Object getPropertyUsingGetter() throws SourceException
     {
         try
@@ -366,9 +478,9 @@ public class PropertyAccess
     }
 
     /**
-     * Returns the class of the generic type property.
+     * Returns the generic type of the property.
      *
-     * @return the class of the generic type of the property,
+     * @return the generic type of the property,
      *         or null if the property does not exist.
      */
     public Type getPropertyGenericType()
@@ -388,6 +500,14 @@ public class PropertyAccess
         return null;
     }
 
+    /**
+     * Gets the class of the first generic argument of the property.
+     * E.g. if the property is a collection, this method will return
+     * the class of the members of the collection.
+     *
+     * @return the class of the first generic argument of the property,
+     *         or null if the property is not generified.
+     */
     public Class<?> getFirstGenericTypeArgument()
     {
         Type type = getPropertyGenericType();
@@ -403,17 +523,30 @@ public class PropertyAccess
         return null;
     }
 
+    /**
+     * Adds value as a member of an array to the property of the target object.
+     * This method should only be called ifthe property is an array.
+     *
+     * @param value the value to add to the array.
+     *
+     * @throws SourceException if adding the value fails.
+     *         A common reason is that value has the wrong class.
+     */
     private void setMemberinArrayField(Object value) throws SourceException
     {
         Object[] oldContent = (Object[]) getProperty();
         int newIndex;
         Object newContent;
         if (oldContent == null) {
-            newContent = Array.newInstance(getPropertyType().getComponentType(), 1);
+            newContent = Array.newInstance(
+                    getPropertyType().getComponentType(),
+                    1);
             newIndex = 0;
         }
         else {
-            newContent = Array.newInstance(getPropertyType().getComponentType(), oldContent.length + 1);
+            newContent = Array.newInstance(
+                    getPropertyType().getComponentType(),
+                    oldContent.length + 1);
             System.arraycopy(oldContent, 0, newContent, 0, oldContent.length);
             newIndex = oldContent.length;
         }
@@ -421,7 +554,18 @@ public class PropertyAccess
         setPropertyStrict(newContent);
     }
 
-    private void setMemberinCollectionField(Object value) throws SourceException
+    /**
+     * Adds value as a member of an collection to the property of the target
+     * object.
+     * This method should only be called if the property is a collection.
+     *
+     * @param value the value to add to the array.
+     *
+     * @throws SourceException if adding the value fails.
+     *         A common reason is that value has the wrong class.
+     */
+    private void setMemberinCollectionProperty(Object value)
+            throws SourceException
     {
         @SuppressWarnings("unchecked")
         Collection<Object> content = (Collection<Object>) getProperty();
@@ -432,6 +576,21 @@ public class PropertyAccess
         content.add(value);
     }
 
+    /**
+     * Returns the collection instance to use if a member is added
+     * to a collection property which is still null.
+     * If the property is of type Collection or List, an instance of ArrayList
+     * will be returned.
+     * If the property is of type Set, an instance of HashSet will be returned.
+     * If the property is of type Queue, an instance of LinkedList will be
+     * returned.
+     * In all other cases the class of the collection will be instantiated.
+     *
+     * @return the collection instance to use, not null.
+     *
+     * @throws SourceException if instantiation fails, e.g. if the collection
+     *         is an unknown abstract collection.
+     */
     private Collection<Object> getCollectionInstance() throws SourceException
     {
         Class<?> type = getPropertyType();
@@ -464,6 +623,15 @@ public class PropertyAccess
         }
     }
 
+    /**
+     * Constructs a source exception when setting a field fails.
+     *
+     * @param value the value to which the field was set.
+     * @param reason the reason why setting the field failed.
+     * @param cause the root cause of the exception.
+     *
+     * @return An appropriate SourceException to throw.
+     */
     private SourceException createSetFieldException(
             Object value,
             String reason,
@@ -477,6 +645,17 @@ public class PropertyAccess
                 cause);
     }
 
+    /**
+     * Constructs a source exception when setting a field fails.
+     *
+     * @param target the target object on which the property was set.
+     * @param propertyName the name of the property which was set.
+     * @param value the value to which the field was set.
+     * @param reason the reason why setting the field failed.
+     * @param cause the root cause of the exception.
+     *
+     * @return An appropriate SourceException to throw.
+     */
     private static SourceException createSetFieldException(
             Object target,
             String propertyName,

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyNotReadableException.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyNotReadableException.java?rev=1464334&r1=1464333&r2=1464334&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyNotReadableException.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyNotReadableException.java Thu Apr  4 07:44:52 2013
@@ -21,14 +21,38 @@ package org.apache.torque.generator.sour
 
 import org.apache.torque.generator.source.SourceException;
 
+/**
+ * Indicates that an attempt was made to read a property which is not readable.
+ *
+ * @version $Id: $
+ */
 public class PropertyNotReadableException extends SourceException
 {
+    /** Serial Version UID. */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructor.
+     *
+     * @param target the object on which the property was unsuccessfully read.
+     * @param name the name of the property which was unsuccessfully read.
+     */
     public PropertyNotReadableException(Object target, String name)
     {
         this(target, name, null);
     }
 
-    public PropertyNotReadableException(Object target, String name, String detail)
+    /**
+     * Constructor.
+     *
+     * @param target the object on which the property was unsuccessfully read.
+     * @param name the name of the property which was unsuccessfully read.
+     * @param detail a detail cause which is appended to the error message.
+     */
+    public PropertyNotReadableException(
+            Object target,
+            String name,
+            String detail)
     {
         super("The property "
                 + name

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyNotWriteableException.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyNotWriteableException.java?rev=1464334&r1=1464333&r2=1464334&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyNotWriteableException.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/model/PropertyNotWriteableException.java Thu Apr  4 07:44:52 2013
@@ -21,14 +21,41 @@ package org.apache.torque.generator.sour
 
 import org.apache.torque.generator.source.SourceException;
 
+/**
+ * Indicates that an attempt was made to write a property which is not
+ * writeable.
+ *
+ * @version $Id: $
+ */
 public class PropertyNotWriteableException extends SourceException
 {
+    /** Serial Version UID. */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructor.
+     *
+     * @param target the object on which the property was unsuccessfully
+     *        written.
+     * @param name the name of the property which was unsuccessfully written.
+     */
     public PropertyNotWriteableException(Object target, String name)
     {
         this(target, name, null);
     }
 
-    public PropertyNotWriteableException(Object target, String name, String detail)
+    /**
+     * Constructor.
+     *
+     * @param target the object on which the property was unsuccessfully
+     *        written.
+     * @param name the name of the property which was unsuccessfully written.
+     * @param detail a detail cause which is appended to the error message.
+     */
+    public PropertyNotWriteableException(
+            Object target,
+            String name,
+            String detail)
     {
         super("The property "
                 + name

Modified: db/torque/torque4/trunk/torque-generator/src/main/resources/org/apache/torque/generator/configuration/configuration.xsd
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/resources/org/apache/torque/generator/configuration/configuration.xsd?rev=1464334&r1=1464333&r2=1464334&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/resources/org/apache/torque/generator/configuration/configuration.xsd (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/resources/org/apache/torque/generator/configuration/configuration.xsd Thu Apr  4 07:44:52 2013
@@ -198,6 +198,14 @@
         </documentation>
       </annotation>
     </attribute>
+    <attribute name="modelRootClass" type="string" use="optional">
+      <annotation>
+        <documentation>
+          The fully qualified name of the class to construct from the root
+          element.
+        </documentation>
+      </annotation>
+    </attribute>
     <attribute name="skipDecider" type="string" use="optional">
       <annotation>
         <documentation>



---------------------------------------------------------------------
To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
For additional commands, e-mail: torque-dev-help@db.apache.org