/*
* 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.deployment;
import org.jboss.logging.Logger;
import org.jboss.mx.server.Invocation;
import org.jboss.system.InterceptorServiceMBeanSupport;
/**
* Base class that can be used for writing services
* that dynamically hook to other interceptable deployers
* in order to add functionality in the deployment cycle.
*
* We override attach() to install a different interceptor
* from that of the base class that understands SubDeployer
* calls. Note that the baseclass invoke(Invocation) won't be
* called, so no need to override it.
*
* Simply call attach()/detach() from createService()/destroyService()
* or startService()/stopService() pair methods to attach/detach the
* interceptor to the configured Interceptable SubDeployer(s).
* Then override any of the init/create/start/stop/destroy methods to
* apply the extra interception functionality. Inside those methods
* don't forget to forward the call using invokeNext().
*
* @author <a href="mailto:dimitris@jboss.org">Dimitris Andreadis</a>
* @version $Revision: 81033 $
*/
public abstract class SubDeployerInterceptorSupport extends InterceptorServiceMBeanSupport
implements SubDeployerInterceptorMBean
{
// Constructors -------------------------------------------------
/**
* Constructs an <tt>SubDeployerInterceptorSupport</tt>.
*/
public SubDeployerInterceptorSupport()
{
super();
}
/**
* Constructs an <tt>SubDeployerInterceptorSupport</tt>.
*
* Pass-through to InterceptorServiceMBeanSupport.
*
* @param type The class type to determine Logger name from.
*/
public SubDeployerInterceptorSupport(final Class type)
{
super(type);
}
/**
* Constructs an <tt>SubDeployerInterceptorSupport</tt>.
*
* Pass-through to InterceptorServiceMBeanSupport.
*
* @param category The logger category name.
*/
public SubDeployerInterceptorSupport(final String category)
{
super(category);
}
/**
* Constructs an <tt>SubDeployerInterceptorSupport</tt>.
*
* Pass-through to InterceptorServiceMBeanSupport.
*
* @param log The logger to use.
*/
public SubDeployerInterceptorSupport(final Logger log)
{
super(log);
}
// Protected API -------------------------------------------------
/**
* We override attach() from InterceptorServiceMBeanSupport
* to attach a different interceptor that knows how to switch
* init/create/start/stop/destroy SubDeployer calls.
*
* @throws Exception thrown on any interceptor registration error
*/
protected void attach() throws Exception
{
super.attach(new XMBeanInterceptor());
}
// Override ------------------------------------------------------
/**
* Override
*/
protected Object init(Invocation invocation, DeploymentInfo di) throws Throwable
{
return invokeNext(invocation);
}
/**
* Override
*/
protected Object create(Invocation invocation, DeploymentInfo di) throws Throwable
{
return invokeNext(invocation);
}
/**
* Override
*/
protected Object start(Invocation invocation, DeploymentInfo di) throws Throwable
{
return invokeNext(invocation);
}
/**
* Override
*/
protected Object stop(Invocation invocation, DeploymentInfo di) throws Throwable
{
return invokeNext(invocation);
}
/**
* Override
*/
protected Object destroy(Invocation invocation, DeploymentInfo di) throws Throwable
{
return invokeNext(invocation);
}
// Private Inner Class -------------------------------------------
/**
* Simple SubDeployerInterceptor delegating to
* the SubDeployerInterceptorSupport callbacks
*/
private class XMBeanInterceptor extends SubDeployerInterceptor
{
public XMBeanInterceptor()
{
super("XMBeanInterceptor('" + SubDeployerInterceptorSupport.this.getServiceName() + "')");
}
protected Object init(Invocation invocation, DeploymentInfo di) throws Throwable
{
logSubDeployerInvocation(invocation, di);
// delegate
return SubDeployerInterceptorSupport.this.init(invocation, di);
}
protected Object create(Invocation invocation, DeploymentInfo di) throws Throwable
{
logSubDeployerInvocation(invocation, di);
// delegate
return SubDeployerInterceptorSupport.this.create(invocation, di);
}
protected Object start(Invocation invocation, DeploymentInfo di) throws Throwable
{
logSubDeployerInvocation(invocation, di);
// delegate
return SubDeployerInterceptorSupport.this.start(invocation, di);
}
protected Object stop(Invocation invocation, DeploymentInfo di) throws Throwable
{
logSubDeployerInvocation(invocation, di);
// delegate
return SubDeployerInterceptorSupport.this.stop(invocation, di);
}
protected Object destroy(Invocation invocation, DeploymentInfo di) throws Throwable
{
logSubDeployerInvocation(invocation, di);
// delegate
return SubDeployerInterceptorSupport.this.destroy(invocation, di);
}
protected void logSubDeployerInvocation(Invocation invocation, DeploymentInfo di)
{
if (SubDeployerInterceptorSupport.this.log.isTraceEnabled())
{
StringBuffer sbuf = new StringBuffer();
sbuf.append("intercepting ").append(invocation.getName())
.append("(), url=").append(di.url.toString())
.append(", state=").append(di.state.toString());
SubDeployerInterceptorSupport.this.log.trace(sbuf.toString());
}
}
}
}