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/20 23:23:42 UTC

svn commit: r1470235 [2/7] - in /db/torque/torque4/trunk: torque-generator/ torque-generator/src/main/java/org/apache/torque/generator/configuration/ torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/ torque-generator/src/...

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/outlet/OutletImpl.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/outlet/OutletImpl.java?rev=1470235&r1=1470234&r2=1470235&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/outlet/OutletImpl.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/outlet/OutletImpl.java Sat Apr 20 21:23:39 2013
@@ -32,7 +32,7 @@ import org.apache.torque.generator.confi
 import org.apache.torque.generator.control.ControllerState;
 import org.apache.torque.generator.control.action.MergepointAction;
 import org.apache.torque.generator.qname.QualifiedName;
-import org.apache.torque.generator.source.SourcePath;
+import org.apache.torque.generator.source.SourceElement;
 import org.apache.torque.generator.variable.Variable;
 import org.apache.torque.generator.variable.VariableStore;
 
@@ -60,11 +60,18 @@ public abstract class OutletImpl impleme
 
     /**
      * The name of the input elements to process. If null, the input
-     * elements are not checked.
+     * elements are not checked. If not null, the input element must be
+     * a SourceElement.
      */
     private String inputElementName;
 
     /**
+     * The class  of the input models to process. If null, the class of the
+     * input objects are not checked, except if inputElementName is not null.
+     */
+    private String inputClass;
+
+    /**
      * Constructs a OutletImpl with the given name.
      *
      * @param name the name of this outlet, not null.
@@ -95,6 +102,16 @@ public abstract class OutletImpl impleme
         this.inputElementName = inputElementName;
     }
 
+    public String getInputClass()
+    {
+        return inputClass;
+    }
+
+    public void setInputClass(String inputClass)
+    {
+        this.inputClass = inputClass;
+    }
+
     /**
      * Adds an mergepoint mapping to the outlet. No mergepoint
      * mappings must exist with the given name.
@@ -156,8 +173,46 @@ public abstract class OutletImpl impleme
     }
 
     public void beforeExecute(ControllerState controllerState)
-        throws GeneratorException
+            throws GeneratorException
     {
+        if (inputElementName != null || inputClass != null)
+        {
+            Object model = controllerState.getModel();
+            if (inputClass != null
+                    && !inputClass.equals(model.getClass().getName()))
+            {
+                throw new GeneratorException("The input model of outlet "
+                        + getName()
+                        + " must be of class " + inputClass
+                        + " (because of the value of the attribute inputClass"
+                        + " on the outlet in the generator config) "
+                        + "but is of class " + model.getClass().getName());
+            }
+            if (inputElementName != null
+                    && !SourceElement.class.isAssignableFrom(model.getClass()))
+            {
+                throw new GeneratorException("The input model of outlet "
+                        + getName()
+                        + " must be "
+                        + SourceElement.class.getName()
+                        + " or a subclass thereof "
+                        + "(because the attribute elementName is set "
+                        + "on the outlet in the generator config) "
+                        + " but is of class "
+                        + model.getClass().getName());
+            }
+            if (inputElementName != null
+                && !inputElementName.equals(((SourceElement) model).getName()))
+            {
+                throw new GeneratorException("Input element name, "
+                        + ((SourceElement) model).getName()
+                        + ", is not the expected name, "
+                        + getInputElementName()
+                        + ", for outlet "
+                        + getName());
+            }
+        }
+
         controllerState.pushOutlet(this);
         controllerState.getVariableStore().startOutlet();
         if (log.isDebugEnabled())
@@ -165,8 +220,7 @@ public abstract class OutletImpl impleme
             log.debug("Executing outlet "
                     + getName()
                     + " on element "
-                    + SourcePath.getPathAsString(
-                            controllerState.getSourceElement()));
+                    + controllerState.getModel());
         }
     }
 

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/outlet/java/OutletUtils.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/outlet/java/OutletUtils.java?rev=1470235&r1=1470234&r2=1470235&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/outlet/java/OutletUtils.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/outlet/java/OutletUtils.java Sat Apr 20 21:23:39 2013
@@ -70,7 +70,7 @@ public final class OutletUtils
         throws GeneratorException
     {
         SourceElement sourceElement = SourcePath.getElement(
-                controllerState.getSourceElement(),
+                (SourceElement) controllerState.getModel(),
                 elementName,
                 false);
         Object attribute

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/outlet/java/XmlOutlet.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/outlet/java/XmlOutlet.java?rev=1470235&r1=1470234&r2=1470235&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/outlet/java/XmlOutlet.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/outlet/java/XmlOutlet.java Sat Apr 20 21:23:39 2013
@@ -23,6 +23,7 @@ import org.apache.torque.generator.Gener
 import org.apache.torque.generator.control.ControllerState;
 import org.apache.torque.generator.outlet.OutletResult;
 import org.apache.torque.generator.qname.QualifiedName;
+import org.apache.torque.generator.source.SourceElement;
 import org.apache.torque.generator.source.stream.SourceToXml;
 
 /**
@@ -50,7 +51,7 @@ public class XmlOutlet extends OutletWit
             throws GeneratorException
     {
         String result = sourceToXml.toXml(
-                controllerState.getRootElement(),
+                (SourceElement) controllerState.getModelRoot(),
                 createIdAttributes);
 
         return new OutletResult(result.toString());

Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/ModelNodeFactory.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/ModelNodeFactory.java?rev=1470235&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/ModelNodeFactory.java (added)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/ModelNodeFactory.java Sat Apr 20 21:23:39 2013
@@ -0,0 +1,73 @@
+package org.apache.torque.generator.source;
+
+/*
+ * 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.
+ */
+
+import java.util.Locale;
+
+import org.apache.commons.jxpath.JXPathBeanInfo;
+import org.apache.commons.jxpath.JXPathIntrospector;
+import org.apache.commons.jxpath.ri.QName;
+import org.apache.commons.jxpath.ri.model.NodePointer;
+import org.apache.commons.jxpath.ri.model.NodePointerFactory;
+import org.apache.commons.jxpath.ri.model.beans.NullPointer;
+
+/**
+ * Implements NodePointerFactory for JavaBeans.
+ *
+ * @author Dmitri Plotnikov
+ * @author Thomas Fox
+ * @version $Revision: 652845 $ $Date: 2008-05-02 12:46:46 -0500 (Fri, 02 May 2008) $
+ */
+public class ModelNodeFactory implements NodePointerFactory
+{
+
+    /** factory order constant */
+    public static final int MODEL_NODE_FACTORY_ORDER = 2;
+
+    public int getOrder()
+    {
+        return MODEL_NODE_FACTORY_ORDER;
+    }
+
+    public NodePointer createNodePointer(
+            final QName name,
+            final Object bean,
+            final Locale locale)
+    {
+        final JXPathBeanInfo bi
+                = JXPathIntrospector.getBeanInfo(bean.getClass());
+        return new ModelNodePointer(name, bean, bi, bean.getClass(), locale);
+    }
+
+    public NodePointer createNodePointer(
+            final NodePointer parent,
+            final QName name,
+            final Object bean)
+    {
+        if (bean == null)
+        {
+            return new NullPointer(parent, name);
+        }
+
+        final JXPathBeanInfo bi
+                = JXPathIntrospector.getBeanInfo(bean.getClass());
+        return new ModelNodePointer(parent, name, bean, bi, bean.getClass());
+    }
+}

Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/ModelNodePointer.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/ModelNodePointer.java?rev=1470235&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/ModelNodePointer.java (added)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/ModelNodePointer.java Sat Apr 20 21:23:39 2013
@@ -0,0 +1,117 @@
+package org.apache.torque.generator.source;
+
+/*
+ * 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.
+ */
+
+import java.util.Locale;
+
+import org.apache.commons.jxpath.JXPathBeanInfo;
+import org.apache.commons.jxpath.ri.QName;
+import org.apache.commons.jxpath.ri.model.NodePointer;
+import org.apache.commons.jxpath.ri.model.beans.BeanPointer;
+import org.apache.commons.jxpath.ri.model.beans.PropertyPointer;
+
+/**
+ * A Pointer that points to a Java Object or a collection. It is either
+ * the first element of a path or a pointer for a property value.
+ *
+ * @author Dmitri Plotnikov
+ * @author Thomas Fox
+ *
+ * @version $Id: $
+ */
+public class ModelNodePointer extends BeanPointer
+{
+    /** SerialVersionUID. */
+    private static final long serialVersionUID = 1L;
+
+    /** The JavaBean properties of the object pointed to. */
+    private final JXPathBeanInfo beanInfo;
+
+    /** The class of the object pointed to. */
+    private final Class<?> beanClass;
+
+    /**
+     * Create a new BeanPointer.
+     * @param name is the name given to the first node
+     * @param bean pointed
+     * @param beanInfo JXPathBeanInfo
+     * @param beanClass the class of the bean
+     * @param locale Locale
+     */
+    public ModelNodePointer(
+            final QName name,
+            final Object bean,
+            final JXPathBeanInfo beanInfo,
+            final Class<?> beanClass,
+            final Locale locale)
+    {
+        super(name, bean, beanInfo, locale);
+        this.beanInfo = beanInfo;
+        this.beanClass = beanClass;
+    }
+
+    /**
+     * Create a new BeanPointer.
+     * @param parent pointer
+     * @param name is the name given to the first node
+     * @param bean pointed
+     * @param beanInfo JXPathBeanInfo
+     * @param beanClass the class of the bean
+     */
+    public ModelNodePointer(
+            final NodePointer parent,
+            final QName name,
+            final Object bean,
+            final JXPathBeanInfo beanInfo,
+            final Class<?> beanClass)
+    {
+        super(parent, name, bean, beanInfo);
+        this.beanInfo = beanInfo;
+        this.beanClass = beanClass;
+    }
+
+    @Override
+    public PropertyPointer getPropertyPointer()
+    {
+        return new ModelPropertyPointer(this, beanInfo, beanClass);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return getName() == null ? 0 : getName().hashCode();
+    }
+
+    @Override
+    public boolean equals(final Object object)
+    {
+        if (object == this)
+        {
+            return true;
+        }
+
+        if (!(object instanceof ModelNodePointer))
+        {
+            return false;
+        }
+
+        return super.equals(object);
+    }
+}

Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/ModelPropertyPointer.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/ModelPropertyPointer.java?rev=1470235&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/ModelPropertyPointer.java (added)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/ModelPropertyPointer.java Sat Apr 20 21:23:39 2013
@@ -0,0 +1,586 @@
+package org.apache.torque.generator.source;
+
+/*
+ * 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.
+ */
+
+import java.beans.IndexedPropertyDescriptor;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.apache.commons.jxpath.JXPathBeanInfo;
+import org.apache.commons.jxpath.JXPathContext;
+import org.apache.commons.jxpath.JXPathException;
+import org.apache.commons.jxpath.JXPathInvalidAccessException;
+import org.apache.commons.jxpath.ri.model.NodePointer;
+import org.apache.commons.jxpath.ri.model.beans.PropertyPointer;
+import org.apache.commons.jxpath.util.ValueUtils;
+
+/**
+ * Pointer pointing to a property or field of a JavaBean.
+ *
+ * @author Dmitri Plotnikov
+ * @author Thomas Fox
+ * @version $Id: $
+ */
+public class ModelPropertyPointer extends PropertyPointer
+{
+    /** Serial Verion UID. */
+    private static final long serialVersionUID = 1L;
+
+    /** The object which signifies that a field is not initialized. */
+    private static final Object UNINITIALIZED = new Object();
+
+    /** The name of the property or field pointed to. */
+    private String name;
+
+    /** The JavaBean properties of the base object. */
+    private final JXPathBeanInfo beanInfo;
+
+    /** The class of the base object. */
+    private final Class<?> valueClass;
+
+    /** The base value of the object (which properties should be accessed). */
+    private Object baseValue = UNINITIALIZED;
+
+    /** The current value pointed to. */
+    private Object value = UNINITIALIZED;
+
+    /** The names of all JavaBean properties and fields of the base object. */
+    private transient String[] propertyNames;
+
+    /** The descriptors of all JavaBean properties of the base object. */
+    private transient PropertyDescriptor[] propertyDescriptors;
+
+    /** The descriptor of the current property pointed to. */
+    private transient PropertyDescriptor propertyDescriptor;
+
+    /** The descriptor of the current field pointed to. */
+    private transient Field field;
+
+    /**
+     * Create a new BeanPropertyPointer.
+     * @param parent parent pointer
+     * @param beanInfo describes the target property/ies.
+     */
+    public ModelPropertyPointer(
+            final NodePointer parent,
+            final JXPathBeanInfo beanInfo,
+            final Class<?> valueClass)
+    {
+        super(parent);
+        this.beanInfo = beanInfo;
+        this.valueClass = valueClass;
+    }
+
+    /**
+     * This type of node is auxiliary.
+     * @return true
+     */
+    @Override
+    public boolean isContainer()
+    {
+        return true;
+    }
+
+    @Override
+    public int getPropertyCount()
+    {
+        if (beanInfo.isAtomic())
+        {
+            return 0;
+        }
+        return getPropertyDescriptors().length;
+    }
+
+    /**
+     * Get the names of all properties, sorted alphabetically
+     * @return String[]
+     */
+    @Override
+    public String[] getPropertyNames()
+    {
+        if (propertyNames == null)
+        {
+            final Set<String> names = new TreeSet<String>();
+            for (final PropertyDescriptor pd : beanInfo.getPropertyDescriptors())
+            {
+                names.add(pd.getName());
+            }
+            for (final Field f : valueClass.getFields())
+            {
+                if (Modifier.isPublic(f.getModifiers()))
+                {
+                    names.add(f.getName());
+                }
+            }
+            propertyNames = names.toArray(new String[] {});
+        }
+        return propertyNames;
+    }
+
+    /**
+     * Select a property by name.
+     * @param name String name
+     */
+    @Override
+    public void setPropertyName(final String name)
+    {
+        setPropertyIndex(UNSPECIFIED_PROPERTY);
+        this.name = name;
+    }
+
+    /**
+     * Selects a property by its offset in the alphabetically sorted list.
+     * @param index property index
+     */
+    @Override
+    public void setPropertyIndex(final int index)
+    {
+        if (this.propertyIndex != index)
+        {
+            super.setPropertyIndex(index);
+            name = null;
+            propertyDescriptor = null;
+            field = null;
+            baseValue = UNINITIALIZED;
+            value = UNINITIALIZED;
+        }
+    }
+
+    /**
+     * Get the value of the currently selected property.
+     * @return Object value
+     */
+    @Override
+    public Object getBaseValue()
+    {
+        if (baseValue == UNINITIALIZED)
+        {
+            final PropertyDescriptor pd = getPropertyDescriptor();
+            if (pd == null)
+            {
+                final Field f = getField();
+                if (f == null)
+                {
+                    return null;
+                }
+                baseValue = getFieldValue(f);
+            }
+            else
+            {
+                baseValue = ValueUtils.getValue(getBean(), pd);
+            }
+        }
+        return baseValue;
+    }
+
+    @Override
+    public void setIndex(final int index)
+    {
+        if (this.index == index)
+        {
+            return;
+        }
+        // When dealing with a scalar, index == 0 is equivalent to
+        // WHOLE_COLLECTION, so do not change it.
+        if (this.index != WHOLE_COLLECTION
+                || index != 0
+                || isCollection())
+        {
+            super.setIndex(index);
+            value = UNINITIALIZED;
+        }
+    }
+
+    /**
+     * If index == WHOLE_COLLECTION, the value of the property, otherwise
+     * the value of the index'th element of the collection represented by the
+     * property. If the property is not a collection, index should be zero
+     * and the value will be the property itself.
+     * @return Object
+     */
+    @Override
+    public Object getImmediateNode()
+    {
+        if (value == UNINITIALIZED)
+        {
+            if (index == WHOLE_COLLECTION)
+            {
+                value = ValueUtils.getValue(getBaseValue());
+            }
+            else
+            {
+                final PropertyDescriptor pd = getPropertyDescriptor();
+                if (pd == null)
+                {
+                    final Field f = getField();
+                    if (f == null)
+                    {
+                        value = null;
+                    }
+                    else
+                    {
+                        value = ValueUtils.getValue(getFieldValue(f), index);
+                    }
+                }
+                else
+                {
+                    value = ValueUtils.getValue(getBean(), pd, index);
+                }
+            }
+        }
+        return value;
+    }
+
+    @Override
+    protected boolean isActualProperty()
+    {
+        return getPropertyDescriptor() != null;
+    }
+
+    @Override
+    public boolean isCollection()
+    {
+        final PropertyDescriptor pd = getPropertyDescriptor();
+        final int hint;
+        if (pd == null)
+        {
+            final Field f = getField();
+            if (f == null)
+            {
+                return false;
+            }
+            hint = ValueUtils.getCollectionHint(field.getType());
+        }
+        else
+        {
+            if (pd instanceof IndexedPropertyDescriptor)
+            {
+                return true;
+            }
+            hint = ValueUtils.getCollectionHint(pd.getPropertyType());
+        }
+        if (hint == -1)
+        {
+            return false;
+        }
+        if (hint == 1)
+        {
+            return true;
+        }
+
+        final Object v = getBaseValue();
+        return v != null && ValueUtils.isCollection(v);
+    }
+
+    /**
+     * If the property contains a collection, then the length of that
+     * collection, otherwise - 1.
+     * @return int length
+     */
+    @Override
+    public int getLength()
+    {
+        final PropertyDescriptor pd = getPropertyDescriptor();
+        final int hint;
+        if (pd == null)
+        {
+            final Field f = getField();
+            if (f == null)
+            {
+                return 1;
+            }
+            hint = ValueUtils.getCollectionHint(f.getType());
+        }
+        else
+        {
+            if (pd instanceof IndexedPropertyDescriptor)
+            {
+                return ValueUtils.getIndexedPropertyLength(
+                    getBean(),
+                    (IndexedPropertyDescriptor) pd);
+            }
+            hint = ValueUtils.getCollectionHint(pd.getPropertyType());
+        }
+
+        if (hint == -1)
+        {
+            return 1;
+        }
+        return ValueUtils.getLength(getBaseValue());
+    }
+
+    /**
+     * If index == WHOLE_COLLECTION, change the value of the property, otherwise
+     * change the value of the index'th element of the collection
+     * represented by the property.
+     * @param value value to set
+     */
+    @Override
+    public void setValue(final Object value)
+    {
+        final PropertyDescriptor pd = getPropertyDescriptor();
+        Field f;
+        if (pd == null)
+        {
+            f = getField();
+            if (f == null)
+            {
+                throw new JXPathInvalidAccessException(
+                    "Cannot set property: " + asPath() + " - no such property");
+            }
+            setFieldValue(f, value);
+        }
+        else
+        {
+            if (index == WHOLE_COLLECTION)
+            {
+                ValueUtils.setValue(getBean(), pd, value);
+            }
+            else
+            {
+                ValueUtils.setValue(getBean(), pd, index, value);
+            }
+        }
+        this.value = value;
+    }
+
+    @Override
+    public NodePointer createPath(final JXPathContext context)
+    {
+        if (getImmediateNode() == null)
+        {
+            super.createPath(context);
+            baseValue = UNINITIALIZED;
+            value = UNINITIALIZED;
+        }
+        return this;
+    }
+
+    @Override
+    public void remove()
+    {
+        if (index == WHOLE_COLLECTION)
+        {
+            setValue(null);
+        }
+        else if (isCollection())
+        {
+            final Object o = getBaseValue();
+            final Object collection = ValueUtils.remove(getBaseValue(), index);
+            if (collection != o)
+            {
+                final PropertyDescriptor pd = getPropertyDescriptor();
+                if (pd == null)
+                {
+                    final Field f = getField();
+                    setFieldValue(f, collection);
+                }
+                else
+                {
+                    ValueUtils.setValue(
+                            getBean(),
+                            getPropertyDescriptor(),
+                            collection);
+                }
+            }
+        }
+        else if (index == 0)
+        {
+            index = WHOLE_COLLECTION;
+            setValue(null);
+        }
+    }
+
+    /**
+     * Get the name of the currently selected property.
+     * @return String property name
+     */
+    @Override
+    public String getPropertyName()
+    {
+        if (name == null)
+        {
+            final PropertyDescriptor pd = getPropertyDescriptor();
+            if (pd != null)
+            {
+                name = pd.getName();
+            }
+            else
+            {
+                final Field f = getField();
+                if (f != null)
+                {
+                    name = f.getName();
+                }
+            }
+        }
+        return name != null ? name : "*";
+    }
+
+    /**
+     * Finds the property descriptor corresponding to the current property
+     * index.
+     * @return PropertyDescriptor
+     */
+    private PropertyDescriptor getPropertyDescriptor()
+    {
+        if (propertyDescriptor == null)
+        {
+            final int inx = getPropertyIndex();
+            if (inx == UNSPECIFIED_PROPERTY)
+            {
+                propertyDescriptor =
+                    beanInfo.getPropertyDescriptor(name);
+            }
+            else
+            {
+                final String[] names = getPropertyNames();
+                if (inx >= 0 && inx < names.length)
+                {
+                    propertyDescriptor
+                            = beanInfo.getPropertyDescriptor(names[inx]);
+                }
+                else
+                {
+                    propertyDescriptor = null;
+                }
+            }
+        }
+        return propertyDescriptor;
+    }
+
+    /**
+     * Finds the property descriptor corresponding to the current property
+     * index.
+     * @return PropertyDescriptor
+     */
+    private Field getField()
+    {
+        if (field == null)
+        {
+            final int inx = getPropertyIndex();
+            if (inx == UNSPECIFIED_PROPERTY)
+            {
+                field = getField(name);
+            }
+            else
+            {
+                final String[] names = getPropertyNames();
+                if (inx >= 0 && inx < names.length)
+                {
+                    field = getField(names[inx]);
+                }
+                else
+                {
+                    field = null;
+                }
+            }
+        }
+        return field;
+    }
+
+    private Field getField(final String name)
+    {
+        try
+        {
+            return valueClass.getField(name);
+        }
+        catch (final SecurityException e)
+        {
+            throw new JXPathException(
+                    "Cannot access property: "
+                        + valueClass.getName()
+                        + "."
+                        + name,
+                    e);
+       }
+        catch (final NoSuchFieldException e)
+        {
+            throw new JXPathException(
+                    "Cannot access property: "
+                        + valueClass.getName()
+                        + "."
+                        + name,
+                    e);
+        }
+    }
+
+    private Object getFieldValue(final Field field)
+    {
+        try
+        {
+            return field.get(getBean());
+        }
+        catch (final IllegalArgumentException e)
+        {
+            throw new JXPathException(
+                    "Cannot access property: "
+                        + (bean == null ? "null" : bean.getClass().getName())
+                        + "."
+                        + name,
+                    e);
+        }
+        catch (final IllegalAccessException e)
+        {
+            throw new JXPathException(
+                    "Cannot access property: "
+                        + (bean == null ? "null" : bean.getClass().getName())
+                        + "."
+                        + name,
+                    e);
+
+        }
+    }
+
+    private void setFieldValue(final Field field, final Object value)
+    {
+        try
+        {
+            field.set(getBean(), value);
+        }
+        catch (final IllegalArgumentException e)
+        {
+            throw new JXPathInvalidAccessException(
+                    "Cannot set property: " + asPath(), e);
+        }
+        catch (final IllegalAccessException e)
+        {
+            throw new JXPathInvalidAccessException(
+                    "Cannot set property: " + asPath(), e);
+        }
+    }
+
+    /**
+     * Get all PropertyDescriptors.
+     * @return PropertyDescriptor[]
+     */
+    protected synchronized PropertyDescriptor[] getPropertyDescriptors()
+    {
+        if (propertyDescriptors == null)
+        {
+            propertyDescriptors = beanInfo.getPropertyDescriptors();
+        }
+        return propertyDescriptors;
+    }
+
+}

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElement.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElement.java?rev=1470235&r1=1470234&r2=1470235&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElement.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElement.java Sat Apr 20 21:23:39 2013
@@ -24,7 +24,9 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.ListIterator;
 import java.util.Map;
 import java.util.Set;
 
@@ -51,7 +53,8 @@ public class SourceElement
     /**
      * the source element's attributes.
      */
-    private final Map<String, Object> attributes = new HashMap<String, Object>();
+    private final Map<String, Object> attributes
+            = new LinkedHashMap<String, Object>();
 
     /**
      * Constructor.
@@ -231,6 +234,33 @@ public class SourceElement
         return SourcePath.hasChild(this, name);
     }
 
+    /**
+     * Returns the first child of this source element.
+     *
+     * @return the first child, or null if this source element has no children.
+     */
+    public SourceElement getFirstChild()
+    {
+        if (children.isEmpty())
+        {
+            return null;
+        }
+        return children.get(0);
+    }
+
+    /**
+     * Returns the last child of this source element.
+     *
+     * @return the last child, or null if this source element has no children.
+     */
+    public SourceElement getLastChild()
+    {
+        if (children.isEmpty())
+        {
+            return null;
+        }
+        return children.get(children.size() - 1);
+    }
 
     /**
      * Returns all the following elements after this element
@@ -251,6 +281,35 @@ public class SourceElement
     }
 
     /**
+     * Returns the following element after this element
+     * If this element has no parent, null is returned.
+     *
+     * @param parent the parent of this source Element in which child
+     *        list the following element should be looked for.
+     *
+     * @return the following source element,
+     *         or null if no following source element exists.
+     *
+     * @throws IllegalArgumentException if parent is not a parent
+     *         of this SourceElement.
+     */
+    public SourceElement getFollowingSourceElement(SourceElement parent)
+    {
+        if (!parents.contains(parent))
+        {
+            throw new IllegalArgumentException(
+                    "parent is not a parent of this SourceElement");
+        }
+        ListIterator<SourceElement> sameLevelIt
+            = SourcePath.getSiblingIteratorPositionedOnSelf(this, parent);
+        if (!sameLevelIt.hasNext())
+        {
+            return null;
+        }
+        return sameLevelIt.next();
+    }
+
+    /**
      * Returns whether a following element exists as a child of the parent of
      * this element.
      *
@@ -313,6 +372,36 @@ public class SourceElement
     }
 
     /**
+     * Returns the preceding element after this element.
+     * If this element has no parent, null is returned.
+     *
+     * @param parent the parent of this source Element in which child
+     *        list the following element should be looked for.
+     *
+     * @return the preceding source element,
+     *         or null if no preceding source element exists.
+     *
+     * @throws IllegalArgumentException if parent is not a parent
+     *         of this SourceElement.
+     */
+    public SourceElement getPrecedingSourceElement(SourceElement parent)
+    {
+        if (!parents.contains(parent))
+        {
+            throw new IllegalArgumentException(
+                    "parent is not a parent of this SourceElement");
+        }
+        ListIterator<SourceElement> sameLevelIt
+            = SourcePath.getSiblingIteratorPositionedOnSelf(this, parent);
+        sameLevelIt.previous();
+        if (!sameLevelIt.hasPrevious())
+        {
+            return null;
+        }
+        return sameLevelIt.previous();
+    }
+
+    /**
      * Returns the object stored in the attribute with key null.
      *
      * @return the stored object, or null if no object is stored

Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementAttributeIterator.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementAttributeIterator.java?rev=1470235&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementAttributeIterator.java (added)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementAttributeIterator.java Sat Apr 20 21:23:39 2013
@@ -0,0 +1,135 @@
+package org.apache.torque.generator.source;
+
+/*
+ * 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.
+ */
+
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.jxpath.ri.QName;
+import org.apache.commons.jxpath.ri.model.NodeIterator;
+import org.apache.commons.jxpath.ri.model.NodePointer;
+
+/**
+ * A node iterator iterating over attributes of a SourceElement.
+ *
+ * @author Dmitri Plotnikov
+ * @author Thomas Fox
+ *
+ * @version $Id: $
+ */
+public class SourceElementAttributeIterator implements NodeIterator
+{
+    /** The parent pointer. */
+    private final NodePointer parent;
+
+    /** The source element over which attributes is iterated. */
+    private final SourceElement sourceElement;
+
+    /** The name of the selected attribute. */
+    private final String name;
+
+    /** All matching names. */
+    private final List<String> names;
+
+    /** The position of the iterator. */
+    private int position = 0;
+
+    /**
+     * Create a new SourceElementAttributeIterator.
+     *
+     * @param parent the parent pointer
+     * @param qName the name to test
+     */
+    public SourceElementAttributeIterator(final NodePointer parent, final QName qName)
+    {
+        this.parent = parent;
+        this.name = qName.getName();
+        names = new ArrayList<String>();
+        sourceElement = (SourceElement) parent.getNode();
+        if (!name.equals("*"))
+        {
+            final Object attr = sourceElement.getAttribute(name);
+            if (attr != null)
+            {
+                names.add(name);
+            }
+        }
+        else
+        {
+            final Set<String> attributeNames = sourceElement.getAttributeNames();
+            for (final String attributeName : attributeNames)
+            {
+                final Object value = sourceElement.getAttribute(attributeName);
+                if (testAttr(attributeName, value))
+                {
+                    names.add(name);
+                }
+            }
+        }
+    }
+
+    /**
+     * Test an attribute.
+     * @param attr to test
+     * @return whether test succeeded
+     */
+    private boolean testAttr(final String attributeName, final Object value)
+    {
+        if (name.equals("*") || name.equals(attributeName))
+        {
+            return true;
+        }
+        return false;
+    }
+
+    public NodePointer getNodePointer()
+    {
+        if (position == 0)
+        {
+            if (!setPosition(1))
+            {
+                return null;
+            }
+            position = 0;
+        }
+        int index = position - 1;
+        if (index < 0)
+        {
+            index = 0;
+        }
+        return new SourceElementAttributePointer(
+                parent,
+                sourceElement,
+                names.get(index));
+    }
+
+    public int getPosition()
+    {
+        return position;
+    }
+
+    public boolean setPosition(final int position)
+    {
+        this.position = position;
+        return position >= 1 && position <= names.size();
+    }
+}

Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementAttributePointer.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementAttributePointer.java?rev=1470235&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementAttributePointer.java (added)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementAttributePointer.java Sat Apr 20 21:23:39 2013
@@ -0,0 +1,204 @@
+package org.apache.torque.generator.source;
+
+/*
+ * 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.
+ */
+
+import org.apache.commons.jxpath.ri.Compiler;
+import org.apache.commons.jxpath.ri.QName;
+import org.apache.commons.jxpath.ri.compiler.NodeTest;
+import org.apache.commons.jxpath.ri.compiler.NodeTypeTest;
+import org.apache.commons.jxpath.ri.model.NodePointer;
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+/**
+ * A node pointer pointing to an attribute of a SourceElement.
+ *
+ * @author Dmitri Plotnikov
+ * @author Thomas Fox
+ *
+ * @version $Id: $
+ */
+public class SourceElementAttributePointer extends NodePointer
+{
+    /** SerialVersionUID. */
+    private static final long serialVersionUID = 1115085175427555951L;
+
+    /** The source element to which the attribute belongs. */
+    private final SourceElement sourceElement;
+
+    /** The name of the attribute. */
+    private final String name;
+
+    /**
+     * Constructor.
+     *
+     * @param parent the parent pointer.
+     * @param sourceElement the SourceElement to which attribute is pointed.
+     * @param name the name of the attribute pointed to.
+     */
+    public SourceElementAttributePointer(
+            final NodePointer parent,
+            final SourceElement sourceElement,
+            final String name)
+    {
+        super(parent);
+        this.sourceElement = sourceElement;
+        this.name = name;
+    }
+
+    @Override
+    public QName getName()
+    {
+        return new QName(null, name);
+    }
+
+    @Override
+    public String getNamespaceURI()
+    {
+        return null;
+    }
+
+    @Override
+    public Object getValue()
+    {
+        return sourceElement.getAttribute(name);
+    }
+
+    @Override
+    public Object getBaseValue()
+    {
+        return sourceElement.getAttribute(name);
+    }
+
+    @Override
+    public boolean isCollection()
+    {
+        return false;
+    }
+
+    @Override
+    public int getLength()
+    {
+        return 1;
+    }
+
+    @Override
+    public Object getImmediateNode()
+    {
+        return sourceElement.getAttribute(name);
+    }
+
+    @Override
+    public boolean isActual()
+    {
+        return true;
+    }
+
+    @Override
+    public boolean isLeaf()
+    {
+        return true;
+    }
+
+    @Override
+    public boolean testNode(final NodeTest nodeTest)
+    {
+        return nodeTest == null
+            || ((nodeTest instanceof NodeTypeTest)
+                && ((NodeTypeTest) nodeTest).getNodeType() == Compiler.NODE_TYPE_NODE);
+    }
+
+    /**
+     * Sets the value of this attribute.
+     *
+     * @param value to set
+     */
+    @Override
+    public void setValue(final Object value)
+    {
+        sourceElement.setAttribute(name, value);
+    }
+
+    /**
+     * Removes the attribute pointed to.
+     */
+    @Override
+    public void remove()
+    {
+        sourceElement.setAttribute(name, null);
+    }
+
+    @Override
+    public String asPath()
+    {
+        final StringBuffer buffer = new StringBuffer();
+        if (parent != null)
+        {
+            buffer.append(parent.asPath());
+            if (buffer.length() == 0
+                || buffer.charAt(buffer.length() - 1) != '/')
+            {
+                buffer.append('/');
+            }
+        }
+        buffer.append('@');
+        buffer.append(getName());
+        return buffer.toString();
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return new HashCodeBuilder()
+            .append(sourceElement)
+            .append(name)
+            .toHashCode();
+    }
+
+    @Override
+    public boolean equals(final Object object)
+    {
+        if (object == this)
+        {
+            return true;
+        }
+        if (!(object instanceof SourceElementAttributePointer))
+        {
+            return false;
+        }
+        final SourceElementAttributePointer other
+                = (SourceElementAttributePointer) object;
+        if (sourceElement != other.sourceElement)
+        {
+            return false;
+        }
+        return ObjectUtils.equals(name, other.name);
+    }
+
+    @Override
+    public int compareChildNodePointers(
+            final NodePointer pointer1,
+            final NodePointer pointer2)
+    {
+        // Won't happen - attributes don't have children
+        return 0;
+    }
+
+}

Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementNodeIterator.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementNodeIterator.java?rev=1470235&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementNodeIterator.java (added)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementNodeIterator.java Sat Apr 20 21:23:39 2013
@@ -0,0 +1,210 @@
+package org.apache.torque.generator.source;
+
+/*
+ * 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.
+ */
+
+
+import org.apache.commons.jxpath.ri.compiler.NodeTest;
+import org.apache.commons.jxpath.ri.model.NodeIterator;
+import org.apache.commons.jxpath.ri.model.NodePointer;
+
+/**
+ * A node iterator iterating over children of a SourceElement.
+ *
+ * @author Dmitri Plotnikov
+ * @author Thomas Fox
+ *
+ * @version $Id: $
+ */
+public class SourceElementNodeIterator implements NodeIterator
+{
+    /** The parent pointer. */
+    private final NodePointer parent;
+
+    /** The node test which the selected children must match. */
+    private final NodeTest nodeTest;
+
+    /** The source element which is the parent of the nodes iterated over. */
+    private final SourceElement sourceElement;
+
+    /** The current matching child in the iteration. */
+    private SourceElement child = null;
+
+    /** Whether order is reverse. */
+    private final boolean reverse;
+
+    /** The current iterator position. */
+    private int position = 0;
+
+    /**
+     * Create a new DOMNodeIterator.
+     * @param parent parent pointer
+     * @param nodeTest test
+     * @param reverse whether to iterate in reverse
+     * @param startWith starting pointer
+     */
+    public SourceElementNodeIterator(
+        final NodePointer parent,
+        final NodeTest nodeTest,
+        final boolean reverse,
+        final NodePointer startWith)
+    {
+        this.parent = parent;
+        this.sourceElement = (SourceElement) parent.getNode();
+        if (startWith != null)
+        {
+            this.child = (SourceElement) startWith.getNode();
+        }
+        this.nodeTest = nodeTest;
+        this.reverse = reverse;
+    }
+
+    public NodePointer getNodePointer()
+    {
+        if (position == 0)
+        {
+            setPosition(1);
+        }
+        return child == null ? null : new SourceElementNodePointer(parent, child);
+    }
+
+    public int getPosition()
+    {
+        return position;
+    }
+
+    public boolean setPosition(final int position)
+    {
+        while (this.position < position)
+        {
+            if (!next())
+            {
+                return false;
+            }
+        }
+        while (this.position > position)
+        {
+            if (!previous())
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Set the previous position.
+     * @return whether valid
+     */
+    private boolean previous()
+    {
+        position--;
+        if (!reverse)
+        {
+            if (position == 0)
+            {
+                child = null;
+            }
+            else if (child == null)
+            {
+                child = sourceElement.getLastChild();
+            }
+            else
+            {
+                child = child.getPrecedingSourceElement(sourceElement);
+            }
+            while (child != null && !testChild())
+            {
+                child = child.getPrecedingSourceElement(sourceElement);
+            }
+        }
+        else
+        {
+            child = child.getFollowingSourceElement(sourceElement);
+            while (child != null && !testChild())
+            {
+                child = child.getFollowingSourceElement(sourceElement);
+            }
+        }
+        return child != null;
+    }
+
+    /**
+     * Set the next position.
+     * @return whether valid
+     */
+    private boolean next()
+    {
+        position++;
+        if (!reverse)
+        {
+            if (position == 1)
+            {
+                if (child == null)
+                {
+                    child = sourceElement.getFirstChild();
+                }
+                else
+                {
+                    child = child.getFollowingSourceElement(sourceElement);
+                }
+            }
+            else
+            {
+                child = child.getFollowingSourceElement(sourceElement);
+            }
+            while (child != null && !testChild())
+            {
+                child = child.getFollowingSourceElement(sourceElement);
+            }
+        }
+        else
+        {
+            if (position == 1)
+            {
+                if (child == null)
+                {
+                    child = sourceElement.getLastChild();
+                }
+                else
+                {
+                    child = sourceElement.getPrecedingSourceElement(sourceElement);
+                }
+            }
+            else
+            {
+                child = sourceElement.getPrecedingSourceElement(sourceElement);
+            }
+            while (child != null && !testChild())
+            {
+                child = child.getPrecedingSourceElement(sourceElement);
+            }
+        }
+        return child != null;
+    }
+
+    /**
+     * Test child.
+     * @return result of the test
+     */
+    private boolean testChild()
+    {
+        return SourceElementNodePointer.testSourceElement(child, nodeTest);
+    }
+}

Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementNodePointer.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementNodePointer.java?rev=1470235&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementNodePointer.java (added)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementNodePointer.java Sat Apr 20 21:23:39 2013
@@ -0,0 +1,194 @@
+package org.apache.torque.generator.source;
+
+/*
+ * 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.
+ */
+
+import java.util.Locale;
+
+import org.apache.commons.jxpath.ri.Compiler;
+import org.apache.commons.jxpath.ri.QName;
+import org.apache.commons.jxpath.ri.compiler.NodeNameTest;
+import org.apache.commons.jxpath.ri.compiler.NodeTest;
+import org.apache.commons.jxpath.ri.compiler.NodeTypeTest;
+import org.apache.commons.jxpath.ri.model.NodeIterator;
+import org.apache.commons.jxpath.ri.model.NodePointer;
+
+/**
+ * A node pointer pointing to a SourceElement.
+ *
+ * @author Dmitri Plotnikov
+ * @author Thomas Fox
+ *
+ * @version $Id: $
+ */
+public class SourceElementNodePointer extends NodePointer
+{
+    /** SerialVersionUID. */
+    private static final long serialVersionUID = 1L;
+
+    /** The SourceElement pointed to. */
+    private final SourceElement sourceElement;
+
+    protected SourceElementNodePointer(
+            final SourceElement sourceElement,
+            final Locale locale)
+    {
+        super(null, locale);
+        this.sourceElement = sourceElement;
+    }
+
+    protected SourceElementNodePointer(
+            final NodePointer parent,
+            final SourceElement sourceElement)
+    {
+        super(parent);
+        this.sourceElement = sourceElement;
+    }
+
+    @Override
+    public boolean isLeaf()
+    {
+        return sourceElement.getChildren().isEmpty();
+    }
+
+    @Override
+    public boolean isCollection()
+    {
+        return false;
+    }
+
+    @Override
+    public int getLength()
+    {
+        return 1;
+    }
+
+    @Override
+    public QName getName()
+    {
+        return new QName(null, sourceElement.getName());
+    }
+
+    @Override
+    public Object getBaseValue()
+    {
+        return sourceElement;
+    }
+
+    @Override
+    public Object getImmediateNode()
+    {
+        return sourceElement;
+    }
+
+    @Override
+    public void setValue(final Object value)
+    {
+        // do nothing
+    }
+
+    @Override
+    public int compareChildNodePointers(final NodePointer pointer1,
+            final NodePointer pointer2)
+    {
+        final SourceElement sourceElement1
+                = (SourceElement) pointer1.getBaseValue();
+        final SourceElement sourceElement2
+                = (SourceElement) pointer2.getBaseValue();
+        if (sourceElement1 == sourceElement2)
+        {
+            return 0;
+        }
+        for (final SourceElement child : sourceElement.getChildren())
+        {
+            if (child == sourceElement1)
+            {
+                return -1;
+            }
+            if (child == sourceElement2)
+            {
+                return 1;
+            }
+        }
+        return 0;
+    }
+
+    @Override
+    public NodeIterator childIterator(
+            final NodeTest test,
+            final boolean reverse,
+            final NodePointer startWith)
+    {
+        return new SourceElementNodeIterator(this, test, reverse, startWith);
+    }
+
+    @Override
+    public NodeIterator attributeIterator(final QName qname)
+    {
+        return new SourceElementAttributeIterator(this, qname);
+    }
+
+    public boolean testSourceElement(final NodeTest test)
+    {
+        return testSourceElement(sourceElement, test);
+    }
+
+    /**
+     * Test a Node.
+     * @param node to test
+     * @param test to execute
+     * @return true if node passes test
+     */
+    public static boolean testSourceElement(
+            final SourceElement sourceElement,
+            final NodeTest test)
+    {
+        if (test == null)
+        {
+            return true;
+        }
+        if (test instanceof NodeNameTest)
+        {
+
+            final NodeNameTest nodeNameTest = (NodeNameTest) test;
+            final QName testName = nodeNameTest.getNodeName();
+            final boolean wildcard = nodeNameTest.isWildcard();
+            final String testPrefix = testName.getPrefix();
+            if (wildcard && testPrefix == null)
+            {
+                return true;
+            }
+            if (wildcard || testName.getName().equals(sourceElement.getName()))
+            {
+               return true;
+            }
+            return false;
+        }
+        if (test instanceof NodeTypeTest)
+        {
+            if (((NodeTypeTest) test).getNodeType() == Compiler.NODE_TYPE_NODE)
+            {
+                    return true;
+            }
+            return false;
+        }
+        return false;
+    }
+
+}

Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementNodePointerFactory.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementNodePointerFactory.java?rev=1470235&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementNodePointerFactory.java (added)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceElementNodePointerFactory.java Sat Apr 20 21:23:39 2013
@@ -0,0 +1,60 @@
+package org.apache.torque.generator.source;
+
+/*
+ * 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.
+ */
+
+import java.util.Locale;
+
+import org.apache.commons.jxpath.ri.QName;
+import org.apache.commons.jxpath.ri.model.NodePointer;
+import org.apache.commons.jxpath.ri.model.NodePointerFactory;
+
+/**
+ * A node pointer factory for SourceElements.
+ *
+ * @version $Id: $
+ */
+public class SourceElementNodePointerFactory implements NodePointerFactory
+{
+    public int getOrder()
+    {
+        return 1;
+    }
+
+    public NodePointer createNodePointer(
+            final QName name,
+            final Object object,
+            final Locale locale)
+    {
+        return object instanceof SourceElement
+                ? new SourceElementNodePointer((SourceElement) object, locale)
+                : null;
+    }
+
+    public NodePointer createNodePointer(
+            final NodePointer parent,
+            final QName name,
+            final Object object)
+    {
+        return object instanceof SourceElement
+                ? new SourceElementNodePointer(parent, (SourceElement) object)
+                : null;
+    }
+
+}

Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourcePath.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourcePath.java?rev=1470235&r1=1470234&r2=1470235&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourcePath.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourcePath.java Sat Apr 20 21:23:39 2013
@@ -20,12 +20,16 @@ package org.apache.torque.generator.sour
  */
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Set;
 import java.util.StringTokenizer;
 
+import org.apache.commons.jxpath.JXPathContext;
+import org.apache.commons.jxpath.ri.JXPathContextReferenceImpl;
 import org.apache.torque.generator.GeneratorException;
 
 /**
@@ -53,6 +57,14 @@ public final class SourcePath
      */
     private static final String ANY_ELEMENT_TOKEN = "*";
 
+    static
+    {
+        JXPathContextReferenceImpl.addNodePointerFactory(
+                new SourceElementNodePointerFactory());
+        JXPathContextReferenceImpl.addNodePointerFactory(
+                new ModelNodeFactory());
+    }
+
     /**
      * Private constructor for utility class.
      */
@@ -70,7 +82,7 @@ public final class SourcePath
      *
      * @throws NullPointerException if name is null.
      */
-    public static boolean hasChild(SourceElement sourceElement, String name)
+    public static boolean hasChild(final SourceElement sourceElement, final String name)
     {
         if (name == null)
         {
@@ -80,7 +92,7 @@ public final class SourcePath
         {
             throw new NullPointerException("sourceElement must not be null");
         }
-        for (SourceElement child : sourceElement.getChildren())
+        for (final SourceElement child : sourceElement.getChildren())
         {
             if (name.equals(child.getName()))
             {
@@ -98,7 +110,7 @@ public final class SourcePath
      *
      * @return true if a following element exists, false if not.
      */
-    public static boolean hasFollowing(SourceElement sourceElement)
+    public static boolean hasFollowing(final SourceElement sourceElement)
     {
         return !getFollowing(sourceElement, null).isEmpty();
     }
@@ -111,7 +123,7 @@ public final class SourcePath
      *
      * @return true if a preceding element exists, false if not.
      */
-    public static boolean hasPreceding(SourceElement sourceElement)
+    public static boolean hasPreceding(final SourceElement sourceElement)
     {
         return !getPreceding(sourceElement, sourceElement.getName()).isEmpty();
     }
@@ -124,7 +136,7 @@ public final class SourcePath
      *
      * @return true if a following sibling exists, false if not.
      */
-    public static boolean hasFollowingSibling(SourceElement sourceElement)
+    public static boolean hasFollowingSibling(final SourceElement sourceElement)
     {
         return !getFollowing(sourceElement, sourceElement.getName()).isEmpty();
     }
@@ -137,13 +149,14 @@ public final class SourcePath
      *
      * @return true if a preceding sibling exists, false if not.
      */
-    public static boolean hasPrecedingSibling(SourceElement sourceElement)
+    public static boolean hasPrecedingSibling(final SourceElement sourceElement)
     {
         return !getPreceding(sourceElement, sourceElement.getName()).isEmpty();
     }
 
     /**
-     * Returns all the preceding elements before this element
+     * Returns all the preceding elements in the child list
+     * of the default parent which appear before this element
      * with the given name.
      * If name is null, all preceding elements are returned.
      * If this element has no parent, an empty list is returned.
@@ -158,17 +171,19 @@ public final class SourcePath
      * @see <a href="http://www.w3.org/TR/xpath#axes">xpath axes</a>
      */
     public static List<SourceElement> getPreceding(
-            SourceElement sourceElement,
-            String name)
+            final SourceElement sourceElement,
+            final String name)
     {
         if (sourceElement == null)
         {
             throw new NullPointerException("sourceElement must not be null");
         }
 
-        List<SourceElement> result = new ArrayList<SourceElement>();
-        ListIterator<SourceElement> sameLevelIt
-                = getSiblingIteratorPositionedOnSelf(sourceElement);
+        final List<SourceElement> result = new ArrayList<SourceElement>();
+        final ListIterator<SourceElement> sameLevelIt
+                = getSiblingIteratorPositionedOnSelf(
+                        sourceElement,
+                        sourceElement.getParent());
         if (sameLevelIt == null)
         {
             return result;
@@ -176,7 +191,7 @@ public final class SourcePath
         boolean first = true;
         while (sameLevelIt.hasPrevious())
         {
-            SourceElement sameLevelElement = sameLevelIt.previous();
+            final SourceElement sameLevelElement = sameLevelIt.previous();
             // skip first iterated element because it is input element,
             // but we want to begin before the input element.
             if (first)
@@ -194,7 +209,8 @@ public final class SourcePath
     }
 
     /**
-     * Returns all the following elements after this element
+     * Returns all the following elements in the child list
+     * of the default parent which appear after this element
      * with the given name.
      * If name is null, all following elements are returned.
      * If this element has no parent, an empty list is returned.
@@ -209,24 +225,26 @@ public final class SourcePath
      * @see <a href="http://www.w3.org/TR/xpath#axes">xpath axes</a>
      */
     public static List<SourceElement> getFollowing(
-            SourceElement sourceElement,
-            String name)
+            final SourceElement sourceElement,
+            final String name)
     {
         if (sourceElement == null)
         {
             throw new NullPointerException("sourceElement must not be null");
         }
-        List<SourceElement> result = new ArrayList<SourceElement>();
+        final List<SourceElement> result = new ArrayList<SourceElement>();
 
-        ListIterator<SourceElement> sameLevelIt
-                = getSiblingIteratorPositionedOnSelf(sourceElement);
+        final ListIterator<SourceElement> sameLevelIt
+                = getSiblingIteratorPositionedOnSelf(
+                        sourceElement,
+                        sourceElement.getParent());
         if (sameLevelIt == null)
         {
             return result;
         }
         while (sameLevelIt.hasNext())
         {
-            SourceElement sameLevelElement = sameLevelIt.next();
+            final SourceElement sameLevelElement = sameLevelIt.next();
             if (name == null || name.equals(sameLevelElement.getName()))
             {
                 result.add(sameLevelElement);
@@ -243,6 +261,7 @@ public final class SourcePath
      *
      * @param sourceElement the source element for which the sibling iterator
      *        should be created, not null.
+     * @param parent the parent for the source element.
      *
      * @return the sibling iterator, or null if the input source element has
      *         no parent.
@@ -250,21 +269,21 @@ public final class SourcePath
      * @throws IllegalArgumentException if the element cannot be found in the
      *         list of children of its parent.
      */
-    private static ListIterator<SourceElement> getSiblingIteratorPositionedOnSelf(
-            SourceElement sourceElement)
+    protected static ListIterator<SourceElement> getSiblingIteratorPositionedOnSelf(
+            final SourceElement sourceElement,
+            final SourceElement parent)
     {
-        SourceElement parent = sourceElement.getParent();
         if (parent == null)
         {
             return null;
         }
-        ListIterator<SourceElement> sameLevelIt
+        final ListIterator<SourceElement> sameLevelIt
                 = parent.getChildren().listIterator();
 
         boolean found = false;
         while (sameLevelIt.hasNext())
         {
-            SourceElement sameLevelElement = sameLevelIt.next();
+            final SourceElement sameLevelElement = sameLevelIt.next();
             if (sameLevelElement == sourceElement)
             {
                 found = true;
@@ -284,6 +303,35 @@ public final class SourcePath
      * Gets the elements which can be reached from the start element by a given
      * path.
      *
+     * @param base the base object, not null.
+     * @param path the path to use, or null (which refers base).
+     *
+     * @return the list of matching source elements, not null, may be empty.
+     *
+     * @see <a href="http://www.w3.org/TR/xpath#axes">xpath axes</a>
+     */
+    public static Iterator<?> iterate(final Object base, final String path)
+    {
+        if (base == null)
+        {
+            throw new NullPointerException("base must not be null");
+        }
+        if (path == null)
+        {
+            return Arrays.asList(new Object[] {base}).iterator();
+        }
+
+        final JXPathContext context = JXPathContext.newContext(base);
+        context.setLenient(true);
+
+        final Iterator<?> iterator = context.iterate(path);
+        return iterator;
+    }
+
+    /**
+     * Gets the elements which can be reached from the start element by a given
+     * path.
+     *
      * @param sourceElement the start element, not null.
      * @param path the path to use, not null.
      *
@@ -292,8 +340,8 @@ public final class SourcePath
      * @see <a href="http://www.w3.org/TR/xpath#axes">xpath axes</a>
      */
     public static List<SourceElement> getElements(
-            SourceElement sourceElement,
-            String path)
+            final SourceElement sourceElement,
+            final String path)
     {
         if (sourceElement == null)
         {
@@ -302,23 +350,23 @@ public final class SourcePath
 
         if (path.equals(THIS_TOKEN))
         {
-            List<SourceElement> result = new ArrayList<SourceElement>(1);
+            final List<SourceElement> result = new ArrayList<SourceElement>(1);
             result.add(sourceElement);
             return result;
         }
-        StringTokenizer selectionPathTokenizer
+        final StringTokenizer selectionPathTokenizer
             = new StringTokenizer(path, PATH_LEVEL_SEPARATOR);
         List<SourceElement> currentSelection = new ArrayList<SourceElement>();
         currentSelection.add(sourceElement);
         while (selectionPathTokenizer.hasMoreTokens())
         {
-            String childName = selectionPathTokenizer.nextToken();
-            List<SourceElement> nextSelection = new ArrayList<SourceElement>();
-            for (SourceElement currentElement : currentSelection)
+            final String childName = selectionPathTokenizer.nextToken();
+            final List<SourceElement> nextSelection = new ArrayList<SourceElement>();
+            for (final SourceElement currentElement : currentSelection)
             {
                 if (childName.equals(PARENT_TOKEN))
                 {
-                    SourceElement parent = currentElement.getParent();
+                    final SourceElement parent = currentElement.getParent();
                     if (parent != null && !nextSelection.contains(parent))
                     {
                         nextSelection.add(parent);
@@ -326,14 +374,14 @@ public final class SourcePath
                 }
                 else if (ANY_ELEMENT_TOKEN.equals(childName))
                 {
-                    for (SourceElement child
+                    for (final SourceElement child
                             : currentElement.getChildren())
                     {
                         nextSelection.add(child);
                     }
                 }
                 {
-                    for (SourceElement child
+                    for (final SourceElement child
                             : currentElement.getChildren(childName))
                     {
                         nextSelection.add(child);
@@ -358,7 +406,7 @@ public final class SourcePath
      * @see <a href="http://www.w3.org/TR/xpath#axes">xpath axes</a>
      */
     public static List<SourceElement> getElementsFromRoot(
-            SourceElement rootElement,
+            final SourceElement rootElement,
             String path)
     {
         if (rootElement == null)
@@ -371,7 +419,7 @@ public final class SourcePath
                 || PATH_LEVEL_SEPARATOR.equals(path.trim()))
         {
             // use root element
-            List<SourceElement> result = new ArrayList<SourceElement>(1);
+            final List<SourceElement> result = new ArrayList<SourceElement>(1);
             result.add(rootElement);
             return result;
         }
@@ -382,7 +430,7 @@ public final class SourcePath
         {
             path = path.substring(1);
         }
-        int firstSeparatorPos = path.indexOf(PATH_LEVEL_SEPARATOR);
+        final int firstSeparatorPos = path.indexOf(PATH_LEVEL_SEPARATOR);
         String firstElementName;
         if (firstSeparatorPos == -1)
         {
@@ -402,6 +450,55 @@ public final class SourcePath
         return SourcePath.getElements(rootElement, path);
     }
 
+    /**
+     * Gets a single source element which can be reached from the start element
+     * by a given path.
+     *
+     * @param sourceElement the start element, not null.
+     * @param path the path to use, not null.
+     * @param acceptEmpty whether no match is an error(acceptEmpty=false)
+     *        or not (acceptEmpty=true)
+     *
+     * @return the single matching source elements, may be null only if
+     *         acceptEmpty=true.
+     *
+     * @throws GeneratorException if more than one source element matches,
+     *       or if no source element matches and acceptEmpty=false
+     * @see <a href="http://www.w3.org/TR/xpath#axes">xpath axes</a>
+     */
+    public static Object getObject(
+            final SourceElement sourceElement,
+            final String path,
+            final boolean acceptEmpty)
+        throws GeneratorException
+    {
+        final Iterator<?> sourceElementIt = iterate(sourceElement, path);
+        if (!sourceElementIt.hasNext())
+        {
+            if (acceptEmpty)
+            {
+                return null;
+            }
+            else
+            {
+                throw new GeneratorException(
+                        "Source element path "
+                        + path
+                        + " selects no element on source element "
+                        + sourceElement.getName());
+            }
+        }
+        final Object result = sourceElementIt.next();
+        if (sourceElementIt.hasNext())
+        {
+            throw new GeneratorException(
+                    "Source element path "
+                    + path
+                    + " selects more than a single element on source element "
+                    + sourceElement.getName());
+        }
+        return result;
+    }
 
     /**
      * Gets a single source element which can be reached from the start element
@@ -420,12 +517,12 @@ public final class SourcePath
      * @see <a href="http://www.w3.org/TR/xpath#axes">xpath axes</a>
      */
     public static SourceElement getElement(
-            SourceElement sourceElement,
-            String path,
-            boolean acceptEmpty)
+            final SourceElement sourceElement,
+            final String path,
+            final boolean acceptEmpty)
         throws GeneratorException
     {
-        List<SourceElement> sourceElements
+        final List<SourceElement> sourceElements
                 = SourcePath.getElements(sourceElement, path);
         if (sourceElements.isEmpty())
         {
@@ -464,10 +561,10 @@ public final class SourcePath
      *
      * @throws GeneratorException if the parent chain contains a closed loop.
      */
-    public static String getPathAsString(SourceElement sourceElement)
+    public static String getPathAsString(final SourceElement sourceElement)
         throws GeneratorException
     {
-        StringBuilder result = new StringBuilder();
+        final StringBuilder result = new StringBuilder();
         getParentPath(sourceElement, new HashSet<SourceElement>(), result);
         result.append(sourceElement.getName());
         return result.toString();
@@ -486,12 +583,12 @@ public final class SourcePath
      *         or if the parent chain contains a closed loop.
      */
     private static void getParentPath(
-            SourceElement toProcess,
-            Set<SourceElement> alreadyProcessed,
-            StringBuilder result)
+            final SourceElement toProcess,
+            final Set<SourceElement> alreadyProcessed,
+            final StringBuilder result)
         throws GeneratorException
     {
-        SourceElement parent = toProcess.getParent();
+        final SourceElement parent = toProcess.getParent();
         if (alreadyProcessed.contains(parent))
         {
             throw new GeneratorException(

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=1470235&r1=1470234&r2=1470235&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 Sat Apr 20 21:23:39 2013
@@ -49,12 +49,6 @@ 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
@@ -97,33 +91,6 @@ 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
@@ -177,17 +144,4 @@ 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/SourceTransformerDefinition.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceTransformerDefinition.java?rev=1470235&r1=1470234&r2=1470235&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceTransformerDefinition.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/source/SourceTransformerDefinition.java Sat Apr 20 21:23:39 2013
@@ -37,20 +37,12 @@ public final class SourceTransformerDefi
     private final SourceTransformer sourceTransformer;
 
     /**
-     * The path to the source elements on which the transformer is applied.
-     */
-    private final String elements;
-
-    /**
      * Constructor.
      *
      * @param sourceTransformer the transformer instance, not null.
-     * @param elements the elements to which the transformer is applied,
-     *        may be null.
      */
     public SourceTransformerDefinition(
-            SourceTransformer sourceTransformer,
-            String elements)
+            SourceTransformer sourceTransformer)
     {
         if (sourceTransformer == null)
         {
@@ -58,7 +50,6 @@ public final class SourceTransformerDefi
                     "sourceTransformer must not be null");
         }
         this.sourceTransformer = sourceTransformer;
-        this.elements = elements;
     }
 
     /**
@@ -71,29 +62,17 @@ public final class SourceTransformerDefi
         return sourceTransformer;
     }
 
-    /**
-     * Returns the path to the source elements to which the transformer is
-     * applied.
-     *
-     * @return The path to the transformed source elements, or null.
-     */
-    public String getElements()
-    {
-        return elements;
-    }
-
     @Override
     public String toString()
     {
-        return "SourceTransformerDefinition [elements=" + elements
-                + ", sourceTransformer=" + sourceTransformer + "]";
+        return "SourceTransformerDefinition [sourceTransformer="
+                + sourceTransformer + "]";
     }
 
     @Override
     public int hashCode()
     {
         HashCodeBuilder hashCodeBuilder = new HashCodeBuilder()
-            .append(elements)
             .append(sourceTransformer);
         return hashCodeBuilder.toHashCode();
     }
@@ -115,7 +94,6 @@ public final class SourceTransformerDefi
         }
         SourceTransformerDefinition other = (SourceTransformerDefinition) obj;
         EqualsBuilder equalsBuilder = new EqualsBuilder()
-            .append(elements, other.elements)
             .append(sourceTransformer, other.sourceTransformer);
         return equalsBuilder.isEquals();
     }



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