001    /*
002     * CDDL HEADER START
003     *
004     * The contents of this file are subject to the terms of the
005     * Common Development and Distribution License, Version 1.0 only
006     * (the "License").  You may not use this file except in compliance
007     * with the License.
008     *
009     * You can obtain a copy of the license at
010     * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011     * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012     * See the License for the specific language governing permissions
013     * and limitations under the License.
014     *
015     * When distributing Covered Code, include this CDDL HEADER in each
016     * file and include the License file at
017     * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
018     * add the following below this CDDL HEADER, with the fields enclosed
019     * by brackets "[]" replaced with your own identifying information:
020     *      Portions Copyright [yyyy] [name of copyright owner]
021     *
022     * CDDL HEADER END
023     *
024     *
025     *      Copyright 2008 Sun Microsystems, Inc.
026     */
027    
028     package org.opends.server.util;
029     import static org.opends.server.loggers.ErrorLogger.logError;
030     import static org.opends.messages.RuntimeMessages.*;
031     import static org.opends.messages.CoreMessages.*;
032     import static org.opends.server.util.DynamicConstants.*;
033     import org.opends.server.core.DirectoryServer;
034     import java.net.InetAddress;
035     import java.lang.management.RuntimeMXBean;
036     import java.lang.management.ManagementFactory;
037     import java.util.List;
038    
039    import javax.management.MBeanServer;
040    import javax.management.ObjectName;
041    
042    import com.sleepycat.je.JEVersion;
043    
044    
045     /**
046      * This class is used to gather and display information from the runtime
047      * environment.
048      */
049     public class RuntimeInformation {
050    
051    
052       private static boolean is64Bit=false;
053    
054       static {
055         String arch = System.getProperty("sun.arch.data.model");
056         if (arch != null) {
057           try {
058             is64Bit = Integer.parseInt(arch) == 64;
059           } catch (NumberFormatException ex) {
060             //Default to 32 bit.
061           }
062         }
063       }
064    
065       /**
066        * Returns whether the architecture of the JVM we are running under is 64-bit
067        * or not.
068        *
069        * @return <CODE>true</CODE> if the JVM architecture we running under is
070        * 64-bit and <CODE>false</CODE> otherwise.
071        */
072       public static boolean is64Bit() {
073         return is64Bit;
074       }
075    
076       /**
077        * Returns a string representing the JVM input arguments as determined by the
078        * MX runtime bean. The individual arguments are separated by commas.
079        *
080        * @return  A string representation of the JVM input arguments.
081        */
082       private static String getInputArguments() {
083         int count=0;
084         RuntimeMXBean rtBean = ManagementFactory.getRuntimeMXBean();
085         StringBuilder argList = new StringBuilder();
086         List<String> jvmArguments = rtBean.getInputArguments();
087         if ((jvmArguments != null) && (! jvmArguments.isEmpty())) {
088           for (String jvmArg : jvmArguments) {
089             if (argList.length() > 0)  {
090               argList.append(" ");
091             }
092             argList.append("\"");
093             argList.append(jvmArg);
094             argList.append("\"");
095             count++;
096             if (count < jvmArguments.size())  {
097               argList.append(",");
098             }
099           }
100         }
101         return argList.toString();
102       }
103    
104       /**
105        * Writes runtime information to a print stream.
106        */
107       public static void printInfo() {
108         System.out.println(NOTE_VERSION.get(DirectoryServer.getVersionString()));
109         System.out.println(NOTE_BUILD_ID.get(BUILD_ID));
110         System.out.println(
111                 NOTE_JAVA_VERSION.get(System.getProperty("java.version")));
112         System.out.println(
113                 NOTE_JAVA_VENDOR.get(System.getProperty("java.vendor")));
114         System.out.println(
115                 NOTE_JVM_VERSION.get(System.getProperty("java.vm.version")));
116         System.out.println(
117                 NOTE_JVM_VENDOR.get(System.getProperty("java.vm.vendor")));
118         System.out.println(
119                 NOTE_JAVA_HOME.get(System.getProperty("java.home")));
120         System.out.println(
121                 NOTE_JAVA_CLASSPATH.get(System.getProperty("java.class.path")));
122         System.out.println(
123                 NOTE_JE_VERSION.get(JEVersion.CURRENT_VERSION.toString()));
124         System.out.println(
125                 NOTE_CURRENT_DIRECTORY.get(System.getProperty("user.dir")));
126         System.out.println(
127                 NOTE_OPERATING_SYSTEM.get(System.getProperty("os.name") + " " +
128                         System.getProperty("os.version") + " " +
129                         System.getProperty("os.arch")));
130         String sunOsArchDataModel = System.getProperty("sun.arch.data.model");
131         if (sunOsArchDataModel != null) {
132           if (! sunOsArchDataModel.toLowerCase().equals("unknown")) {
133             System.out.println(NOTE_JVM_ARCH.get(sunOsArchDataModel + "-bit"));
134           }
135         }
136         else{
137           System.out.println(NOTE_JVM_ARCH.get("unknown"));
138         }
139         try {
140           System.out.println(NOTE_SYSTEM_NAME.get(InetAddress.getLocalHost().
141                   getCanonicalHostName()));
142         }
143         catch (Exception e) {
144           System.out.println(NOTE_SYSTEM_NAME.get("Unknown (" + e + ")"));
145         }
146         System.out.println(NOTE_AVAILABLE_PROCESSORS.get(Runtime.getRuntime().
147                 availableProcessors()));
148         System.out.println(NOTE_MAX_MEMORY.get(Runtime.getRuntime().maxMemory()));
149         System.out.println(
150                 NOTE_TOTAL_MEMORY.get(Runtime.getRuntime().totalMemory()));
151         System.out.println(
152                 NOTE_FREE_MEMORY.get(Runtime.getRuntime().freeMemory()));
153       }
154    
155       /**
156         * Returns the physical memory size, in bytes, of the hardware we are
157         * running on.
158         *
159         * @return Bytes of physical memory of the hardware we are running on.
160         */
161      private static long getPhysicalMemorySize()
162      {
163        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
164        try
165        {
166          // Assuming the RuntimeMXBean has been registered in mbs
167          ObjectName oname = new ObjectName(
168              ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME);
169          // Check if this MXBean contains Sun's extension
170          if (mbs.isInstanceOf(oname, "com.sun.management.OperatingSystemMXBean")) {
171              // Get platform-specific attribute "TotalPhysicalMemorySize"
172              Long l = (Long) mbs.getAttribute(oname, "TotalPhysicalMemorySize");
173              return l ;
174          }
175          else
176          {
177            return -1;
178          }
179        }
180        catch (Exception e)
181        {
182          return -1;
183        }
184       }
185    
186       /**
187        * Returns a string representing the fully qualified domain name.
188        *
189        * @return A string representing the fully qualified domain name or the
190        * string "unknown" if an exception was thrown.
191        */
192       private static String getHostName() {
193         String host;
194         try {
195           host=InetAddress.getLocalHost().getCanonicalHostName();
196         }
197         catch (Exception e) {
198           host="Unknown (" + e + ")";
199         }
200         return host;
201       }
202    
203       /**
204        * Returns string representing operating system name,
205        * version and architecture.
206        *
207        * @return String representing the operating system information the JVM is
208        * running under.
209        */
210       private static String getOSInfo() {
211        return System.getProperty("os.name") + " " +
212               System.getProperty("os.version") + " " +
213               System.getProperty("os.arch");
214       }
215    
216       /**
217        * Return string representing the architecture of the JVM we are running
218        * under.
219        *
220        * @return A string representing the architecture of the JVM we are running
221        * under or "unknown" if the architecture cannot be determined.
222        */
223       private static String getArch() {
224         String sunOsArchDataModel = System.getProperty("sun.arch.data.model");
225         if (sunOsArchDataModel != null) {
226           if (! sunOsArchDataModel.toLowerCase().equals("unknown")) {
227             return (sunOsArchDataModel + "-bit");
228           }
229         }
230         return "unknown";
231       }
232    
233       /**
234        * Write runtime information to error log.
235        */
236       public static void logInfo() {
237        logError(NOTE_JVM_INFO.get(System.getProperty("java.runtime.version"),
238                                   System.getProperty("java.vendor"),
239                                   getArch(),Runtime.getRuntime().maxMemory()));
240        Long physicalMemorySize = getPhysicalMemorySize();
241        if (physicalMemorySize != -1)
242        {
243          logError(NOTE_JVM_HOST.get(getHostName(), getOSInfo(),
244              physicalMemorySize, Runtime.getRuntime().availableProcessors()));
245        }
246        else
247        {
248          logError(NOTE_JVM_HOST_WITH_UNKNOWN_PHYSICAL_MEM.get(getHostName(),
249              getOSInfo(), Runtime.getRuntime().availableProcessors()));
250        }
251        logError(NOTE_JVM_ARGS.get(getInputArguments()));
252       }
253     }