/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.spring.deployment;
import java.io.File;
import java.net.URL;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import org.jboss.deployment.DeploymentException;
import org.jboss.deployment.DeploymentInfo;
import org.jboss.deployment.SubDeployer;
import org.jboss.deployment.SubDeployerSupport;
import org.jboss.spring.loader.BeanFactoryLoader;
/**
* @author <a href="mailto:bill@jboss.org">Bill Burke</a>
* @author <a href="mailto:ales.justin@genera-lynx.com">Ales Justin</a>
*/
@Deprecated
public abstract class SpringDeployer extends SubDeployerSupport implements
SubDeployer, SpringDeployerMBean
{
protected abstract BeanFactoryLoader createBeanFactoryLoader();
private BeanFactoryLoader beanFactoryLoader = createBeanFactoryLoader();
/**
* Default CTOR used to set default values to the Suffixes and RelativeOrder
* attributes. Those are read at subdeployer registration time by the MainDeployer
* to alter its SuffixOrder.
*/
public SpringDeployer()
{
initializeMainDeployer();
}
protected void initializeMainDeployer()
{
setSuffixes(new String[]{".spring", "-spring.xml"});
setRelativeOrder(350); //after -ds, before ejb3
}
/**
* Returns true if this deployer can deploy the given DeploymentInfo.
*
* @return True if this deployer can deploy the given DeploymentInfo.
* @jmx:managed-operation
*/
public boolean accepts(DeploymentInfo di)
{
String urlStr = di.url.toString();
return urlStr.endsWith(".spring") || urlStr.endsWith(".spring/") ||
urlStr.endsWith("-spring.xml");
}
/**
* Describe <code>init</code> method here.
*
* @param di a <code>DeploymentInfo</code> value
* @throws DeploymentException if an error occurs
* @jmx:managed-operation
*/
public void init(DeploymentInfo di) throws DeploymentException
{
try
{
if (di.watch == null)
{
// resolve the watch
if (di.url.getProtocol().equals("file"))
{
File file = new File(di.url.getFile());
// If not directory we watch the package
if (!file.isDirectory())
{
di.watch = di.url;
}
// If directory we watch the xml files
else
{
di.watch = new URL(di.url, "META-INF/jboss-spring.xml");
}
}
else
{
// We watch the top only, no directory support
di.watch = di.url;
}
}
}
catch (Exception e)
{
log.error("failed to parse Spring context document: ", e);
throw new DeploymentException(e);
}
super.init(di);
}
/**
* Describe <code>create</code> method here.
*
* @param di a <code>DeploymentInfo</code> value
* @throws DeploymentException if an error occurs
* @jmx:managed-operation
*/
public void create(DeploymentInfo di) throws DeploymentException
{
try
{
beanFactoryLoader.create(di);
emitNotification("Spring Deploy", di);
log.info("Deployed Spring: " + di.url);
}
catch (Exception e)
{
throw new DeploymentException(e);
}
}
/**
* The <code>start</code> method starts all the mbeans in this DeploymentInfo..
*
* @param di a <code>DeploymentInfo</code> value
* @throws DeploymentException if an error occurs
* @jmx:managed-operation
*/
public void start(DeploymentInfo di) throws DeploymentException
{
beanFactoryLoader.start(di);
}
/**
* Undeploys the package at the url string specified. This will: Undeploy
* packages depending on this one. Stop, destroy, and unregister all the
* specified mbeans Unload this package and packages this package deployed
* via the classpath tag. Keep track of packages depending on this one that
* we undeployed so that they can be redeployed should this one be
* redeployed.
*
* @param di the <code>DeploymentInfo</code> value to stop.
* @jmx:managed-operation
*/
public void stop(DeploymentInfo di)
{
log.info("Undeploying Spring: " + di.url);
try
{
beanFactoryLoader.stop(di);
emitNotification("Spring Undeploy", di);
}
catch (Exception e)
{
log.error("Failed to stop bean factory: " + di.url);
}
}
/**
* Describe <code>destroy</code> method here.
*
* @param di a <code>DeploymentInfo</code> value
* @jmx:managed-operation
*/
public void destroy(DeploymentInfo di)
{
try
{
beanFactoryLoader.destroy(di);
emitNotification("Spring Destroy", di);
}
catch (DeploymentException e)
{
log.error("Failed to destroy deployer: " + di);
}
}
protected ObjectName getObjectName(MBeanServer server, ObjectName name)
throws MalformedObjectNameException
{
return name == null ? getDefaultObjectName() : name;
}
protected abstract ObjectName getDefaultObjectName();
}