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 2008/06/09 02:36:40 UTC

svn commit: r664598 - in /tapestry/tapestry5/trunk/tapestry-ioc/src: main/java/org/apache/tapestry5/ioc/internal/ main/java/org/apache/tapestry5/ioc/internal/util/ test/java/org/apache/tapestry5/ioc/internal/util/

Author: hlship
Date: Sun Jun  8 17:36:39 2008
New Revision: 664598

URL: http://svn.apache.org/viewvc?rev=664598&view=rev
Log:
TAPESTRY-2096: Confusing exception when autobuilding a class fails due to class visibility

Modified:
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ConstructorServiceCreator.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/InternalUtilsTest.java

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ConstructorServiceCreator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ConstructorServiceCreator.java?rev=664598&r1=664597&r2=664598&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ConstructorServiceCreator.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ConstructorServiceCreator.java Sun Jun  8 17:36:39 2008
@@ -1,4 +1,4 @@
-// Copyright 2007 The Apache Software Foundation
+// Copyright 2007, 2008 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.
@@ -42,6 +42,8 @@
 
         try
         {
+            InternalUtils.validateConstructorForAutobuild(constructor);
+
             Object[] parameters = InternalUtils.calculateParametersForConstructor(constructor, resources,
                                                                                   getParameterDefaultsWithConfigurations());
 

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java?rev=664598&r1=664597&r2=664598&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java Sun Jun  8 17:36:39 2008
@@ -725,6 +725,8 @@
 
         try
         {
+            InternalUtils.validateConstructorForAutobuild(constructor);
+
             Object[] parameters = InternalUtils.calculateParametersForConstructor(constructor, this, empty);
 
             return clazz.cast(constructor.newInstance(parameters));

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java?rev=664598&r1=664597&r2=664598&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java Sun Jun  8 17:36:39 2008
@@ -562,4 +562,20 @@
 
         return exception.getClass().getName();
     }
+
+    public static void validateConstructorForAutobuild(Constructor constructor)
+    {
+        Class clazz = constructor.getDeclaringClass();
+
+        if (!Modifier.isPublic(clazz.getModifiers()))
+            throw new IllegalArgumentException(
+                    String.format("Class %s is not a public class and may not be autobuilt.", clazz.getName()));
+
+        if (!Modifier.isPublic(constructor.getModifiers()))
+            throw new IllegalArgumentException(String.format(
+                    "Constructor %s is not public and may not be used for autobuilding an instance of the class. " +
+                            "You should make the constructor public, or mark an alternate public constructor with the @Inject annotation.",
+                    constructor));
+
+    }
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/InternalUtilsTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/InternalUtilsTest.java?rev=664598&r1=664597&r2=664598&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/InternalUtilsTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/InternalUtilsTest.java Sun Jun  8 17:36:39 2008
@@ -31,6 +31,21 @@
 
 public class InternalUtilsTest extends IOCTestCase
 {
+
+    private static class PrivateInnerClass
+    {
+        public PrivateInnerClass()
+        {
+        }
+    }
+
+    public static class PublicInnerClass
+    {
+        protected PublicInnerClass()
+        {
+        }
+    }
+
     @Test
     public void method_as_string_no_args() throws Exception
     {
@@ -384,4 +399,40 @@
         assertEquals(c.getParameterTypes()[0], String.class);
     }
 
+    @Test
+    public void validate_constructor_class_not_public()
+    {
+        Class clazz = PrivateInnerClass.class;
+        Constructor cons = clazz.getConstructors()[0];
+
+        try
+        {
+            InternalUtils.validateConstructorForAutobuild(cons);
+            unreachable();
+        }
+        catch (IllegalArgumentException ex)
+        {
+            assertEquals(ex.getMessage(),
+                         "Class org.apache.tapestry5.ioc.internal.util.InternalUtilsTest$PrivateInnerClass is not a public class and may not be autobuilt.");
+        }
+    }
+
+    @Test
+    public void validate_constructor_check_for_public()
+    {
+        Class clazz = PublicInnerClass.class;
+        Constructor cons = clazz.getDeclaredConstructors()[0];
+
+        try
+        {
+            InternalUtils.validateConstructorForAutobuild(cons);
+            unreachable();
+        }
+        catch (IllegalArgumentException ex)
+        {
+            assertMessageContains(ex,
+                                  "Constructor protected org.apache.tapestry5.ioc.internal.util.InternalUtilsTest$PublicInnerClass() is not public and may not be used for autobuilding an instance of the class.");
+
+        }
+    }
 }