Skip to content

Commit

Permalink
up memory for running tests, fix serialization for child managers, us…
Browse files Browse the repository at this point in the history
…e correct manager in client proxy

git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@2303 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
pmuir committed Apr 5, 2009
1 parent 53bb958 commit b209991
Show file tree
Hide file tree
Showing 9 changed files with 275 additions and 50 deletions.
31 changes: 28 additions & 3 deletions impl/src/main/java/org/jboss/webbeans/CurrentManager.java
Expand Up @@ -17,6 +17,9 @@

package org.jboss.webbeans;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


/**
* Access point for getting/setting current Managager
Expand All @@ -25,8 +28,11 @@
*/
public class CurrentManager
{

// The root manager instance
protected static ManagerImpl managerImpl;
private static Integer rootManagerId;

private final static Map<Integer, ManagerImpl> managers = new ConcurrentHashMap<Integer, ManagerImpl>();

/**
* Gets the root manager
Expand All @@ -35,7 +41,7 @@ public class CurrentManager
*/
public static ManagerImpl rootManager()
{
return managerImpl;
return managers.get(rootManagerId);
}

/**
Expand All @@ -45,7 +51,26 @@ public static ManagerImpl rootManager()
*/
public static void setRootManager(ManagerImpl managerImpl)
{
CurrentManager.managerImpl = managerImpl;
if (managerImpl == null)
{
rootManagerId = null;
}
else
{
rootManagerId = add(managerImpl);
}
}

public static ManagerImpl get(Integer key)
{
return managers.get(key);
}

public static Integer add(ManagerImpl manager)
{
Integer id = manager.getId();
managers.put(id, manager);
return id;
}

}
102 changes: 66 additions & 36 deletions impl/src/main/java/org/jboss/webbeans/ManagerImpl.java
Expand Up @@ -34,9 +34,11 @@
import java.util.Stack;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

import javax.context.Context;
import javax.context.ContextNotActiveException;
Expand Down Expand Up @@ -82,9 +84,9 @@
import org.jboss.webbeans.util.Beans;
import org.jboss.webbeans.util.Proxies;
import org.jboss.webbeans.util.Reflections;
import org.jboss.webbeans.util.collections.multi.ConcurrentSetHashMultiMap;
import org.jboss.webbeans.util.collections.multi.ConcurrentListHashMultiMap;
import org.jboss.webbeans.util.collections.multi.ConcurrentListMultiMap;
import org.jboss.webbeans.util.collections.multi.ConcurrentSetHashMultiMap;
import org.jboss.webbeans.util.collections.multi.ConcurrentSetMultiMap;

/**
Expand Down Expand Up @@ -123,6 +125,7 @@ public class ManagerImpl implements WebBeansManager, Serializable
private transient final Map<Class<?>, EnterpriseBean<?>> newEnterpriseBeans;
private transient final Map<String, RIBean<?>> riBeans;
private final transient Map<Bean<?>, Bean<?>> specializedBeans;
private final transient AtomicInteger ids;


/*
Expand All @@ -141,7 +144,9 @@ public class ManagerImpl implements WebBeansManager, Serializable
private transient final ThreadLocal<Stack<InjectionPoint>> currentInjectionPoint;
private transient List<Bean<?>> beans;
private final transient Namespace rootNamespace;
private final ConcurrentSetMultiMap<Type, EventObserver<?>> registeredObservers;
private final transient ConcurrentSetMultiMap<Type, EventObserver<?>> registeredObservers;
private final transient Set<ManagerImpl> childActivities;
private final Integer id;


/**
Expand All @@ -166,8 +171,9 @@ public static ManagerImpl newRootManager(ServiceRegistry serviceRegistry)
new ClientProxyProvider(),
new ConcurrentListHashMultiMap<Class<? extends Annotation>, Context>(),
new HashMap<Bean<?>, Bean<?>>(),

defaultEnabledDeploymentTypes);
defaultEnabledDeploymentTypes,
new AtomicInteger()
);
}

/**
Expand Down Expand Up @@ -195,7 +201,9 @@ public static ManagerImpl newChildManager(ManagerImpl parentManager)
parentManager.getClientProxyProvider(),
parentManager.getContexts(),
parentManager.getSpecializedBeans(),
parentManager.getEnabledDeploymentTypes());
parentManager.getEnabledDeploymentTypes(),
parentManager.getIds()
);
}

/**
Expand All @@ -213,7 +221,8 @@ private ManagerImpl(
ClientProxyProvider clientProxyProvider,
ConcurrentListMultiMap<Class<? extends Annotation>, Context> contexts,
Map<Bean<?>, Bean<?>> specializedBeans,
List<Class<? extends Annotation>> enabledDeploymentTypes
List<Class<? extends Annotation>> enabledDeploymentTypes,
AtomicInteger ids
)
{
this.services = serviceRegistry;
Expand All @@ -226,10 +235,13 @@ private ManagerImpl(
this.registeredObservers = registeredObservers;
setEnabledDeploymentTypes(enabledDeploymentTypes);
this.rootNamespace = rootNamespace;
this.ids = ids;
this.id = ids.incrementAndGet();

this.resolver = new Resolver(this);
this.eventManager = new EventManager(this);
this.nonContextualInjector = new NonContextualInjector(this);
this.childActivities = new CopyOnWriteArraySet<ManagerImpl>();
this.currentInjectionPoint = new ThreadLocal<Stack<InjectionPoint>>()
{
@Override
Expand Down Expand Up @@ -280,6 +292,10 @@ public Manager addBean(Bean<?> bean)
resolver.clear();
beans.add(bean);
registerBeanNamespace(bean);
for (ManagerImpl childActivity : childActivities)
{
childActivity.addBean(bean);
}
return this;
}

Expand Down Expand Up @@ -557,43 +573,44 @@ public Manager addInterceptor(Interceptor interceptor)
throw new UnsupportedOperationException("Not yet implemented");
}

/**
* Registers an observer for a given event type and binding types
*
* @param observer The observer to register
* @param eventType The event type to match
* @param bindings The bindings to match
* @return A reference to the manager
*
* @see javax.inject.manager.Manager#addObserver(javax.event.Observer,
* java.lang.Class, java.lang.annotation.Annotation[])
*/
public <T> Manager addObserver(Observer<T> observer, Class<T> eventType, Annotation... bindings)
{
this.eventManager.addObserver(observer, eventType, bindings);
return this;
return _addObserver(observer, eventType, bindings);
}

/**
* Shortcut to register an ObserverImpl
*
* @param <T>
* @param observer
* @return
*/
public <T> Manager addObserver(ObserverImpl<T> observer)
{
this.eventManager.addObserver(observer, observer.getEventType(), observer.getBindingsAsArray());
return this;
return _addObserver(observer, observer.getEventType(), observer.getBindingsAsArray());
}

public <T> Manager addObserver(Observer<T> observer, TypeLiteral<T> eventType, Annotation... bindings)
{
return _addObserver(observer, eventType.getType(), bindings);
}

/**
* Registers an observer for a given event type literal and binding types
*
* @param observer The observer to register
* @param eventType The event type literal to match
* @param bindings The bindings to match
* @return A reference to the manager
*
* @see javax.inject.manager.Manager#addObserver(javax.event.Observer,
* javax.inject.TypeLiteral, java.lang.annotation.Annotation[])
* Does the actual observer registration
*
* @param <T>
* @param observer
* @param eventType
* @param bindings
* @return
*/
public <T> Manager addObserver(Observer<T> observer, TypeLiteral<T> eventType, Annotation... bindings)
protected <T> Manager _addObserver(Observer<T> observer, Type eventType, Annotation... bindings)
{
eventManager.addObserver(observer, eventType.getType(), bindings);
this.eventManager.addObserver(observer, eventType, bindings);
for (ManagerImpl childActivity : childActivities)
{
childActivity._addObserver(observer, eventType, bindings);
}
return this;
}

Expand Down Expand Up @@ -704,7 +721,7 @@ else if (getServices().get(MetaDataCache.class).getScopeModel(bean.getScopeType(
{
if (creationalContext != null || (creationalContext == null && getContext(bean.getScopeType()).get(bean) != null))
{
return (T) clientProxyProvider.getClientProxy(bean);
return (T) clientProxyProvider.getClientProxy(this, bean);
}
else
{
Expand Down Expand Up @@ -968,9 +985,12 @@ public Manager parse(InputStream xmlStream)
throw new UnsupportedOperationException();
}

public Manager createActivity()
public ManagerImpl createActivity()
{
return newChildManager(this);
ManagerImpl childActivity = newChildManager(this);
childActivities.add(childActivity);
CurrentManager.add(childActivity);
return childActivity;
}

public Manager setCurrent(Class<? extends Annotation> scopeType)
Expand Down Expand Up @@ -1015,7 +1035,7 @@ public Map<Bean<?>, Bean<?>> getSpecializedBeans()

protected Object readResolve()
{
return CurrentManager.rootManager();
return CurrentManager.get(id);
}

/**
Expand Down Expand Up @@ -1076,6 +1096,16 @@ protected ConcurrentListMultiMap<Class<? extends Annotation>, Context> getContex
return contexts;
}

protected AtomicInteger getIds()
{
return ids;
}

public Integer getId()
{
return id;
}

public ConcurrentSetMultiMap<Type, EventObserver<?>> getRegisteredObservers()
{
return registeredObservers;
Expand Down
Expand Up @@ -25,7 +25,7 @@
import javax.context.Context;
import javax.inject.manager.Bean;

import org.jboss.webbeans.CurrentManager;
import org.jboss.webbeans.ManagerImpl;
import org.jboss.webbeans.context.CreationalContextImpl;
import org.jboss.webbeans.log.LogProvider;
import org.jboss.webbeans.log.Logging;
Expand All @@ -48,7 +48,9 @@ public class ClientProxyMethodHandler implements MethodHandler, Serializable
// The bean
private transient Bean<?> bean;
// The bean index in the manager
private int beanIndex;
private final int beanIndex;

private final ManagerImpl manager;

private static final ThreadLocal<CreationalContextImpl<?>> currentCreationalContext = new ThreadLocal<CreationalContextImpl<?>>();

Expand All @@ -58,10 +60,11 @@ public class ClientProxyMethodHandler implements MethodHandler, Serializable
* @param bean The bean to proxy
* @param beanIndex The index to the bean in the manager bean list
*/
public ClientProxyMethodHandler(Bean<?> bean, int beanIndex)
public ClientProxyMethodHandler(Bean<?> bean, ManagerImpl manager, int beanIndex)
{
this.bean = bean;
this.beanIndex = beanIndex;
this.manager = manager;
log.trace("Created method handler for bean " + bean + " indexed as " + beanIndex);
}

Expand All @@ -88,7 +91,7 @@ public Object invoke(Object self, Method proxiedMethod, Method proceed, Object[]
{
if (bean == null)
{
bean = CurrentManager.rootManager().getBeans().get(beanIndex);
bean = manager.getBeans().get(beanIndex);
}
Object proxiedInstance = getProxiedInstance(bean);
Object returnValue = Reflections.lookupMethod(proxiedMethod, proxiedInstance).invoke(proxiedInstance, args);
Expand All @@ -110,7 +113,7 @@ private <T> T getProxiedInstance(Bean<T> bean)
}
try
{
Context context = CurrentManager.rootManager().getContext(bean.getScopeType());
Context context = manager.getContext(bean.getScopeType());
return context.get(bean, creationalContext);
}
finally
Expand Down
Expand Up @@ -28,7 +28,7 @@
import javax.inject.DefinitionException;
import javax.inject.manager.Bean;

import org.jboss.webbeans.CurrentManager;
import org.jboss.webbeans.ManagerImpl;
import org.jboss.webbeans.util.Proxies;
import org.jboss.webbeans.util.collections.ConcurrentCache;

Expand Down Expand Up @@ -71,12 +71,12 @@ public ClientProxyProvider()
* @throws InstantiationException When the proxy couldn't be created
* @throws IllegalAccessException When the proxy couldn't be created
*/
private static <T> T createClientProxy(Bean<T> bean, int beanIndex) throws RuntimeException
private static <T> T createClientProxy(Bean<T> bean, ManagerImpl manager, int beanIndex) throws RuntimeException
{

try
{
ClientProxyMethodHandler proxyMethodHandler = new ClientProxyMethodHandler(bean, beanIndex);
ClientProxyMethodHandler proxyMethodHandler = new ClientProxyMethodHandler(bean, manager, beanIndex);
Set<Type> classes = new LinkedHashSet<Type>(bean.getTypes());
classes.add(Serializable.class);
ProxyFactory proxyFactory = Proxies.getProxyFactory(classes);
Expand Down Expand Up @@ -110,19 +110,19 @@ private static <T> T createClientProxy(Bean<T> bean, int beanIndex) throws Runti
* @return the client proxy for the bean
*/
// TODO: What is this create parameter? Something obsolete?
public <T> T getClientProxy(final Bean<T> bean)
public <T> T getClientProxy(final ManagerImpl manager, final Bean<T> bean)
{
return pool.putIfAbsent(bean, new Callable<T>()
{

public T call() throws Exception
{
int beanIndex = CurrentManager.rootManager().getBeans().indexOf(bean);
int beanIndex = manager.getBeans().indexOf(bean);
if (beanIndex < 0)
{
throw new DefinitionException(bean + " is not known to the manager");
}
return createClientProxy(bean, beanIndex);
return createClientProxy(bean, manager, beanIndex);
}

});
Expand Down
2 changes: 2 additions & 0 deletions jboss-tck-runner/pom.xml
Expand Up @@ -92,6 +92,8 @@
<suiteXmlFiles>
<suiteXmlFile>${project.build.directory}/dependency/jsr299-tck-impl-suite.xml</suiteXmlFile>
</suiteXmlFiles>
<argLine>-Xmx128m</argLine>
<forkMode>once</forkMode>
</configuration>
</plugin>
<plugin>
Expand Down

0 comments on commit b209991

Please sign in to comment.