001: /**
002: * The XMOJO Project 5
003: * Copyright © 2003 XMOJO.org. All rights reserved.
004:
005: * NO WARRANTY
006:
007: * BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
008: * THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
009: * OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
010: * PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
011: * OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
012: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
013: * TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE
014: * LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
015: * REPAIR OR CORRECTION.
016:
017: * IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
018: * ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE
019: * THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
020: * GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
021: * USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF
022: * DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
023: * PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE),
024: * EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
025: * SUCH DAMAGES.
026: **/package javax.management;
027:
028: //--------------------- Importing the Java packages -------------------------//
029: import java.util.Hashtable;
030: import java.util.ArrayList;
031: import java.util.Enumeration;
032:
033: import com.adventnet.jmx.MBeanServerImpl;
034: import com.adventnet.jmx.DefaultLoaderRepositoryExt;
035:
036: import com.adventnet.agent.logging.Log;
037: import com.adventnet.agent.logging.LogFactory;
038:
039: /**
040: * Provides references to the MBeanServer objects and acts as a
041: * factory for creating creating and releasing the references of
042: * MBeanServer objects.
043: */
044: public class MBeanServerFactory {
045: //--------------------------Variable Declaration-------------------------//
046:
047: /** The static list which maintains the MBeanServer instances **/
048: private static ArrayList servers = new ArrayList();
049:
050: /** The default domain of the MBeanServer **/
051: private static String defaultDomain = new String("DefaultDomain");
052:
053: private static final String DELEGATE_NAME = "JMImplementation:type=MBeanServerDelegate";
054:
055: private static Log log;
056:
057: /** Get Logger Instance **/
058: static {
059: try {
060: log = LogFactory.getInstance("JMX");
061: } catch (Exception e) {
062: e.printStackTrace();
063: }
064: }
065:
066: // the following is to prevent generation of default constructor
067: // all the methods in this class are static methods
068: private MBeanServerFactory() {
069: }
070:
071: /**
072: * Return a new object implementing the MBeanServer interface with a
073: * standard default domain name. The default domain name is used as the
074: * domain part in the ObjectName of MBeans, if no domain is specified by
075: * the user.
076: * <br>
077: * The standard default domain name is "DefaultDomain". This can
078: * be got from MBeanServer.getDefaultDomain() method.
079: * <br>
080: * The MBeanServer reference is internally kept. This will allows
081: * <CODE>findMBeanServer</CODE> to give back a reference to this
082: * newly MBeanServer object.
083: *
084: * @return This creates a new MBean server
085: */
086: public static MBeanServer createMBeanServer() {
087: return createMBeanServer(defaultDomain);
088: }
089:
090: /**
091: * Return a new object implementing the MBeanServer interface with the
092: * specified default domain name. The default domain name is used as the
093: * domain part in the ObjectName of MBeans, if no domain is specified by the
094: * user is null.
095: * <p>
096: * The MBeanServer reference is internally kept. This will allows
097: * <CODE>findMBeanServer</CODE> to give back a reference to this newly
098: * MBeanServer object.
099: *
100: * @param domain The MBeanServer is created with this domain name
101: *
102: * @return This creates a new MBeanServer with the specified domain name
103: */
104: public static MBeanServer createMBeanServer(String domain) {
105: log.trace("Before creating the MBeanServer");
106: MBeanServerImpl impl = new MBeanServerImpl(domain);
107:
108: synchronized (servers) {
109: servers.add(impl);
110: }
111:
112: log.trace("MBeanServer created and added");
113:
114: return impl;
115: }
116:
117: /**
118: * Returns a new MBeanServer Object without storing the reference to the
119: * created object with standard default domain name. This domain will
120: * be used as a part of the ObjectName while registering the MBeans.
121: * As no reference is kept, invoking the <CODE>findMBeanServer</CODE> will
122: * not give back reference to this newly created MBeanServer object, but
123: * this MBeanServer is eligible for Garbage Collection.
124: *
125: * @param mbeanServer The newly created MbeanServer object.
126: */
127: public static MBeanServer newMBeanServer() {
128: return newMBeanServer(defaultDomain);
129: }
130:
131: /**
132: * Returns a new MBeanServer Object without storing the reference to the
133: * created object with the specified domain name. This domain will
134: * be used as a part of the ObjectName while registering the MBeans.
135: * As no reference is kept, invoking the <CODE>findMBeanServer</CODE> will
136: * not give back reference to this newly created MBeanServer object, but
137: * this MBeanServer is eligible for Garbage Collection.
138: *
139: * @param mbeanServer The newly created MbeanServer object.
140: */
141: public static MBeanServer newMBeanServer(String domain) {
142: DefaultLoaderRepositoryExt.removeAllLoader();
143: return new MBeanServerImpl(domain);
144: }
145:
146: /**
147: * Releases all the internal references for a MBeanServer object, thus
148: * making the MBeanServer instance an eligible object for Garbage Collection.
149: *
150: * @param mbeanServer The MbeanServer object to remove.
151: */
152: public static void releaseMBeanServer(MBeanServer mbeanServer) {
153: if (mbeanServer != null) {
154: servers.remove(mbeanServer);
155: } else {
156: log.warn("MBeanServer could not be removed");
157: }
158: }
159:
160: /**
161: * Return a list of objects implementing the MBeanServer interface.
162: * This static method allows a user to retrieve references on MBeanServer
163: * which have been instantiated in the Java Virtual Machine.
164: *
165: * @param agentId The agent identifier of the MBeanServer to retrieve.
166: * If this parameter is null, all MBeanServer present in
167: * the JVM are returned.
168: *
169: * @return A list of MBeanServer object.
170: */
171: public static ArrayList findMBeanServer(String agentId) {
172:
173: ArrayList toRet = new ArrayList();
174:
175: if (agentId == null) {
176: return (ArrayList) (servers.clone()); //clone will help in not
177: // scattering the references
178: } else {
179: // Going to browse through the ArrayList to find the respective
180: // MBeanServer. This is a factory method ..so synchronization must
181: // be done to avoid indiscrepancies.
182:
183: synchronized (servers) {
184: for (int i = 0; i < servers.size(); i++) {
185: MBeanServer server = (MBeanServer) (servers.get(i));
186: //check the server's id with that of the corresponding delegate
187: try {
188: String serverId = (String) (server
189: .getAttribute(new ObjectName(
190: DELEGATE_NAME), "MBeanServerId"));
191:
192: if (serverId.equals(agentId)) {
193: toRet.add(server);
194: }
195: } catch (Exception e) {
196: log.error("Exception in findMBeanServer", e);
197: }
198: }
199:
200: return toRet;
201: }
202: }
203: }
204: } // End of Class MBeanServerFactory.java
|