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: EasyBeansDeployer.java 1970 2007-10-16 11:49:25Z benoitf $
023: * --------------------------------------------------------------------------
024: */package org.ow2.easybeans.deployer;
025:
026: import java.util.ArrayList;
027: import java.util.List;
028:
029: import org.ow2.easybeans.api.EZBContainer;
030: import org.ow2.easybeans.api.EZBContainerException;
031: import org.ow2.easybeans.persistence.PersistenceUnitManager;
032: import org.ow2.util.ee.deploy.api.archive.IArchive;
033: import org.ow2.util.ee.deploy.api.deployable.EARDeployable;
034: import org.ow2.util.ee.deploy.api.deployable.EJBDeployable;
035: import org.ow2.util.ee.deploy.api.deployable.IDeployable;
036: import org.ow2.util.ee.deploy.api.deployer.DeployerException;
037: import org.ow2.util.ee.deploy.api.deployer.IDeployer;
038: import org.ow2.util.log.Log;
039: import org.ow2.util.log.LogFactory;
040:
041: /**
042: * Implementation of the Deployer for EasyBeans in standalone mode (or default
043: * mode). It can deploy EJB-JAR or EAR deployable
044: * @author Florent Benoit
045: */
046: public class EasyBeansDeployer extends AbsDeployer implements IDeployer {
047:
048: /**
049: * Logger.
050: */
051: private static Log logger = LogFactory
052: .getLog(EasyBeansDeployer.class);
053:
054: /**
055: * Deploy a deployable. It can be an EJB jar, EAR, WAR, etc.
056: * @param deployable a given deployable
057: * @throws DeployerException if the deployment is not done.
058: */
059: public void deploy(final IDeployable deployable)
060: throws DeployerException {
061: checkSupportedDeployable(deployable);
062: if (deployable instanceof EJBDeployable) {
063: deployEJB((EJBDeployable) deployable);
064: } else if (deployable instanceof EARDeployable) {
065: // needs to unpack it before deploying it
066: EARDeployable earDeployable = unpackEARDeployable((EARDeployable) deployable);
067: deployEAR(earDeployable);
068: }
069: }
070:
071: /**
072: * Undeploy the given deployable. It can be an EJB jar, EAR, WAR, etc.
073: * @param deployable a given deployable to undeploy
074: * @throws DeployerException if the undeploy operation fails.
075: */
076: public void undeploy(final IDeployable deployable)
077: throws DeployerException {
078: checkSupportedDeployable(deployable);
079: if (deployable instanceof EJBDeployable) {
080: throw new UnsupportedOperationException(
081: "Single EJB jar should not be removed by this deployer");
082: } else if (deployable instanceof EARDeployable) {
083: undeployEJB3FromEAR((EARDeployable) deployable);
084: }
085:
086: }
087:
088: /**
089: * Deploy an EAR (called by the deploy method).
090: * @param earDeployable a given EAR deployable
091: * @throws DeployerException if the deployment is not done.
092: */
093: protected void deployEAR(final EARDeployable earDeployable)
094: throws DeployerException {
095:
096: // Needs to deploy all the EJB containers of the EAR with the same
097: // classloader
098: logger.info("Deploying {0}", earDeployable);
099:
100: // Get EJBs of this EAR
101: List<EJBDeployable<?>> ejbs = earDeployable.getEJBDeployables();
102:
103: // Build classloader
104: ClassLoader appClassLoader = getClassLoaderForEAR(earDeployable);
105:
106: // Get Persistence unit manager
107: PersistenceUnitManager persistenceUnitManager = getPersistenceUnitManager(
108: earDeployable, appClassLoader);
109:
110: // Get Extra libraries
111: List<IArchive> libArchives = getLibArchives(earDeployable);
112:
113: // Create containers for each EJB deployable
114: List<EZBContainer> containers = new ArrayList<EZBContainer>();
115: for (EJBDeployable<?> ejb : ejbs) {
116: containers.add(getEmbedded().createContainer(
117: ejb.getArchive()));
118: }
119:
120: // Configure containers
121: for (EZBContainer container : containers) {
122: // Set the classloader that needs to be used
123: container.setClassLoader(appClassLoader);
124:
125: // Add persistence context found
126: container.setPersistenceUnitManager(persistenceUnitManager);
127:
128: // Add the metadata
129: container.setExtraArchives(libArchives);
130: }
131:
132: // Start containers
133: for (EZBContainer container : containers) {
134: try {
135: container.start();
136: } catch (EZBContainerException e) {
137: logger.error("Cannot start container {0}", container
138: .getName(), e);
139: }
140: }
141:
142: }
143:
144: /**
145: * Check that the given deployable is supported by this deployer. If it is
146: * not supported, throw an error.
147: * @param deployable the deployable that needs to be deployed
148: * @throws DeployerException if this deployable is not supported.
149: */
150: private void checkSupportedDeployable(final IDeployable deployable)
151: throws DeployerException {
152: if (!(deployable instanceof EARDeployable || deployable instanceof EJBDeployable)) {
153: throw new DeployerException("The deployable '" + deployable
154: + "' is not supported by this deployer");
155: }
156: }
157:
158: }
|