001: /**
002: * EasyBeans
003: * Copyright (C) 2007 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: DeployerFactory.java 1970 2007-10-16 11:49:25Z benoitf $
023: * --------------------------------------------------------------------------
024: */package org.ow2.easybeans.deployable;
025:
026: import java.lang.reflect.InvocationTargetException;
027: import java.lang.reflect.Method;
028:
029: import org.ow2.easybeans.api.EZBServer;
030: import org.ow2.util.ee.deploy.api.deployer.DeployerException;
031: import org.ow2.util.ee.deploy.api.deployer.IDeployer;
032: import org.ow2.util.log.Log;
033: import org.ow2.util.log.LogFactory;
034:
035: /**
036: * Allow to get a deployer. When EasyBeans is integrated into JOnAS, it will
037: * return a JOnASDeployer, for EasyBeans in standalone mode an
038: * EasyBeansDeployer, etc.
039: * @author Florent Benoit
040: */
041: public final class DeployerFactory {
042:
043: /**
044: * Name of the property thats defines the deployer's class. (optional)
045: */
046: public static final String DEPLOYER_FACTORY_CLASS_NAME = DeployerFactory.class
047: .getName();
048:
049: /**
050: * Default deployer.
051: */
052: private static final String DEFAULT_DEPLOYER = "org.ow2.easybeans.deployer.EasyBeansDeployer";
053:
054: /**
055: * Logger.
056: */
057: private static Log logger = LogFactory
058: .getLog(DeployerFactory.class);
059:
060: /**
061: * Name of the class to use for the deployer.
062: */
063: private static String className = null;
064:
065: /**
066: * Utility class, no public constructor.
067: */
068: private DeployerFactory() {
069:
070: }
071:
072: /**
073: * Gets a deployer depending of the property or the class that has been
074: * registered.
075: * @param embedded the instance of the server.
076: * @return an instance of the deployer.
077: * @throws DeployerException if the deployer cannot be returned.
078: */
079: @SuppressWarnings("unchecked")
080: public static IDeployer getDeployer(final EZBServer embedded)
081: throws DeployerException {
082: IDeployer deployer = null;
083:
084: // If class name is empty, set to the default value
085: if (className == null) {
086: className = DEFAULT_DEPLOYER;
087: }
088:
089: // Use the system property of the class name if the sys property is not
090: // set.
091: String clName = System.getProperty(DEPLOYER_FACTORY_CLASS_NAME,
092: className);
093:
094: logger.debug("Using ''{0}'' as deployer class", clName);
095:
096: // load the class
097: Class<?> clazz;
098: try {
099: clazz = Thread.currentThread().getContextClassLoader()
100: .loadClass(clName);
101: } catch (ClassNotFoundException e) {
102: throw new DeployerException(
103: "Cannot load the deployer class named '" + clName
104: + "'.", e);
105: }
106:
107: // Cast
108: Class<IDeployer> depClass = null;
109: if (IDeployer.class.isAssignableFrom(clazz)) {
110: depClass = (Class<IDeployer>) clazz;
111: } else {
112: throw new DeployerException("The class '" + clName
113: + "' is not an EZBDeployer class");
114: }
115:
116: // Build new instance
117: try {
118: deployer = depClass.newInstance();
119: } catch (InstantiationException e) {
120: throw new DeployerException(
121: "Cannot instantiate the class '" + clName + "'.");
122: } catch (IllegalAccessException e) {
123: throw new DeployerException(
124: "Cannot instantiate the class '" + clName + "'.");
125: }
126:
127: // Set the embedded if exists
128: Method m = null;
129: try {
130: m = depClass.getMethod("setEmbedded", EZBServer.class);
131: } catch (SecurityException e) {
132: logger.debug("Cannot get the method setEmbedded", e);
133: } catch (NoSuchMethodException e) {
134: logger.debug("Cannot get the method setEmbedded", e);
135: }
136:
137: if (m != null) {
138: try {
139: m.invoke(deployer, embedded);
140: } catch (IllegalArgumentException e) {
141: logger.error("Cannot call setEmbedded", e);
142: } catch (IllegalAccessException e) {
143: logger.error("Cannot call setEmbedded", e);
144: } catch (InvocationTargetException e) {
145: logger.error("Cannot call setEmbedded", e);
146: }
147: }
148:
149: // return
150: return deployer;
151: }
152:
153: /**
154: * Set the name of the deployer class to use.
155: * @param classNameStr the name of the class to use.
156: */
157: public static void setClassName(final String classNameStr) {
158: DeployerFactory.className = classNameStr;
159: }
160:
161: }
|