You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jd...@apache.org on 2009/02/13 23:51:11 UTC
svn commit: r744275 -
/wicket/trunk/wicket/src/main/java/org/apache/wicket/session/DefaultPageFactory.java
Author: jdonnerstag
Date: Fri Feb 13 22:51:07 2009
New Revision: 744275
URL: http://svn.apache.org/viewvc?rev=744275&view=rev
Log:
fixed WICKET-2092: SignInPanel IllegalArgumentException exception
Improved generics and made the source code a bit better readable.
Modified:
wicket/trunk/wicket/src/main/java/org/apache/wicket/session/DefaultPageFactory.java
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/session/DefaultPageFactory.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/session/DefaultPageFactory.java?rev=744275&r1=744274&r2=744275&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/session/DefaultPageFactory.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/session/DefaultPageFactory.java Fri Feb 13 22:51:07 2009
@@ -42,55 +42,88 @@
public final class DefaultPageFactory implements IPageFactory
{
/** Map of Constructors for Page subclasses */
- private final Map<Class<?>, Constructor<?>> constructorForClass = Generics.newConcurrentHashMap();
+ private final Map<Class<? extends Page>, Constructor<? extends Page>> constructorForClass = Generics.newConcurrentHashMap();
/**
* @see IPageFactory#newPage(Class)
*/
public final <C extends Page> Page newPage(final Class<C> pageClass)
{
- try
+ // Try default constructor if one exists
+ Constructor<? extends Page> constructor = constructor(pageClass);
+ if (constructor != null)
{
- // throw an exception in case default constructor is missing
- // => improved error message
- final Constructor<? extends Page> constructor = pageClass.getConstructor((Class[])null);
-
- return newPage(constructor, null);
+ // return new Page()
+ return createPage(constructor, null);
}
- catch (NoSuchMethodException e)
+
+ // Try to get constructor that takes PageParameters
+ constructor = constructor(pageClass, PageParameters.class);
+ if (constructor != null)
{
- // a bit of a hack here..
- Constructor<?> constructor = constructor(pageClass, PageParameters.class);
- if (constructor != null)
- {
- return newPage(constructor, new PageParameters());
- }
- else
- {
- throw new WicketRuntimeException("Unable to create page from " + pageClass +
- ". Class does not have a default contructor", e);
- }
+ // return new Page(parameters)
+ return createPage(constructor, new PageParameters());
}
+
+ throw new WicketRuntimeException("Unable to create page from " + pageClass +
+ ". Class does neither have a constructor with PageParameter nor a default constructor");
}
/**
* @see IPageFactory#newPage(Class, PageParameters)
*/
- public final <C extends Page> Page newPage(final Class<C> pageClass,
- final PageParameters parameters)
+ public final <C extends Page> Page newPage(final Class<C> pageClass, PageParameters parameters)
{
- // Try to get constructor that takes PageParameters
- Constructor<?> constructor = constructor(pageClass, PageParameters.class);
+ // If no parameters are provided, try the default constructor first, than the PageParameter
+ // constructor with empty parameter list.
+ if (parameters == null)
+ {
+ return newPage(pageClass);
+ }
- // If we got a PageParameters constructor
+ // If parameters not null, than try to get constructor that takes PageParameters
+ Constructor<? extends Page> constructor = constructor(pageClass, PageParameters.class);
if (constructor != null)
{
// return new Page(parameters)
- return newPage(constructor, parameters);
+ return createPage(constructor, parameters);
+ }
+
+ // No constructor with PageParameters found. Try default constructor.
+ constructor = constructor(pageClass);
+ if (constructor != null)
+ {
+ // return new Page()
+ return createPage(constructor, null);
+ }
+
+ throw new WicketRuntimeException("Unable to create page from " + pageClass +
+ ". Class does neither have a constructor with PageParameter nor a default constructor");
+ }
+
+ /**
+ * Looks up a one-arg Page constructor by class and argument type.
+ *
+ * @param <C>
+ *
+ * @param pageClass
+ * The class of page
+ * @return The page constructor, or null if no one-arg constructor can be found taking the given
+ * argument type.
+ */
+ private final <C extends Page> Constructor<? extends Page> constructor(final Class<C> pageClass)
+ {
+ try
+ {
+ // Try to find the constructor
+ return pageClass.getConstructor();
+ }
+ catch (NoSuchMethodException e)
+ {
+ // Ignore
}
- // Always try default constructor if one exists
- return newPage(pageClass);
+ return null;
}
/**
@@ -105,11 +138,11 @@
* @return The page constructor, or null if no one-arg constructor can be found taking the given
* argument type.
*/
- private final <C extends Page> Constructor<?> constructor(final Class<C> pageClass,
- final Class<PageParameters> argumentType)
+ private final <C extends Page> Constructor<? extends Page> constructor(
+ final Class<C> pageClass, final Class<PageParameters> argumentType)
{
// Get constructor for page class from cache
- Constructor<?> constructor = constructorForClass.get(pageClass);
+ Constructor<? extends Page> constructor = constructorForClass.get(pageClass);
// Need to look up?
if (constructor == null)
@@ -133,6 +166,8 @@
/**
* Creates a new Page using the given constructor and argument.
+ * <p>
+ * Note that you can not create a Page with PageParameters and pass null.
*
* @param constructor
* The constructor to invoke
@@ -143,14 +178,19 @@
* Thrown if the Page cannot be instantiated using the given constructor and
* argument.
*/
- private final Page newPage(final Constructor<?> constructor, final Object argument)
+ private final Page createPage(final Constructor<? extends Page> constructor,
+ final PageParameters argument)
{
try
{
if (argument != null)
- return (Page)constructor.newInstance(new Object[] { argument });
+ {
+ return constructor.newInstance(new Object[] { argument });
+ }
else
- return (Page)constructor.newInstance(new Object[] {});
+ {
+ return constructor.newInstance();
+ }
}
catch (InstantiationException e)
{
@@ -173,12 +213,23 @@
}
}
- private String createDescription(Constructor<?> constructor, Object argument)
+ /**
+ *
+ * @param constructor
+ * @param argument
+ * @return description
+ */
+ private String createDescription(Constructor<? extends Page> constructor,
+ PageParameters argument)
{
if (argument != null)
+ {
return "Can't instantiate page using constructor " + constructor + " and argument " +
argument;
+ }
else
+ {
return "Can't instantiate page using constructor " + constructor;
+ }
}
}
\ No newline at end of file