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.mx.interceptor;
023:
024: import javax.management.MBeanServer;
025: import javax.management.ObjectName;
026:
027: import org.jboss.logging.Logger;
028: import org.jboss.mx.server.Invocation;
029:
030: /**
031: * Base class for all interceptors. This class provides some default method
032: * implementations for interceptors.
033: *
034: * @see org.jboss.mx.interceptor.Interceptor
035: * @see org.jboss.mx.server.MBeanInvoker
036: *
037: * @author <a href="mailto:juha@jboss.org">Juha Lindfors</a>.
038: * @version $Revision: 57200 $
039: */
040: public abstract class AbstractInterceptor implements Interceptor {
041:
042: // Attributes ----------------------------------------------------
043:
044: /**
045: * Name for this interceptor.
046: */
047: protected String name = "<no name>";
048:
049: /**
050: * Indicates whether this interceptor instance is shared or not.
051: */
052: protected boolean isShared = false;
053:
054: /**
055: * Logger reference for interceptor implementations. This reference is
056: * set by the invoker for non-shared interceptors after construction.
057: * Shared interceptors will should create their own logger instance.
058: */
059: protected Logger log;
060:
061: // Constructors --------------------------------------------------
062:
063: /**
064: * Constructs a new intereceptor instance. This interceptor is not shared
065: * in the MBean server.
066: */
067: public AbstractInterceptor() {
068: log = Logger.getLogger(getClass());
069: }
070:
071: /**
072: * Constructs a new interceptor instance with a given name. This interceptor
073: * is not shared in the MBean server.
074: *
075: * @param name name of this interceptor
076: *
077: * @throws IllegalArgumentException if name contains <tt>null</tt> reference
078: */
079: public AbstractInterceptor(String name) {
080: if (name == null || name.equals(""))
081: throw new IllegalArgumentException("null name");
082:
083: this .name = name;
084: }
085:
086: // Public --------------------------------------------------------
087:
088: /**
089: * Sets a name for this interceptor.
090: *
091: * @param name
092: */
093: public void setName(String name) {
094: this .name = name;
095: }
096:
097: // Interceptor implementation ------------------------------------
098:
099: /**
100: * The default invoke implementation queries the invocation object for the
101: * next interceptor in the chain. If one exists, it is invoked. Otherwise
102: * the invocation is dispatched to the target object. <p>
103: *
104: * Concrete implementations should override this method to implement
105: * their specific application logic.
106: *
107: * @see org.jboss.mx.server.Invocation
108: * @see org.jboss.mx.server.MBeanInvoker
109: *
110: * @param invocation the invocation object send towards the target
111: * resource by the invoker
112: *
113: * @return return value from the target resource
114: *
115: * @throws InvocationException This exception wraps any exceptions thrown
116: * by either the target method of the resource object, or invocation
117: * interceptors in this interceptor chain. The target exception is
118: * unwrapped at the {@link org.jboss.mx.server.MBeanInvoker} instance.
119: */
120: public Object invoke(Invocation invocation) throws Throwable {
121: Interceptor ic = invocation.nextInterceptor();
122:
123: // if the invocation object does not provide us with more interceptors,
124: // invoke the dispatcher that lands the invocation to its final target
125: // in the resource object
126: if (ic == null)
127: return invocation.dispatch();
128:
129: // see if the next interceptor in the chain is shared
130: if (ic.isShared()) {
131: // we require a common interface for all shared interceptors
132: SharedInterceptor shared = (SharedInterceptor) ic;
133:
134: // we invoke shared interceptor it via the MBean server bus, get the
135: // interceptors view to its MBean server
136: MBeanServer server = shared.getMBeanServer();
137:
138: // And the object name the interceptor is registered under
139: ObjectName name = shared.getObjectName();
140:
141: return server.invoke(name, "invoke",
142: new Object[] { invocation }, // args
143: new String[] { Invocation.class.getName() } // signature
144: );
145: }
146:
147: // invoke non-shared interceptor directly via Java reference
148: else {
149: return ic.invoke(invocation);
150: }
151: }
152:
153: public String getName() {
154: return name;
155: }
156:
157: public boolean isShared() {
158: return isShared;
159: }
160:
161: public void setLogger(Logger log) {
162: this .log = log;
163: }
164:
165: public void init() throws Exception {
166: }
167:
168: public void start() {
169: }
170:
171: public void stop() throws Exception {
172: }
173:
174: public void destroy() {
175: }
176:
177: // Object overrides ----------------------------------------------
178:
179: /**
180: * Returns a string representation of this interceptor instance.
181: *
182: * @return string representation
183: */
184: public String toString() {
185: String className = getClass().getName();
186: int index = className.lastIndexOf('.');
187:
188: return className.substring((index < 0) ? 0 : index) + "[name="
189: + name + "]";
190: }
191:
192: }
|