001    /**
002     *
003     * Copyright 2003-2004 The Apache Software Foundation
004     *
005     *  Licensed under the Apache License, Version 2.0 (the "License");
006     *  you may not use this file except in compliance with the License.
007     *  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.net.InetAddress;
021    import java.net.UnknownHostException;
022    import java.util.Date;
023    import java.util.Hashtable;
024    import java.util.Properties;
025    import javax.management.ObjectName;
026    import javax.management.j2ee.statistics.Stats;
027    
028    import org.apache.geronimo.gbean.GBeanInfo;
029    import org.apache.geronimo.gbean.GBeanInfoBuilder;
030    import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
031    import org.apache.geronimo.kernel.Kernel;
032    import org.apache.geronimo.kernel.ObjectNameUtil;
033    import org.apache.geronimo.management.StatisticsProvider;
034    import org.apache.geronimo.management.geronimo.JVM;
035    import org.apache.geronimo.management.stats.BoundedRangeImpl;
036    import org.apache.geronimo.management.stats.JVMStatsImpl;
037    import org.apache.geronimo.system.logging.SystemLog;
038    
039    /**
040     *
041     *
042     * @version $Rev: 396206 $ $Date: 2006-04-22 19:55:45 -0700 (Sat, 22 Apr 2006) $
043     */
044    public class JVMImpl implements JVM, StatisticsProvider {
045        public static final String JAVA_VERSION = System.getProperty("java.version");
046        public static final String JAVA_VENDOR = System.getProperty("java.vendor");
047        public static final String NODE;
048        private static final Runtime runtime = Runtime.getRuntime();
049    
050        static {
051            String node;
052            try {
053                node = InetAddress.getLocalHost().toString();
054            } catch (UnknownHostException e) {
055                node = null;
056            }
057            NODE = node;
058        }
059    
060        private final String objectName;
061        private final Kernel kernel;
062        private final SystemLog systemLog;
063        private JVMStatsImpl stats;
064    
065        public JVMImpl(String objectName, Kernel kernel, SystemLog systemLog) {
066            this.objectName = objectName;
067            this.kernel = kernel;
068            this.systemLog = systemLog;
069            ObjectName myObjectName = ObjectNameUtil.getObjectName(this.objectName);
070            verifyObjectName(myObjectName);
071        }
072    
073        /**
074         * ObjectName must match this pattern:
075         * <p/>
076         * domain:j2eeType=JVM,name=MyName
077         */
078        private void verifyObjectName(ObjectName objectName) {
079            if (objectName.isPattern()) {
080                throw new InvalidObjectNameException("ObjectName can not be a pattern", objectName);
081            }
082            Hashtable keyPropertyList = objectName.getKeyPropertyList();
083            if (!"JVM".equals(keyPropertyList.get("j2eeType"))) {
084                throw new InvalidObjectNameException("JVM object name j2eeType property must be 'JVM'", objectName);
085            }
086            if (!keyPropertyList.containsKey("name")) {
087                throw new InvalidObjectNameException("JVM object must contain a name property", objectName);
088            }
089            if (!keyPropertyList.containsKey("J2EEServer")) {
090                throw new InvalidObjectNameException("JVM object must contain a J2EEServer property", objectName);
091            }
092            if (keyPropertyList.size() != 3) {
093                throw new InvalidObjectNameException("JVM object name can only have J2EEServer, j2eeType, and name", objectName);
094            }
095        }
096    
097        public String getObjectName() {
098            return objectName;
099        }
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    }