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