package org.jboss.as.ee.component; import org.jboss.as.ee.logging.EeLogger; import org.jboss.invocation.InterceptorContext; import java.io.Serializable; import java.util.HashMap; import java.util.Map; /** * Class that represents an instance of a component client. It should only be referenced from client * post construct interceptors. * * This stores all the context data for the client, such as the SFSB session ID etc. * * Previously this was achieved using stateful interceptor chains. This information can only be set during view * construction for thread safety reasons. If mutable data is required then a mutable and thread safe structure should * be inserted into the map at construction time. * * The class is only used at component creation time, after that the information that is contains is attached to the * private data of the interceptor context. * * @author Stuart Douglas */ public class ComponentClientInstance implements Serializable { private final Map<Object, Object> contextInformation = new HashMap<Object, Object>(); private volatile boolean constructionComplete = false; public Object getViewInstanceData(final Object key) { return contextInformation.get(key); } public void setViewInstanceData(final Object key, final Object data) { if(constructionComplete) { throw EeLogger.ROOT_LOGGER.instanceDataCanOnlyBeSetDuringConstruction(); } contextInformation.put(key, data); } void prepareInterceptorContext(InterceptorContext interceptorContext){ for(Map.Entry<Object, Object> entry : contextInformation.entrySet()) { interceptorContext.putPrivateData(entry.getKey(), entry.getValue()); } } void constructionComplete() { constructionComplete = true; } }