001: /**
002: * JOnAS: Java(TM) Open Application Server
003: * Copyright (C) 2006 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: LogicalCluster.java 9448 2006-08-23 12:18:46Z danesa $
023: * --------------------------------------------------------------------------
024: */package org.objectweb.jonas.management.cluster;
025:
026: import javax.management.InstanceNotFoundException;
027: import javax.management.JMException;
028: import javax.management.MBeanRegistrationException;
029: import javax.management.MBeanServer;
030: import javax.management.ObjectName;
031:
032: import org.objectweb.jonas.jmx.JonasObjectName;
033: import org.objectweb.jonas.management.monitoring.ServerProxy;
034:
035: import org.objectweb.util.monolog.api.BasicLevel;
036:
037: /**
038: * Logical Cluster: may be created by jonasAdmin, or declared in domain.xml
039: * A default logical cluster is created for each domain, it holds all the
040: * servers in the doamin.
041: * @author Adriana Danes
042: * @author Philippe Durieux
043: */
044: public class LogicalCluster extends BaseCluster implements
045: BaseClusterMBean {
046:
047: /**
048: * The type of Cluster, that is part of the MBean ObjectName
049: */
050: protected String type = "LogicalCluster";
051:
052: /**
053: * logical cluster constructor
054: * @param cf ClusterFactory
055: * @throws JMException could not create MBean instance
056: */
057: public LogicalCluster(ClusterFactory cf) throws JMException {
058: super (cf);
059: }
060:
061: public ClusterMember createClusterMember(String svname,
062: ServerProxy proxy) {
063: return new LogicalClusterMember(svname, proxy);
064: }
065:
066: // --------------------------------------------------------------------------
067: // Other public methods
068: // --------------------------------------------------------------------------
069:
070: /**
071: * @return The String type to be put in the ObjectName
072: */
073: public String getType() {
074: return type;
075: }
076:
077: /**
078: * Add a Server to the list
079: * Make link between the member and the ServerProxy.
080: * @param serverName name of the managed server
081: * @param proxy The ServerProxy related object.
082: * @return True if correctly added in the List.
083: */
084: public boolean addServer(String serverName, ServerProxy proxy) {
085:
086: // Create the LogicalClusterMember object
087: LogicalClusterMember server = new LogicalClusterMember(
088: serverName, proxy);
089:
090: // Add this member to the 'members' list
091: boolean added = addMember(server);
092: if (added) {
093: // Build the ObjectName and register the ClusterMember MBean
094: ObjectName on = null;
095: try {
096: on = JonasObjectName.clusterMember(serverName,
097: getType(), name);
098: server.setObjectName(on);
099: MBeanServer mbeanServer = jmx.getJmxServer();
100: if (mbeanServer.isRegistered(on)) {
101: mbeanServer.unregisterMBean(on);
102: }
103: mbeanServer.registerMBean(server, on);
104: } catch (JMException e) {
105: logger.log(BasicLevel.WARN, "Cannot register " + on
106: + ": " + e);
107: }
108: }
109: return added;
110: }
111:
112: /**
113: * MBean operation which overides the BaseCluster's one
114: * It removes the corresponding member object from the <code>members</code>
115: * list and unregisters the corresponding ServerProxy MBean if this
116: * is the domain cluster.
117: * Note that the ClusterMember MBean is not unregistered (it will
118: * be done in case of the re-register of a new member in case the server
119: * is re-added to the domain).
120: * Remove a server from the cluster (jonasAdmin)
121: * @param svname logical name of the server
122: */
123: public synchronized void removeServer(String svname) {
124: // Remove the corresponding member from the 'members' list
125: ClusterMember member = (ClusterMember) members.remove(svname);
126: if (member != null) {
127: // found a member corresponding to this server in this cluster
128: String domainName = member.getProxy().getDomain();
129: // Only treat ServerProxy if this is the domain cluster
130: if (domainName.equals(name)) {
131: // Unregister the server's ServerProxy MBean
132: ServerProxy sp = member.getProxy();
133: ObjectName spOn = null;
134: try {
135: spOn = ObjectName.getInstance(sp.getObjectName());
136: MBeanServer mbeanServer = jmx.getJmxServer();
137: if (mbeanServer.isRegistered(spOn)) {
138: mbeanServer.unregisterMBean(spOn);
139: }
140: } catch (JMException e) {
141: logger.log(BasicLevel.WARN,
142: "Cannot unregister ServerProxy of "
143: + svname + ": " + e);
144: }
145: }
146: }
147: }
148: }
|