001: /**
002: * JOnAS: Java(TM) Open Application Server
003: * Copyright (C) 2005 Bull S.A.
004: * Contact: jonas-team@objectweb.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * --------------------------------------------------------------------------
022: * $Id$
023: * --------------------------------------------------------------------------
024: */package org.objectweb.jonas.ws.mbean;
025:
026: import java.util.Iterator;
027: import java.util.List;
028:
029: import javax.management.MBeanServer;
030: import javax.management.MalformedObjectNameException;
031: import javax.management.ObjectName;
032: import javax.management.modelmbean.ModelMBean;
033:
034: import org.apache.commons.modeler.ManagedBean;
035: import org.apache.commons.modeler.Registry;
036:
037: import org.objectweb.jonas.common.Log;
038: import org.objectweb.jonas.jmx.JmxService;
039: import org.objectweb.jonas.management.JonasMBeanTools;
040: import org.objectweb.jonas.management.j2eemanagement.J2EEManagedObject;
041: import org.objectweb.jonas.service.ServiceManager;
042:
043: import org.objectweb.util.monolog.api.BasicLevel;
044: import org.objectweb.util.monolog.api.Logger;
045:
046: /**
047: * Base Class for WebServices MBeans. It makes registration/unregistration
048: * of hierarchical MBeans very easy. Needs to be subclassed for each WebService MBean.
049: *
050: * @author Guillaume Sauthier
051: */
052: public abstract class AbstractWebServiceMBean extends J2EEManagedObject {
053:
054: /**
055: * logger
056: */
057: private static Logger log = Log.getLogger(Log.JONAS_WS_PREFIX);
058:
059: /**
060: * ObjectName instance : avoid recreating an ObjectName each time we want one
061: */
062: private ObjectName realObjectName = null;
063:
064: /**
065: * Constructor for default J2eeManagedObject
066: * @param objectName the MBean's ObjectName
067: */
068: public AbstractWebServiceMBean(String objectName) {
069: super (objectName);
070: try {
071: realObjectName = ObjectName.getInstance(objectName);
072: } catch (MalformedObjectNameException e) {
073: // Cannot go here
074: realObjectName = null;
075: }
076: }
077:
078: /**
079: * Registers the MBean (and its childs) in the default MBeanServer
080: */
081: public void register() {
082: register(getMBeanServer());
083: }
084:
085: /**
086: * Registers the MBean (and its childs) in the specified MBeanServer
087: * @param server the MBeanServer where ON will be registered
088: */
089: public void register(MBeanServer server) {
090:
091: // get common-modeler Registry
092: Registry registry = JonasMBeanTools.getRegistry();
093: // get the ManagedBean given the MBean type (WebServices, PortComponent, ...)
094: ManagedBean managed = registry.findManagedBean(getMBeanType());
095: try {
096: // instantiate and register the Model
097: ModelMBean model = managed.createMBean(this );
098: server.registerMBean(model, realObjectName);
099: } catch (Exception e) {
100: // should never goes here
101: log.log(BasicLevel.DEBUG, "Should never goes here", e);
102: }
103:
104: // register "childs"
105: List childs = getChildsMBeans();
106: if (childs != null) {
107: for (Iterator i = childs.iterator(); i.hasNext();) {
108: AbstractWebServiceMBean child = (AbstractWebServiceMBean) i
109: .next();
110: child.register(server);
111: }
112: }
113: }
114:
115: /**
116: * @return Returns the MBean type (as used in mbean-descriptor.xml)
117: */
118: protected abstract String getMBeanType();
119:
120: /**
121: * Unregisters the MBean (and its childs) from the default MBeanServer
122: */
123: public void unregister() {
124: unregister(getMBeanServer());
125: }
126:
127: /**
128: * Unregisters the MBean (and its childs) from the specified MBeanServer
129: * @param server the MBeanServer where ON will be unregistered
130: */
131: public void unregister(MBeanServer server) {
132: // unregister MBean
133: try {
134: server.unregisterMBean(ObjectName
135: .getInstance(getObjectName()));
136: } catch (Exception e) {
137: // nothing to do, we simply continue the unregistering process
138: log.log(BasicLevel.DEBUG, "Should never goes here", e);
139: }
140:
141: // unregister "childs"
142: List childs = getChildsMBeans();
143: if (childs != null) {
144: for (Iterator i = childs.iterator(); i.hasNext();) {
145: AbstractWebServiceMBean child = (AbstractWebServiceMBean) i
146: .next();
147: child.unregister(server);
148: }
149: }
150: }
151:
152: /**
153: * @return Returns the Child List
154: */
155: protected abstract List getChildsMBeans();
156:
157: /**
158: * @return Returns the MBeanServer
159: */
160: private MBeanServer getMBeanServer() {
161: ServiceManager sm;
162: try {
163: sm = ServiceManager.getInstance();
164: } catch (Exception e) {
165: // we should never goes here
166: throw new IllegalStateException(
167: "Cannot get ServiceManager inside JOnAS !");
168: }
169: MBeanServer server = ((JmxService) sm.getJmxService())
170: .getJmxServer();
171: return server;
172: }
173:
174: /**
175: * @return Returns the ObjectName instance
176: */
177: public ObjectName getRealObjectName() {
178: return this.realObjectName;
179: }
180: }
|