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.mx.interceptor.AbstractInterceptor;
025: import org.jboss.mx.interceptor.Interceptor;
026: import org.jboss.mx.server.Invocation;
027:
028: /**
029: * Base class for SubDeployer interceptors.
030: *
031: * Override one or more of the init(), create(), start(), stop(), destroy()
032: * methods to add behaviour. Don't forget to call invokeNext() inside
033: * your implementation, if you want the call to be continued.
034: *
035: * @author <a href="mailto:dimitris@jboss.org">Dimitris Andreadis</a>
036: * @version $Revision: 57205 $
037: */
038: public abstract class SubDeployerInterceptor extends
039: AbstractInterceptor {
040: // Constructors --------------------------------------------------
041:
042: /**
043: * Default CTOR
044: */
045: public SubDeployerInterceptor() {
046: super ();
047: }
048:
049: /**
050: * CTOR
051: *
052: * @param name - the name to use for this interceptor
053: */
054: public SubDeployerInterceptor(String name) {
055: // invoker is unknown
056: super (name);
057: }
058:
059: // Interceptor implementation ------------------------------------
060:
061: /**
062: * This invoke method checks for invocations of interest, .i.e.
063: * init(), create(), start(), stop(), destroy() operation calls
064: * with a single DeploymentInfo argument and wraps the invocation
065: * with calls to corresponding init(), create(), etc. methods.
066: */
067: public Object invoke(Invocation invocation) throws Throwable {
068: String type = invocation.getType();
069:
070: // make sure this is an operation invocation
071: if (type.equals(Invocation.OP_INVOKE)) {
072: Object args[] = invocation.getArgs();
073: Object retn = invocation.getReturnTypeClass();
074:
075: // make sure the signature matches -> void <methodName>(DeploymentInfo di)
076: if ((args.length == 1)
077: && (args[0] instanceof DeploymentInfo)
078: && (retn == null)) {
079: String method = invocation.getName();
080: DeploymentInfo di = (DeploymentInfo) args[0];
081:
082: if (method.equals("init")) {
083: return init(invocation, di);
084: } else if (method.equals("create")) {
085: return create(invocation, di);
086: } else if (method.equals("start")) {
087: return start(invocation, di);
088: } else if (method.equals("stop")) {
089: return stop(invocation, di);
090: } else if (method.equals("destroy")) {
091: return destroy(invocation, di);
092: }
093: }
094: }
095: // if we reached this point invocation is of no interest
096: // to SubDeployerInterceptor so simply forward it
097: return invokeNext(invocation);
098: }
099:
100: // Protected -----------------------------------------------------
101:
102: /**
103: * Use this to forward the call
104: */
105: protected Object invokeNext(Invocation invocation) throws Throwable {
106: // call the next in the interceptor chain,
107: // if nobody follows dispatch the call
108: Interceptor next = invocation.nextInterceptor();
109: if (next != null) {
110: return next.invoke(invocation);
111: } else {
112: return invocation.dispatch();
113: }
114: }
115:
116: // Protected overrides -------------------------------------------
117:
118: // Override the following methods to add behaviour. Remember
119: // to call invokeNext() if you want the call to proceed.
120:
121: protected Object init(Invocation invocation, DeploymentInfo di)
122: throws Throwable {
123: return invokeNext(invocation);
124: }
125:
126: protected Object create(Invocation invocation, DeploymentInfo di)
127: throws Throwable {
128: return invokeNext(invocation);
129: }
130:
131: protected Object start(Invocation invocation, DeploymentInfo di)
132: throws Throwable {
133: return invokeNext(invocation);
134: }
135:
136: protected Object stop(Invocation invocation, DeploymentInfo di)
137: throws Throwable {
138: return invokeNext(invocation);
139: }
140:
141: protected Object destroy(Invocation invocation, DeploymentInfo di)
142: throws Throwable {
143: return invokeNext(invocation);
144: }
145:
146: }
|