You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by uk...@apache.org on 2014/05/19 22:41:56 UTC

[2/2] git commit: TAP5-1213 - Refactor public API changes to be backwards compatible

TAP5-1213 - Refactor public API changes to be backwards compatible


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/737ebd64
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/737ebd64
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/737ebd64

Branch: refs/heads/master
Commit: 737ebd64cf8f1607b5c755c7967260e1e755633d
Parents: daa2790
Author: uklance <uk...@gmail.com>
Authored: Mon May 19 21:33:03 2014 +0100
Committer: uklance <uk...@gmail.com>
Committed: Mon May 19 21:34:52 2014 +0100

----------------------------------------------------------------------
 .../main/java/org/apache/tapestry5/Binding.java |  9 -----
 .../java/org/apache/tapestry5/Binding2.java     | 38 +++++++++++++++++++
 .../org/apache/tapestry5/PropertyConduit.java   | 13 -------
 .../org/apache/tapestry5/PropertyConduit2.java  | 40 ++++++++++++++++++++
 .../internal/InternalPropertyConduit.java       |  6 +--
 .../internal/TapestryInternalUtils.java         |  6 ++-
 .../internal/bindings/AbstractBinding.java      |  3 +-
 .../internal/bindings/InternalPropBinding.java  |  4 +-
 .../internal/bindings/PropBinding.java          | 17 ++++++---
 .../CoercingPropertyConduitWrapper.java         | 14 ++++---
 .../services/PropertyConduitSourceImpl.java     |  3 +-
 .../InternalComponentResourcesImpl.java         |  9 ++++-
 .../integration/app1/CoreBehaviorsTests.java    | 18 ++++-----
 .../app1/components/GenericTypeDisplay.java     |  8 ++--
 .../integration/app1/pages/GenericTypeDemo.java | 14 +------
 .../services/PropertyConduitSourceImplTest.java | 19 +++++-----
 .../integration/app1/pages/GenericTypeDemo.tml  | 18 ++++-----
 17 files changed, 153 insertions(+), 86 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/main/java/org/apache/tapestry5/Binding.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/Binding.java b/tapestry-core/src/main/java/org/apache/tapestry5/Binding.java
index 711c748..8a99914 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/Binding.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/Binding.java
@@ -14,8 +14,6 @@
 
 package org.apache.tapestry5;
 
-import java.lang.reflect.Type;
-
 import org.apache.tapestry5.ioc.AnnotationProvider;
 
 /**
@@ -55,11 +53,4 @@ public interface Binding extends AnnotationProvider
      * bound.
      */
     Class getBindingType();
-    
-    /**
-     * Returns the generic type of the binding, either the generic type of resource exposed by the binding, or the 
-     * generic type of the property bound.
-     * @since 5.4
-     */
-    Type getBindingGenericType();
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/main/java/org/apache/tapestry5/Binding2.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/Binding2.java b/tapestry-core/src/main/java/org/apache/tapestry5/Binding2.java
new file mode 100644
index 0000000..7569a8c
--- /dev/null
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/Binding2.java
@@ -0,0 +1,38 @@
+// Copyright 2006-2013 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.tapestry5;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+
+import org.apache.tapestry5.services.BindingFactory;
+
+/**
+ * Extension to {@link Binding} that adds a method to access the generic property type.
+ * {@link BindingFactory} instances should ideally return Binding2 objects, not Binding.
+ * This is only primarily of interest to {@link ComponentResources}.
+ * 
+ * @since 5.4
+ */
+public interface Binding2 extends Binding
+{
+    /**
+     * Returns the generic type of the binding
+     * 
+     * @see Method#getGenericReturnType()
+     * @see java.lang.reflect.Field#getGenericType()
+     */
+    Type getBindingGenericType();
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/main/java/org/apache/tapestry5/PropertyConduit.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/PropertyConduit.java b/tapestry-core/src/main/java/org/apache/tapestry5/PropertyConduit.java
index b28293a..3dbb0c0 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/PropertyConduit.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/PropertyConduit.java
@@ -14,8 +14,6 @@
 
 package org.apache.tapestry5;
 
-import java.lang.reflect.Type;
-
 import org.apache.tapestry5.ioc.AnnotationProvider;
 
 /**
@@ -44,15 +42,4 @@ public interface PropertyConduit extends AnnotationProvider
      * Returns the type of the property read or updated by the conduit.
      */
     Class getPropertyType();
-    
-    /**
-     * Returns a Type object that represents the declared type for the property.
-     * If the Type is a parameterized type, the Type object returned must accurately 
-     * reflect the actual type parameters used in the source code. If the type of the
-     * underlying property is a type variable or a parameterized type, it is created.
-     * Otherwise, it is resolved.
-     * 
-     * @since 5.4
-     */
-    Type getPropertyGenericType();
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/main/java/org/apache/tapestry5/PropertyConduit2.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/PropertyConduit2.java b/tapestry-core/src/main/java/org/apache/tapestry5/PropertyConduit2.java
new file mode 100644
index 0000000..839d70f
--- /dev/null
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/PropertyConduit2.java
@@ -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.tapestry5;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+
+import org.apache.tapestry5.services.PropertyConduitSource;
+
+
+/**
+ * Extension to {@link PropertyConduit} that adds a method to access the generic property type.
+ * {@link PropertyConduitSource} instances should ideally return PropertyConduit2 objects, not PropertyConduit.
+ * This is only primarily of interest to {@link Binding2}.
+ * 
+ * @since 5.4
+ */
+public interface PropertyConduit2 extends PropertyConduit
+{
+    /**
+     * Returns the generic type of the property
+     * 
+     * @see Method#getGenericReturnType()
+     * @see java.lang.reflect.Field#getGenericType()
+     * 
+     */
+	Type getPropertyGenericType();
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/main/java/org/apache/tapestry5/internal/InternalPropertyConduit.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/InternalPropertyConduit.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/InternalPropertyConduit.java
index 5e19e5b..315b372 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/InternalPropertyConduit.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/InternalPropertyConduit.java
@@ -14,16 +14,16 @@
 
 package org.apache.tapestry5.internal;
 
-import org.apache.tapestry5.PropertyConduit;
+import org.apache.tapestry5.PropertyConduit2;
 
 
 /**
- * Extension to {@link org.apache.tapestry5.PropertyConduit} that adds a method to determine the name of the property.
+ * Extension to {@link org.apache.tapestry5.PropertyConduit2} that adds a method to determine the name of the property.
  * 
  * @since 5.2.0
  *
  */
-public interface InternalPropertyConduit extends PropertyConduit
+public interface InternalPropertyConduit extends PropertyConduit2
 {
     /**
      * Returns the name of the property read or updated by the conduit or null. 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java
index 45da70b..6c6138b 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java
@@ -494,7 +494,11 @@ public class TapestryInternalUtils
 
             public Type getPropertyGenericType()
             {
-                return conduit.getPropertyGenericType();
+                if (conduit instanceof PropertyConduit2)
+                {
+                	return ((PropertyConduit2) conduit).getPropertyGenericType();
+                }
+            	return conduit.getPropertyType();
             }
             
             public Object get(Object instance)

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/AbstractBinding.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/AbstractBinding.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/AbstractBinding.java
index 12885e1..8e731b7 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/AbstractBinding.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/AbstractBinding.java
@@ -15,6 +15,7 @@
 package org.apache.tapestry5.internal.bindings;
 
 import org.apache.tapestry5.Binding;
+import org.apache.tapestry5.Binding2;
 import org.apache.tapestry5.ioc.BaseLocatable;
 import org.apache.tapestry5.ioc.Location;
 import org.apache.tapestry5.ioc.internal.util.TapestryException;
@@ -26,7 +27,7 @@ import java.lang.reflect.Type;
  * Abstract base class for bindings. Assumes that the binding is read only and invariant. Subclasses must provide an
  * implementation of {@link Binding#get()}.
  */
-public abstract class AbstractBinding extends BaseLocatable implements Binding
+public abstract class AbstractBinding extends BaseLocatable implements Binding2
 {
     public AbstractBinding()
     {

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/InternalPropBinding.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/InternalPropBinding.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/InternalPropBinding.java
index 1d7fd60..8af0943 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/InternalPropBinding.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/InternalPropBinding.java
@@ -13,13 +13,13 @@
 // limitations under the License.
 package org.apache.tapestry5.internal.bindings;
 
-import org.apache.tapestry5.Binding;
+import org.apache.tapestry5.Binding2;
 
 /**
  * Internal marker interface for {@linkplain org.apache.tapestry5.internal.bindings.PropBinding}
  *
  */
-public interface InternalPropBinding extends Binding
+public interface InternalPropBinding extends Binding2
 {
     /**
      * Returns the name of the property, if exists.

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/PropBinding.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/PropBinding.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/PropBinding.java
index 55ea9d8..afe63eb 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/PropBinding.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/PropBinding.java
@@ -14,15 +14,16 @@
 
 package org.apache.tapestry5.internal.bindings;
 
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
 import org.apache.tapestry5.PropertyConduit;
+import org.apache.tapestry5.PropertyConduit2;
 import org.apache.tapestry5.internal.TapestryInternalUtils;
 import org.apache.tapestry5.internal.services.Invariant;
 import org.apache.tapestry5.ioc.Location;
 import org.apache.tapestry5.ioc.internal.util.TapestryException;
 
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-
 /**
  * Base class for bindings created by the {@link org.apache.tapestry5.internal.bindings.PropBindingFactory}. A subclass
  * of this is created at runtime.
@@ -103,13 +104,17 @@ public class PropBinding extends AbstractBinding implements InternalPropBinding
     }
     
     /**
-     * Get the generic type from the underlying field or getter.
-     * @see PropertyConduit#getPropertyGenericType()
+     * Get the generic type from the underlying property
+     * 
+     * @see PropertyConduit2#getPropertyGenericType()
      */
     @Override
     public Type getBindingGenericType()
     {
-    	return conduit.getPropertyGenericType();
+    	if (conduit instanceof PropertyConduit2) {
+    		return ((PropertyConduit2) conduit).getPropertyGenericType();
+    	}
+    	return conduit.getPropertyType();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/CoercingPropertyConduitWrapper.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/CoercingPropertyConduitWrapper.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/CoercingPropertyConduitWrapper.java
index 158d4a4..4dbfb2d 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/CoercingPropertyConduitWrapper.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/CoercingPropertyConduitWrapper.java
@@ -14,13 +14,14 @@
 
 package org.apache.tapestry5.internal.services;
 
-import org.apache.tapestry5.PropertyConduit;
-import org.apache.tapestry5.ioc.services.TypeCoercer;
-
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
-public class CoercingPropertyConduitWrapper implements PropertyConduit
+import org.apache.tapestry5.PropertyConduit;
+import org.apache.tapestry5.PropertyConduit2;
+import org.apache.tapestry5.ioc.services.TypeCoercer;
+
+public class CoercingPropertyConduitWrapper implements PropertyConduit2
 {
     private final PropertyConduit conduit;
 
@@ -49,7 +50,10 @@ public class CoercingPropertyConduitWrapper implements PropertyConduit
     
     public Type getPropertyGenericType()
     {
-    	return conduit.getPropertyGenericType();
+    	if (conduit instanceof PropertyConduit2) {
+    		return ((PropertyConduit2) conduit).getPropertyGenericType();
+    	}
+    	return conduit.getPropertyType();
     }
 
     @SuppressWarnings("unchecked")

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java
index 6dab120..701420f 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java
@@ -18,6 +18,7 @@ import org.antlr.runtime.ANTLRInputStream;
 import org.antlr.runtime.CommonTokenStream;
 import org.antlr.runtime.tree.Tree;
 import org.apache.tapestry5.PropertyConduit;
+import org.apache.tapestry5.PropertyConduit2;
 import org.apache.tapestry5.internal.InternalPropertyConduit;
 import org.apache.tapestry5.internal.antlr.PropertyExpressionLexer;
 import org.apache.tapestry5.internal.antlr.PropertyExpressionParser;
@@ -63,7 +64,7 @@ public class PropertyConduitSourceImpl implements PropertyConduitSource
         private static final MethodDescription GET_PROPERTY_TYPE = getMethodDescription(PropertyConduit.class,
                 "getPropertyType");
 
-        private static final MethodDescription GET_PROPERTY_GENERIC_TYPE = getMethodDescription(PropertyConduit.class,
+        private static final MethodDescription GET_PROPERTY_GENERIC_TYPE = getMethodDescription(PropertyConduit2.class,
                 "getPropertyGenericType");
         
         private static final MethodDescription GET_PROPERTY_NAME = getMethodDescription(InternalPropertyConduit.class,

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java
index 5e0e440..c51c086 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java
@@ -349,8 +349,13 @@ public class InternalComponentResourcesImpl extends LockSupport implements Inter
     public Type getBoundGenericType(String parameterName)
     {
         Binding binding = getBinding(parameterName);
-
-        return binding == null ? null : binding.getBindingGenericType();
+        Type genericType;
+        if (binding instanceof Binding2) {
+        	genericType = ((Binding2) binding).getBindingGenericType();
+        } else {
+        	genericType = binding.getBindingType();
+        }
+        return genericType;
     }
     
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java
index afdc002..d7ecc25 100644
--- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java
+++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java
@@ -1726,14 +1726,14 @@ public class CoreBehaviorsTests extends App1TestCase
     {
     	openLinks("Generic bound type demo");
     	
-		assertTextPresent("clientId=one,type=java.util.Map,genericType=java.util.Map<java.lang.String, java.lang.String>");
-		assertTextPresent("clientId=two,type=java.lang.String,genericType=class java.lang.String");
-		assertTextPresent("clientId=three,type=java.util.Set,genericType=java.util.Set<java.lang.Long>");
-		assertTextPresent("clientId=four,type=java.util.List,genericType=java.util.List<java.util.List<java.util.Date>>");
-		assertTextPresent("clientId=five,type=java.util.List,genericType=interface java.util.List");
-		assertTextPresent("clientId=six,type=java.util.Date,genericType=class java.util.Date");
-		assertTextPresent("clientId=seven,type=java.util.List,genericType=interface java.util.List");
-		assertTextPresent("clientId=eight,type=java.util.Map,genericType=interface java.util.Map");
-		assertTextPresent("clientId=nine,type=java.lang.String,genericType=class java.lang.String");
+    	assertTextPresent("description=mapOfStrings,type=java.util.Map,genericType=java.util.Map<java.lang.String, java.lang.String>");
+    	assertTextPresent("description=mapOfStrings.get('foo'),type=java.lang.String,genericType=class java.lang.String");
+    	assertTextPresent("description=setOfLongs,type=java.util.Set,genericType=java.util.Set<java.lang.Long>");
+    	assertTextPresent("description=listOfListOfDates,type=java.util.List,genericType=java.util.List<java.util.List<java.util.Date>>");
+    	assertTextPresent("description=listOfListOfDates.get(0),type=java.util.List,genericType=interface java.util.List");
+    	assertTextPresent("description=listOfListOfDates.get(0).get(0),type=java.util.Date,genericType=class java.util.Date");
+    	assertTextPresent("description=[1,2,3],type=java.util.List,genericType=interface java.util.List");
+    	assertTextPresent("description={'foo':'bar'},type=java.util.Map,genericType=interface java.util.Map");
+    	assertTextPresent("description=baz,type=java.lang.String,genericType=class java.lang.String");
     }
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/components/GenericTypeDisplay.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/components/GenericTypeDisplay.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/components/GenericTypeDisplay.java
index ab95807..f6d2aa7 100644
--- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/components/GenericTypeDisplay.java
+++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/components/GenericTypeDisplay.java
@@ -22,23 +22,23 @@ import org.apache.tapestry5.annotations.Parameter;
 import org.apache.tapestry5.ioc.annotations.Inject;
 
 /**
- * Outputs the type and genericType of the 'value' parameter in a div
+ * Outputs the type and genericType of the 'value' binding in a div
  */
 public class GenericTypeDisplay {
 	@Inject
 	private ComponentResources resources;
 	
 	@Parameter(required=true, defaultPrefix=BindingConstants.LITERAL)
-	private String clientId;
+	private String description;
 	
 	@Parameter(required=true)
 	private Object value;
 	
 	void afterRender(MarkupWriter writer) {
-		writer.element("div", "id", clientId);
+		writer.element("div");
 		Class<?> type = resources.getBoundType("value");
 		Type genericType = resources.getBoundGenericType("value");
-		String text = String.format("clientId=%s,type=%s,genericType=%s", clientId, type.getName(), genericType.toString());
+		String text = String.format("description=%s,type=%s,genericType=%s", description, type.getName(), genericType.toString());
 		writer.write(text);
 		writer.end();
 	}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/GenericTypeDemo.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/GenericTypeDemo.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/GenericTypeDemo.java
index 80bf40a..8e9fdd3 100644
--- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/GenericTypeDemo.java
+++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/GenericTypeDemo.java
@@ -1,14 +1,11 @@
 package org.apache.tapestry5.integration.app1.pages;
 
-import java.util.Arrays;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import org.apache.tapestry5.annotations.Property;
-import org.apache.tapestry5.annotations.SetupRender;
 
 public class GenericTypeDemo {
 	private Set<Long> setOfLongs;
@@ -17,17 +14,10 @@ public class GenericTypeDemo {
 	private Map<String, String> mapOfStrings;
 	
 	public List<List<Date>> getListOfListOfDates() {
-		List<Date> dates = Arrays.asList(new Date(Long.MIN_VALUE), new Date(0), new Date(Long.MAX_VALUE));
-		return Arrays.asList(dates);
+		throw new UnsupportedOperationException();
 	}
 	
 	public void setSetOfLongs(Set<Long> setOfLongs) {
-		this.setOfLongs = setOfLongs;
-	}
-	
-	@SetupRender
-	void setupRender() {
-		mapOfStrings = new HashMap<String,String>();
-		mapOfStrings.put("foo", "bar");
+		throw new UnsupportedOperationException();
 	}
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImplTest.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImplTest.java b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImplTest.java
index 5c9f88a..0e61220 100644
--- a/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImplTest.java
+++ b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImplTest.java
@@ -14,8 +14,14 @@
 
 package org.apache.tapestry5.internal.services;
 
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.tapestry5.Block;
 import org.apache.tapestry5.PropertyConduit;
+import org.apache.tapestry5.PropertyConduit2;
 import org.apache.tapestry5.beaneditor.NonVisual;
 import org.apache.tapestry5.beaneditor.Validate;
 import org.apache.tapestry5.integration.app1.data.IntegerHolder;
@@ -29,11 +35,6 @@ import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
 /**
  * Most of the testing occurs inside {@link PropBindingFactoryTest} (due to
  * historical reasons).
@@ -178,10 +179,10 @@ public class PropertyConduitSourceImplTest extends InternalBaseTestCase
     @Test
     public void generic_types_are_determined()
     {
-        PropertyConduit datesConduit = source.create(GenericBean.class, "dates");
-        PropertyConduit longsConduit = source.create(GenericBean.class, "longs");
-        PropertyConduit nestedDatesConduit = source.create(GenericBean.class, "genericBeans.get(0).dates");
-        PropertyConduit mapConduit = source.create(GenericBean.class, "map");
+        PropertyConduit2 datesConduit = (PropertyConduit2) source.create(GenericBean.class, "dates");
+        PropertyConduit2 longsConduit = (PropertyConduit2) source.create(GenericBean.class, "longs");
+        PropertyConduit2 nestedDatesConduit = (PropertyConduit2) source.create(GenericBean.class, "genericBeans.get(0).dates");
+        PropertyConduit2 mapConduit = (PropertyConduit2) source.create(GenericBean.class, "map");
         assertEquals(datesConduit.getPropertyGenericType().toString(), "java.util.List<java.util.Date>");
         assertEquals(longsConduit.getPropertyGenericType().toString(), "java.util.List<java.lang.Long>");
         assertEquals(nestedDatesConduit.getPropertyGenericType().toString(), "java.util.List<java.util.Date>");

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/737ebd64/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/GenericTypeDemo.tml
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/GenericTypeDemo.tml b/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/GenericTypeDemo.tml
index c9f4b78..12e347a 100644
--- a/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/GenericTypeDemo.tml
+++ b/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/GenericTypeDemo.tml
@@ -1,12 +1,12 @@
 <html t:type="Border" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
 	<h1>Generic Type Tests</h1>
-	<t:genericTypeDisplay clientId="one" value="mapOfStrings" />
-	<t:genericTypeDisplay clientId="two" value="mapOfStrings.get('foo')" />
-	<t:genericTypeDisplay clientId="three" value="setOfLongs" />
-	<t:genericTypeDisplay clientId="four" value="listOfListOfDates" />
-	<t:genericTypeDisplay clientId="five" value="listOfListOfDates.get(0)" />
-	<t:genericTypeDisplay clientId="six" value="listOfListOfDates.get(0).get(0)" />
-	<t:genericTypeDisplay clientId="seven" value="[1,2,3]" />
-	<t:genericTypeDisplay clientId="eight" value="{'foo':'bar'}" />
-	<t:genericTypeDisplay clientId="nine" value="literal:aaa" />
+	<t:genericTypeDisplay description="mapOfStrings" value="mapOfStrings" />
+	<t:genericTypeDisplay description="mapOfStrings.get('foo')" value="mapOfStrings.get('foo')" />
+	<t:genericTypeDisplay description="setOfLongs" value="setOfLongs" />
+	<t:genericTypeDisplay description="listOfListOfDates" value="listOfListOfDates" />
+	<t:genericTypeDisplay description="listOfListOfDates.get(0)" value="listOfListOfDates.get(0)" />
+	<t:genericTypeDisplay description="listOfListOfDates.get(0).get(0)" value="listOfListOfDates.get(0).get(0)" />
+	<t:genericTypeDisplay description="[1,2,3]" value="[1,2,3]" />
+	<t:genericTypeDisplay description="{'foo':'bar'}" value="{'foo':'bar'}" />
+	<t:genericTypeDisplay description="baz" value="literal:baz" />
 </html>