/* * JBoss, the OpenSource J2EE webOS * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.resource; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import javax.management.ObjectName; import org.jboss.deployment.DeploymentException; import org.jboss.deployment.DeploymentInfo; import org.jboss.deployment.SubDeployerSupport; import org.jboss.metadata.XmlFileLoader; import org.jboss.system.ServiceControllerMBean; import org.jboss.mx.util.MBeanProxyExt; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * Service that deploys ".rar" files containing resource adapters. Deploying * the RAR file is the first step in making the resource adapter available to * application components; once it is deployed, one or more connection * factories must be configured and bound into JNDI, a task performed by the * ConnectionFactoryLoader service. * * @jmx:mbean * name="jboss.jca:service=RARDeployer" * extends="org.jboss.deployment.SubDeployerMBean" * * @author Toby Allsopp (toby.allsopp@peace.com) * @author David Jencks * @version $Revision: 1.31.2.3 $ * @see org.jboss.resource.ConnectionFactoryLoader

*/ public class RARDeployer extends SubDeployerSupport implements RARDeployerMBean { /** A proxy to the ServiceController. */ private ServiceControllerMBean serviceController; /** * Gets the DeployableFilter attribute of the RARDeployer object * * @return The DeployableFilter value */ public boolean accepts(DeploymentInfo sdi) { String urlStr = sdi.url.toString(); return urlStr.endsWith("rar") || urlStr.endsWith("rar/"); } /** * Once registration has finished, create a proxy to the ServiceController * for later use. */ public void postRegister(Boolean done) { super.postRegister(done); serviceController = (ServiceControllerMBean) MBeanProxyExt.create(ServiceControllerMBean.class, ServiceControllerMBean.OBJECT_NAME, server); } // RARDeployerMBean implementation ------------------------------- public void init(DeploymentInfo rdi) throws DeploymentException { URL raUrl = rdi.localCl.findResource("META-INF/ra.xml"); Document dd = XmlFileLoader.getDocument(raUrl); Element root = dd.getDocumentElement(); RARMetaData metadata = new RARMetaData(); metadata.importXml(root); metadata.setClassLoader(rdi.ucl); rdi.metaData = metadata; // resolve the watch if (rdi.url.getProtocol().equals("file")) { File file = new File(rdi.url.getFile()); // If not directory we watch the package if (!file.isDirectory()) rdi.watch = rdi.url; // If directory we watch the xml files else { try { rdi.watch = new URL(rdi.url, "META-INF/ra.xml"); } catch (MalformedURLException mue) { throw new DeploymentException("Could not watch ra.xml file", mue); } // end of try-catch } // end of else } else { // We watch the top only, no directory support rdi.watch = rdi.url; } // invoke super-class initialization super.init(rdi); } /** * The deploy method deploys a rar at the given url. * * @param url The URL location of the rar to deploy. * @return an Object to identify this deployment. * @exception IOException if an error occurs * @exception DeploymentException if an error occurs */ public void create(DeploymentInfo rdi) throws DeploymentException { log.debug("Attempting to deploy RAR at '" + rdi.url + "'"); try { RARMetaData metaData = (RARMetaData) rdi.metaData; //set up the RARDeployment mbean for dependency management. rdi.deployedObject = new ObjectName("jboss.jca:service=RARDeployment,name=" + metaData.getDisplayName()); server.createMBean("org.jboss.resource.RARDeployment", rdi.deployedObject, new Object[]{metaData}, new String[]{"org.jboss.resource.RARMetaData"}); serviceController.create(rdi.deployedObject); } catch (Exception e) { throw new DeploymentException(e); } super.create(rdi); } public void start(DeploymentInfo rdi) throws DeploymentException { try { serviceController.start(rdi.deployedObject); } catch (Exception e) { throw new DeploymentException(e); } super.start(rdi); } public void stop(DeploymentInfo rdi) throws DeploymentException { if (log.isDebugEnabled()) { log.debug("Undeploying RAR at '" + rdi.url + "'"); } try { log.info("About to undeploy RARDeploymentMBean, objectname: " + rdi.deployedObject); serviceController.stop(rdi.deployedObject); } catch (Exception e) { throw new DeploymentException(e); } super.stop(rdi); } public void destroy(DeploymentInfo rdi) throws DeploymentException { try { serviceController.destroy(rdi.deployedObject); serviceController.remove(rdi.deployedObject); } catch (Exception e) { throw new DeploymentException(e); } ((RARMetaData) rdi.metaData).setClassLoader(null); super.destroy(rdi); } }