001: /**
002: * EasyBeans
003: * Copyright (C) 2006 Bull S.A.S.
004: * Contact: easybeans@ow2.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * --------------------------------------------------------------------------
022: * $Id: SecurityCurrent.java 1970 2007-10-16 11:49:25Z benoitf $
023: * --------------------------------------------------------------------------
024: */package org.ow2.easybeans.security.propagation.context;
025:
026: import org.ow2.easybeans.security.api.EZBSecurityContext;
027: import org.ow2.easybeans.security.api.EZBSecurityCurrent;
028:
029: /**
030: * Manages the current security context associated to the current thread.
031: * @author Florent Benoit
032: */
033: public class SecurityCurrent implements EZBSecurityCurrent {
034:
035: /**
036: * Inherited Local thread used to keep the security context.
037: */
038: private static InheritableThreadLocal<EZBSecurityContext> threadLocal;
039:
040: /**
041: * Static Security Context that is applied on all threads (used for heavy
042: * client).
043: */
044: private static EZBSecurityContext globalContext = null;
045:
046: /**
047: * Default security context.
048: */
049: private static final EZBSecurityContext DEFAULT_CTX = new SecurityContext();
050:
051: /**
052: * Init the thread
053: */
054: static {
055: threadLocal = new InheritableThreadLocal<EZBSecurityContext>();
056: threadLocal.set(new SecurityContext());
057: }
058:
059: /**
060: * Unique instance of this current object.
061: */
062: private static EZBSecurityCurrent unique = initCurrent();
063:
064: /**
065: * Build the unique instance of the security current.<br>
066: * It can use JOnAS current object.
067: * @return unique instance.
068: */
069: @SuppressWarnings("unchecked")
070: private static EZBSecurityCurrent initCurrent() {
071: String externalPropertyClass = System
072: .getProperty(SECURITY_CURRENT_PROPERTY);
073: if (externalPropertyClass != null) {
074: EZBSecurityCurrent current = null;
075: // use this external current object
076: Class<EZBSecurityCurrent> currentClass = null;
077: try {
078: currentClass = (Class<EZBSecurityCurrent>) Thread
079: .currentThread().getContextClassLoader()
080: .loadClass(externalPropertyClass);
081: } catch (ClassNotFoundException e) {
082: throw new IllegalStateException(
083: "Cannot find the class '"
084: + externalPropertyClass + "'", e);
085: } catch (ClassCastException e) {
086: throw new IllegalStateException(
087: "'"
088: + externalPropertyClass
089: + "' class is not an instance of EZBSecurityCurrent interface.",
090: e);
091: }
092:
093: try {
094: current = currentClass.newInstance();
095: } catch (InstantiationException e) {
096: throw new IllegalStateException(
097: "Cannot create an instance of the class '"
098: + externalPropertyClass + "'", e);
099: } catch (IllegalAccessException e) {
100: throw new IllegalStateException(
101: "Cannot create an instance of the class '"
102: + externalPropertyClass + "'", e);
103: }
104:
105: return current;
106:
107: }
108:
109: // else return default implementation
110: return new SecurityCurrent();
111: }
112:
113: /**
114: * Return the unique instance of this object.
115: * @return SecurityCurrent return the current
116: */
117: public static EZBSecurityCurrent getCurrent() {
118: return unique;
119: }
120:
121: /**
122: * Associates the given security context to the current thread.
123: * @param securityContext Security context to associate to the current
124: * thread.
125: */
126: public void setSecurityContext(
127: final EZBSecurityContext securityContext) {
128: threadLocal.set(securityContext);
129: }
130:
131: /**
132: * Associates the given security context to all threads (JVM).
133: * @param securityContext Security context to associate to the JVM
134: */
135: public void setGlobalSecurityContext(
136: final EZBSecurityContext securityContext) {
137: globalContext = securityContext;
138: }
139:
140: /**
141: * Gets the current context.
142: * @return SecurityContext return the Security context associated to the
143: * current thread or the JVM
144: */
145: public EZBSecurityContext getSecurityContext() {
146: if (globalContext != null) {
147: return globalContext;
148: }
149: if (threadLocal.get() != null) {
150: return threadLocal.get();
151: }
152:
153: // else, never null context.
154: return DEFAULT_CTX;
155: }
156:
157: }
|