On Sun, Nov 25, 2012 at 6:27 AM, Martin Grigorov <[email protected]> wrote:
> 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 ?

done. i dont much like the idea of delegating to the context because
this class should fail outside of wicket context, but it doesnt matter
that much i guess.

> 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.

yes, it seems very strange and very broken.

> 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.

i modified classreference to implement iprovider so it can now replace
classprovider as a drop in. want to do it?

-igor

>
>> +                       }
>> +                       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
>

Reply via email to