/*
* Copyright 2000-2002,2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// package
package org.apache.jetspeed.services.rundata;
// Java classes
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// Turbine classes
import org.apache.turbine.services.rundata.TurbineRunDataService;
import org.apache.turbine.services.InitializationException;
import org.apache.turbine.util.RunData;
import org.apache.turbine.util.TurbineException;
import org.apache.turbine.services.TurbineServices;
// Jetspeed classes
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.jetspeed.services.rundata.JetspeedRunData;
import org.apache.jetspeed.services.statemanager.StateManagerService;
/**
* The JetspeedRunDataService extends TurbineRunDataService,
* adding the ability to get the current runData object for the thread
* at any time. This is accomplished by storing the active runData objects
* in a map, keyed by thread.
* Also done here, because this is so nicely bracketed around each http request
* by Turbine, is the association of the http session for this request / thread
* with the state manager.
*
* @author <a href="mailto:ggolden@umich.edu">Glenn R. Golden</a>
* @version $Revision: 1.5 $
*/
public class JetspeedRunDataService
extends TurbineRunDataService
{
/**
* Static initialization of the logger for this class
*/
private static final JetspeedLogger logger = JetspeedLogFactoryService.getLogger(JetspeedRunDataService.class.getName());
/** The collection of active JetspeedRunData objects, keyed by Thread. */
private Map m_runDataStore = null;
/*******************************************************************************
* Service implementation
*******************************************************************************/
/**
* Initializes the service
*
* @throws InitializationException if initialization fails.
*/
public void init()
throws InitializationException
{
super.init();
// allocate a thread-safe map
m_runDataStore = Collections.synchronizedMap(new HashMap());
} // init
/*******************************************************************************
* TurbineRunDataService implementation
*******************************************************************************/
/**
* Gets a RunData instance from a specific configuration.
*
* @param key a configuration key.
* @param req a servlet request.
* @param res a servlet response.
* @param config a servlet config.
* @return a new or recycled RunData object.
* @throws TurbineException if the operation fails.
* @throws IllegalArgumentException if any of the parameters are null.
*/
public RunData getRunData(String key,
HttpServletRequest req,
HttpServletResponse res,
ServletConfig config)
throws TurbineException, IllegalArgumentException
{
// let the super do the work
JetspeedRunData r = (JetspeedRunData)super.getRunData(key, req, res, config);
// store the rundata associated with this thread
m_runDataStore.put(Thread.currentThread(), r);
// associate this http session with this thread in the state manager
StateManagerService stateManager = (StateManagerService)TurbineServices
.getInstance().getService(StateManagerService.SERVICE_NAME);
if (stateManager != null)
{
stateManager.setCurrentContext(req.getSession(true));
}
if (logger.isDebugEnabled())
logger.debug("JetspeedRunDataService: storing rundata " + r
+ " for thread: " + Thread.currentThread());
return r;
} // getRunData
/**
* Puts the used RunData object back to the factory for recycling.
*
* @param data the used RunData object.
* @return true, if pooling is supported and the object was accepted.
*/
public boolean putRunData(RunData data)
{
// un-associate this http session with this thread in the state manager
StateManagerService stateManager = (StateManagerService)TurbineServices
.getInstance().getService(StateManagerService.SERVICE_NAME);
if (stateManager != null)
{
stateManager.clearCurrentContext();
}
// remove this thread's rundata
m_runDataStore.remove(Thread.currentThread());
if (logger.isDebugEnabled())
logger.debug("JetspeedRunDataService: releasing rundata for thread: "
+ Thread.currentThread());
// let super do the work
return super.putRunData(data);
} // putRunData
/**
* Access the current rundata object - the one associated with the current thread.
* @return The current JetspeedRunData object associatd with the current thread.
*/
public JetspeedRunData getCurrentRunData()
{
if (logger.isDebugEnabled())
logger.debug("JetspeedRunDataService: accessing rundata "
+ m_runDataStore.get(Thread.currentThread())
+ " for thread: " + Thread.currentThread());
return (JetspeedRunData) m_runDataStore.get(Thread.currentThread());
} // getCurrentRunData
} // JetspeedRunDataService
/**********************************************************************************
*
* $Header: /home/cvspublic/jakarta-jetspeed/src/java/org/apache/jetspeed/services/rundata/JetspeedRunDataService.java,v 1.5 2004/02/23 03:36:10 jford Exp $
*
**********************************************************************************/