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 2011/04/14 00:24:18 UTC

svn commit: r1091963 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java test/java/org/apache/tapestry5/internal/bindings/PropBindingFactoryTest.java

Author: hlship
Date: Wed Apr 13 22:24:17 2011
New Revision: 1091963

URL: http://svn.apache.org/viewvc?rev=1091963&view=rev
Log:
TAP5-853: Minor cleanups to get last few failing tests to pass

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/bindings/PropBindingFactoryTest.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java?rev=1091963&r1=1091962&r2=1091963&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java Wed Apr 13 22:24:17 2011
@@ -307,11 +307,18 @@ public class PropertyConduitSourceImpl i
                     builder.loadConstant(conduitPropertyName).returnResult();
                 }
             });
+
+            if (conduitPropertyType == null)
+                throw new RuntimeException("Conduit property type is null for " + rootType + " " + expression);
+
+            final PlasticField propertyTypeField = plasticClass.introduceField(Class.class, "propertyType").inject(
+                    conduitPropertyType);
+
             plasticClass.introduceMethod(ConduitMethods.GET_PROPERTY_TYPE, new InstructionBuilderCallback()
             {
                 public void doBuild(InstructionBuilder builder)
                 {
-                    builder.loadTypeConstant(conduitPropertyType).returnResult();
+                    builder.loadThis().getField(propertyTypeField).returnResult();
                 }
             });
 
@@ -492,11 +499,12 @@ public class PropertyConduitSourceImpl i
 
             PropertyAdapter adapter = findPropertyAdapter(activeType, propertyName);
 
-            implementGetter(activeType, adapter);
-            implementSetter(activeType, adapter);
-
+            conduitPropertyType = adapter.getType();
             conduitPropertyName = propertyName;
             annotationProvider = adapter;
+
+            implementGetter(activeType, adapter);
+            implementSetter(activeType, adapter);
         }
 
         private void implementSetter(Type activeType, PropertyAdapter adapter)
@@ -513,7 +521,7 @@ public class PropertyConduitSourceImpl i
                 return;
             }
 
-            implementNoOpMethod(ConduitMethods.SET, "Expression %s for class %s is read-only.", expression,
+            implementNoOpMethod(ConduitMethods.SET, "Expression '%s' for class %s is read-only.", expression,
                     rootType.getName());
         }
 
@@ -568,7 +576,7 @@ public class PropertyConduitSourceImpl i
                 return;
             }
 
-            implementNoOpMethod(ConduitMethods.GET, "Expression %d for class %s is write-only.", expression,
+            implementNoOpMethod(ConduitMethods.GET, "Expression '%s' for class %s is write-only.", expression,
                     rootType.getName());
         }
 
@@ -580,9 +588,6 @@ public class PropertyConduitSourceImpl i
                 {
                     invokeNavigateMethod(builder);
 
-                    Type actualType = GenericsUtils.extractActualType(activeType, field);
-                    conduitPropertyType = GenericsUtils.asClass(actualType);
-
                     builder.getField(field.getDeclaringClass().getName(), field.getName(), field.getType());
 
                     // Cast not necessary here since the return type of get() is Object
@@ -606,8 +611,6 @@ public class PropertyConduitSourceImpl i
 
                     invokeMethod(builder, readMethod, null, 0);
 
-                    conduitPropertyType = GenericsUtils.asClass(actualType);
-
                     boxIfPrimitive(builder, conduitPropertyType);
 
                     builder.returnResult();
@@ -1126,20 +1129,29 @@ public class PropertyConduitSourceImpl i
 
         private Method findMethod(Class activeType, String methodName, int parameterCount)
         {
-            for (Method method : activeType.getMethods())
-            {
+            Class searchType = activeType;
 
-                if (method.getParameterTypes().length == parameterCount
-                        && method.getName().equalsIgnoreCase(methodName))
-                    return method;
-            }
+            while (true)
+            {
 
-            // TAP5-330
-            if (activeType != Object.class)
-                return findMethod(Object.class, methodName, parameterCount);
+                for (Method method : searchType.getMethods())
+                {
+                    if (method.getParameterTypes().length == parameterCount
+                            && method.getName().equalsIgnoreCase(methodName))
+                        return method;
+                }
 
-            throw new RuntimeException(String.format("Class %s does not contain a method named '%s()'.", activeType,
-                    methodName));
+                // TAP5-330
+                if (searchType != Object.class)
+                {
+                    searchType = Object.class;
+                }
+                else
+                {
+                    throw new RuntimeException(String.format("Class %s does not contain a public method named '%s()'.",
+                            activeType.getName(), methodName));
+                }
+            }
         }
 
         public void boxIfPrimitive(InstructionBuilder builder, Type termType)

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/bindings/PropBindingFactoryTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/bindings/PropBindingFactoryTest.java?rev=1091963&r1=1091962&r2=1091963&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/bindings/PropBindingFactoryTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/bindings/PropBindingFactoryTest.java Wed Apr 13 22:24:17 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007, 2008, 2009, 2010 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 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.
@@ -266,7 +266,7 @@ public class PropBindingFactoryTest exte
         catch (RuntimeException ex)
         {
             assertMessageContains(ex,
-                    "No public method \'isThatRealBlood()\' in class org.apache.tapestry5.internal.bindings.TargetBean");
+                    "Class org.apache.tapestry5.internal.bindings.TargetBean does not contain a public method named 'isThatRealBlood()'");
         }
 
         verify();
@@ -290,8 +290,7 @@ public class PropBindingFactoryTest exte
         }
         catch (RuntimeException ex)
         {
-            assertMessageContains(ex,
-                    "No public method \'isThatRealBlood()\' in class org.apache.tapestry5.internal.bindings.StringHolder");
+            assertMessageContains(ex, "StringHolder", "does not contain a public method", "isThatRealBlood()");
         }
 
         verify();
@@ -478,7 +477,7 @@ public class PropBindingFactoryTest exte
         catch (TapestryException ex)
         {
             assertEquals(ex.getMessage(),
-                    "Expression writeOnly for class org.apache.tapestry5.internal.bindings.TargetBean is write-only.");
+                    "Expression 'writeOnly' for class org.apache.tapestry5.internal.bindings.TargetBean is write-only.");
             assertEquals(ex.getLocation(), l);
         }