
org.objectstyle.cayenne.remote.service.HttpRemoteService Maven / Gradle / Ivy
/* ====================================================================
*
* The ObjectStyle Group Software License, version 1.1
* ObjectStyle Group - http://objectstyle.org/
*
* Copyright (c) 2002-2005, Andrei (Andrus) Adamchik and individual authors
* of the software. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if any,
* must include the following acknowlegement:
* "This product includes software developed by independent contributors
* and hosted on ObjectStyle Group web site (http://objectstyle.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse
* or promote products derived from this software without prior written
* permission. For written permission, email
* "andrus at objectstyle dot org".
*
* 5. Products derived from this software may not be called "ObjectStyle"
* or "Cayenne", nor may "ObjectStyle" or "Cayenne" appear in their
* names without prior written permission.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals and hosted on ObjectStyle Group web site. For more
* information on the ObjectStyle Group, please see
* .
*/
package org.objectstyle.cayenne.remote.service;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.objectstyle.cayenne.DataChannel;
import org.objectstyle.cayenne.remote.RemoteSession;
/**
* A {@link org.objectstyle.cayenne.remote.RemoteService} implementation that stores
* server context information in HTTP sessions.
*
* @since 1.2
* @author Andrus Adamchik
*/
public abstract class HttpRemoteService extends BaseRemoteService {
static final String SESSION_ATTRIBUTE = "HttpRemoteService.ServerSession";
// keep logger non-static so that it could be garbage collected with this instance..
private final Logger logObj = Logger.getLogger(HttpRemoteService.class);
private Map sharedChannels = new HashMap();
/**
* Returns an HttpSession associated with the current request in progress.
*/
protected abstract HttpSession getSession(boolean create);
/**
* Returns a ServerSession object that represents Cayenne-related state associated
* with the current session. If ServerSession hasn't been previously saved, returns
* null.
*/
protected ServerSession getServerSession() {
HttpSession httpSession = getSession(true);
return (ServerSession) httpSession.getAttribute(SESSION_ATTRIBUTE);
}
/**
* Creates a new ServerSession with a dedicated DataChannel. Returned ServerSession is
* stored in HttpSession for future reuse.
*/
protected ServerSession createServerSession() {
HttpSession httpSession = getSession(true);
DataChannel channel = createChannel();
RemoteSession remoteSession = createRemoteSession(
httpSession.getId(),
null,
false);
ServerSession serverSession = new ServerSession(remoteSession, channel);
httpSession.setAttribute(SESSION_ATTRIBUTE, serverSession);
return serverSession;
}
/**
* Creates a new ServerSession based on a shared DataChannel. Returned ServerSession
* is stored in HttpSession for future reuse.
*
* @param name shared session name used to lookup a shared DataChannel.
*/
protected ServerSession createServerSession(String name) {
if (name == null) {
throw new IllegalArgumentException("Name is null for shared session.");
}
HttpSession httpSession = getSession(true);
DataChannel channel;
synchronized (sharedChannels) {
channel = getSharedChannel(name);
if (channel == null) {
channel = createChannel();
saveSharedChannel(name, channel);
logObj.debug("Starting a new shared channel: " + name);
}
else {
logObj.debug("Joining existing shared channel: " + name);
}
}
RemoteSession remoteSession = createRemoteSession(httpSession.getId(), name, true);
ServerSession serverSession = new ServerSession(remoteSession, channel);
httpSession.setAttribute(SESSION_ATTRIBUTE, serverSession);
return serverSession;
}
protected DataChannel getSharedChannel(String name) {
WeakReference ref = (WeakReference) sharedChannels.get(name);
return (ref != null) ? (DataChannel) ref.get() : null;
}
protected void saveSharedChannel(String name, DataChannel channel) {
// wrap value in a WeakReference so that channels can be deallocated when all
// sessions that reference this channel time out...
sharedChannels.put(name, new WeakReference(channel));
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy