View Javadoc

1   /**
2    *
3    * Copyright 2003-2004 The Apache Software Foundation
4    *
5    *  Licensed under the Apache License, Version 2.0 (the "License");
6    *  you may not use this file except in compliance with the License.
7    *  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   *  Unless required by applicable law or agreed to in writing, software
12   *  distributed under the License is distributed on an "AS IS" BASIS,
13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   *  See the License for the specific language governing permissions and
15   *  limitations under the License.
16   */
17  
18  package org.apache.geronimo.j2ee.management.impl;
19  
20  import java.net.InetAddress;
21  import java.net.UnknownHostException;
22  import java.util.Date;
23  import java.util.Hashtable;
24  import java.util.Properties;
25  import javax.management.ObjectName;
26  import javax.management.j2ee.statistics.Stats;
27  
28  import org.apache.geronimo.gbean.GBeanInfo;
29  import org.apache.geronimo.gbean.GBeanInfoBuilder;
30  import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
31  import org.apache.geronimo.kernel.Kernel;
32  import org.apache.geronimo.kernel.ObjectNameUtil;
33  import org.apache.geronimo.management.StatisticsProvider;
34  import org.apache.geronimo.management.geronimo.JVM;
35  import org.apache.geronimo.management.stats.BoundedRangeImpl;
36  import org.apache.geronimo.management.stats.JVMStatsImpl;
37  import org.apache.geronimo.system.logging.SystemLog;
38  
39  /**
40   *
41   *
42   * @version $Rev: 396206 $ $Date: 2006-04-22 19:55:45 -0700 (Sat, 22 Apr 2006) $
43   */
44  public class JVMImpl implements JVM, StatisticsProvider {
45      public static final String JAVA_VERSION = System.getProperty("java.version");
46      public static final String JAVA_VENDOR = System.getProperty("java.vendor");
47      public static final String NODE;
48      private static final Runtime runtime = Runtime.getRuntime();
49  
50      static {
51          String node;
52          try {
53              node = InetAddress.getLocalHost().toString();
54          } catch (UnknownHostException e) {
55              node = null;
56          }
57          NODE = node;
58      }
59  
60      private final String objectName;
61      private final Kernel kernel;
62      private final SystemLog systemLog;
63      private JVMStatsImpl stats;
64  
65      public JVMImpl(String objectName, Kernel kernel, SystemLog systemLog) {
66          this.objectName = objectName;
67          this.kernel = kernel;
68          this.systemLog = systemLog;
69          ObjectName myObjectName = ObjectNameUtil.getObjectName(this.objectName);
70          verifyObjectName(myObjectName);
71      }
72  
73      /**
74       * ObjectName must match this pattern:
75       * <p/>
76       * domain:j2eeType=JVM,name=MyName
77       */
78      private void verifyObjectName(ObjectName objectName) {
79          if (objectName.isPattern()) {
80              throw new InvalidObjectNameException("ObjectName can not be a pattern", objectName);
81          }
82          Hashtable keyPropertyList = objectName.getKeyPropertyList();
83          if (!"JVM".equals(keyPropertyList.get("j2eeType"))) {
84              throw new InvalidObjectNameException("JVM object name j2eeType property must be 'JVM'", objectName);
85          }
86          if (!keyPropertyList.containsKey("name")) {
87              throw new InvalidObjectNameException("JVM object must contain a name property", objectName);
88          }
89          if (!keyPropertyList.containsKey("J2EEServer")) {
90              throw new InvalidObjectNameException("JVM object must contain a J2EEServer property", objectName);
91          }
92          if (keyPropertyList.size() != 3) {
93              throw new InvalidObjectNameException("JVM object name can only have J2EEServer, j2eeType, and name", objectName);
94          }
95      }
96  
97      public String getObjectName() {
98          return objectName;
99      }
100 
101     public boolean isStateManageable() {
102         return true;
103     }
104 
105     public boolean isStatisticsProvider() {
106         return true;
107     }
108 
109     public boolean isEventProvider() {
110         return true;
111     }
112 
113     /**
114      * The version of the JVMImpl we are running on.
115      * This is the value of java.version system property
116      * @see "JSR77.3.4.1.1"
117      * @return the JVMImpl version
118      */
119     public String getJavaVersion() {
120         return JAVA_VERSION;
121     }
122 
123     /**
124      * The vendor of the JVMImpl we are running on.
125      * This is the value of java.vendor system property
126      * @see "JSR77.3.4.1.2"
127      * @return the JVMImpl version
128      */
129     public String getJavaVendor() {
130         return JAVA_VENDOR;
131     }
132 
133     /**
134      * The node we are running on.
135      * This is the fully qualified host name returned for InetAddress.getLocalHost.toString();
136      * we return null if there is no network
137      * @see "JSR77.3.4.1.3"
138      * @return the node we are running on
139      */
140     public String getNode() {
141         return NODE;
142     }
143 
144     public int getAvailableProcessors() {
145         return runtime.availableProcessors();
146     }
147 
148     public Date getKernelBootTime() {
149         return kernel.getBootTime();
150     }
151 
152     public Stats getStats() {
153         BoundedRangeImpl heap;
154         if(stats == null) {
155             stats = new JVMStatsImpl();
156             long start = kernel.getBootTime().getTime();
157             stats.getUpTimeImpl().setCount(start);
158             stats.getUpTimeImpl().setStartTime(start);
159             heap = stats.getHeapSizeImpl();
160             heap.setStartTime(start);
161             heap.setBounds(0, runtime.totalMemory());
162             heap.setCurrent(heap.getUpperBound() - runtime.freeMemory());
163             heap.setLowWaterMark(heap.getCurrent());
164             heap.setHighWaterMark(heap.getCurrent());
165         } else {
166             heap = stats.getHeapSizeImpl();
167             heap.setBounds(0, runtime.totalMemory());
168             heap.setCurrent(heap.getUpperBound() - runtime.freeMemory());
169         }
170         long now = System.currentTimeMillis();
171         stats.getUpTimeImpl().setLastSampleTime(now);
172         heap.setLastSampleTime(now);
173         return stats;
174     }
175 
176     public Properties getSystemProperties() {
177         return System.getProperties();
178     }
179 
180     public SystemLog getSystemLog() {
181         return systemLog;
182     }
183 
184     public static final GBeanInfo GBEAN_INFO;
185 
186     static {
187         GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(JVMImpl.class, NameFactory.JVM);
188         infoFactory.addReference("SystemLog", SystemLog.class);
189         infoFactory.setConstructor(new String[] {"objectName", "kernel", "SystemLog"});
190         GBEAN_INFO = infoFactory.getBeanInfo();
191     }
192 
193     public static GBeanInfo getGBeanInfo() {
194         return GBEAN_INFO;
195     }
196 }