001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.geronimo.j2ee.management.impl;
019
020 import java.lang.management.ManagementFactory;
021 import java.lang.management.MemoryMXBean;
022 import java.lang.management.MemoryUsage;
023 import java.lang.management.RuntimeMXBean;
024 import java.net.InetAddress;
025 import java.net.UnknownHostException;
026 import java.util.Date;
027 import java.util.Hashtable;
028 import java.util.Properties;
029
030 import javax.management.ObjectName;
031 import javax.management.j2ee.statistics.Stats;
032
033 import org.apache.geronimo.gbean.GBeanInfo;
034 import org.apache.geronimo.gbean.GBeanInfoBuilder;
035 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
036 import org.apache.geronimo.kernel.Kernel;
037 import org.apache.geronimo.kernel.ObjectNameUtil;
038 import org.apache.geronimo.management.StatisticsProvider;
039 import org.apache.geronimo.management.geronimo.JVM;
040 import org.apache.geronimo.management.stats.BoundedRangeStatisticImpl;
041 import org.apache.geronimo.management.stats.CountStatisticImpl;
042 import org.apache.geronimo.management.stats.JVMStatsImpl;
043 import org.apache.geronimo.system.logging.SystemLog;
044
045 /**
046 *
047 *
048 * @version $Rev: 561093 $ $Date: 2007-07-30 15:04:51 -0400 (Mon, 30 Jul 2007) $
049 */
050 public class JVMImpl implements JVM, StatisticsProvider {
051 public static final String JAVA_VERSION = System.getProperty("java.version");
052 public static final String JAVA_VENDOR = System.getProperty("java.vendor");
053 public static final String NODE;
054 private static final Runtime runtime = Runtime.getRuntime();
055
056 static {
057 String node;
058 try {
059 node = InetAddress.getLocalHost().toString();
060 } catch (UnknownHostException e) {
061 node = null;
062 }
063 NODE = node;
064 }
065
066 private final String objectName;
067 private final Kernel kernel;
068 private final SystemLog systemLog;
069 private JVMStatsImpl stats;
070
071 public JVMImpl(String objectName, Kernel kernel, SystemLog systemLog) {
072 this.objectName = objectName;
073 this.kernel = kernel;
074 this.systemLog = systemLog;
075 ObjectName myObjectName = ObjectNameUtil.getObjectName(this.objectName);
076 verifyObjectName(myObjectName);
077 }
078
079 /**
080 * ObjectName must match this pattern:
081 * <p/>
082 * domain:j2eeType=JVM,name=MyName
083 */
084 private void verifyObjectName(ObjectName objectName) {
085 if (objectName.isPattern()) {
086 throw new InvalidObjectNameException("ObjectName can not be a pattern", objectName);
087 }
088 Hashtable keyPropertyList = objectName.getKeyPropertyList();
089 if (!"JVM".equals(keyPropertyList.get("j2eeType"))) {
090 throw new InvalidObjectNameException("JVM object name j2eeType property must be 'JVM'", objectName);
091 }
092 if (!keyPropertyList.containsKey("name")) {
093 throw new InvalidObjectNameException("JVM object must contain a name property", objectName);
094 }
095 if (!keyPropertyList.containsKey("J2EEServer")) {
096 throw new InvalidObjectNameException("JVM object must contain a J2EEServer property", objectName);
097 }
098 if (keyPropertyList.size() != 3) {
099 throw new InvalidObjectNameException("JVM object name can only have J2EEServer, j2eeType, and name", objectName);
100 }
101 }
102
103 public String getObjectName() {
104 return objectName;
105 }
106
107 public boolean isStateManageable() {
108 return true;
109 }
110
111 public boolean isStatisticsProvider() {
112 return true;
113 }
114
115 public boolean isEventProvider() {
116 return true;
117 }
118
119 /**
120 * The version of the JVMImpl we are running on.
121 * This is the value of java.version system property
122 * @see "JSR77.3.4.1.1"
123 * @return the JVMImpl version
124 */
125 public String getJavaVersion() {
126 return JAVA_VERSION;
127 }
128
129 /**
130 * The vendor of the JVMImpl we are running on.
131 * This is the value of java.vendor system property
132 * @see "JSR77.3.4.1.2"
133 * @return the JVMImpl version
134 */
135 public String getJavaVendor() {
136 return JAVA_VENDOR;
137 }
138
139 /**
140 * The node we are running on.
141 * This is the fully qualified host name returned for InetAddress.getLocalHost.toString();
142 * we return null if there is no network
143 * @see "JSR77.3.4.1.3"
144 * @return the node we are running on
145 */
146 public String getNode() {
147 return NODE;
148 }
149
150 public int getAvailableProcessors() {
151 return runtime.availableProcessors();
152 }
153
154 public Date getKernelBootTime() {
155 return kernel.getBootTime();
156 }
157
158 public Stats getStats() {
159 RuntimeMXBean runmxbean = ManagementFactory.getRuntimeMXBean();
160 MemoryMXBean memmxbean = ManagementFactory.getMemoryMXBean();
161 MemoryUsage memUsage = memmxbean.getHeapMemoryUsage();
162 CountStatisticImpl upTime;
163 BoundedRangeStatisticImpl heapSize;
164
165 if (stats == null) {
166 stats = new JVMStatsImpl();
167 // setup UpTime CountStatistic
168 upTime = stats.getUpTimeImpl();
169 upTime.setStartTime(runmxbean.getStartTime());
170 upTime.setCount(runmxbean.getUptime());
171 // setup Heap BoundedRangeStatistic
172 heapSize = stats.getHeapSizeImpl();
173 heapSize.setStartTime(runmxbean.getStartTime());
174 heapSize.setBounds(0, memUsage.getMax());
175 heapSize.setCurrent(memUsage.getUsed());
176 heapSize.setLowWaterMark(memUsage.getUsed());
177 heapSize.setHighWaterMark(memUsage.getUsed());
178 } else {
179 // update UpTime CountStatistic
180 upTime = stats.getUpTimeImpl();
181 upTime.setCount(runmxbean.getUptime());
182 // update Heap BoundedRangeStatistic
183 heapSize = stats.getHeapSizeImpl();
184 heapSize.setBounds(0, memUsage.getMax());
185 heapSize.setCurrent(memUsage.getUsed());
186 }
187 long now = upTime.getStartTime() + upTime.getCount();
188 upTime.setLastSampleTime(now);
189 heapSize.setLastSampleTime(now);
190
191 return stats;
192 }
193
194 public void resetStats() {
195 // TODO
196 }
197
198 public Properties getSystemProperties() {
199 return System.getProperties();
200 }
201
202 public SystemLog getSystemLog() {
203 return systemLog;
204 }
205
206 public static final GBeanInfo GBEAN_INFO;
207
208 static {
209 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(JVMImpl.class, NameFactory.JVM);
210 infoFactory.addReference("SystemLog", SystemLog.class);
211 infoFactory.setConstructor(new String[] {"objectName", "kernel", "SystemLog"});
212 GBEAN_INFO = infoFactory.getBeanInfo();
213 }
214
215 public static GBeanInfo getGBeanInfo() {
216 return GBEAN_INFO;
217 }
218 }