On Sun, Nov 25, 2012 at 9:01 PM, Igor Vaynberg <[email protected]> wrote:
> 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? > Done. Thanks! > > -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 > > > -- Martin Grigorov jWeekend Training, Consulting, Development http://jWeekend.com <http://jweekend.com/>
