/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.wicket;
import org.apache.wicket.request.cycle.RequestCycle;
/**
* Holds thread local state for Wicket data.
*
* @author Matej Knopp
*/
public class ThreadContext
{
private Application application;
private RequestCycle requestCycle;
private Session session;
private static final ThreadLocal<ThreadContext> threadLocal = new ThreadLocal<ThreadContext>();
/**
* INTERNAL METHOD
*
* @param createIfDoesNotExist
* @return ThreadContext
*/
public static ThreadContext get(boolean createIfDoesNotExist)
{
ThreadContext context = threadLocal.get();
if (context == null)
{
if (createIfDoesNotExist)
{
context = new ThreadContext();
threadLocal.set(context);
}
else
{
/*
* There is no ThreadContext set, but the threadLocal.get() operation has registered
* the threadLocal in this Thread's ThreadLocal map. We must now remove it.
*/
threadLocal.remove();
}
}
return context;
}
/**
* Checks if {@link ThreadContext} exists for the current thread
*
* @return {@code true} if {@link ThreadContext} exists for the current thread
*/
public static boolean exists()
{
return get(false) != null;
}
/**
* @return {@link Application} bound to current thread
*/
public static Application getApplication()
{
ThreadContext context = get(false);
return context != null ? context.application : null;
}
/**
* Binds the specified application to current thread.
*
* @param application
*/
public static void setApplication(Application application)
{
ThreadContext context = get(true);
context.application = application;
}
/**
* @return {@link RequestCycle} bound to current thrad
*/
public static RequestCycle getRequestCycle()
{
ThreadContext context = get(false);
return context != null ? context.requestCycle : null;
}
/**
* Binds the {@link RequestCycle} to current thread.
*
* @param requestCycle
*/
public static void setRequestCycle(RequestCycle requestCycle)
{
ThreadContext context = get(true);
context.requestCycle = requestCycle;
}
/**
* @return {@link Session} bound to current thread
*/
public static Session getSession()
{
ThreadContext context = get(false);
return context != null ? context.session : null;
}
/**
* Binds the session to current thread.
*
* @param session
*/
public static void setSession(Session session)
{
ThreadContext context = get(true);
context.session = session;
}
/**
* Cleans the {@link ThreadContext} and returns previous context.
*
* @return old {@link ThreadContext}
*/
public static ThreadContext detach()
{
ThreadContext value = threadLocal.get();
threadLocal.remove();
return value;
}
/**
* Restores the context
*
* @param threadContext
* @see #detach()
*/
public static void restore(ThreadContext threadContext)
{
if (threadContext == null)
{
threadLocal.remove();
}
else
{
threadLocal.set(threadContext);
}
}
/**
* Construct.
*/
private ThreadContext()
{
}
}