001: /*
002: * ==============================================================================
003: * Licensed under the Apache License, Version 2.0 (the "License"); you may not
004: * use this file except in compliance with the License. You may obtain a copy of
005: * the License at
006: *
007: * http://www.apache.org/licenses/LICENSE-2.0
008: *
009: * Unless required by applicable law or agreed to in writing, software
010: * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
011: * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
012: * License for the specific language governing permissions and limitations under
013: * the License.
014: */
015: package wicket.jmx;
016:
017: import java.lang.management.ManagementFactory;
018: import java.util.ArrayList;
019: import java.util.List;
020:
021: import javax.management.InstanceAlreadyExistsException;
022: import javax.management.InstanceNotFoundException;
023: import javax.management.MBeanRegistrationException;
024: import javax.management.MBeanServer;
025: import javax.management.MalformedObjectNameException;
026: import javax.management.NotCompliantMBeanException;
027: import javax.management.ObjectName;
028:
029: import org.apache.commons.logging.Log;
030: import org.apache.commons.logging.LogFactory;
031:
032: import wicket.IDestroyer;
033: import wicket.IInitializer;
034: import wicket.WicketRuntimeException;
035:
036: /**
037: * Registers Wicket's MBeans.
038: *
039: * @author eelcohillenius
040: */
041: public class Initializer implements IInitializer, IDestroyer {
042: private static Log log = LogFactory.getLog(Initializer.class);
043:
044: /**
045: * List of registered names
046: */
047: private List<ObjectName> registered = new ArrayList<ObjectName>();
048:
049: /**
050: * @see wicket.IDestroyer#destroy(wicket.Application)
051: */
052: public void destroy(wicket.Application application) {
053: MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
054: for (ObjectName objectName : registered) {
055: try {
056: mbs.unregisterMBean(objectName);
057: } catch (InstanceNotFoundException e) {
058: log.error(e.getMessage(), e);
059: } catch (MBeanRegistrationException e) {
060: log.error(e.getMessage(), e);
061: }
062: }
063: }
064:
065: /**
066: * @see wicket.IInitializer#init(wicket.Application)
067: */
068: public void init(wicket.Application application) {
069: try {
070: String name = application.getName();
071: MBeanServer mbs = ManagementFactory
072: .getPlatformMBeanServer();
073:
074: // register top level application object, but first check whether
075: // multiple instances of the same application (name) are running and
076: // if so adjust the name
077: String domain = "wicket.app." + name;
078: ObjectName appBeanName = new ObjectName(domain
079: + ":type=Application");
080: String tempDomain = domain;
081: int i = 0;
082: while (mbs.isRegistered(appBeanName)) {
083: tempDomain = name + "-" + i++;
084: appBeanName = new ObjectName(tempDomain
085: + ":type=Application");
086: }
087: domain = tempDomain;
088:
089: Application appBean = new Application(application);
090: register(mbs, appBean, appBeanName);
091:
092: register(
093: mbs,
094: new ApplicationSettings(application),
095: new ObjectName(
096: domain
097: + ":type=Application,name=ApplicationSettings"));
098: register(mbs, new DebugSettings(application),
099: new ObjectName(domain
100: + ":type=Application,name=DebugSettings"));
101: register(mbs, new MarkupSettings(application),
102: new ObjectName(domain
103: + ":type=Application,name=MarkupSettings"));
104: register(
105: mbs,
106: new ResourceSettings(application),
107: new ObjectName(domain
108: + ":type=Application,name=ResourceSettings"));
109: register(mbs, new PageSettings(application),
110: new ObjectName(domain
111: + ":type=Application,name=PageSettings"));
112: register(
113: mbs,
114: new RequestCycleSettings(application),
115: new ObjectName(
116: domain
117: + ":type=Application,name=RequestCycleSettings"));
118: register(
119: mbs,
120: new SecuritySettings(application),
121: new ObjectName(domain
122: + ":type=Application,name=SecuritySettings"));
123: register(mbs, new SessionSettings(application),
124: new ObjectName(domain
125: + ":type=Application,name=SessionSettings"));
126: register(
127: mbs,
128: new CookieValuePersisterSettings(application),
129: new ObjectName(
130: domain
131: + ":type=Application,name=CookieValuePersisterSettings"));
132:
133: RequestLogger sessionsBean = new RequestLogger(application);
134: ObjectName sessionsBeanName = new ObjectName(domain
135: + ":type=RequestLogger");
136: register(mbs, sessionsBean, sessionsBeanName);
137: } catch (MalformedObjectNameException e) {
138: throw new WicketRuntimeException(e);
139: } catch (InstanceAlreadyExistsException e) {
140: throw new WicketRuntimeException(e);
141: } catch (MBeanRegistrationException e) {
142: throw new WicketRuntimeException(e);
143: } catch (NotCompliantMBeanException e) {
144: throw new WicketRuntimeException(e);
145: }
146: }
147:
148: /**
149: * @see java.lang.Object#toString()
150: */
151: public String toString() {
152: return "Wicket JMX initializer";
153: }
154:
155: /**
156: * Register MBean.
157: *
158: * @param mbs
159: * server
160: * @param o
161: * MBean
162: * @param objectName
163: * Object name
164: * @throws NotCompliantMBeanException
165: * @throws MBeanRegistrationException
166: * @throws InstanceAlreadyExistsException
167: */
168: private void register(MBeanServer mbs, Object o,
169: ObjectName objectName)
170: throws InstanceAlreadyExistsException,
171: MBeanRegistrationException, NotCompliantMBeanException {
172: mbs.registerMBean(o, objectName);
173: registered.add(objectName);
174: }
175: }
|