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: ENCManager.java 1970 2007-10-16 11:49:25Z benoitf $
023: * --------------------------------------------------------------------------
024: */package org.ow2.easybeans.naming.interceptors;
025:
026: import javax.naming.Context;
027:
028: import org.ow2.easybeans.api.Factory;
029: import org.ow2.easybeans.api.naming.NamingInterceptor;
030: import org.ow2.util.log.Log;
031: import org.ow2.util.log.LogFactory;
032:
033: /**
034: * Detects the server type and return the correct interceptor to use depending
035: * of the application server. It could be EasyBeans, JOnAS or Tomcat.
036: * @author Florent Benoit
037: */
038: public final class ENCManager {
039:
040: /**
041: * Logger.
042: */
043: private static Log logger = LogFactory.getLog(ENCManager.class);
044:
045: /**
046: * Class used for the interceptor.
047: */
048: private static Class<? extends NamingInterceptor> encInterceptor = null;
049:
050: /**
051: * No public constructor (utility class).
052: */
053: private ENCManager() {
054:
055: }
056:
057: /**
058: * Sets the ENC interceptor to use for the naming.
059: * @param userEncInterceptor the interceptor class.
060: */
061: public static void setInterceptorClass(
062: final Class<? extends NamingInterceptor> userEncInterceptor) {
063: if (encInterceptor != null) {
064: throw new IllegalStateException(
065: "The interceptor class has already been set with '"
066: + encInterceptor
067: + "', cannot update it with '"
068: + userEncInterceptor + "'.");
069: }
070: encInterceptor = userEncInterceptor;
071: }
072:
073: /**
074: * @return the class to use depending of the application server.
075: */
076: public static Class<? extends NamingInterceptor> getInterceptorClass() {
077: if (encInterceptor == null) {
078: ClassLoader loader = Thread.currentThread()
079: .getContextClassLoader();
080:
081: // try to load JOnAS class.
082: try {
083: loader
084: .loadClass(JOnASENCInterceptor.JONAS_NAMING_MANAGER_CLASS);
085: encInterceptor = JOnASENCInterceptor.class;
086: logger
087: .info("Detecting JOnAS: using JOnAS ENC for the naming.");
088: } catch (ClassNotFoundException e) {
089: // not found, try with Tomcat
090: try {
091: loader
092: .loadClass(TomcatENCInterceptor.TOMCAT_NAMING_CLASS);
093: encInterceptor = TomcatENCInterceptor.class;
094: logger
095: .info("Detecting Tomcat: using Tomcat ENC for the naming.");
096: } catch (ClassNotFoundException e1) {
097: // Not found, try with Jetty
098: try {
099: loader
100: .loadClass(JettyENCInterceptor.JETTY_CONTEXT_FACTORY_CLASS);
101: encInterceptor = JettyENCInterceptor.class;
102: logger
103: .info("Detecting Jetty: using Jetty ENC for the naming.");
104: } catch (ClassNotFoundException e2) {
105: // Not found, use EZB.
106: encInterceptor = EZBENCInterceptor.class;
107: logger
108: .debug("Using EasyBeans ENC for the naming.");
109: }
110: }
111:
112: }
113:
114: }
115: return encInterceptor;
116: }
117:
118: /**
119: * Init the context for the given factory.
120: * @param factory the given factory
121: * @param context the context associated to the container URL.
122: */
123: public static void initContext(final Factory factory,
124: final Context context) {
125: try {
126: encInterceptor.newInstance().initContext(factory.getId(),
127: context);
128: } catch (InstantiationException e) {
129: throw new IllegalStateException(
130: "Cannot init the context for the factory '"
131: + factory.getClassName()
132: + "' of container '"
133: + factory.getContainer().getName() + "'.",
134: e);
135: } catch (IllegalAccessException e) {
136: throw new IllegalStateException(
137: "Cannot init the context for the factory '"
138: + factory.getClassName()
139: + "' of container '"
140: + factory.getContainer().getName() + "'.",
141: e);
142: }
143: }
144:
145: /**
146: * Remove the context associated to a factory.
147: * @param factory the given factory
148: */
149: public static void removeContext(final Factory factory) {
150: try {
151: encInterceptor.newInstance().removeContext(factory.getId());
152: } catch (InstantiationException e) {
153: throw new IllegalStateException(
154: "Cannot remove the context for the factory '"
155: + factory.getClassName()
156: + "' of container '"
157: + factory.getContainer().getName() + "'.",
158: e);
159: } catch (IllegalAccessException e) {
160: throw new IllegalStateException(
161: "Cannot remove the context for the factory '"
162: + factory.getClassName()
163: + "' of container '"
164: + factory.getContainer().getName() + "'.",
165: e);
166: }
167: }
168:
169: }
|