Skip to content

Commit

Permalink
Make metadatacache a static singleton
Browse files Browse the repository at this point in the history
git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@431 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
pmuir committed Dec 7, 2008
1 parent d5678f8 commit 57507ff
Show file tree
Hide file tree
Showing 10 changed files with 34 additions and 38 deletions.
22 changes: 4 additions & 18 deletions webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java
Expand Up @@ -73,7 +73,6 @@ public class ManagerImpl implements Manager
public static final String JNDI_KEY = "java:comp/Manager";

private List<Class<? extends Annotation>> enabledDeploymentTypes;
private MetaDataCache metaDataCache;
private EventManager eventManager;
private Resolver resolver;
private ContextMap contextMap;
Expand All @@ -85,7 +84,6 @@ public class ManagerImpl implements Manager
@SuppressWarnings("unchecked")
public ManagerImpl()
{
this.metaDataCache = new MetaDataCache();
this.beans = new CopyOnWriteArrayList<Bean<?>>();
this.eventManager = new EventManager(this);
this.resolver = new Resolver(this);
Expand Down Expand Up @@ -190,18 +188,6 @@ public List<Class<? extends Annotation>> getEnabledDeploymentTypes()
return Collections.unmodifiableList(enabledDeploymentTypes);
}

/**
* Returns the metadata cache
*
* @return The cache
*
* @see org.jboss.webbeans.MetaDataCache
*/
public MetaDataCache getMetaDataCache()
{
return this.metaDataCache;
}

/**
* Resolves beans by API type and binding types
*
Expand Down Expand Up @@ -244,7 +230,7 @@ public <T> Set<Bean<T>> resolveByType(AnnotatedItem<T, ?> element, Annotation...
{
for (Annotation annotation : element.getAnnotations())
{
if (!metaDataCache.getBindingTypeModel(annotation.annotationType()).isValid())
if (!MetaDataCache.instance().getBindingTypeModel(annotation.annotationType()).isValid())
{
throw new IllegalArgumentException("Not a binding type " + annotation);
}
Expand Down Expand Up @@ -446,7 +432,7 @@ public <T> T getInstance(Bean<T> bean)
try
{
contextMap.getBuiltInContext(Dependent.class).setActive(true);
if (getMetaDataCache().getScopeModel(bean.getScopeType()).isNormal())
if (MetaDataCache.instance().getScopeModel(bean.getScopeType()).isNormal())
{
return (T) proxyPool.getClientProxy(bean);
}
Expand Down Expand Up @@ -545,7 +531,7 @@ else if (beans.size() > 1)
else
{
Bean<T> bean = beans.iterator().next();
if (getMetaDataCache().getScopeModel(bean.getScopeType()).isNormal() && !element.isProxyable())
if (MetaDataCache.instance().getScopeModel(bean.getScopeType()).isNormal() && !element.isProxyable())
{
throw new UnproxyableDependencyException(element + "Unable to proxy");
}
Expand Down Expand Up @@ -651,7 +637,7 @@ public String toString()
StringBuilder buffer = new StringBuilder();
buffer.append(Strings.collectionToString("Enabled deployment types: ", getEnabledDeploymentTypes()));
buffer.append(eventManager.toString() + "\n");
buffer.append(metaDataCache.toString() + "\n");
buffer.append(MetaDataCache.instance().toString() + "\n");
buffer.append(resolver.toString() + "\n");
buffer.append(contextMap.toString() + "\n");
buffer.append(proxyPool.toString() + "\n");
Expand Down
12 changes: 12 additions & 0 deletions webbeans-ri/src/main/java/org/jboss/webbeans/MetaDataCache.java
Expand Up @@ -30,6 +30,18 @@
public class MetaDataCache
{

private static MetaDataCache instance;

public static MetaDataCache instance()
{
return instance;
}

static
{
instance = new MetaDataCache();
}

private ConcurrentCache<Class<? extends Annotation>, StereotypeModel<?>> stereotypes = new ConcurrentCache<Class<? extends Annotation>, StereotypeModel<?>>();

private ConcurrentCache<Class<? extends Annotation>, ScopeModel<?>> scopes = new ConcurrentCache<Class<? extends Annotation>, ScopeModel<?>>();
Expand Down
3 changes: 1 addition & 2 deletions webbeans-ri/src/main/java/org/jboss/webbeans/Resolver.java
Expand Up @@ -270,10 +270,9 @@ private <T> Set<Bean<T>> getMatchingBeans(AnnotatedItem<T, ?> element, List<Bean

private boolean containsAllBindingBindingTypes(AnnotatedItem<?, ?> element, Set<Annotation> bindingTypes)
{
MetaDataCache metaDataCache = manager.getMetaDataCache();
for (Annotation bindingType : element.getBindingTypes())
{
BindingTypeModel<?> bindingTypeModel = metaDataCache.getBindingTypeModel(bindingType.annotationType());
BindingTypeModel<?> bindingTypeModel = MetaDataCache.instance().getBindingTypeModel(bindingType.annotationType());
if (bindingTypeModel.getNonBindingTypes().size() > 0)
{
boolean matchFound = false;
Expand Down
Expand Up @@ -121,7 +121,7 @@ public AbstractBean(ManagerImpl manager)
*/
protected void init()
{
mergedStereotypes = new MergedStereotypes<T, E>(getAnnotatedItem().getMetaAnnotations(Stereotype.class), manager.getMetaDataCache());
mergedStereotypes = new MergedStereotypes<T, E>(getAnnotatedItem().getMetaAnnotations(Stereotype.class));
initType();
initPrimitive();
log.debug("Building Web Bean bean metadata for " + getType());
Expand Down
Expand Up @@ -32,6 +32,7 @@
import javax.webbeans.manager.Manager;

import org.jboss.webbeans.ManagerImpl;
import org.jboss.webbeans.MetaDataCache;
import org.jboss.webbeans.ejb.EJB;
import org.jboss.webbeans.ejb.EjbMetaData;
import org.jboss.webbeans.introspector.AnnotatedField;
Expand Down Expand Up @@ -71,7 +72,7 @@ public EnterpriseBean(Class<T> type, ManagerImpl manager)
protected void init()
{
super.init();
ejbMetaData = manager.getMetaDataCache().getEjbMetaData(getType());
ejbMetaData = MetaDataCache.instance().getEjbMetaData(getType());
initRemoveMethod();
initInjectionPoints();
checkEnterpriseBeanTypeAllowed();
Expand Down Expand Up @@ -139,14 +140,14 @@ private void checkSpecialization()
}
if (!isDefinedInXml())
{
if (!manager.getMetaDataCache().getEjbMetaData(getAnnotatedItem().getSuperclass().getType()).isEjb())
if (!MetaDataCache.instance().getEjbMetaData(getAnnotatedItem().getSuperclass().getType()).isEjb())
{
throw new DefinitionException("Annotation defined specializing EJB must have EJB superclass");
}
}
else
{
if (manager.getMetaDataCache().getEjbMetaData(getAnnotatedItem().getSuperclass().getType()).isEjb())
if (MetaDataCache.instance().getEjbMetaData(getAnnotatedItem().getSuperclass().getType()).isEjb())
{
throw new DefinitionException("XML defined specializing EJB must have annotation defined EJB implementation");
}
Expand Down
Expand Up @@ -49,26 +49,26 @@ public class MergedStereotypes<T, E>
*
* @param stereotypeAnnotations The stereotypes to merge
*/
public MergedStereotypes(Set<Annotation> stereotypeAnnotations, MetaDataCache metaDataCache)
public MergedStereotypes(Set<Annotation> stereotypeAnnotations)
{
possibleDeploymentTypes = new AnnotationMap();
possibleScopeTypes = new HashSet<Annotation>();
requiredTypes = new HashSet<Class<?>>();
supportedScopes = new HashSet<Class<? extends Annotation>>();
merge(stereotypeAnnotations, metaDataCache);
merge(stereotypeAnnotations);
}

/**
* Perform the merge
*
* @param stereotypeAnnotations The stereotype annotations
*/
protected void merge(Set<Annotation> stereotypeAnnotations, MetaDataCache metaDataCache)
protected void merge(Set<Annotation> stereotypeAnnotations)
{
for (Annotation stereotypeAnnotation : stereotypeAnnotations)
{
// Retrieve and merge all metadata from stereotypes
StereotypeModel<?> stereotype = metaDataCache.getStereotype(stereotypeAnnotation.annotationType());
StereotypeModel<?> stereotype = MetaDataCache.instance().getStereotype(stereotypeAnnotation.annotationType());
if (stereotype == null)
{
throw new IllegalStateException("Stereotype " + stereotypeAnnotation + " not registered with container");
Expand Down
Expand Up @@ -28,6 +28,7 @@

import org.jboss.webbeans.CurrentManager;
import org.jboss.webbeans.ManagerImpl;
import org.jboss.webbeans.MetaDataCache;
import org.jboss.webbeans.bean.AbstractBean;
import org.jboss.webbeans.bean.AbstractClassBean;
import org.jboss.webbeans.bean.EventBean;
Expand Down Expand Up @@ -115,7 +116,7 @@ public void registerBeans(Iterable<Class<?>> classes)
for (Class<?> clazz : classes)
{
AbstractClassBean<?> bean;
if (CurrentManager.rootManager().getMetaDataCache().getEjbMetaData(clazz).isEjb())
if (MetaDataCache.instance().getEjbMetaData(clazz).isEjb())
{
bean = createEnterpriseBean(clazz);
}
Expand Down
Expand Up @@ -159,7 +159,7 @@ public EventManager(ManagerImpl manager)
*/
public <T> void addObserver(Observer<T> observer, Class<T> eventType, Annotation... bindings)
{
EventObserver<T> eventObserver = new EventObserver<T>(manager.getMetaDataCache(), observer, eventType, bindings);
EventObserver<T> eventObserver = new EventObserver<T>(observer, eventType, bindings);
registeredObservers.put(eventType, eventObserver);
}

Expand Down Expand Up @@ -252,7 +252,7 @@ private <T> void deferEvent(T event, Observer<T> observer)
public <T> void removeObserver(Observer<T> observer, Class<T> eventType, Annotation... bindings)
{
List<EventObserver<?>> observers = registeredObservers.get(eventType);
EventObserver<T> eventObserver = new EventObserver<T>(manager.getMetaDataCache(), observer, eventType, bindings);
EventObserver<T> eventObserver = new EventObserver<T>(observer, eventType, bindings);
observers.remove(eventObserver);
}

Expand Down
Expand Up @@ -44,7 +44,6 @@ public class EventObserver<T>
private final Class<T> eventType;
private final List<Annotation> eventBindings;
private final Observer<T> observer;
private final MetaDataCache metaDataCache;

/**
* Constructs a new wrapper for an observer.
Expand All @@ -53,12 +52,11 @@ public class EventObserver<T>
* @param eventType The class of event being observed
* @param eventBindings The array of annotation event bindings, if any
*/
public EventObserver(MetaDataCache metaDataCache, final Observer<T> observer, final Class<T> eventType, final Annotation... eventBindings)
public EventObserver(final Observer<T> observer, final Class<T> eventType, final Annotation... eventBindings)
{
this.observer = observer;
this.eventType = eventType;
this.eventBindings = Arrays.asList(eventBindings);
this.metaDataCache = metaDataCache;
}

/**
Expand Down Expand Up @@ -108,7 +106,7 @@ public boolean isObserverInterested(Annotation... bindings)
boolean found = false;
for (Annotation y: bindings)
{
if ( metaDataCache.getBindingTypeModel(x.annotationType()).isEqual(x, y) ) {
if ( MetaDataCache.instance().getBindingTypeModel(x.annotationType()).isEqual(x, y) ) {
found = true;
}
}
Expand Down
Expand Up @@ -2,7 +2,6 @@

import javax.webbeans.Observer;

import org.jboss.webbeans.MetaDataCache;
import org.jboss.webbeans.event.EventObserver;
import org.jboss.webbeans.test.beans.DangerCall;
import org.jboss.webbeans.test.bindings.AnimalStereotypeAnnotationLiteral;
Expand Down Expand Up @@ -38,15 +37,15 @@ public void notify(T event)
public void testIsObserverInterested()
{
Observer<DangerCall> observer = new AnObserver<DangerCall>();
EventObserver<DangerCall> wrappedObserver = new EventObserver<DangerCall>(new MetaDataCache(), observer, DangerCall.class, new TameAnnotationLiteral());
EventObserver<DangerCall> wrappedObserver = new EventObserver<DangerCall>(observer, DangerCall.class, new TameAnnotationLiteral());
assert wrappedObserver.getEventBindings().size() == 1;
assert wrappedObserver.isObserverInterested(new TameAnnotationLiteral());
assert !wrappedObserver.isObserverInterested(new AnimalStereotypeAnnotationLiteral());
assert !wrappedObserver.isObserverInterested();
assert wrappedObserver.isObserverInterested(new TameAnnotationLiteral(), new RoleBinding("Admin"));

// Perform some tests with binding values (7.7.1)
wrappedObserver = new EventObserver<DangerCall>(new MetaDataCache(), observer, DangerCall.class, new RoleBinding("Admin"));
wrappedObserver = new EventObserver<DangerCall>(observer, DangerCall.class, new RoleBinding("Admin"));
assert wrappedObserver.getEventBindings().size() == 1;
assert wrappedObserver.isObserverInterested(new RoleBinding("Admin"));
assert !wrappedObserver.isObserverInterested(new RoleBinding("User"));
Expand Down

0 comments on commit 57507ff

Please sign in to comment.