package org.marketcetera.util.ws.stateful; import org.marketcetera.util.except.I18NException; import org.marketcetera.util.misc.ClassVersion; import org.marketcetera.util.ws.stateless.StatelessRemoteCall; import org.marketcetera.util.ws.tags.SessionId; import org.marketcetera.util.ws.tags.TagFilter; import org.marketcetera.util.ws.tags.ValidSessionTagFilter; /** * An implementation wrapper for stateful services. It runs on the * server-side and applies the (optional) client version, application, * client, and session IDs through its filters; it also handles * logging, exception wrapping, and (optionally) maps session IDs to * session holders. * * @author tlerios@marketcetera.com * @since 1.0.0 * @version $Id: RemoteCall.java 16154 2012-07-14 16:34:05Z colin $ */ /* $License$ */ @ClassVersion("$Id: RemoteCall.java 16154 2012-07-14 16:34:05Z colin $") public class RemoteCall<T> extends StatelessRemoteCall { // INSTANCE DATA. private final SessionManager<T> mSessionManager; private final TagFilter mSessionIdFilter; // CONSTRUCTORS. /** * Creates a new wrapper which uses the given (optional) session * manager for session ID mappings, and which applies the given * filters to the client context. * * @param versionIdFilter The version ID filter, which may be null. * @param appIdFilter The application ID filter, which may be null. * @param clientIdFilter The client ID filter, which may be null. * @param sessionManager The session manager, which may be null. * @param sessionIdFilter The session ID filter, which may be null. */ public RemoteCall (TagFilter versionIdFilter, TagFilter appIdFilter, TagFilter clientIdFilter, SessionManager<T> sessionManager, TagFilter sessionIdFilter) { super(versionIdFilter,appIdFilter,clientIdFilter); mSessionManager=sessionManager; mSessionIdFilter=sessionIdFilter; } /** * Creates a new wrapper which uses the given (optional) session * manager for session ID mappings, and which applies two filters * to the client context. The first filter ensures that the * client's version ID is equal to the server's version ID; the * second ensures that the session ID maps to an active session. * * @param sessionManager The session manager, which may be null. */ public RemoteCall (SessionManager<T> sessionManager) { mSessionManager=sessionManager; if (getSessionManager()!=null) { mSessionIdFilter=getDefaultSessionIdFilter(getSessionManager()); } else { mSessionIdFilter=null; } } // INSTANCE METHODS. /** * Returns the receiver's session manager. * * @return The session manager, which may be null. */ public SessionManager<T> getSessionManager() { return mSessionManager; } /** * Returns the default session ID filter for the given session * manager. * * @param sessionManager The session manager. * * @return The filter. */ public static <T> ValidSessionTagFilter<T> getDefaultSessionIdFilter (SessionManager<T> sessionManager) { return new ValidSessionTagFilter<T>(sessionManager); } /** * Returns the receiver's session ID filter. * * @return The filter, which may be null. */ public TagFilter getSessionIdFilter() { return mSessionIdFilter; } /** * Asserts that the given client context matches all of the * receiver's filters. It also returns the session holder for the * active session of that client, if one exists. * * @param context The context. * * @return The session holder, which may be null. * * @throws I18NException Thrown if there is a filter mismatch. */ protected SessionHolder<T> getSessionHolder (ClientContext context) throws I18NException { assertFilterMatch(context); SessionId sessionId=context.getSessionId(); assertFilterMatch(getSessionIdFilter(),sessionId); if ((sessionId==null) || (getSessionManager()==null)) { return null; } SessionHolder<T> holder=getSessionManager().get(sessionId); return holder; } }