Skip to content

Commit

Permalink
Contexts refactoring
Browse files Browse the repository at this point in the history
git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@320 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
nickarls committed Nov 18, 2008
1 parent ac420f6 commit 873aa2c
Show file tree
Hide file tree
Showing 6 changed files with 128 additions and 53 deletions.
38 changes: 6 additions & 32 deletions webbeans-ri/src/main/java/org/jboss/webbeans/contexts/BeanMap.java
@@ -1,38 +1,12 @@
package org.jboss.webbeans.contexts;

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

import javax.webbeans.manager.Bean;

import com.google.common.collect.ForwardingMap;

public class BeanMap extends ForwardingMap<Bean<? extends Object>, Object>
public interface BeanMap
{

protected Map<Bean<? extends Object>, Object> delegate;

public BeanMap()
{
delegate = new ConcurrentHashMap<Bean<? extends Object>, Object>();
}

@SuppressWarnings("unchecked")
public <T extends Object> T get(Bean<? extends T> bean)
{
return (T) super.get(bean);
}

@Override
public Map<Bean<? extends Object>, Object> delegate()
{
return delegate;
}

@SuppressWarnings("unchecked")
public <T extends Object> T remove(Bean<? extends T> bean)
{
return (T) super.remove(bean);
}

public abstract <T extends Object> T get(Bean<? extends T> bean);
public abstract <T extends Object> T remove(Bean<? extends T> bean);
public abstract void clear();
public abstract Iterable<Bean<? extends Object>> keySet();
public abstract <T extends Object> T put(Bean<? extends T> bean, T instance);
}
Expand Up @@ -12,16 +12,11 @@ public PrivateContext(Class<? extends Annotation> scopeType)
{
super(scopeType);
beans = new ThreadLocal<BeanMap>();
beans.set(new BeanMap());
beans.set(new SimpleBeanMap());
active = new ThreadLocal<AtomicBoolean>();
active.set(new AtomicBoolean(true));
}

public void setBeans(BeanMap beans)
{
this.beans.set(beans);
}

@Override
protected AtomicBoolean getActive()
{
Expand Down
@@ -1,40 +1,93 @@
package org.jboss.webbeans.contexts;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.servlet.http.HttpSession;
import javax.webbeans.manager.Bean;

import org.jboss.webbeans.ManagerImpl;

public class SessionBeanMap extends BeanMap
public class SessionBeanMap implements BeanMap
{
private static final String KEY_PREFIX = "SessionScoped#";

private HttpSession session;
private ManagerImpl manager;

public SessionBeanMap(ManagerImpl manager) {
private BeanMap cache;

public SessionBeanMap(ManagerImpl manager)
{
super();
this.manager = manager;
cache = new SimpleBeanMap();
}

public void setSession(HttpSession session) {
public void setSession(HttpSession session)
{
this.session = session;
}
@Override

@SuppressWarnings("unchecked")
public <T> T get(Bean<? extends T> bean)
{
String id = Integer.toString(manager.getBeans().indexOf(bean));
T instance = super.get(bean);
session.setAttribute(id, instance);
T instance = cache.get(bean);
if (instance != null)
{
return instance;
}
String id = KEY_PREFIX + manager.getBeans().indexOf(bean);
instance = (T) session.getAttribute(id);
if (instance != null)
{
cache.put(bean, instance);
}
return instance;
}

@Override
public <T> T remove(Bean<? extends T> bean)
{
T instance = super.remove(bean);
String id = Integer.toString(manager.getBeans().indexOf(bean));
T instance = get(bean);
String id = KEY_PREFIX + manager.getBeans().indexOf(bean);
session.removeAttribute(id);
cache.remove(bean);
return instance;
}

@SuppressWarnings("unchecked")
public void clear()
{
Enumeration names = session.getAttributeNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
session.removeAttribute(name);
}
cache.clear();
}

public Iterable<Bean<? extends Object>> keySet()
{
List<Bean<?>> beans = new ArrayList<Bean<?>>();

Enumeration names = session.getAttributeNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
if (name.startsWith(KEY_PREFIX)) {
String id = name.substring(KEY_PREFIX.length());
Bean<?> bean = manager.getBeans().get(Integer.parseInt(id));
beans.add(bean);
}
}

return beans;
}

public <T> T put(Bean<? extends T> bean, T instance)
{
String id = KEY_PREFIX + manager.getBeans().indexOf(bean);
session.setAttribute(id, instance);
return cache.put(bean, instance);
}

}
Expand Up @@ -6,12 +6,12 @@

public class SessionContext extends PrivateContext {

private ThreadLocal<SessionBeanMap> beans;
private ThreadLocal<BeanMap> beans;

public SessionContext(ManagerImpl manager)
{
super(SessionScoped.class);
beans = new ThreadLocal<SessionBeanMap>();
beans = new ThreadLocal<BeanMap>();
beans.set(new SessionBeanMap(manager));
}

Expand Down
Expand Up @@ -11,7 +11,7 @@ public class SharedContext extends AbstractContext
public SharedContext(Class<? extends Annotation> scopeType)
{
super(scopeType);
beans = new BeanMap();
beans = new SimpleBeanMap();
active = new AtomicBoolean(true);
}

Expand Down
@@ -0,0 +1,53 @@
package org.jboss.webbeans.contexts;

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

import javax.webbeans.manager.Bean;

import com.google.common.collect.ForwardingMap;

public class SimpleBeanMap extends ForwardingMap<Bean<? extends Object>, Object> implements BeanMap
{

protected Map<Bean<? extends Object>, Object> delegate;

public SimpleBeanMap()
{
delegate = new ConcurrentHashMap<Bean<? extends Object>, Object>();
}

@SuppressWarnings("unchecked")
public <T extends Object> T get(Bean<? extends T> bean)
{
return (T) super.get(bean);
}

@Override
public Map<Bean<? extends Object>, Object> delegate()
{
return delegate;
}

@SuppressWarnings("unchecked")
public <T extends Object> T remove(Bean<? extends T> bean)
{
return (T) super.remove(bean);
}

public void clear() {
delegate.clear();
}

public Set<Bean<? extends Object>> keySet() {
return delegate.keySet();
}

@SuppressWarnings("unchecked")
public <T> T put(Bean<? extends T> bean, T instance)
{
return (T) delegate.put(bean, instance);
}

}

0 comments on commit 873aa2c

Please sign in to comment.