mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

dugan
04.38.2008 ac1efc47fda406988f0705a7e615d972d11cdf11
Issue 2650: import-ldif command should give information about JRE version and settings


Change the server startup and import-ldif startup message to display runtime information.

See issue for details.
2 files added
6 files modified
477 ■■■■ changed files
opends/build.xml 5 ●●●● patch | view | raw | blame | history
opends/src/messages/messages/core.properties 23 ●●●● patch | view | raw | blame | history
opends/src/messages/messages/jeb.properties 4 ●●●● patch | view | raw | blame | history
opends/src/messages/messages/runtime_information.properties 73 ●●●●● patch | view | raw | blame | history
opends/src/messages/src/org/opends/messages/Category.java 8 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/backends/jeb/ImportJob.java 9 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/core/DirectoryServer.java 132 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/util/RuntimeInformation.java 223 ●●●●● patch | view | raw | blame | history
opends/build.xml
@@ -22,7 +22,7 @@
 ! CDDL HEADER END
 !
 !
 !      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 !      Portions Copyright 2006-2008 Sun Microsystems, Inc.
 ! -->
<project name="Directory Server" basedir="." default="package">
@@ -250,6 +250,9 @@
    <genmsg sourceProps="${msg.prop.dir}/version.properties"
            destJava="${msg.javagen.dir}/org/opends/messages/VersionMessages.java">
    </genmsg>
    <genmsg sourceProps="${msg.prop.dir}/runtime_information.properties"
            destJava="${msg.javagen.dir}/org/opends/messages/RuntimeMessages.java">
    </genmsg>
  </target>
opends/src/messages/messages/core.properties
@@ -190,7 +190,7 @@
 configuration bootstrapping process
INFO_DIRECTORY_BOOTSTRAPPED_133=The Directory Server has completed the \
 configuration bootstrapping process
NOTICE_DIRECTORY_SERVER_STARTING_134=%s starting up
NOTICE_DIRECTORY_SERVER_STARTING_134=%s (build %s, R%d) starting up
NOTICE_DIRECTORY_SERVER_STARTED_135=The Directory Server has started \
 successfully
INFO_ERROR_CATEGORY_EXTENSIONS_137=extensions
@@ -1739,7 +1739,7 @@
 symmetric key attribute value that can be decoded by this instance
SEVERE_ERR_CRYPTOMGR_IMPORT_KEY_ENTRY_FIELD_MISMATCH_688=CryptoManager \
 detected a field mismatch between the key entry to be imported and an entry \
 in the key cache that share the key identifier "%s"
 in the key cache that share the key identifier "%s"
SEVERE_ERR_CRYPTOMGR_IMPORT_KEY_ENTRY_FAILED_OTHER_689=CryptoManager failed \
 to import the symmetric key entry "%s":  %s
SEVERE_ERR_CRYPTOMGR_IMPORT_KEY_ENTRY_FAILED_TO_ADD_KEY_690=CryptoManager \
@@ -1764,4 +1764,21 @@
MILD_ERR_ADD_ENTRY_UNKNOWN_SUFFIX_697=The provided entry %s cannot be added \
 because its suffix is not defined as one of the suffixes within the \
 Directory Server
#Messages for start-ds -F option, the alignment matters
NOTICE_VERSION_698=%s
NOTICE_MAJOR_VERSION_699=Major Version:           %d
NOTICE_MINOR_VERSION_700=Minor Version:           %d
NOTICE_POINT_VERSION_701=Point Version:           %d
NOTICE_VERSION_QUALIFIER_702=Version Qualifier:       %s
NOTICE_BUILD_NUMBER_703=Build Number:                 %s
NOTICE_REVISION_NUMBER_704=Revision Number:         %d
NOTICE_FIX_IDS_705=Fix IDs:                           %s
NOTICE_DEBUG_BUILD_706=Debug Build:             %b
NOTICE_BUILD_OS_707=Build OS:                %s
NOTICE_BUILD_USER_708=Build User:              %s
NOTICE_UPGRADE_EVENTS_709=Upgrade Event IDs:       %s
NOTICE_BUILD_JAVA_VERSION_710=Build Java Version:      %s
NOTICE_BUILD_JAVA_VENDOR_711=Build Java Vendor:       %s
NOTICE_BUILD_JVM_VERSION_712=Build JVM Version:       %s
NOTICE_BUILD_JVM_VENDOR_713=Build JVM Vendor:        %s
NOTICE_BUILD_ID_714=Buld ID:                 %s
opends/src/messages/messages/jeb.properties
@@ -178,7 +178,7 @@
 seconds (average rate %.1f/sec)
INFO_JEB_EXPORT_PROGRESS_REPORT_88=Exported %d records and skipped %d (recent \
 rate %.1f/sec)
INFO_JEB_IMPORT_THREAD_COUNT_89=Starting import (using %d threads)
INFO_JEB_IMPORT_THREAD_COUNT_89=Import Thread Count: %d threads
INFO_JEB_IMPORT_BUFFER_SIZE_90=Buffer size per thread = %,d
INFO_JEB_IMPORT_LDIF_PROCESSING_TIME_91=LDIF processing took %d seconds
INFO_JEB_IMPORT_INDEX_PROCESSING_TIME_92=Index processing took %d seconds
@@ -337,4 +337,4 @@
  will not take effect until the backend is restarted. The DB files from the \
  previous directory %s must be moved to the new directory %s after shutting \
  down the backend to retain the existing data
INFO_JEB_IMPORT_STARTING_173=%s starting import (build %s, R%d)
opends/src/messages/messages/runtime_information.properties
New file
@@ -0,0 +1,73 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License, Version 1.0 only
# (the "License").  You may not use this file except in compliance
# with the License.
#
# You can obtain a copy of the license at
# trunk/opends/resource/legal-notices/OpenDS.LICENSE
# or https://OpenDS.dev.java.net/OpenDS.LICENSE.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at
# trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
# add the following below this CDDL HEADER, with the fields enclosed
# by brackets "[]" replaced with your own identifying information:
#      Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#      Portions Copyright 2006-2008 Sun Microsystems, Inc.
#
# Global directives
#
global.category=RUNTIME_INFORMATION
#
# Format string definitions
#
# Keys must be formatted as follows:
#
# [SEVERITY]_[DESCRIPTION]_[ORDINAL]
#
# where:
#
# SEVERITY is one of:
# [INFO, MILD_WARN, SEVERE_WARN, MILD_ERR, SEVERE_ERR, FATAL_ERR, DEBUG, NOTICE]
#
# DESCRIPTION is an upper case string providing a hint as to the context of
# the message in upper case with the underscore ('_') character serving as
# word separator
#
# ORDINAL is an integer unique among other ordinals in this file
#
#Messages for start-ds -s option, alignment matters.
NOTICE_JAVA_VERSION_1=JAVA Version:            %s
NOTICE_JAVA_VENDOR_2=JAVA Vendor:             %s
NOTICE_JVM_VERSION_3=JVM Version:             %s
NOTICE_JVM_VENDOR_4=JVM Vendor:              %s
NOTICE_JAVA_HOME_5=JAVA Home:               %s
NOTICE_JAVA_CLASSPATH_6=Class Path:              %s
NOTICE_JE_VERSION_7=JE Version:              %s
NOTICE_CURRENT_DIRECTORY_8=Current Directory:       %s
NOTICE_OPERATING_SYSTEM_9=Operating System:        %s
NOTICE_JVM_ARCH_10=JVM Architecture:        %s
NOTICE_SYSTEM_NAME_11=System Name:             %s
NOTICE_AVAILABLE_PROCESSORS_12=Available Processors:    %d
NOTICE_MAX_MEMORY_13=Max Available Memory:    %d
NOTICE_TOTAL_MEMORY_14=Currently Used Memory:   %d
NOTICE_FREE_MEMORY_15=Currently Free Memory:   %d
NOTICE_JVM_INPUT_ARGUMENTS_16=JVM Input Arguments:     %s
#Messages written to server.out
NOTICE_JVM_INFO_17=JVM Information: %s by %s, %s architecture, \
                                    %d bytes heap size
NOTICE_JVM_HOST_18=JVM Host: %s, running %s, %d bytes physical memory size, \
                   number of processors available %d
NOTICE_JVM_ARGS_19=JVM Arguments: %s
opends/src/messages/src/org/opends/messages/Category.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2007 Sun Microsystems, Inc.
 *      Portions Copyright 2007-2008 Sun Microsystems, Inc.
 */
package org.opends.messages;
@@ -151,6 +151,12 @@
  DSCONFIG(0x01200000),
  /**
   * The category used for messages associated with the runtime information.
   */
  RUNTIME_INFORMATION(0x01300000),
  /**
   * The category that will be used for messages associated with
   * third-party (including user-defined) modules.
   */
opends/src/server/org/opends/server/backends/jeb/ImportJob.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.backends.jeb;
import org.opends.messages.Message;
@@ -40,8 +40,10 @@
import org.opends.server.util.LDIFException;
import org.opends.server.util.LDIFReader;
import org.opends.server.util.StaticUtils;
import org.opends.server.util.RuntimeInformation;
import static org.opends.server.util.StaticUtils.getFileForPath;
import static org.opends.server.util.DynamicConstants.*;
import java.io.File;
import java.io.IOException;
import java.util.*;
@@ -60,6 +62,7 @@
import org.opends.server.admin.std.server.LocalDBBackendCfg;
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.config.ConfigException;
import org.opends.server.core.DirectoryServer;
/**
 * Import from LDIF to a JE backend.
@@ -200,9 +203,13 @@
      long bufferSize = config.getImportBufferSize() /
          (importThreadCount*rootContainer.getBaseDNs().size());
      message = INFO_JEB_IMPORT_STARTING.get(DirectoryServer.getVersionString(),
                                                     BUILD_ID, REVISION_NUMBER);
      logError(message);
      message = INFO_JEB_IMPORT_THREAD_COUNT.get(importThreadCount);
      logError(message);
      RuntimeInformation.logInfo();
      if (debugEnabled())
      {
opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -22,12 +22,10 @@
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.core;
import com.sleepycat.je.JEVersion;
import org.opends.server.admin.ClassLoaderProvider;
import org.opends.server.admin.server.ServerManagementContext;
import org.opends.server.admin.std.meta.GlobalCfgDefn.WorkflowConfigurationMode;
@@ -174,15 +172,10 @@
import org.opends.server.types.DirectoryEnvironmentConfig;
import org.opends.server.types.LockManager;
import static org.opends.server.util.DynamicConstants.*;
import org.opends.server.util.MultiOutputStream;
import static org.opends.server.util.ServerConstants.*;
import org.opends.server.util.SetupUtils;
import org.opends.server.util.StaticUtils;
import static org.opends.server.util.StaticUtils.*;
import org.opends.server.util.TimeThread;
import org.opends.server.util.Validator;
import static org.opends.server.util.Validator.ensureNotNull;
import org.opends.server.util.VersionCompatibilityIssue;
import org.opends.server.util.*;
import org.opends.server.util.args.ArgumentException;
import org.opends.server.util.args.ArgumentParser;
import org.opends.server.util.args.BooleanArgument;
@@ -1262,9 +1255,10 @@
      }
      logError(NOTE_DIRECTORY_SERVER_STARTING.get(getVersionString()));
      logError(NOTE_DIRECTORY_SERVER_STARTING.get(getVersionString(),
                                                  BUILD_ID, REVISION_NUMBER));
      RuntimeInformation.logInfo();
      // Acquire an exclusive lock for the Directory Server process.
      if (! serverLocked)
      {
@@ -9338,91 +9332,12 @@
    }
    else if (fullVersion.isPresent())
    {
      System.out.println(getVersionString());
      System.out.println("Build ID:            " + BUILD_ID);
      System.out.println("Major Version:       " + MAJOR_VERSION);
      System.out.println("Minor Version:       " + MINOR_VERSION);
      System.out.println("Point Version:       " + POINT_VERSION);
      System.out.println("Version Qualifier:   " + VERSION_QUALIFIER);
      if (BUILD_NUMBER > 0)
      {
        System.out.println("Build Number:        " +
                           new DecimalFormat("000").format(BUILD_NUMBER));
      }
      System.out.println("Revision Number:     " + REVISION_NUMBER);
      System.out.println("Fix IDs:             " + FIX_IDS);
      System.out.println("Debug Build:         " + DEBUG_BUILD);
      System.out.println("Build OS:            " + BUILD_OS);
      System.out.println("Build User:          " + BUILD_USER);
      System.out.println("Build Java Version:  " + BUILD_JAVA_VERSION);
      System.out.println("Build Java Vendor:   " + BUILD_JAVA_VENDOR);
      System.out.println("Build JVM Version:   " + BUILD_JVM_VERSION);
      System.out.println("Build JVM Vendor:    " + BUILD_JVM_VENDOR);
      System.out.println("Upgrade Event IDs:   " +
              StaticUtils.listToString(
                      VersionCompatibilityIssue.getAllEvents(), ","));
      printFullVersionInformation();
      return;
    }
    else if (systemInfo.isPresent())
    {
      System.out.println(getVersionString());
      System.out.println("Build ID:               " + BUILD_ID);
      System.out.println("Java Version:           " +
                         System.getProperty("java.version"));
      System.out.println("Java Vendor:            " +
                         System.getProperty("java.vendor"));
      System.out.println("JVM Version:            " +
                         System.getProperty("java.vm.version"));
      System.out.println("JVM Vendor:             " +
                         System.getProperty("java.vm.vendor"));
      System.out.println("Java Home:              " +
                         System.getProperty("java.home"));
      System.out.println("Class Path:             " +
                         System.getProperty("java.class.path"));
      System.out.println("JE Version:             " +
                         JEVersion.CURRENT_VERSION.toString());
      System.out.println("Current Directory:      " +
                         System.getProperty("user.dir"));
      System.out.println("Operating System:       " +
                         System.getProperty("os.name") + " " +
                         System.getProperty("os.version") + " " +
                         System.getProperty("os.arch"));
      String sunOsArchDataModel = System.getProperty("sun.arch.data.model");
      if (sunOsArchDataModel != null)
      {
        System.out.print  ("JVM Architecture:       " + sunOsArchDataModel);
        if (! sunOsArchDataModel.toLowerCase().equals("unknown"))
        {
          System.out.print("-bit");
        }
        System.out.println();
      }
      else
      {
        System.out.println("JVM Architecture:        unknown");
      }
      try
      {
        System.out.println("System Name:            " +
                           InetAddress.getLocalHost().getCanonicalHostName());
      }
      catch (Exception e)
      {
        System.out.println("System Name:             Unknown (" + e + ")");
      }
      Runtime runtime = Runtime.getRuntime();
      System.out.println("Available Processors:   " +
                         runtime.availableProcessors());
      System.out.println("Max Available Memory:   " + runtime.maxMemory());
      System.out.println("Currently Used Memory:  " + runtime.totalMemory());
      System.out.println("Currently Free Memory:  " + runtime.freeMemory());
      RuntimeInformation.printInfo();
      return;
    }
@@ -9907,5 +9822,38 @@
  {
    return directoryServer.workflowConfigurationMode;
  }
  /**
   * Print messages for start-ds "-F" option (full version information).
   */
  private static
  void printFullVersionInformation() {
    System.out.println(NOTE_VERSION.get(getVersionString()));
    System.out.println(NOTE_BUILD_ID.get(BUILD_ID));
    System.out.println(NOTE_MAJOR_VERSION.get(MAJOR_VERSION));
    System.out.println(NOTE_MINOR_VERSION.get(MINOR_VERSION));
    System.out.println(NOTE_POINT_VERSION.get(POINT_VERSION));
    System.out.println(NOTE_VERSION_QUALIFIER.get(VERSION_QUALIFIER));
    if (BUILD_NUMBER > 0)
    {
      System.out.println(NOTE_BUILD_NUMBER.get(
                     new DecimalFormat("000").format(BUILD_NUMBER)));
    }
    System.out.println(NOTE_REVISION_NUMBER.get(REVISION_NUMBER));
    System.out.println(NOTE_FIX_IDS.get(FIX_IDS));
    System.out.println(NOTE_DEBUG_BUILD.get(DEBUG_BUILD));
    System.out.println(NOTE_BUILD_OS.get(BUILD_OS));
    System.out.println(NOTE_BUILD_USER.get(BUILD_USER));
    System.out.println(NOTE_BUILD_JAVA_VERSION.get(BUILD_JAVA_VERSION));
    System.out.println(NOTE_BUILD_JAVA_VENDOR.get(BUILD_JAVA_VENDOR));
    System.out.println(NOTE_BUILD_JVM_VERSION.get(BUILD_JVM_VERSION));
    System.out.println(NOTE_BUILD_JVM_VENDOR.get(BUILD_JVM_VENDOR));
    System.out.println(NOTE_UPGRADE_EVENTS.get(StaticUtils.listToString(
                      VersionCompatibilityIssue.getAllEvents(), ",")));
  }
}
opends/src/server/org/opends/server/util/RuntimeInformation.java
New file
@@ -0,0 +1,223 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 * add the following below this CDDL HEADER, with the fields enclosed
 * by brackets "[]" replaced with your own identifying information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2008 Sun Microsystems, Inc.
 */
 package org.opends.server.util;
 import static org.opends.server.loggers.ErrorLogger.logError;
 import static org.opends.messages.RuntimeMessages.*;
 import static org.opends.messages.CoreMessages.*;
 import static org.opends.server.util.DynamicConstants.*;
 import org.opends.server.core.DirectoryServer;
 import java.net.InetAddress;
 import java.lang.management.RuntimeMXBean;
 import java.lang.management.ManagementFactory;
 import java.util.List;
 import com.sleepycat.je.JEVersion;
 /**
  * This class is used to gather and display information from the runtime
  * environment.
  */
 public class RuntimeInformation {
   private static boolean is64Bit=false;
   static {
     String arch = System.getProperty("sun.arch.data.model");
     if (arch != null) {
       try {
         is64Bit = Integer.parseInt(arch) == 64;
       } catch (NumberFormatException ex) {
         //Default to 32 bit.
       }
     }
   }
   /**
    * Returns whether the architecture of the JVM we are running under is 64-bit
    * or not.
    *
    * @return <CODE>true</CODE> if the JVM architecture we running under is
    * 64-bit and <CODE>false</CODE> otherwise.
    */
   public static boolean is64Bit() {
     return is64Bit;
   }
   /**
    * Returns a string representing the JVM input arguments as determined by the
    * MX runtime bean. The individual arguments are separated by commas.
    *
    * @return  A string representation of the JVM input arguments.
    */
   private static String getInputArguments() {
     int count=0;
     RuntimeMXBean rtBean = ManagementFactory.getRuntimeMXBean();
     StringBuilder argList = new StringBuilder();
     List<String> jvmArguments = rtBean.getInputArguments();
     if ((jvmArguments != null) && (! jvmArguments.isEmpty())) {
       for (String jvmArg : jvmArguments) {
         if (argList.length() > 0)  {
           argList.append(" ");
         }
         argList.append("\"");
         argList.append(jvmArg);
         argList.append("\"");
         count++;
         if (count < jvmArguments.size())  {
           argList.append(",");
         }
       }
     }
     return argList.toString();
   }
   /**
    * Writes runtime information to a print stream.
    */
   public static void printInfo() {
     System.out.println(NOTE_VERSION.get(DirectoryServer.getVersionString()));
     System.out.println(NOTE_BUILD_ID.get(BUILD_ID));
     System.out.println(
             NOTE_JAVA_VERSION.get(System.getProperty("java.version")));
     System.out.println(
             NOTE_JAVA_VENDOR.get(System.getProperty("java.vendor")));
     System.out.println(
             NOTE_JVM_VERSION.get(System.getProperty("java.vm.version")));
     System.out.println(
             NOTE_JVM_VENDOR.get(System.getProperty("java.vm.vendor")));
     System.out.println(
             NOTE_JAVA_HOME.get(System.getProperty("java.home")));
     System.out.println(
             NOTE_JAVA_CLASSPATH.get(System.getProperty("java.class.path")));
     System.out.println(
             NOTE_JE_VERSION.get(JEVersion.CURRENT_VERSION.toString()));
     System.out.println(
             NOTE_CURRENT_DIRECTORY.get(System.getProperty("user.dir")));
     System.out.println(
             NOTE_OPERATING_SYSTEM.get(System.getProperty("os.name") + " " +
                     System.getProperty("os.version") + " " +
                     System.getProperty("os.arch")));
     String sunOsArchDataModel = System.getProperty("sun.arch.data.model");
     if (sunOsArchDataModel != null) {
       if (! sunOsArchDataModel.toLowerCase().equals("unknown")) {
         System.out.println(NOTE_JVM_ARCH.get(sunOsArchDataModel + "-bit"));
       }
     }
     else{
       System.out.println(NOTE_JVM_ARCH.get("unknown"));
     }
     try {
       System.out.println(NOTE_SYSTEM_NAME.get(InetAddress.getLocalHost().
               getCanonicalHostName()));
     }
     catch (Exception e) {
       System.out.println(NOTE_SYSTEM_NAME.get("Unknown (" + e + ")"));
     }
     System.out.println(NOTE_AVAILABLE_PROCESSORS.get(Runtime.getRuntime().
             availableProcessors()));
     System.out.println(NOTE_MAX_MEMORY.get(Runtime.getRuntime().maxMemory()));
     System.out.println(
             NOTE_TOTAL_MEMORY.get(Runtime.getRuntime().totalMemory()));
     System.out.println(
             NOTE_FREE_MEMORY.get(Runtime.getRuntime().freeMemory()));
   }
   /**
    * Returns the physical memory size, in bytes, of the hardware we are
    * running on.
    *
    * @return Bytes of physical memory of the hardware we are running on.
    */
   private static long getPhysicalMemorySize() {
     com.sun.management.OperatingSystemMXBean mxbean =
             (com.sun.management.OperatingSystemMXBean)
             ManagementFactory.getOperatingSystemMXBean();
     return mxbean.getTotalPhysicalMemorySize();
   }
   /**
    * Returns a string representing the fully qualified domain name.
    *
    * @return A string representing the fully qualified domain name or the
    * string "unknown" if an exception was thrown.
    */
   private static String getHostName() {
     String host;
     try {
       host=InetAddress.getLocalHost().getCanonicalHostName();
     }
     catch (Exception e) {
       host="Unknown (" + e + ")";
     }
     return host;
   }
   /**
    * Returns string representing operating system name,
    * version and architecture.
    *
    * @return String representing the operating system information the JVM is
    * running under.
    */
   private static String getOSInfo() {
    return System.getProperty("os.name") + " " +
           System.getProperty("os.version") + " " +
           System.getProperty("os.arch");
   }
   /**
    * Return string representing the architecture of the JVM we are running
    * under.
    *
    * @return A string representing the architecture of the JVM we are running
    * under or "unknown" if the architecture cannot be determined.
    */
   private static String getArch() {
     String sunOsArchDataModel = System.getProperty("sun.arch.data.model");
     if (sunOsArchDataModel != null) {
       if (! sunOsArchDataModel.toLowerCase().equals("unknown")) {
         return (sunOsArchDataModel + "-bit");
       }
     }
     return "unknown";
   }
   /**
    * Write runtime information to error log.
    */
   public static void logInfo() {
    logError(NOTE_JVM_INFO.get(System.getProperty("java.vm.version"),
                               System.getProperty("java.vm.vendor"),
                               getArch(),Runtime.getRuntime().maxMemory()));
    logError(NOTE_JVM_HOST.get(getHostName(),getOSInfo(),
                               getPhysicalMemorySize(),
                               Runtime.getRuntime().availableProcessors()));
    logError(NOTE_JVM_ARGS.get(getInputArguments()));
   }
 }