Skip to content

Commit

Permalink
concurrency support for metadata
Browse files Browse the repository at this point in the history
git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@399 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
pmuir committed Dec 4, 2008
1 parent 52d725e commit 50dcdf5
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 145 deletions.
172 changes: 39 additions & 133 deletions webbeans-ri/src/main/java/org/jboss/webbeans/MetaDataCache.java
Expand Up @@ -18,174 +18,80 @@
package org.jboss.webbeans;

import java.lang.annotation.Annotation;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Callable;

import org.jboss.webbeans.ejb.EjbMetaData;
import org.jboss.webbeans.model.AnnotationModel;
import org.jboss.webbeans.model.BindingTypeModel;
import org.jboss.webbeans.model.ScopeModel;
import org.jboss.webbeans.model.StereotypeModel;
import org.jboss.webbeans.util.ConcurrentCache;
import org.jboss.webbeans.util.Strings;

import com.google.common.collect.ForwardingMap;

public class MetaDataCache
{

private abstract class AnnotationModelMap<T extends AnnotationModel<?>> extends ForwardingMap<Class<? extends Annotation>, T>
{

Map<Class<? extends Annotation>, T> delegate;

public AnnotationModelMap()
{
delegate = new ConcurrentHashMap<Class<? extends Annotation>, T>();
}

public <S extends Annotation> T putIfAbsent(Class<S> key)
{
if (!containsKey(key))
{
T model = createAnnotationModel(key);
super.put(key, model);
return model;
}
return (T) super.get(key);
}

protected abstract <S extends Annotation> T createAnnotationModel(Class<S> type);
private ConcurrentCache<Class<? extends Annotation>, StereotypeModel<?>> stereotypes = new ConcurrentCache<Class<? extends Annotation>, StereotypeModel<?>>();

@Override
protected Map<Class<? extends Annotation>, T> delegate()
{
return delegate;
}
private ConcurrentCache<Class<? extends Annotation>, ScopeModel<?>> scopes = new ConcurrentCache<Class<? extends Annotation>, ScopeModel<?>>();

@Override
public String toString()
{
return Strings.mapToString("AnnotationModelMap (annotation -> ?): ", delegate);
}
private ConcurrentCache<Class<? extends Annotation>, BindingTypeModel<?>> bindingTypes = new ConcurrentCache<Class<? extends Annotation>, BindingTypeModel<?>>();

}
private ConcurrentCache<Class<?>, EjbMetaData<?>> ejbMetaDataMap = new ConcurrentCache<Class<?>, EjbMetaData<?>>();

@SuppressWarnings("unchecked")
private class ScopeModelMap extends AnnotationModelMap<ScopeModel<?>>
public <T extends Annotation> void addStereotype(final Class<T> stereotype)
{

@Override
public <S extends Annotation> ScopeModel<S> putIfAbsent(Class<S> key)
stereotypes.putIfAbsent(stereotype, new Callable<StereotypeModel<?>>()
{
return (ScopeModel<S>) super.putIfAbsent(key);
}

@Override
protected <S extends Annotation> ScopeModel<?> createAnnotationModel(Class<S> type)
{
return new ScopeModel<S>(type);
}

@Override
public String toString()
{
return Strings.mapToString("ScopeModelMap (annotation -> ScopeModel): ", delegate);
}

public StereotypeModel<?> call() throws Exception
{
return new StereotypeModel<T>(stereotype);
}
});
}

@SuppressWarnings("unchecked")
private class BindingTypeModelMap extends AnnotationModelMap<BindingTypeModel<?>>
public StereotypeModel<?> getStereotype(Class<? extends Annotation> annotationType)
{

@Override
public <S extends Annotation> BindingTypeModel<S> putIfAbsent(Class<S> key)
{
return (BindingTypeModel<S>) super.putIfAbsent(key);
}

@Override
protected <S extends Annotation> BindingTypeModel<?> createAnnotationModel(Class<S> type)
{
return new BindingTypeModel<S>(type);
}

@Override
public String toString()
{
return Strings.mapToString("BindingTypeModelMap (annotation -> BindingTypeModel): ", delegate);
}
return stereotypes.getValue(annotationType);
}

private class EjbMetaDataMap extends ForwardingMap<Class<?>, EjbMetaData<?>>
public <T extends Annotation> ScopeModel<T> getScopeModel(final Class<T> scopeType)
{

private Map<Class<?>, EjbMetaData<?>> delegate;

public EjbMetaDataMap()
{
delegate = new HashMap<Class<?>, EjbMetaData<?>>();
}

@Override
protected Map<Class<?>, EjbMetaData<?>> delegate()
return scopes.putIfAbsent(scopeType, new Callable<ScopeModel<T>>()
{
return delegate;
}

@SuppressWarnings("unchecked")
public <T> EjbMetaData<T> putIfAbsent(Class<T> key)
{
if (!containsKey(key))
public ScopeModel<T> call() throws Exception
{
EjbMetaData<T> ejbMetaData = new EjbMetaData<T>(key);
super.put(key, ejbMetaData);
return ejbMetaData;
return new ScopeModel<T>(scopeType);
}
return (EjbMetaData<T>) super.get(key);
}

@Override
public String toString()
{
return Strings.mapToString("EJBMetadataMap (class -> EJBMetaData): ", delegate);
}

}

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

private ScopeModelMap scopes = new ScopeModelMap();

private BindingTypeModelMap bindingTypes = new BindingTypeModelMap();

private EjbMetaDataMap ejbMetaDataMap = new EjbMetaDataMap();

public void addStereotype(StereotypeModel<?> stereotype)
{
stereotypes.put(stereotype.getType(), stereotype);

});
}

public StereotypeModel<?> getStereotype(Class<? extends Annotation> annotationType)
public <T extends Annotation> BindingTypeModel<T> getBindingTypeModel(final Class<T> bindingType)
{
return stereotypes.get(annotationType);
}
return bindingTypes.putIfAbsent(bindingType, new Callable<BindingTypeModel<T>>()
{

public <T extends Annotation> ScopeModel<T> getScopeModel(Class<T> scopeType)
{
return scopes.putIfAbsent(scopeType);
public BindingTypeModel<T> call() throws Exception
{
return new BindingTypeModel<T>(bindingType);
}

});
}

public <T extends Annotation> BindingTypeModel<T> getBindingTypeModel(Class<T> bindingType)
public <T> EjbMetaData<T> getEjbMetaData(final Class<T> clazz)
{
return bindingTypes.putIfAbsent(bindingType);
}
return ejbMetaDataMap.putIfAbsent(clazz, new Callable<EjbMetaData<T>>()
{

public <T> EjbMetaData<T> getEjbMetaData(Class<T> clazz)
{
return ejbMetaDataMap.putIfAbsent(clazz);
public EjbMetaData<T> call() throws Exception
{
return new EjbMetaData<T>(clazz);
}

});
}

@Override
Expand Down
Expand Up @@ -53,7 +53,7 @@ public AbstractContext getBuiltInContext(Class<? extends Annotation> scopeType)
{
try
{
return (AbstractContext) get(scopeType).get().iterator().next();
return (AbstractContext) getFuture(scopeType).get().iterator().next();
}
catch (InterruptedException e)
{
Expand Down Expand Up @@ -84,7 +84,7 @@ public List<Context> getContext(Class<? extends Annotation> scopeType)
{
try
{
return get(scopeType).get();
return getFuture(scopeType).get();
}
catch (InterruptedException e)
{
Expand Down
Expand Up @@ -21,11 +21,42 @@ public ConcurrentCache()
}

@SuppressWarnings("unchecked")
public <T extends V> Future<T> get(K key)
public <T extends V> Future<T> getFuture(K key)
{
return (Future<T>) super.get(key);
}

public <T extends V> T getValue(K key)
{
Future<T> value = (Future<T>) map.get(key);
boolean interrupted = false;
try
{
while (true)
{
try
{
return value.get();
}
catch (InterruptedException e)
{
interrupted = true;
}
catch (ExecutionException e)
{
rethrow(e);
};
}
}
finally
{
if (interrupted)
{
Thread.currentThread().interrupt();
}
}
}

public <E> E putIfAbsent(K key, Callable<E> callable)
{
Future<E> value = (Future<E>) map.get(key);
Expand Down
Expand Up @@ -6,7 +6,6 @@
import javax.webbeans.Standard;

import org.jboss.webbeans.bootstrap.Bootstrap;
import org.jboss.webbeans.model.StereotypeModel;
import org.jboss.webbeans.test.annotations.AnimalStereotype;
import org.jboss.webbeans.test.annotations.AnotherDeploymentType;
import org.jboss.webbeans.test.annotations.FishStereotype;
Expand Down Expand Up @@ -47,14 +46,14 @@ protected void addEnabledDeploymentTypes()

protected void addStereotypes()
{
manager.getMetaDataCache().addStereotype(new StereotypeModel<Decorator>(Decorator.class));
manager.getMetaDataCache().addStereotype(new StereotypeModel<Interceptor>(Interceptor.class));
manager.getMetaDataCache().addStereotype(new StereotypeModel<AnimalStereotype>(AnimalStereotype.class));
manager.getMetaDataCache().addStereotype(new StereotypeModel<HornedMammalStereotype>(HornedMammalStereotype.class));
manager.getMetaDataCache().addStereotype(new StereotypeModel<MammalStereotype>(MammalStereotype.class));
manager.getMetaDataCache().addStereotype(new StereotypeModel<FishStereotype>(FishStereotype.class));
manager.getMetaDataCache().addStereotype(new StereotypeModel<RiverFishStereotype>(RiverFishStereotype.class));
manager.getMetaDataCache().addStereotype(new StereotypeModel<RequestScopedAnimalStereotype>(RequestScopedAnimalStereotype.class));
manager.getMetaDataCache().addStereotype(Decorator.class);
manager.getMetaDataCache().addStereotype(Interceptor.class);
manager.getMetaDataCache().addStereotype(AnimalStereotype.class);
manager.getMetaDataCache().addStereotype(HornedMammalStereotype.class);
manager.getMetaDataCache().addStereotype(MammalStereotype.class);
manager.getMetaDataCache().addStereotype(FishStereotype.class);
manager.getMetaDataCache().addStereotype(RiverFishStereotype.class);
manager.getMetaDataCache().addStereotype(RequestScopedAnimalStereotype.class);
}

}

0 comments on commit 50dcdf5

Please sign in to comment.