package org.nocket.gen.domain.ref; import gengui.domain.DomainClassReference; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import org.apache.wicket.RuntimeConfigurationType; import org.apache.wicket.protocol.http.WebApplication; public class DomainClassReferenceFactory implements DomainReferenceFactoryI<DomainClassReference> { private static final Map<String, DomainClassReference> domainClassReferenceCache = new HashMap<String, DomainClassReference>(); private final WrappedDomainClassReference rootReference; public DomainClassReferenceFactory(Class<?> rootDomainClass, boolean runtime) { this.rootReference = new WrappedDomainClassReference( getDomainClassReference(rootDomainClass, runtime)); } @Override public WrappedDomainReferenceI<DomainClassReference> getRootReference() { return rootReference; } @Override public WrappedDomainReferenceI<DomainClassReference> newSubReference( WrappedDomainReferenceI<DomainClassReference> upper, Method getter) { return new WrappedDomainClassReference(new DomainClassReference( upper.getRef(), getter)); } public static DomainClassReference getDomainClassReference(Class<?> domainClass, boolean runtime) { // Wicket's development mode allows to reload classes at runtime, so in that mode // we must not cache any data structures which depend on class structures. The // DomainClassReference cache is such a candidate. if (!runtime || WebApplication.get().getConfigurationType() == RuntimeConfigurationType.DEVELOPMENT) { return new DomainClassReference(domainClass); } synchronized (DomainClassReferenceFactory.class) { String domainClassName = domainClass.getName(); DomainClassReference ref = domainClassReferenceCache.get(domainClassName); if (ref == null) { ref = new DomainClassReference(domainClass); domainClassReferenceCache.put(domainClassName, ref); } return ref; } } }