Hi,

On Sat, Nov 24, 2012 at 8:16 PM, <[email protected]> wrote:

> Updated Branches:
>   refs/heads/master 48044610a -> 65dd7b32e
>
>
> add a serialization-safe class wrapper
>
>
> Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
> Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/65dd7b32
> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/65dd7b32
> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/65dd7b32
>
> Branch: refs/heads/master
> Commit: 65dd7b32ea4f91862353ab0f7bafe3bca5e271ea
> Parents: 4804461
> Author: Igor Vaynberg <[email protected]>
> Authored: Sat Nov 24 11:16:32 2012 -0800
> Committer: Igor Vaynberg <[email protected]>
> Committed: Sat Nov 24 11:16:32 2012 -0800
>
> ----------------------------------------------------------------------
>  .../wicket/util/reference/ClassReference.java      |   72 +++++++++++++++
>  1 files changed, 72 insertions(+), 0 deletions(-)
> ----------------------------------------------------------------------
>
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/65dd7b32/wicket-core/src/main/java/org/apache/wicket/util/reference/ClassReference.java
> ----------------------------------------------------------------------
> diff --git
> a/wicket-core/src/main/java/org/apache/wicket/util/reference/ClassReference.java
> b/wicket-core/src/main/java/org/apache/wicket/util/reference/ClassReference.java
> new file mode 100644
> index 0000000..7653633
> --- /dev/null
> +++
> b/wicket-core/src/main/java/org/apache/wicket/util/reference/ClassReference.java
> @@ -0,0 +1,72 @@
> +package org.apache.wicket.util.reference;
> +
> +import java.io.Serializable;
> +import java.lang.ref.WeakReference;
> +
> +import org.apache.wicket.Application;
> +
> +/**
> + * A serialization-safe reference to a {@link Class}
> + *
> + * @author igor
> + *
> + * @param <T>
> + *            type of class
> + */
> +public class ClassReference<T> implements Serializable
> +{
> +       private transient WeakReference<Class<? extends T>> cache;
> +       private final String name;
> +
> +       /**
> +        * Constructor
> +        *
> +        * @param clazz
> +        */
> +       public ClassReference(Class<? extends T> clazz)
> +       {
> +               name = clazz.getName();
> +               cache(clazz);
> +       }
> +
> +       /**
> +        * @return the {@link Class} stored in this reference
> +        */
> +       @SuppressWarnings("unchecked")
> +       public Class<? extends T> get()
> +       {
> +               Class<? extends T> clazz = cache != null ? cache.get() :
> null;
> +               if (clazz == null)
> +               {
> +                       try
> +                       {
> +                               clazz = (Class<? extends
> T>)Application.get()
> +                                       .getApplicationSettings()
> +                                       .getClassResolver()
> +                                       .resolveClass(name);
>

Issue 1:
org.apache.wicket.core.util.lang.WicketObjects#resolveClass(String) does
almost the same.
Differences:
1) it falls back to the context class loader
2) it just logs a warning and returns null instead

Question: do we want to re-use it here ?


Issue 2:
org.apache.wicket.util.ClassProvider is something very similar to
ClassReference.
problem 1: ClassProvider is just broken in its current state because it
doesn't resolve the class from its name when the weakRef is null.
problem 2: Its only usage is
at org.apache.wicket.SystemMapper.HomePageProvider and it really doesn't
need ClassProvider but just IProvider<Class<? extends Page>>

Question: should we merge ClassProvider and ClassReference into one ?
I think the easiest way is to just deprecate ClassProvider.

+                       }
> +                       catch (ClassNotFoundException e)
> +                       {
> +                               throw new RuntimeException("Could not
> resolve class: " + name, e);
> +                       }
> +                       cache(clazz);
> +               }
> +               return clazz;
> +       }
> +
> +       private void cache(Class<? extends T> clazz)
> +       {
> +               cache = new WeakReference<Class<? extends T>>(clazz);
> +       }
> +
> +       /**
> +        * Diamond operator factory
> +        *
> +        * @param clazz
> +        * @return class reference
> +        */
> +       public static <T> ClassReference<T> of(Class<T> clazz)
> +       {
> +               return new ClassReference<T>(clazz);
> +       }
> +}
> \ No newline at end of file
>
>


-- 
Martin Grigorov
jWeekend
Training, Consulting, Development
http://jWeekend.com <http://jweekend.com/>

Reply via email to