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