001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.deployment;
023:
024: import org.jboss.logging.Logger;
025: import org.jboss.mx.server.Invocation;
026: import org.jboss.system.InterceptorServiceMBeanSupport;
027:
028: /**
029: * Base class that can be used for writing services
030: * that dynamically hook to other interceptable deployers
031: * in order to add functionality in the deployment cycle.
032: *
033: * We override attach() to install a different interceptor
034: * from that of the base class that understands SubDeployer
035: * calls. Note that the baseclass invoke(Invocation) won't be
036: * called, so no need to override it.
037: *
038: * Simply call attach()/detach() from createService()/destroyService()
039: * or startService()/stopService() pair methods to attach/detach the
040: * interceptor to the configured Interceptable SubDeployer(s).
041: * Then override any of the init/create/start/stop/destroy methods to
042: * apply the extra interception functionality. Inside those methods
043: * don't forget to forward the call using invokeNext().
044: *
045: * @author <a href="mailto:dimitris@jboss.org">Dimitris Andreadis</a>
046: * @version $Revision: 57205 $
047: */
048: public abstract class SubDeployerInterceptorSupport extends
049: InterceptorServiceMBeanSupport implements
050: SubDeployerInterceptorMBean {
051:
052: // Constructors -------------------------------------------------
053:
054: /**
055: * Constructs an <tt>SubDeployerInterceptorSupport</tt>.
056: */
057: public SubDeployerInterceptorSupport() {
058: super ();
059: }
060:
061: /**
062: * Constructs an <tt>SubDeployerInterceptorSupport</tt>.
063: *
064: * Pass-through to InterceptorServiceMBeanSupport.
065: *
066: * @param type The class type to determine Logger name from.
067: */
068: public SubDeployerInterceptorSupport(final Class type) {
069: super (type);
070: }
071:
072: /**
073: * Constructs an <tt>SubDeployerInterceptorSupport</tt>.
074: *
075: * Pass-through to InterceptorServiceMBeanSupport.
076: *
077: * @param category The logger category name.
078: */
079: public SubDeployerInterceptorSupport(final String category) {
080: super (category);
081: }
082:
083: /**
084: * Constructs an <tt>SubDeployerInterceptorSupport</tt>.
085: *
086: * Pass-through to InterceptorServiceMBeanSupport.
087: *
088: * @param log The logger to use.
089: */
090: public SubDeployerInterceptorSupport(final Logger log) {
091: super (log);
092: }
093:
094: // Protected API -------------------------------------------------
095:
096: /**
097: * We override attach() from InterceptorServiceMBeanSupport
098: * to attach a different interceptor that knows how to switch
099: * init/create/start/stop/destroy SubDeployer calls.
100: *
101: * @throws Exception thrown on any interceptor registration error
102: */
103: protected void attach() throws Exception {
104: super .attach(new XMBeanInterceptor());
105: }
106:
107: // Override ------------------------------------------------------
108:
109: /**
110: * Override
111: */
112: protected Object init(Invocation invocation, DeploymentInfo di)
113: throws Throwable {
114: return invokeNext(invocation);
115: }
116:
117: /**
118: * Override
119: */
120: protected Object create(Invocation invocation, DeploymentInfo di)
121: throws Throwable {
122: return invokeNext(invocation);
123: }
124:
125: /**
126: * Override
127: */
128: protected Object start(Invocation invocation, DeploymentInfo di)
129: throws Throwable {
130: return invokeNext(invocation);
131: }
132:
133: /**
134: * Override
135: */
136: protected Object stop(Invocation invocation, DeploymentInfo di)
137: throws Throwable {
138: return invokeNext(invocation);
139: }
140:
141: /**
142: * Override
143: */
144: protected Object destroy(Invocation invocation, DeploymentInfo di)
145: throws Throwable {
146: return invokeNext(invocation);
147: }
148:
149: // Private Inner Class -------------------------------------------
150:
151: /**
152: * Simple SubDeployerInterceptor delegating to
153: * the SubDeployerInterceptorSupport callbacks
154: */
155: private class XMBeanInterceptor extends SubDeployerInterceptor {
156: public XMBeanInterceptor() {
157: super ("XMBeanInterceptor('"
158: + SubDeployerInterceptorSupport.this
159: .getServiceName() + "')");
160: }
161:
162: protected Object init(Invocation invocation, DeploymentInfo di)
163: throws Throwable {
164: logSubDeployerInvocation(invocation, di);
165:
166: // delegate
167: return SubDeployerInterceptorSupport.this .init(invocation,
168: di);
169: }
170:
171: protected Object create(Invocation invocation, DeploymentInfo di)
172: throws Throwable {
173: logSubDeployerInvocation(invocation, di);
174:
175: // delegate
176: return SubDeployerInterceptorSupport.this .create(
177: invocation, di);
178: }
179:
180: protected Object start(Invocation invocation, DeploymentInfo di)
181: throws Throwable {
182: logSubDeployerInvocation(invocation, di);
183:
184: // delegate
185: return SubDeployerInterceptorSupport.this .start(invocation,
186: di);
187: }
188:
189: protected Object stop(Invocation invocation, DeploymentInfo di)
190: throws Throwable {
191: logSubDeployerInvocation(invocation, di);
192:
193: // delegate
194: return SubDeployerInterceptorSupport.this .stop(invocation,
195: di);
196: }
197:
198: protected Object destroy(Invocation invocation,
199: DeploymentInfo di) throws Throwable {
200: logSubDeployerInvocation(invocation, di);
201:
202: // delegate
203: return SubDeployerInterceptorSupport.this .destroy(
204: invocation, di);
205: }
206:
207: protected void logSubDeployerInvocation(Invocation invocation,
208: DeploymentInfo di) {
209: if (SubDeployerInterceptorSupport.this .log.isTraceEnabled()) {
210: StringBuffer sbuf = new StringBuffer();
211: sbuf.append("intercepting ").append(
212: invocation.getName()).append("(), url=")
213: .append(di.url.toString()).append(", state=")
214: .append(di.state.toString());
215:
216: SubDeployerInterceptorSupport.this.log.trace(sbuf
217: .toString());
218: }
219: }
220: }
221: }
|