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.");
+
+ }
+ }
}