You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2007/02/07 19:31:41 UTC

svn commit: r504639 - in /tapestry/tapestry5/tapestry-core/trunk/src: main/java/org/apache/tapestry/ main/java/org/apache/tapestry/beaneditor/ main/java/org/apache/tapestry/corelib/components/ main/java/org/apache/tapestry/grid/ main/java/org/apache/ta...

Author: hlship
Date: Wed Feb  7 10:31:36 2007
New Revision: 504639

URL: http://svn.apache.org/viewvc?view=rev&rev=504639
Log:
Add a GridDataModel, which identifies the columns/properties of a a bean - to be used in the Grid component.
Add an override to newMemberName() to ClassTransformation that accepts a prefix and a raw base name.

Added:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/PropertyConduit.java
      - copied, changed from r503936, tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/PropertyConduit.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/ColumnModel.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridDataModel.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridPresentationModel.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/ColumnModelImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridDataModelImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridMessages.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/GridDataModelSourceImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/GridDataModelSource.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/grid/
    tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/grid/GridStrings.properties
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/GridDataModelSourceImplTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/WriteOnlyBean.java
Removed:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/PropertyConduit.java
Modified:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/PropertyEditModel.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/BeanEditForm.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryUtils.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/BeanEditorModelImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/PropertyEditModelImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/PropBinding.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/PropBindingFactory.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ApplicationStateWorker.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/BasePropertyConduit.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/CoercingPropertyConduitWrapper.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/EnvironmentalWorker.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InjectPageWorker.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ParameterWorker.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PersistWorker.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PropertyConduitSourceImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/BeanEditorModelSource.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ClassTransformation.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/PropertyConduitSource.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryUtilsTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/beaneditor/ValidateAnnotationConstraintGeneratorTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/BeanEditorModelSourceImplTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/InternalClassTransformationImplTest.java

Copied: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/PropertyConduit.java (from r503936, tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/PropertyConduit.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/PropertyConduit.java?view=diff&rev=504639&p1=tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/PropertyConduit.java&r1=503936&p2=tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/PropertyConduit.java&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/PropertyConduit.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/PropertyConduit.java Wed Feb  7 10:31:36 2007
@@ -12,9 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry.beaneditor;
-
-import org.apache.tapestry.AnnotationProvider;
+package org.apache.tapestry;
 
 /**
  * Used to read or update the value associated with a property. A PropertyConduit provides access to

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/PropertyEditModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/PropertyEditModel.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/PropertyEditModel.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/PropertyEditModel.java Wed Feb  7 10:31:36 2007
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry.beaneditor;
 
+import org.apache.tapestry.PropertyConduit;
+
 /**
  * Part of a {@link BeanEditorModel} that defines the attributes of a single edittable property of a
  * bean.
@@ -23,6 +25,12 @@
     /** Returns the name of the property. */
     String getPropertyName();
 
+    /**
+     * Returns the id used to access other resources (this is based on the property name, but with
+     * any excess punctiuation stripped out).
+     */
+    String getId();
+
     /** Returns a user-presentable label for the property. */
     String getLabel();
 
@@ -68,18 +76,6 @@
      */
     PropertyEditModel order(int order);
 
-    // "Navigation" methods useful for the "fluent" style of configuration.
-
-    /**
-     * Delegates to {@link BeanEditorModel#get(String)}.
-     */
-    PropertyEditModel get(String propertyName);
-
-    /**
-     * Delegates to {@link BeanEditorModel#add(String)}.
-     */
-    PropertyEditModel add(String propertyName);
-
-    /** Returns the containing model. */
+    /** Returns the containing model, often used for "fluent" construction of the model. */
     BeanEditorModel model();
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/BeanEditForm.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/BeanEditForm.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/BeanEditForm.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/BeanEditForm.java Wed Feb  7 10:31:36 2007
@@ -145,9 +145,7 @@
         _blockForProperty = null;
         _fieldForProperty = null;
 
-        String overrideName = propertyName.replace(".", "");
-
-        Block override = _resources.getBlockParameter(overrideName);
+        Block override = _resources.getBlockParameter(_propertyEditModel.getId());
 
         if (override != null)
         {

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/ColumnModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/ColumnModel.java?view=auto&rev=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/ColumnModel.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/ColumnModel.java Wed Feb  7 10:31:36 2007
@@ -0,0 +1,70 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.grid;
+
+import org.apache.tapestry.PropertyConduit;
+import org.apache.tapestry.beaneditor.Order;
+
+/**
+ * Provides data access and rendering information about a single column within a
+ * {@link GridDataModel}.
+ */
+public interface ColumnModel
+{
+    /**
+     * Returns the conduit used to read values for presentation purposes. The conduit will be passed
+     * a row object (of type {@link GridDataModel#getRowType()}.
+     * 
+     * @return a conduit that can (at least) read a column value for a particular row
+     */
+    PropertyConduit getConduit();
+
+    /** Returns a user-presentable label for this column. This will be used to identify the column. */
+    String getLabel();
+
+    /**
+     * Returns a name which can be used to identify the column model within the
+     * {@link GridDataModel}.
+     */
+    String getName();
+
+    /**
+     * Returns a string used to identify the column, particularily when looking for artifacts
+     * (Blocks, message keys, etc.) related to the column. Generally this is the same value as the
+     * column {@link #getName()}. When the name is, in fact, a property expression, then this is
+     * the name with all extra punctuation stripped out.
+     * 
+     * @return possibly modified name
+     */
+    String getId();
+
+    /**
+     * Returns the enclosing data model containing this column. This is often used to string
+     * together "fluent" calls (such as creating additional columns).
+     */
+    GridDataModel model();
+
+    /** Changes the label for the column then return the model for further changes. */
+    ColumnModel label(String label);
+
+    /**
+     * Returns the sort order for the columns, determined from the {@link Order} annotation on the
+     * property.
+     */
+    int getOrder();
+
+    /** Changes the order for this model and returns the model for additional changes. */
+    ColumnModel order(int order);
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridDataModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridDataModel.java?view=auto&rev=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridDataModel.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridDataModel.java Wed Feb  7 10:31:36 2007
@@ -0,0 +1,73 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.grid;
+
+import java.util.List;
+
+import org.apache.tapestry.PropertyConduit;
+import org.apache.tapestry.services.PropertyConduitSource;
+
+/**
+ * Defines the data available to be displayed inside a Grid component.
+ */
+public interface GridDataModel
+{
+    /** Returns the names of the properties, in presentation order. */
+    List<String> getPropertyNames();
+
+    /**
+     * Returns the type of object presented for each row. The row type is the basis for the
+     * (default) set of columns.
+     */
+    Class getRowType();
+
+    /**
+     * Returns the named column model.
+     * 
+     * @param name
+     *            the name of the column to retrieve
+     * @return the named column
+     * @throws RuntimeException
+     *             if no such column exists
+     */
+    ColumnModel get(String name);
+
+    /**
+     * Adds a new column model to the grid data model. The name must be a valid property name (or
+     * property expression as defined by {@link PropertyConduitSource}).
+     * 
+     * @param name
+     *            property name (or property expression)
+     * @return the newly added column model
+     * @throws RuntimeException
+     *             if the name is not a valid expression, or if the name already exists
+     */
+    ColumnModel add(String name);
+
+    /**
+     * Adds a new column model to the grid data model using an explicit {@link PropertyConduit}.
+     * This bypasses the {@link PropertyConduitSource} and is therefore used when the name does not
+     * represent a real property or property expression.
+     * 
+     * @param name
+     *            the name of the column
+     * @param conduit
+     *            used to access
+     * @return the newly added column model
+     * @throws RuntimeException
+     *             if the name already exists
+     */
+    ColumnModel add(String name, PropertyConduit conduit);
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridPresentationModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridPresentationModel.java?view=auto&rev=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridPresentationModel.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridPresentationModel.java Wed Feb  7 10:31:36 2007
@@ -0,0 +1,20 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.grid;
+
+public interface GridPresentationModel
+{
+
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryUtils.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryUtils.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryUtils.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryUtils.java Wed Feb  7 10:31:36 2007
@@ -22,7 +22,11 @@
 import java.util.Map;
 
 import org.apache.tapestry.OptionModel;
+import org.apache.tapestry.PropertyConduit;
 import org.apache.tapestry.SelectModel;
+import org.apache.tapestry.beaneditor.Order;
+import org.apache.tapestry.ioc.IOCUtilities;
+import org.apache.tapestry.ioc.Messages;
 import org.apache.tapestry.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry.ioc.internal.util.Defense;
 
@@ -60,8 +64,8 @@
 
     /**
      * Capitalizes the string, and inserts a space before each upper case character (or sequence of
-     * upper case characters). Thus "userId" becomes "User Id", etc.  Also, converts underscore
-     * into space (and capitalizes the following word), thus "user_id" also becomes "User Id".
+     * upper case characters). Thus "userId" becomes "User Id", etc. Also, converts underscore into
+     * space (and capitalizes the following word), thus "user_id" also becomes "User Id".
      */
     public static String toUserPresentable(String id)
     {
@@ -70,7 +74,7 @@
         char[] chars = id.toCharArray();
         boolean postSpace = true;
         boolean upcaseNext = true;
-        
+
         for (int i = 0; i < chars.length; i++)
         {
             char ch = chars[i];
@@ -79,10 +83,10 @@
             {
                 builder.append(Character.toUpperCase(ch));
                 upcaseNext = false;
-                
+
                 continue;
             }
-            
+
             if (ch == '_')
             {
                 builder.append(' ');
@@ -193,5 +197,40 @@
         String value = input.substring(pos + 1);
 
         return new KeyValue(key.trim(), value.trim());
+    }
+
+    public static int defaultOrder(PropertyConduit conduit)
+    {
+        Order order = conduit.getAnnotation(Order.class);
+
+        return order == null ? 0 : order.value();
+    }
+
+    /**
+     * Used to convert a property expression into a key that can be used to locate various resources
+     * (Blocks, messages, etc.). Strips out any punctuation characters, leaving just words
+     * characters (letters, number and the underscore).
+     * 
+     * @param expression
+     * @return
+     */
+    public static String extractIdFromPropertyExpression(String expression)
+    {
+        return expression.replaceAll("[^\\w]", "");
+    }
+
+    /**
+     * Looks for a label within the messages based on the id. If found, it is used, otherwise the
+     * name is converted to a user presentable form.
+     */
+    public static String defaultLabel(String id, Messages messages, String propertyExpression)
+    {
+        String key = id + "-label";
+
+        if (messages.contains(key))
+            return messages.get(key);
+
+        return toUserPresentable(extractIdFromPropertyExpression(IOCUtilities
+                .toSimpleId(propertyExpression)));
     }
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/BeanEditorModelImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/BeanEditorModelImpl.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/BeanEditorModelImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/BeanEditorModelImpl.java Wed Feb  7 10:31:36 2007
@@ -22,12 +22,10 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.tapestry.PropertyConduit;
 import org.apache.tapestry.beaneditor.BeanEditorModel;
-import org.apache.tapestry.beaneditor.PropertyConduit;
 import org.apache.tapestry.beaneditor.PropertyEditModel;
-import org.apache.tapestry.internal.TapestryUtils;
 import org.apache.tapestry.internal.services.CoercingPropertyConduitWrapper;
-import org.apache.tapestry.ioc.IOCUtilities;
 import org.apache.tapestry.ioc.Messages;
 import org.apache.tapestry.ioc.services.TypeCoercer;
 import org.apache.tapestry.services.PropertyConduitSource;
@@ -60,12 +58,10 @@
                     _beanType,
                     propertyName));
 
-        String label = defaultLabel(propertyName);
-
         PropertyConduit conduit = createConduit(propertyName);
 
-        PropertyEditModel propertyModel = new PropertyEditModelImpl(this, propertyName, conduit)
-                .label(label);
+        PropertyEditModel propertyModel = new PropertyEditModelImpl(this, propertyName, conduit,
+                _messages);
 
         _properties.put(propertyName, propertyModel);
 
@@ -120,19 +116,4 @@
 
         return result;
     }
-
-    private String defaultLabel(String propertyName)
-    {
-        // For a property path, strip off everything but the last term to form
-        // the key.
-
-        String simplePropertyName = IOCUtilities.toSimpleId(propertyName);
-        String key = simplePropertyName + "-label";
-
-        if (_messages.contains(key))
-            return _messages.get(key);
-
-        return TapestryUtils.toUserPresentable(simplePropertyName);
-    }
-
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/PropertyEditModelImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/PropertyEditModelImpl.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/PropertyEditModelImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/PropertyEditModelImpl.java Wed Feb  7 10:31:36 2007
@@ -16,10 +16,11 @@
 
 import static org.apache.tapestry.ioc.internal.util.Defense.notBlank;
 
+import org.apache.tapestry.PropertyConduit;
 import org.apache.tapestry.beaneditor.BeanEditorModel;
-import org.apache.tapestry.beaneditor.Order;
-import org.apache.tapestry.beaneditor.PropertyConduit;
 import org.apache.tapestry.beaneditor.PropertyEditModel;
+import org.apache.tapestry.internal.TapestryUtils;
+import org.apache.tapestry.ioc.Messages;
 
 public class PropertyEditModelImpl implements PropertyEditModel
 {
@@ -29,6 +30,8 @@
 
     private final PropertyConduit _conduit;
 
+    private final String _id;
+
     private String _label;
 
     private int _order;
@@ -36,16 +39,22 @@
     private String _editorType;
 
     public PropertyEditModelImpl(BeanEditorModel model, final String name,
-            final PropertyConduit conduit)
+            final PropertyConduit conduit, Messages messages)
     {
         _model = model;
         _name = name;
         _conduit = conduit;
 
-        Order annotation = conduit.getAnnotation(Order.class);
+        _id = TapestryUtils.extractIdFromPropertyExpression(name);
+        _order = TapestryUtils.defaultOrder(conduit);
 
-        if (annotation != null)
-            _order = annotation.value();
+        
+        _label = TapestryUtils.defaultLabel(_id, messages, name);
+    }
+
+    public String getId()
+    {
+        return _id;
     }
 
     public Class getPropertyType()
@@ -87,16 +96,6 @@
         _order = order;
 
         return this;
-    }
-
-    public PropertyEditModel add(String propertyName)
-    {
-        return _model.add(propertyName);
-    }
-
-    public PropertyEditModel get(String propertyName)
-    {
-        return _model.get(propertyName);
     }
 
     public BeanEditorModel model()

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/PropBinding.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/PropBinding.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/PropBinding.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/PropBinding.java Wed Feb  7 10:31:36 2007
@@ -16,7 +16,7 @@
 
 import java.lang.annotation.Annotation;
 
-import org.apache.tapestry.beaneditor.PropertyConduit;
+import org.apache.tapestry.PropertyConduit;
 import org.apache.tapestry.ioc.Location;
 import org.apache.tapestry.ioc.internal.util.TapestryException;
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/PropBindingFactory.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/PropBindingFactory.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/PropBindingFactory.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/bindings/PropBindingFactory.java Wed Feb  7 10:31:36 2007
@@ -16,7 +16,7 @@
 
 import org.apache.tapestry.Binding;
 import org.apache.tapestry.ComponentResources;
-import org.apache.tapestry.beaneditor.PropertyConduit;
+import org.apache.tapestry.PropertyConduit;
 import org.apache.tapestry.ioc.Location;
 import org.apache.tapestry.ioc.internal.util.TapestryException;
 import org.apache.tapestry.services.BindingFactory;

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/ColumnModelImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/ColumnModelImpl.java?view=auto&rev=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/ColumnModelImpl.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/ColumnModelImpl.java Wed Feb  7 10:31:36 2007
@@ -0,0 +1,98 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.grid;
+
+import org.apache.tapestry.PropertyConduit;
+import org.apache.tapestry.grid.ColumnModel;
+import org.apache.tapestry.grid.GridDataModel;
+import org.apache.tapestry.internal.TapestryUtils;
+import org.apache.tapestry.ioc.Messages;
+import org.apache.tapestry.ioc.internal.util.Defense;
+
+public class ColumnModelImpl implements ColumnModel
+{
+    private final String _name;
+
+    private final String _id;
+
+    private final PropertyConduit _conduit;
+
+    private final GridDataModel _model;
+
+    private String _label;
+
+    private int _order;
+
+    public ColumnModelImpl(String name, PropertyConduit conduit, GridDataModel dataModel,
+            Messages messages)
+    {
+        _name = name;
+        _conduit = conduit;
+        _model = dataModel;
+
+        _id = TapestryUtils.extractIdFromPropertyExpression(name);
+
+        _label = TapestryUtils.defaultLabel(_id, messages, _name);
+        
+        _order = TapestryUtils.defaultOrder(conduit);
+    }
+
+    public GridDataModel model()
+    {
+        return _model;
+    }
+
+    public PropertyConduit getConduit()
+    {
+        return _conduit;
+    }
+
+    public String getId()
+    {
+        return _id;
+    }
+
+    public String getLabel()
+    {
+        return _label;
+    }
+
+    public String getName()
+    {
+        return _name;
+    }
+
+    public int getOrder()
+    {
+        return _order;
+    }
+
+    public ColumnModel label(String label)
+    {
+        Defense.notBlank(label, "label");
+
+        _label = label;
+
+        return this;
+    }
+
+    public ColumnModel order(int order)
+    {
+        _order = order;
+
+        return this;
+    }
+
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridDataModelImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridDataModelImpl.java?view=auto&rev=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridDataModelImpl.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridDataModelImpl.java Wed Feb  7 10:31:36 2007
@@ -0,0 +1,115 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.grid;
+
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newList;
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
+import static org.apache.tapestry.ioc.internal.util.Defense.notBlank;
+import static org.apache.tapestry.ioc.internal.util.Defense.notNull;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tapestry.PropertyConduit;
+import org.apache.tapestry.grid.ColumnModel;
+import org.apache.tapestry.grid.GridDataModel;
+import org.apache.tapestry.ioc.Messages;
+import org.apache.tapestry.services.PropertyConduitSource;
+
+public class GridDataModelImpl implements GridDataModel, Comparator<ColumnModel>
+{
+    private final Class _rowType;
+
+    private final Messages _messages;
+
+    private final PropertyConduitSource _propertyConduitSource;
+
+    private final Map<String, ColumnModel> _columns = newMap();
+
+    public GridDataModelImpl(final Class rowType, final Messages messages,
+            final PropertyConduitSource propertyConduitSource)
+    {
+
+        _rowType = rowType;
+        _messages = messages;
+        _propertyConduitSource = propertyConduitSource;
+    }
+
+    public ColumnModel add(String name)
+    {
+        notBlank(name, "name");
+
+        PropertyConduit conduit = _propertyConduitSource.create(_rowType, name);
+
+        return add(name, conduit);
+    }
+
+    public ColumnModel add(String name, PropertyConduit conduit)
+    {
+        notBlank(name, "name");
+        notNull(conduit, "conduit");
+
+        if (_columns.containsKey(name))
+            throw new RuntimeException(GridMessages.duplicatePropertyName(_rowType, name));
+
+        ColumnModel model = new ColumnModelImpl(name, conduit, this, _messages);
+
+        _columns.put(name, model);
+
+        return model;
+    }
+
+    public ColumnModel get(String name)
+    {
+        ColumnModel result = _columns.get(name);
+
+        if (result == null)
+            throw new RuntimeException(GridMessages.unknownProperty(_rowType, name, _columns
+                    .keySet()));
+
+        return result;
+    }
+
+    public List<String> getPropertyNames()
+    {
+        List<ColumnModel> sorted = newList(_columns.values());
+
+        Collections.sort(sorted, this);
+
+        List<String> result = newList();
+
+        for (ColumnModel model : sorted)
+            result.add(model.getName());
+
+        return result;
+    }
+
+    public Class getRowType()
+    {
+        return _rowType;
+    }
+
+    public int compare(ColumnModel o1, ColumnModel o2)
+    {
+        int result = o1.getOrder() - o2.getOrder();
+
+        if (result == 0)
+            result = o1.getName().compareTo(o2.getName());
+
+        return result;
+    }
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridMessages.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridMessages.java?view=auto&rev=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridMessages.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridMessages.java Wed Feb  7 10:31:36 2007
@@ -0,0 +1,38 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.grid;
+
+import java.util.Collection;
+
+import org.apache.tapestry.ioc.Messages;
+import org.apache.tapestry.ioc.internal.util.InternalUtils;
+import org.apache.tapestry.ioc.internal.util.MessagesImpl;
+
+class GridMessages
+{
+    private static final Messages MESSAGES = MessagesImpl.forClass(GridMessages.class);
+
+    static String duplicatePropertyName(Class rowType, String propertyName)
+    {
+        return MESSAGES.format("duplicate-property-name", rowType.getName(), propertyName);
+    }
+
+    static String unknownProperty(Class rowType, String propertyName,
+            Collection<String> propertyNames)
+    {
+        return MESSAGES.format("unknown-property", rowType.getName(), propertyName, InternalUtils
+                .joinSorted(propertyNames));
+    }
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ApplicationStateWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ApplicationStateWorker.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ApplicationStateWorker.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ApplicationStateWorker.java Wed Feb  7 10:31:36 2007
@@ -18,7 +18,6 @@
 import java.util.List;
 
 import org.apache.tapestry.annotations.ApplicationState;
-import org.apache.tapestry.ioc.internal.util.InternalUtils;
 import org.apache.tapestry.model.MutableComponentModel;
 import org.apache.tapestry.services.ApplicationStateManager;
 import org.apache.tapestry.services.ClassTransformation;
@@ -84,8 +83,7 @@
     private void replaceWrite(ClassTransformation transformation, String fieldName,
             String fieldType, String managerFieldName, String typeField)
     {
-        String writeMethodName = transformation.newMemberName("write_"
-                + InternalUtils.stripMemberPrefix(fieldName));
+        String writeMethodName = transformation.newMemberName("write", fieldName);
 
         MethodSignature writeSignature = new MethodSignature(Modifier.PRIVATE, "void",
                 writeMethodName, new String[]
@@ -102,8 +100,7 @@
             String fieldType, String managerFieldName, String typeField)
     {
 
-        String readMethodName = transformation.newMemberName("read_"
-                + InternalUtils.stripMemberPrefix(fieldName));
+        String readMethodName = transformation.newMemberName("read", fieldName);
 
         MethodSignature readMethodSignature = new MethodSignature(Modifier.PRIVATE, fieldType,
                 readMethodName, null, null);

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/BasePropertyConduit.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/BasePropertyConduit.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/BasePropertyConduit.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/BasePropertyConduit.java Wed Feb  7 10:31:36 2007
@@ -17,7 +17,7 @@
 import java.lang.annotation.Annotation;
 
 import org.apache.tapestry.AnnotationProvider;
-import org.apache.tapestry.beaneditor.PropertyConduit;
+import org.apache.tapestry.PropertyConduit;
 import org.apache.tapestry.services.PropertyConduitSource;
 
 /**

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/CoercingPropertyConduitWrapper.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/CoercingPropertyConduitWrapper.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/CoercingPropertyConduitWrapper.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/CoercingPropertyConduitWrapper.java Wed Feb  7 10:31:36 2007
@@ -16,7 +16,7 @@
 
 import java.lang.annotation.Annotation;
 
-import org.apache.tapestry.beaneditor.PropertyConduit;
+import org.apache.tapestry.PropertyConduit;
 import org.apache.tapestry.ioc.services.TypeCoercer;
 
 public class CoercingPropertyConduitWrapper implements PropertyConduit

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/EnvironmentalWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/EnvironmentalWorker.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/EnvironmentalWorker.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/EnvironmentalWorker.java Wed Feb  7 10:31:36 2007
@@ -18,7 +18,6 @@
 import java.util.List;
 
 import org.apache.tapestry.annotations.Environmental;
-import org.apache.tapestry.ioc.internal.util.InternalUtils;
 import org.apache.tapestry.model.MutableComponentModel;
 import org.apache.tapestry.services.ClassTransformation;
 import org.apache.tapestry.services.ComponentClassTransformWorker;
@@ -64,8 +63,7 @@
 
             // Caching might be good for efficiency at some point.
 
-            String methodName = transformation.newMemberName("environment_read_"
-                    + InternalUtils.stripMemberPrefix(name));
+            String methodName = transformation.newMemberName("environment_read", name);
 
             MethodSignature sig = new MethodSignature(Modifier.PRIVATE, type, methodName, null,
                     null);

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/GridDataModelSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/GridDataModelSourceImpl.java?view=auto&rev=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/GridDataModelSourceImpl.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/GridDataModelSourceImpl.java Wed Feb  7 10:31:36 2007
@@ -0,0 +1,62 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.services;
+
+import org.apache.tapestry.ComponentResources;
+import org.apache.tapestry.grid.GridDataModel;
+import org.apache.tapestry.internal.grid.GridDataModelImpl;
+import org.apache.tapestry.ioc.Messages;
+import org.apache.tapestry.ioc.internal.util.Defense;
+import org.apache.tapestry.ioc.services.ClassPropertyAdapter;
+import org.apache.tapestry.ioc.services.PropertyAccess;
+import org.apache.tapestry.services.GridDataModelSource;
+import org.apache.tapestry.services.PropertyConduitSource;
+
+public class GridDataModelSourceImpl implements GridDataModelSource
+{
+    private final PropertyAccess _access;
+
+    private final PropertyConduitSource _source;
+
+    public GridDataModelSourceImpl(PropertyAccess access, PropertyConduitSource source)
+    {
+        _access = access;
+        _source = source;
+    }
+
+    public GridDataModel create(Class rowType, ComponentResources resources)
+    {
+        Defense.notNull(rowType, "rowType");
+        Defense.notNull(resources, "resources");
+
+        Messages messages = resources.getMessages();
+
+        GridDataModel model = new GridDataModelImpl(rowType, messages, _source);
+
+        ClassPropertyAdapter adapter = _access.getAdapter(rowType);
+
+        for (String name : adapter.getPropertyNames())
+        {
+            if (name.equals("class"))
+                continue;
+
+            if (adapter.getPropertyAdapter(name).isRead())
+                model.add(name);
+        }
+
+        return model;
+    }
+
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InjectPageWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InjectPageWorker.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InjectPageWorker.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InjectPageWorker.java Wed Feb  7 10:31:36 2007
@@ -65,8 +65,7 @@
         String pageName = annotation.value();
 
         String fieldType = transformation.getFieldType(fieldName);
-        String methodName = transformation.newMemberName("_read_inject_page_"
-                + InternalUtils.stripMemberPrefix(fieldName));
+        String methodName = transformation.newMemberName("read_inject_page", fieldName);
 
         MethodSignature sig = new MethodSignature(Modifier.PRIVATE, fieldType, methodName, null,
                 null);

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java Wed Feb  7 10:31:36 2007
@@ -410,6 +410,11 @@
         return _idAllocator.allocateId(memberName);
     }
 
+    public String newMemberName(String prefix, String baseName)
+    {
+        return newMemberName(prefix + "_" + InternalUtils.stripMemberPrefix(baseName));
+    }
+
     public void addImplementedInterface(Class interfaceClass)
     {
         failIfFrozen();
@@ -1333,7 +1338,7 @@
 
     public void makeReadOnly(String fieldName)
     {
-        String methodName = newMemberName("write_" + InternalUtils.stripMemberPrefix(fieldName));
+        String methodName = newMemberName("write", fieldName);
 
         String fieldType = getFieldType(fieldName);
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ParameterWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ParameterWorker.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ParameterWorker.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ParameterWorker.java Wed Feb  7 10:31:36 2007
@@ -274,7 +274,7 @@
 
         builder.end();
 
-        String methodName = transformation.newMemberName("update_parameter_" + parameterName);
+        String methodName = transformation.newMemberName("update_parameter", parameterName);
 
         MethodSignature signature = new MethodSignature(Modifier.PRIVATE, "void", methodName,
                 new String[]
@@ -334,7 +334,7 @@
         builder.addln("return result;");
         builder.end();
 
-        String methodName = transformation.newMemberName("read_parameter_" + parameterName);
+        String methodName = transformation.newMemberName("read_parameter", parameterName);
 
         MethodSignature signature = new MethodSignature(Modifier.PRIVATE, fieldType, methodName,
                 null, null);

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PersistWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PersistWorker.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PersistWorker.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PersistWorker.java Wed Feb  7 10:31:36 2007
@@ -19,7 +19,6 @@
 import java.lang.reflect.Modifier;
 
 import org.apache.tapestry.annotations.Persist;
-import org.apache.tapestry.ioc.internal.util.InternalUtils;
 import org.apache.tapestry.ioc.util.BodyBuilder;
 import org.apache.tapestry.model.MutableComponentModel;
 import org.apache.tapestry.services.ClassTransformation;
@@ -82,8 +81,7 @@
 
         String resourcesFieldName = transformation.getResourcesFieldName();
 
-        String writeMethodName = transformation.newMemberName("_write_"
-                + InternalUtils.stripMemberPrefix(fieldName));
+        String writeMethodName = transformation.newMemberName("write", fieldName);
 
         BodyBuilder builder = new BodyBuilder();
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PropertyConduitSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PropertyConduitSourceImpl.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PropertyConduitSourceImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PropertyConduitSourceImpl.java Wed Feb  7 10:31:36 2007
@@ -24,7 +24,7 @@
 import java.util.Map;
 
 import org.apache.tapestry.AnnotationProvider;
-import org.apache.tapestry.beaneditor.PropertyConduit;
+import org.apache.tapestry.PropertyConduit;
 import org.apache.tapestry.events.InvalidationListener;
 import org.apache.tapestry.internal.util.MultiKey;
 import org.apache.tapestry.ioc.services.ClassFab;

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/BeanEditorModelSource.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/BeanEditorModelSource.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/BeanEditorModelSource.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/BeanEditorModelSource.java Wed Feb  7 10:31:36 2007
@@ -30,6 +30,9 @@
      * {@link Order} annotation on the getter or setter methods. The labels for the properties are
      * derived from the property names, but if the component's message catalog has keys of the form
      * <code>propertyName-label</code>, then those will be used instead.
+     * <p>
+     * Models are <em>mutable</em>, so they are not cached, a fresh instance is created each
+     * time.
      * 
      * @param beanClass
      *            class of object to be editted

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ClassTransformation.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ClassTransformation.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ClassTransformation.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ClassTransformation.java Wed Feb  7 10:31:36 2007
@@ -58,10 +58,21 @@
     String newMemberName(String suggested);
 
     /**
-     * Generates a list of the names of declared instance fields that have the indicated annotation. Non-private and static
-     * fields are ignored.
-     * Only the names of private instance fields are returned. Any
-     * {@link #claimField(String, Object) claimed} fields are excluded.
+     * As with {@link #newMemberName(String)}, but the suggested name is constructed from the
+     * prefix and base name. An underscore will seperate the prefix from the base name.
+     * 
+     * @param prefix
+     *            for the generated name
+     * @param baseName
+     *            an name, often of an existing field or method
+     * @return a unique name
+     */
+    String newMemberName(String prefix, String baseName);
+
+    /**
+     * Generates a list of the names of declared instance fields that have the indicated annotation.
+     * Non-private and static fields are ignored. Only the names of private instance fields are
+     * returned. Any {@link #claimField(String, Object) claimed} fields are excluded.
      */
     List<String> findFieldsWithAnnotation(Class<? extends Annotation> annotationClass);
 
@@ -90,8 +101,8 @@
     List<MethodSignature> findMethods(MethodFilter filter);
 
     /**
-     * Finds all unclaimed fields matched by the provided filter.  Only considers
-     * unclaimed, private, instance fields.
+     * Finds all unclaimed fields matched by the provided filter. Only considers unclaimed, private,
+     * instance fields.
      * 
      * @param filter
      *            passed each field name and field type

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/GridDataModelSource.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/GridDataModelSource.java?view=auto&rev=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/GridDataModelSource.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/GridDataModelSource.java Wed Feb  7 10:31:36 2007
@@ -0,0 +1,40 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.services;
+
+import org.apache.tapestry.ComponentResources;
+import org.apache.tapestry.grid.GridDataModel;
+
+public interface GridDataModelSource
+{
+    /**
+     * Creates a new GridDataModel around the provided bean class (the "row type"), including in it
+     * all the readable properties of the (excluding "class", which is inherited from
+     * java.lang.Object).
+     * <p>
+     * The resources are used to access messages of the component, which provides overrides of the
+     * labels (which otherwise are computed from the property names).
+     * <p>
+     * Models are <em>mutable</em>, so they are not cached, a fresh instance is created each
+     * time.
+     * 
+     * @param rowType
+     *            determines the properties of the model
+     * @param resources
+     *            used when resolving resources, i.e., column labels
+     * @return a model
+     */
+    GridDataModel create(Class rowType, ComponentResources resources);
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/PropertyConduitSource.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/PropertyConduitSource.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/PropertyConduitSource.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/PropertyConduitSource.java Wed Feb  7 10:31:36 2007
@@ -14,7 +14,7 @@
 
 package org.apache.tapestry.services;
 
-import org.apache.tapestry.beaneditor.PropertyConduit;
+import org.apache.tapestry.PropertyConduit;
 import org.apache.tapestry.internal.bindings.PropBindingFactory;
 
 /**

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java Wed Feb  7 10:31:36 2007
@@ -90,6 +90,7 @@
 import org.apache.tapestry.internal.services.FieldValidatorDefaultSourceImpl;
 import org.apache.tapestry.internal.services.FieldValidatorSourceImpl;
 import org.apache.tapestry.internal.services.FlashPersistentFieldStrategy;
+import org.apache.tapestry.internal.services.GridDataModelSourceImpl;
 import org.apache.tapestry.internal.services.HeartbeatImpl;
 import org.apache.tapestry.internal.services.InfrastructureImpl;
 import org.apache.tapestry.internal.services.InfrastructureManagerImpl;
@@ -208,6 +209,10 @@
 
     private final LinkFactory _linkFactory;
 
+    private final PropertyAccess _propertyAccess;
+
+    private final PropertyConduitSource _propertyConduitSource;
+
     // Yes, you can inject services defined by this module into this module. The service proxy is
     // created without instantiating the module itself. We're careful about making as many
     // service builder and contributor methods static as possible to avoid recursive build
@@ -247,7 +252,13 @@
     ComponentInstantiatorSource componentInstantiatorSource,
 
     @InjectService("tapestry.internal.LinkFactory")
-    LinkFactory linkFactory)
+    LinkFactory linkFactory,
+
+    @Inject("infrastructure:PropertyConduitSource")
+    PropertyConduitSource propertyConduitSource,
+
+    @Inject("infrastructure:PropertyAccess")
+    PropertyAccess propertyAccess)
     {
         _pipelineBuilder = pipelineBuilder;
         _shadowBuilder = shadowBuilder;
@@ -261,6 +272,8 @@
         _strategyBuilder = strategyBuilder;
         _componentInstantiatorSource = componentInstantiatorSource;
         _linkFactory = linkFactory;
+        _propertyAccess = propertyAccess;
+        _propertyConduitSource = propertyConduitSource;
     }
 
     /**
@@ -527,6 +540,7 @@
                 Environment.class,
                 FieldValidatorDefaultSource.class,
                 FieldValidatorSource.class,
+                GridDataModelSource.class,
                 MarkupWriterFactory.class,
                 PersistentFieldManager.class,
                 PropertyConduitSource.class,
@@ -806,9 +820,10 @@
         add(configuration, TransformConstants.AFTER_RENDER_SIGNATURE, AfterRender.class, true);
         add(configuration, TransformConstants.CLEANUP_RENDER_SIGNATURE, CleanupRender.class, true);
 
-        // Ideally, these should be ordered pretty late in the process to make sure there are no side effects
+        // Ideally, these should be ordered pretty late in the process to make sure there are no
+        // side effects
         // with other workers that do work inside the page lifecycle methods.
-        
+
         add(
                 configuration,
                 PageLoaded.class,
@@ -1255,19 +1270,15 @@
      * The configurationof the model source is a mapping from type to string. The types are property
      * types and the values, the strings, represent different type of editors.
      */
-    public BeanEditorModelSource buildBeanEditorModelSource(@Inject("infrastructure:TypeCoercer")
-    TypeCoercer typeCoercer,
+    public BeanEditorModelSource buildBeanEditorModelSource(
 
-    @Inject("infrastructure:PropertyAccess")
-    PropertyAccess propertyAccess,
-
-    @Inject("infrastructure:PropertyConduitSource")
-    PropertyConduitSource propertyConduitSource,
+    @Inject("infrastructure:TypeCoercer")
+    TypeCoercer typeCoercer,
 
     Map<Class, String> configuration)
     {
         BeanEditorModelSourceImpl service = new BeanEditorModelSourceImpl(typeCoercer,
-                propertyAccess, propertyConduitSource, configuration);
+                _propertyAccess, _propertyConduitSource, configuration);
 
         _componentInstantiatorSource.addInvalidationListener(service);
 
@@ -1325,17 +1336,20 @@
     }
 
     public PropertyConduitSource buildPropertyConduitSource(
-            @Inject("infrastructure:PropertyAccess")
-            PropertyAccess propertyAccess,
 
-            @InjectService("ComponentClassFactory")
-            ClassFactory componentClassFactory)
+    @InjectService("ComponentClassFactory")
+    ClassFactory componentClassFactory)
     {
-        PropertyConduitSourceImpl service = new PropertyConduitSourceImpl(propertyAccess,
+        PropertyConduitSourceImpl service = new PropertyConduitSourceImpl(_propertyAccess,
                 componentClassFactory);
 
         _componentInstantiatorSource.addInvalidationListener(service);
 
         return service;
+    }
+
+    public GridDataModelSource buildGridDataModelSource()
+    {
+        return new GridDataModelSourceImpl(_propertyAccess, _propertyConduitSource);
     }
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java Wed Feb  7 10:31:36 2007
@@ -44,12 +44,12 @@
 import org.apache.tapestry.FieldValidator;
 import org.apache.tapestry.Link;
 import org.apache.tapestry.MarkupWriter;
+import org.apache.tapestry.PropertyConduit;
 import org.apache.tapestry.Translator;
 import org.apache.tapestry.ValidationTracker;
 import org.apache.tapestry.Validator;
 import org.apache.tapestry.annotations.Inject;
 import org.apache.tapestry.annotations.Parameter;
-import org.apache.tapestry.beaneditor.PropertyConduit;
 import org.apache.tapestry.beaneditor.PropertyEditModel;
 import org.apache.tapestry.ioc.Location;
 import org.apache.tapestry.ioc.Messages;
@@ -202,6 +202,12 @@
         expect(transformation.newMemberName(suggested)).andReturn(name);
     }
 
+    protected final void train_newMemberName(ClassTransformation transformation, String prefix,
+            String baseName, String name)
+    {
+        expect(transformation.newMemberName(prefix, baseName)).andReturn(name);
+    }
+
     protected final void train_extendMethod(ClassTransformation transformation,
             MethodSignature signature, String... body)
     {
@@ -801,7 +807,9 @@
         return newMock(AnnotationProvider.class);
     }
 
-    protected final void train_createValidator(FieldValidatorSource source, Field field, String validatorType, String constraintValue, String overrideId, Messages overrideMessages, Locale locale, FieldValidator result)
+    protected final void train_createValidator(FieldValidatorSource source, Field field,
+            String validatorType, String constraintValue, String overrideId,
+            Messages overrideMessages, Locale locale, FieldValidator result)
     {
         expect(
                 source.createValidator(
@@ -813,7 +821,8 @@
                         locale)).andReturn(result);
     }
 
-    protected final void train_buildConstraints(ValidationConstraintGenerator generator, Class propertyType, AnnotationProvider provider, String... constraints)
+    protected final void train_buildConstraints(ValidationConstraintGenerator generator,
+            Class propertyType, AnnotationProvider provider, String... constraints)
     {
         expect(generator.buildConstraints(propertyType, provider)).andReturn(
                 Arrays.asList(constraints));

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/grid/GridStrings.properties
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/grid/GridStrings.properties?view=auto&rev=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/grid/GridStrings.properties (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/grid/GridStrings.properties Wed Feb  7 10:31:36 2007
@@ -0,0 +1,16 @@
+# Copyright 2007 The Apache Software Foundation
+#
+# Licensed 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.
+
+duplicate-property-name=Grid data model for %s already contains a column model for property '%s'.
+unknown-property=Grid data model for %s does not contain a property named '%s'.  Available properties: %s.
\ No newline at end of file

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml Wed Feb  7 10:31:36 2007
@@ -27,6 +27,7 @@
       <package name="org.apache.internal"/>
       <package name="org.apache.tapestry.internal"/>
       <package name="org.apache.tapestry.internal.beaneditor"/>
+      <package name="org.apache.tapestry.internal.grid"/>
       <package name="org.apache.tapestry.internal.services"/>
       <package name="org.apache.tapestry.internal.structure"/>
       <package name="org.apache.tapestry.internal.util"/>

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryUtilsTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryUtilsTest.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryUtilsTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryUtilsTest.java Wed Feb  7 10:31:36 2007
@@ -20,8 +20,11 @@
 import java.util.Map;
 
 import org.apache.tapestry.OptionModel;
+import org.apache.tapestry.PropertyConduit;
 import org.apache.tapestry.SelectModel;
+import org.apache.tapestry.beaneditor.Order;
 import org.apache.tapestry.internal.test.InternalBaseTestCase;
+import org.apache.tapestry.ioc.Messages;
 import org.apache.tapestry.ioc.services.TypeCoercer;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
@@ -209,5 +212,78 @@
 
         assertEquals(kv.getKey(), "mykey");
         assertEquals(kv.getValue(), "myvalue");
+    }
+
+    @Test
+    public void default_order_no_annotation()
+    {
+        PropertyConduit conduit = newPropertyConduit();
+
+        train_getAnnotation(conduit, Order.class, null);
+
+        replay();
+
+        assertEquals(TapestryUtils.defaultOrder(conduit), 0);
+
+        verify();
+    }
+
+    @Test
+    public void default_order_with_annotation()
+    {
+        PropertyConduit conduit = newPropertyConduit();
+        Order order = newMock(Order.class);
+
+        train_getAnnotation(conduit, Order.class, order);
+
+        expect(order.value()).andReturn(99);
+
+        replay();
+
+        assertEquals(TapestryUtils.defaultOrder(conduit), 99);
+
+        verify();
+    }
+
+    @Test
+    public void extract_id_from_property_expression()
+    {
+        assertEquals(TapestryUtils.extractIdFromPropertyExpression("simpleName"), "simpleName");
+        assertEquals(
+                TapestryUtils.extractIdFromPropertyExpression("complex.name().withStuff"),
+                "complexnamewithStuff");
+        assertEquals(
+                TapestryUtils.extractIdFromPropertyExpression("number99.withABullet"),
+                "number99withABullet");
+    }
+
+    @Test
+    public void default_label_key_found()
+    {
+        Messages messages = newMessages();
+        train_contains(messages, "myid-label", true);
+        train_get(messages, "myid-label", "My Id");
+
+        replay();
+
+        assertEquals(TapestryUtils.defaultLabel("myid", messages, "myid-name-not-used"), "My Id");
+
+        verify();
+    }
+
+    @Test
+    public void default_label_from_name()
+    {
+        Messages messages = newMessages();
+
+        stub_contains(messages, false);
+
+        replay();
+
+        assertEquals(
+                TapestryUtils.defaultLabel("foobarbazbiff", messages, "foo.bar().baz.biff()"),
+                "Biff");
+
+        verify();
     }
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/beaneditor/ValidateAnnotationConstraintGeneratorTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/beaneditor/ValidateAnnotationConstraintGeneratorTest.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/beaneditor/ValidateAnnotationConstraintGeneratorTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/beaneditor/ValidateAnnotationConstraintGeneratorTest.java Wed Feb  7 10:31:36 2007
@@ -16,7 +16,7 @@
 
 import java.util.Arrays;
 
-import org.apache.tapestry.beaneditor.PropertyConduit;
+import org.apache.tapestry.PropertyConduit;
 import org.apache.tapestry.beaneditor.Validate;
 import org.apache.tapestry.internal.test.InternalBaseTestCase;
 import org.apache.tapestry.services.ValidationConstraintGenerator;

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/BeanEditorModelSourceImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/BeanEditorModelSourceImplTest.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/BeanEditorModelSourceImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/BeanEditorModelSourceImplTest.java Wed Feb  7 10:31:36 2007
@@ -18,8 +18,8 @@
 import java.util.Collections;
 
 import org.apache.tapestry.ComponentResources;
+import org.apache.tapestry.PropertyConduit;
 import org.apache.tapestry.beaneditor.BeanEditorModel;
-import org.apache.tapestry.beaneditor.PropertyConduit;
 import org.apache.tapestry.beaneditor.PropertyEditModel;
 import org.apache.tapestry.internal.test.InternalBaseTestCase;
 import org.apache.tapestry.ioc.Messages;
@@ -275,8 +275,8 @@
         train_getMessages(resources, messages);
         stub_contains(messages, false);
 
-        train_contains(messages, "age-label", true);
-        train_get(messages, "age-label", "Years of Age");
+        train_contains(messages, "simpleage-label", true);
+        train_get(messages, "simpleage-label", "Years of Age");
 
         replay();
 

Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/GridDataModelSourceImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/GridDataModelSourceImplTest.java?view=auto&rev=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/GridDataModelSourceImplTest.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/GridDataModelSourceImplTest.java Wed Feb  7 10:31:36 2007
@@ -0,0 +1,273 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.services;
+
+import java.util.Arrays;
+
+import org.apache.tapestry.ComponentResources;
+import org.apache.tapestry.PropertyConduit;
+import org.apache.tapestry.grid.ColumnModel;
+import org.apache.tapestry.grid.GridDataModel;
+import org.apache.tapestry.internal.test.InternalBaseTestCase;
+import org.apache.tapestry.ioc.Messages;
+import org.apache.tapestry.services.GridDataModelSource;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class GridDataModelSourceImplTest extends InternalBaseTestCase
+{
+    private GridDataModelSource _source;
+
+    @BeforeClass
+    public void setup()
+    {
+        _source = getObject("infrastructure:GridDataModelSource", GridDataModelSource.class);
+    }
+
+    @AfterClass
+    public void cleanup()
+    {
+        _source = null;
+    }
+
+    @Test
+    public void default_model_for_bean()
+    {
+        ComponentResources resources = newComponentResources();
+        Messages messages = newMessages();
+
+        train_getMessages(resources, messages);
+        stub_contains(messages, false);
+
+        replay();
+
+        GridDataModel model = _source.create(SimpleBean.class, resources);
+
+        assertSame(model.getRowType(), SimpleBean.class);
+
+        // class is not in the list
+
+        assertEquals(model.getPropertyNames(), Arrays.asList("age", "firstName", "lastName"));
+
+        ColumnModel age = model.get("age");
+
+        assertEquals(age.getLabel(), "Age");
+
+        ColumnModel firstName = model.get("firstName");
+
+        assertEquals(firstName.getLabel(), "First Name");
+
+        assertEquals(model.get("lastName").getLabel(), "Last Name");
+
+        PropertyConduit conduit = model.get("lastName").getConduit();
+
+        SimpleBean instance = new SimpleBean();
+        instance.setLastName("Lewis Ship");
+
+        assertEquals(conduit.get(instance), "Lewis Ship");
+
+        verify();
+    }
+
+    @Test
+    public void add_duplicate_property_name_is_failure()
+    {
+        ComponentResources resources = newComponentResources();
+        Messages messages = newMessages();
+
+        train_getMessages(resources, messages);
+        stub_contains(messages, false);
+
+        replay();
+
+        GridDataModel model = _source.create(SimpleBean.class, resources);
+
+        try
+        {
+            model.add("age");
+            unreachable();
+        }
+        catch (RuntimeException ex)
+        {
+            assertEquals(
+                    ex.getMessage(),
+                    "Grid data model for org.apache.tapestry.internal.services.SimpleBean already contains a column model for property \'age\'.");
+        }
+
+        verify();
+    }
+
+    @Test
+    public void unknown_property_name()
+    {
+        ComponentResources resources = newComponentResources();
+        Messages messages = newMessages();
+
+        train_getMessages(resources, messages);
+        stub_contains(messages, false);
+
+        replay();
+
+        GridDataModel model = _source.create(SimpleBean.class, resources);
+
+        try
+        {
+            model.get("frobozz");
+            unreachable();
+        }
+        catch (RuntimeException ex)
+        {
+            assertEquals(
+                    ex.getMessage(),
+                    "Grid data model for org.apache.tapestry.internal.services.SimpleBean does not contain a property named \'frobozz\'.  "
+                            + "Available properties: age, firstName, lastName.");
+        }
+
+        verify();
+    }
+
+    @Test
+    public void order_via_annotation()
+    {
+        ComponentResources resources = newComponentResources();
+        Messages messages = newMessages();
+
+        train_getMessages(resources, messages);
+        stub_contains(messages, false);
+
+        replay();
+
+        GridDataModel model = _source.create(StoogeBean.class, resources);
+
+        assertEquals(model.getPropertyNames(), Arrays.asList("larry", "moe", "shemp", "curly"));
+
+        verify();
+    }
+
+    @Test
+    public void override_order()
+    {
+        ComponentResources resources = newComponentResources();
+        Messages messages = newMessages();
+
+        train_getMessages(resources, messages);
+        stub_contains(messages, false);
+
+        replay();
+
+        GridDataModel model = _source.create(StoogeBean.class, resources);
+
+        model.get("larry").order(10000);
+
+        assertEquals(model.getPropertyNames(), Arrays.asList("moe", "shemp", "curly", "larry"));
+
+        verify();
+    }
+
+    @Test
+    public void edit_property_label()
+    {
+        ComponentResources resources = newComponentResources();
+        Messages messages = newMessages();
+
+        train_getMessages(resources, messages);
+        stub_contains(messages, false);
+
+        replay();
+
+        GridDataModel model = _source.create(SimpleBean.class, resources).get("age").label(
+                "Decrepitude").model();
+
+        assertEquals(model.get("age").getLabel(), "Decrepitude");
+
+        verify();
+    }
+
+    @Test
+    public void label_from_component_messages()
+    {
+        ComponentResources resources = newComponentResources();
+        Messages messages = newMessages();
+
+        train_getMessages(resources, messages);
+        stub_contains(messages, false);
+
+        train_contains(messages, "age-label", true);
+        train_get(messages, "age-label", "Decrepitude");
+
+        replay();
+
+        GridDataModel model = _source.create(SimpleBean.class, resources);
+
+        assertEquals(model.get("age").getLabel(), "Decrepitude");
+
+        verify();
+    }
+
+    @Test
+    public void composite_bean()
+    {
+        ComponentResources resources = newComponentResources();
+        Messages messages = newMessages();
+
+        train_getMessages(resources, messages);
+        stub_contains(messages, false);
+
+        train_contains(messages, "simpleage-label", true);
+        train_get(messages, "simpleage-label", "Years of Age");
+
+        replay();
+
+        GridDataModel model = _source.create(CompositeBean.class, resources);
+
+        assertEquals(model.getPropertyNames(), Arrays.asList("simple"));
+
+        // There's not editor for string arrays yet, so it won't show up normally.
+
+        ColumnModel firstName = model.add("simple.firstName");
+
+        assertEquals(firstName.getLabel(), "First Name");
+
+        ColumnModel age = model.add("simple.age");
+        assertEquals(age.getLabel(), "Years of Age");
+
+        CompositeBean bean = new CompositeBean();
+
+        bean.getSimple().setFirstName("Charlie");
+
+        assertEquals(firstName.getConduit().get(bean), "Charlie");
+
+        verify();
+    }
+
+    @Test
+    public void default_properties_exclude_write_only()
+    {
+        ComponentResources resources = newComponentResources();
+        Messages messages = newMessages();
+
+        train_getMessages(resources, messages);
+        stub_contains(messages, false);
+
+        replay();
+
+        GridDataModel model = _source.create(WriteOnlyBean.class, resources);
+
+        assertEquals(model.getPropertyNames(), Arrays.asList("readOnly", "readWrite"));
+
+        verify();
+    }
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/InternalClassTransformationImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/InternalClassTransformationImplTest.java?view=diff&rev=504639&r1=504638&r2=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/InternalClassTransformationImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/InternalClassTransformationImplTest.java Wed Feb  7 10:31:36 2007
@@ -63,7 +63,6 @@
 import org.testng.annotations.Test;
 
 /**
- * <p>
  * The tests share a number of resources, and so are run sequentially.
  */
 @Test(sequential = true)
@@ -143,6 +142,28 @@
         assertEquals(ct.newMemberName("_parentField"), "_$parentField");
         assertEquals(ct.newMemberName("conflictField"), "_$conflictField_0");
         assertEquals(ct.newMemberName("conflictMethod"), "_$conflictMethod_0");
+
+        verify();
+    }
+
+    @Test
+    public void new_member_name_with_prefix() throws Exception
+    {
+        Log log = newLog();
+
+        replay();
+
+        ClassTransformation ct = createClassTransformation(ParentClass.class, log);
+
+        assertEquals(ct.newMemberName("prefix", "fred"), "_$prefix_fred");
+        assertEquals(ct.newMemberName("prefix", "fred"), "_$prefix_fred_0");
+
+        // Here we're exposing a bit of the internal algorithm, which strips
+        // off '$' and '_' before tacking "_$" in front.
+
+        assertEquals(ct.newMemberName("prefix", "_fred"), "_$prefix_fred_1");
+        assertEquals(ct.newMemberName("prefix", "_$fred"), "_$prefix_fred_2");
+        assertEquals(ct.newMemberName("prefix", "__$___$____$_fred"), "_$prefix_fred_3");
 
         verify();
     }

Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/WriteOnlyBean.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/WriteOnlyBean.java?view=auto&rev=504639
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/WriteOnlyBean.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/WriteOnlyBean.java Wed Feb  7 10:31:36 2007
@@ -0,0 +1,36 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.services;
+
+public class WriteOnlyBean
+{
+    public String getReadWrite()
+    {
+        return null;
+    }
+
+    public void setReadWrite(String value)
+    {
+    }
+
+    public String getReadOnly()
+    {
+        return null;
+    }
+
+    public void setWriteOnly(String value)
+    {
+    }
+}