Java Service Wrapper Revision History. -------------------------------------- 3.5.30 * Improve the logging messages when using the IANA timezones introduced in version 3.5.29 and add a new property, wrapper.timezone.debug_timestamps, to display additional information (offset to GMT and whether DST is in effect) in the timestamps of the log outputs. * Improve the behavior when the Wrapper fails to parse the timezone file or fails to resolve daylight saving time. Any error on startup will cause the Wrapper to fall back to system time. If an error would occur during a time change, the Wrapper will continue with the current time. * Add new properties wrapper.ntservice.preshutdown and wrapper.ntservice.preshutdown.timeout to allow Windows services with a long shutdown time to stop cleanly before the system starts its shutdown process. The first property specifies that the service will accept PRESHUTDOWN notifications. The second property tells the service control manager how long to wait until the service stops. These properties are not supported on Windows Itanium or Windows XP and lower. * Fix a memory leak on Fedora 21 and lower. This issue was fixed for RHEL, CentOS and Amazon Linux AMI on version 3.5.28, but was still happening on Fedora when rolling the log file in size mode. * Fix a bug where, under certain conditions, a white square appeared briefly on the screen just before the splashscreen was drawn (wrapperw). * Change name of the architecture for Linux PPC. Since 3.5.29 the Wrapper is available on Linux PPC little-endian and big-endian. To avoid confusion 'linux ppc' is now 'linux ppcbe' and 'linux ppc64le' becomes 'linux ppcle'. * In the script file, add the variable FILES_TO_SOURCE which should contain a list of files to source prior to executing any commands. * Add two tokens, 'W' and 'J', to the logging format to display the Wrapper process id and the Java process id. * Fix a bug where the Wrapper stopped to log messages coming from the Java application, or one of its child process, when it encountered a null character (\0). It also resulted in a memory leak if the Java application was logging messages at a frequency higher than the value specified with wrapper.log.lf_delay.threshold. * Fix a wrong implementation of the property 'wrapper.log.lf_delay.threshold'. The amount of time specified by this property was counted from the last log output received instead of the last line feed received. * If the Wrapper is unable to write to the configured wrapper.logfile, it would fall back to a default log file in the working directory. If this would also fail, the log file will be disabled and logging will only continue in the console, syslog or EventLog. From 3.5.30, the Wrapper will resume logging into the configured file as soon as it is available again. If the log file had been disabled and the configured log file would still be locked, then it will try to resume the logging in the default log file. * Fix a bug where a RESTART or a PAUSE action specified with wrapper.on_exit. (or wrapper.on_exit.default) would abort a SHUTDOWN triggered by an event, a filter, a timer, a deadlock, a ping timeout or failures of mounted shares. * Improve the logging messages when the action 'KILL_RESTART' is specified for the 'wrapper.event..command.block.action' property. Depending on the event, RESTART is not always applicable, but the Wrapper always notified that a new JVM was going to be launched. Now it will clearly inform when the restart is not applicable. * Improve the output when querying the status of a service on Unix. It will show whether the service is installed or not, and which system is used if there are several possibilities for the current OS (init.d, systemd, etc.). * Fix a bug where the daemon was not reloaded when the Wrapper was installed using systemd and a custom service file. * When installing a daemon with systemd or upstart, the Wrapper will now check for a previous install like it does for the other init systems. This implies that the service should first be removed to force reinstallation. * Add the ability to log the properties each time the Wrapper loads or reloads the configuration file. A new wrapper.properties.dump.loglevel property was created to control at which level they will be logged. * fixed a bug happening when launching multiple instances of the shell script in a short time interval. If one instance was starting the Wrapper while another attempted to stop it, the PID file of the new Wrapper process might eventually be deleted. Running without a PID file could cause some issues and would leave open the possibility for a second instance of the Wrapper to run simultaneously even though wrapper.pidfile.strict would be set to TRUE. 3.5.29 * Fix two problems when wrapper.lang.folder was passed in the command line to the JVM. The path was limited to 78 characters and was not put in quotes on Windows. * Add new supported platform: Linux PPC64LE 64-bit. Built on a RedHat 7.1 LE machine, GNU libc 2.17. * Fix a bug happening on startup where timers set with an interval less than wrapper.timer.max_catchup were executed several times. * Add a dynamic variable 'WRAPPER_SYSMEM_

' where

is a percentage of the physical memory available on the system. This variable can be used in the wrapper.java.additional. properties to set the values of JVM options like -Xmn, -XX:PermSize or -XX:MaxMetaspaceSize. * Fix a bug on AIX where the properties wrapper.java.maxmemory.percent and wrapper.java.initmemory.percent did not work because the Wrapper failed to get the physical memory size of the system. * Fix script (AIX only) to allow users to start and stop the Wrapper without using SRC and fix syntax error in a message when validating the size of APP_NAME. * Add the possibility to specify a timezone of the IANA tz database in which the Wrapper will be executed. Although the old timezone abbreviations are still available for backward compatibility, usage of the new IANA identifiers is preferred because it solves several issues, especially regarding daylight saving time. By default, summer/winter time changes are automatic and will update timers, mail settings and time-stamps of all log outputs. * Fix script for MacOSX where users could only start the daemon if it was installed. Now it is not necessary to install it. Introduced in 3.5.28. * Improve a workaround to a bug in a libc function on AIX which causes memory errors when messages containing Japanese characters are logged. There might still be some errors if the Java application logs very long messages through the Wrapper, but in this case a special configuration is possible as a workaround. * Fix a bug on FreeBSD 10.x where the libiconv library could not be loaded. This caused the Wrapper to stop at startup. * Fix a scaling issue on the GUI of the Demo application. The main window was too small on high-DPI displays. 3.5.28 * Fix a memory leak on Red Hat Enterprise Linux, CentOS and Amazon Linux AMI. It occured when activating log rolling in size mode. This memory leak came from an issue in the GNU C Library (glibc) which was fixed on version 2.21. However, a workaround was added so that the Wrapper can run without issues on any version of glibc. * Fix an issue on z/OS that if the path to the Wrapper binaries was longer than 79 characters, the script could not execute the 'start' and 'stop' commands properly. It reported a stale PID file when starting the daemonized process and later failed to stop it because it could not find that PID file. * Fix the console flicker bug that was still happening when launching wrapperw.exe from a Windows shortcut. * Add the possibility to configure Processor affinity for AIX, FreeBSD, HP-UX and Solaris. For HP-UX and Solaris it is only possible to bind one CPU per process. * Fix a problem where boolean configuration properties were not assigned their default values if a wrong value was set. The Wrapper always resolved unknown values to FALSE even though the default value should be TRUE. * Add a new event 'WrapperSecondInvocationEvent' that can be consumed in the Java Application on Windows. This event will be fired whenever a second instance of the Wrapper tries to start when single invocation mode has been specified. This enables you to execute custom tasks like showing a message or bringing a window of your application to the front. * With single invocation mode, it is now possible to specify that the Wrapper will focus the foreground window of the running Java Application instead of launching it a second time. If no window can be found, the focus will be set to the Wrapper monitoring the application. This can be used in combination with the event handling to activate any window that was brought to the front. * Fix bug on Linux where RUN_AS_USER was ignored when running the Wrapper as a service controlled by systemd. The service was always running as root. * Fix bug on AIX where running the Wrapper as a service would not use the System Resource Controller (SRC) and ignore RUN_AS_USER value. Thanks to Miroslaw for pointing this out and for his contributions to the shell script. * Add a new bit flag (0x8000) to indicate that an error occurred when querying the status of a Windows service. If the query is silent (-qs option), wrapperw.exe will no longer display error messages in the dialogbox, but these errors will still be logged in the log file. * Add new system property to WrapperStartStopApp (integration method #2) to handle passthrough parameters. These parameters can be passed to the start and/or stop method of your Java application. By default the passthrough parameters are ignored (see the javadocs of the WrapperStartStopApp class for details). * On Windows, the Wrapper will now check that the code page of the console supports the specified language. If it doesn't, it will fall back to English. * Add two new values for the wrapper.lang property: 'DESKTOP' and 'SYSTEM'. These values are used on Windows and ignored on other systems. The first, which is the default, specifies that the language of the Wrapper will be resolved according to the UI language. The second will cause it to use the system language. Before, the Wrapper used the language of the Region Format settings. * Fix a bug where messages in Japanese coming from the JVM were badly encoded. This occurred on Windows when the language for non-unicode programs was not set to Japanese. * Improve the error message if there are any problems initializing the backend pipe or socket. * Add 'installstart' command to the UNIX shell script in order to install and then automatically start the Wrapper as a daemon process. * On AIX and HPUX Itanium, the Wrapper will no longer have the GNU version of libiconv as a dependency. This dependency was introduced in version 3.5.26 for AIX and 3.5.27 for HPUX itanium, but caused some compatibility issues. * Add a new '--teardown' option (and TeardownApp.bat.in) to the Windows version which can be used to reverse changes done with the '--setup' option. Administrative credentials will be requested. As of version 3.5.28, this will only unregister the application/service from the event log system. * Add a new property, wrapper.syslog.ident.enable, which tells the Wrapper to create or delete an identification (also known as source) for the event log. Starting with Windows Vista or Windows Server 2003, this action requires administrative credentials. When running on a lower permission, the Wrapper will ignore this property and start normally. * Fix a bug where actions specified by wrapper.ping.timeout.action were only performed the first time the JVM became hung. All subsequent hangs were ignored. With the default configuration, this would mean the Wrapper could only restart a hung JVM once. Since 3.5.16. * The Wrapper is now signed with a SHA-2 certificate. SHA-2 provides stronger security than the previously used SHA-1 algorithm. The decision to change the certificate was made in compliance with Microsoft's SHA-1 deprecation plan which states that Windows 7 and higher will no longer support SHA-1 after January 1st, 2016. It should be noted that Windows XP SP2 and lower, as well as Windows Server 2003, don't support SHA-2 and the new certificate will not apply on these platforms. The binaries provided for Windows Itanium will also no longer be signed. * Fix memory errors happening on AIX when the system uses some localizations like Japanese. 3.5.27 * Fix a misleading error message when there is a problem processing a system error message on Windows. * Handle system exit codes with descriptions (Windows only). * Add new configuration file directives (#properties.on_overwrite.loglevel and #properties.on_overwrite.exit) to better control how the Wrapper should behave when detecting duplicate property definitions. * Fix: No longer tries to resume a Windows service that is already running, or pause a service that is already paused. * Improve accuracy of status messages when installing, removing, starting, stopping, resuming and pausing a Windows service. * Improve the display of the available HostIds when calling 'wrapper -h'. * Fix the console flicker bug. Happened when wrapper.ntservice.generate_console was set to TRUE, which is required for thread dumping. * Fix a problem on Windows with the consoleless version of the Wrapper. If a splash screen was set at launch time, and if the Wrapper eventually failed to start normally, the splash screen did not disappear and remained on the top of the log window. * Fix a problem on Windows platforms that caused the log window to overlap all the other forms even when the focus was set on an other application. * Add the ability to define CPU affinity for the Wrapper and JVM processes (Windows and Linux systems, professional edition). * The wrapper can now be executed with a '--setup' option in order to install components under elevated mode on Windows. During the installation, the wrapper will register the application to the Windows Event Log system. After the Wrapper is executed with the '--setup' option, the Event Viewer will no longer report that the installation was corrupted. * wrapper.exe and wrapper.dll are now manifested for compatibility with newer versions of Windows (8.1 and above). * Modify the Community Edition license to allow the Wrapper to be integrated and distributed with Products released under either the GPL version 2 or GPL version 3 licenses. * Include the PID of the Wrapper and Java processes in debug output. * Fix a problem where the wrapper.jvm.port.min and wrapper.jvm.port.max properties were being ignored. This meant that the defaults were always being used. Since 3.5.26. * Fix a very infrequent issue in which the Wrapper would produce an out of memory error or fail when trying to get the path to the Wrapper on Windows XP. * Modify the wrapper.pausable and wrapper.pausable.stop_jvm properties so they are no longer reloaded when wrapper.restart.reload_configuration=TRUE. * Fix a bug when the child process printing the JVM version became a zombie after completion (problem known on CentOS). Add property wrapper.java.version.timeout to let the user set a timeout for the child process to print the JVM version before being terminated. * Avoid 4227 events in the Windows LogBook when using SOCKET values for the wrapper.backend.type property. We now try to check the port status in native code prior to opening it in Java. The Wrapper worked correctly, but a Windows issue was causing warnings in the EventLog if the port had an existing socket in the TIME_WAIT state from a previous JVM invocation. * Fix a problem on AIX with OpenJRE where the Wrapper failed to load the native library. The native library now has a '.so' extension like on other UNIX platforms. * Fix a problem on HP-UX when listing HostIds. If several HostIds were available on the machine, the Wrapper could only get the first one and reported DLPI errors when attempting to get the others. * Fix path to remove files when uninstalling the Wrapper daemon process on HPUX. * Added Linux Itanium binaries in the "Delta Pack". It was removed since version 3.5.18. * Fix an encoding conversion error when sending email on HP-UX. * On MacOSX, set the launchd KeepAlive key to "false" by default as recommended by Apple. However, it is possible to set it to "true" by editing the new MACOSX_KEEP_RUNNING variable in the script file. 3.5.26 * Improve the log messages when a JVM restart is requested when the Wrapper is in a state that it will be ignored. * (Standard, Professional) Add an additional debug message when a deadlock sweep completes. No functional change but this was added to make it easy to tell how long the sweep takes on a given application. * Clean up the internal tracking of where environment variables were set. No functional changes. * When detecting Cygwin with 'uname -o' in the script file, some OS's (Solaris, MacOS, etc.) show an error message because '-o' is not a valid parameter. Now we hide this error message to avoid confusion and we can guess that Cygwin is not running. * Add the ability to control the service with systemd using the script file. * On Mac OS X, fix a typo, add another alternative way to find Java to set the JAVA_HOME environment variable, and use the full path to execute sysctl in case it's not in the path. Thanks to Dannes Wessels for pointing this out. * Fix a problem on newer versions of Windows when customizing the Wrapper. The certificate was not removed when creating the target. This was leading to an error when trying to sign the target with a new certificate. * Add missing support in the shell script for restarting/stopping the Wrapper service with launchctl on Mac OS X. * Add missing support in the shell script for restarting/stopping the Wrapper service with Upstart. * Add the ability to set the path of the 'su' command as well as the ability to specify additional arguments in the Wrapper shell script using new SU_BIN and SU_OPTS variables. * Fix a problem in the WrapperSimpleApp, WrapperStartStopApp, and WrapperJarApp helper classes where command line problems that resulted in the JVM exiting on startup looked like unexpected exits. This meant that the Wrapper would try to relaunch the JVM again rather than giving up on the first attempt. * Modified the WrapperSimpleApp, WrapperStartStopApp, and WrapperJarApp helper classes so that their usage banners will only now be shown for command line related problems. Issues with the specified classes, methods, or jar files are still logged as errors, but showing the user the usage in these cases was confusing. * Correct the WrapperResources.getString() method that has no replacement arguments so that its processing of the raw string is handled the same as methods which have replacement arguments. Now all strings are processed by the MessageFormat class before being returned. Previous versions were not consistent about the need to escape single quotes. * Added optional key validation to make sure that strings passed in to the WrapperResources.getString() method are formatted correctly. See the WrapperResources class for information how to enable. * Clean up escaping of single quotes in a few messages. * Add new options for property wrapper.backend.type: AUTO, SOCKET, SOCKET_IPv4, SOCKET_IPv6, PIPE. When set to AUTO, the Wrapper will try to open a socket ipv4 and fallback to ipv6 and to pipe in case of error. * Fix bug when converting from multibyte to wide char without setting the locale at startup (Unix only). Thanks to Bert. * Add a 'CLOSE_BACKEND' alias to 'CLOSE_SOCKET' as a test command for the wrapper.commandfile property. This is because there have been multiple options for the backend connection for some time and the name is more portable. * Fix a problem on Mac when running OS X Yosemite where the script was failing to correctly compare versions '10.10' to '10.5.0'. This was leading to the script thinking that only 32-bit binaries could be run. This was only an issue if the delta pack naming of the wrapper binaries was being used. * Add a new wrapper.java.classpath.missing.loglevel property which makes it possible to control how the Wrapper logs warnings about missing classpath elements. Previously this was always logged as debug output and could not be disabled. * If there are any low level problems launching the Java process that are not related to configuration or the JVM itself, the Wrapper will no longer try again as such retries were meaningless. * Windows system APIs have a problem that cause a process to crash if it attempts to set an environment variable over 32767 characters in length. The Wrapper now checks for this and logs an error rather than setting the variable. This was a problem if very large classpaths were used when the wrapper.java.classpath.use_environment property was TRUE. * Windows does not allow a command line to be longer than 32766 characters in length. Different versions of Windows handle it differently when such a long command is provided. The Wrapper now does its own check and shows an error in a consistent way. * Improve the error message on UNIX platforms when the command line is longer than the system maximum. This maximum varies greatly by platform and environment and is difficult to calculate reliably, so the maximum length is not currently shown in the message. * Fix a problem on UNIX platforms where a very large configuration file could cause the WrapperManager to fail to startup. This was caused by the partial transfer of the configuration file to the WrapperManager via the backend connection. This would happen regardless of the backend type used. The size of the configuration file that would cause a problem varied greatly based on the specific system. * Fix a problem on Windows platforms where a very large configuration file would fail to be sent to the WrapperManager on startup when the wrapper.backend.type property was set to PIPE. The only problem was that the WrapperManager.getProperties() method would be empty. * (Professional) Add checks to the WrapperManager.exec() methods on Windows for the maximum command line length of 32766, and maximum environment variable name-value pair length of 32767. * (Professional) Fix a problem where a free of a NULL pointer was being done as part of the cleanup process of a WrapperManager.exec() call. This is not known to have caused any issues. * Added getStdOut(), getStdErr(), and getStdIn() methods to the WrapperProcess class as aliases to the getInputStream(), getErrorStream(), and getOutputStream() methods to help avoid confusion. * Fix a problem on Windows 7 where long log lines got corrupted after 31397 characters when wrapper.console.direct was true. This seems to be a problem with the underlying Windows API and was only a display issue. Reduced the maximum number of characters that can be written with a single API call to 30000 to work around the issue. This change is internal and there is still no limit on the length of logged lines. * Fix a deadlock if the Wrapper failed to write to the backend when the wrapper.backend.type property was PIPE. Found by code review and is not known to have actually happened. * From Mac OSX 10.5.0, the script file will use the key 'KeepAlive' in the launchctl configuration file. Prior versions of Mac OSX will continue to use the same key 'OnDemand'. Thanks to Robin for pointing this out. * (Standard, Professional) Disallow the use of hostids tied to Apple Bluetooth devices when running on a virtualized Windows system hosted on an OS X system. * Fix a problem where WrapperManager.log() was not working correctly when multi-byte messages were logged. * In the debug output the full configuration properties packet is suppressed from the log output because it is huge and can contain sensitive data. Add a size to the abbreviated output to assist with debugging. * Fix a memory leak on UNIX platforms whenever an error message was reported. This was only a problem if the message was logged repeatedly. * Correct a couple other potential memory leaks found through code review. Not known to have been causing any actual problems. 3.5.25 * (Professional) Improve the wrapper.timer..interval property so it is now possible to specify ranges and lists of values as well as offsets for interval values to more precisely control when timers are fired. * (Professional) Fix a problem with the wrapper.timer..interval property where timers would not fire during an interval the system time was set back. Also fixed a problem where timers would stop firing permanently if the system time was set forward by more than the value of the wrapper.timer.max_catchup property and a timer had been scheduled to be fired during that interval. Both of these issues were most likely during daylight savings time. * Fix a problem where signals received by the JVM were not being logged in debug output correctly if the wrapper.ignore_signals property is set to true. We now also log debug output even if a user event listener consumes the signal event. * Fix a problem on Gentoo Linux where the shell script was not correctly detecting the system architecture. This may also be a problem on other distributions whose 'uname -p' returns a detailed architecture. * In the shell script, when the flag to use systemd (USE_SYSTEMD) is set, the shell script generates a ".service" file in /etc/systemd/system/ when installing the Wrapper as a daemon. * In the shell script, add a function to validate the size of APP_NAME when installing or removing the daemon on AIX. * It was possible to disable the logging of the Java command line even when debug output was enabled by setting the wrapper.java.command.loglevel property to NONE. This made it difficult to debug problems and is no longer possible. * When the wrapper.java.version.output property is set to true, add debug log output to show the actual command line used. * Fix a problem on Windows when the wrapper.java.version.output property is true where it was possible that java executable being run to get the version could be different than that used to run the application if the java executable was being located on the default system PATH as well as the PATH defined in the environment. The Wrapper now looks once and uses the same fully resolved path in both places. For clarity, both java command lines are now included in debug log output when the version is requested. (Bug #288) * Change the timing of the logging of the Java command line on UNIX so it is consistent with Windows. * Improve the error message text thrown when a native feature is not available from Java to be more clear about whether the problem is that the native library could not be loaded versus the wrong edition being used. * On Windows, detect when the Wrapper is running under Cygwin and set the default value for wrapper.console.flush to TRUE. On other platforms, the script will display a message and stop running. * (Professional) Add support for WRAPPER_EVENT_TIME_* and WRAPPER_EVENT_RAND_* variable references so event times can be used when events are fired. * Fix a buffer overflow problem on AIX which caused crashes or deadlocks on startup for some users. This had been an issue since 3.5.0 but only reported recently. * Remove output debug messages on UNIX when the wrapper.port.address property was set. * Clean up code when converting multibyte characters to wide characters. Some error checks were not implemented correctly. Found during a code review and is not known to have actually caused any problems. 3.5.24 * Fix a problem where the message source of remote syslog messages from the JVM were being logged as "jvm %d" rather than "jvm 1". * Add a new wrapper.syslog.split_messages property which controls whether or not multi-line messages will be logged as is or first split into individual lines. * Fix a problem on Windows Vista and above where the wrapper.single_invocation property was not correctly identifying Wrapper instances running in different sessions under some circumstances. 3.5.23 * Clean up the error messages logged when the Wrapper failed to elevate itself on Windows platforms. They are now more informative. * (Professional) Fix a handle leak on Windows in WrapperProcess.isAlive(). * (Professional) Modify the exception thrown when WrapperManager.exec is called while the Wrapper is shutdown so it now says that rather than saying that the native library is not loaded. * (Processional) The Wrapper is now more careful to make sure that the backend is never closed while a child process is being launched to ensure that the Wrapper knows about all child processes launched. * (Professional) Add a warning message in case the Wrapper is not notified of a launched child process due to the backend connection being closed. * (Professional) Fix a potential NPE that could be thrown while reading stdout or stderr output from a child process while the Wrapper was shutting down and after the child process exited. * (Professional) Fix a problem on UNIX platforms where we were getting stuck trying to cleanup after a process which was currently blocking on a read from stdout or stderr. * (Professional) Fix a problem on UNIX platforms where a timeout attempting to obtain an internal lock of the child process list was causing an internal counter to get out of sync, leading to a other terminated child processes being left as defunct zombies until the Java process terminated. * (Professional) Fix a problem on UNIX platforms where pipe file descriptions used to communicate with child processes were being incorrectly passed to all child processes. They were not growing over time. * (Professional) Fix a potential synchronization problem calling WrapperProcess.waitFor() or WrapperProcess.exitValue(). * Add additional debug log output showing the various timeout values to help with debugging user issues. * Fix a problem where the shell script was not correctly detecting the OS version with Mac OSX Maverick. * Add warnings about undefined environment variables in include file references in the configuration file. * Add support for environment variable expansion in files specified with the wrapper.java.additional_file and wrapper.app.parameter_file properties. * Correct the integer formatting in the WrapperUNIXGroup.toString() method so it is consistent with the rest of the Wrapper. * Fix a problem where the iconv library requirement couldn't be satisfied in FreeBSD 10. We now locate the library dynamically by looking for /usr/local/lib/libiconv.so, /usr/local/lib/libbiconv.so, or /lib/libkiconv.so.4 in that order. * Fix a the WrapperPrintStream.println method so strings containing linefeeds will correctly have each line prepended with the configured header. * (Standard, Professional) When an unknown license type is encountered, include the unknown type in the error message to help with debugging. * (Standard, Professional) Fix a problem on FreeBSD systems where the wrapper.lang.encoding was not resolving to UTF-8 correctly when the LANG environment variable was not set. * (Professional) Fix a memory corruption problem on z/OS when the language was set to a double byte locale like Japanese. * Go through and make the Wrapper much more durable when badly encoded double byte characters are encountered. 3.5.22 * (Standard, Professional) Fix a crash in native code behind WrapperResources instances which could happen if the system was very low on memory. Since version 3.5.7. * (Professional) Fix a couple slow memory leaks in the native code involved with launching and checking on the status of child processes. * (Professional) Fix a problem where an attempt to throw a WrapperJNIError within native code on Z/OS would result in a ClassNotFoundException being thrown. * Reviewed the native JNI code and fixed a few potential crashes and memory leaks which could occur under low memory conditions. * Modify the way the wrapper.console.direct property works so the Wrapper will now always downgrade itself to using piped console writing as soon as it has determined that a physical console does not exist. In 3.5.21 we tried to predict when the console would not exist and disabling it in advance. There were cases where this was not correct, resulting in error messages in the console output. * Fix a problem where operations like installing a service on Windows 7 and above which need to be elevated were resulting in an error that the Wrapper could not write to the console. The actual operation was working correctly but the console output was incorrect. Since 3.5.21. * Move the check that the jar and wrapper versions match earlier in the startup process so we guarantee that a warning will always be displayed. There were some errors which could abort the startup process before this warning was logged. * (Standard, Professional) Fix a problem where the value of wrapper.lang.folder was not being recognized if a wrapper.lang value was not set. * (Standard, Professional) Fix a small memory leak resolving the language to run the Wrapper with. * (Professional) Fix a potential buffer overflow reading data from a child process stderr or stdout if the amount of data available in the pipe is larger than the buffer length passed in to WrapperProcessInputStream. read(byte b[], int off, int len). * (Professional) Fix a problem where reads from a WrapperProcessInputStream were consuming too much CPU while blocking for data on Windows. Now correctly being done asynchronously. * (Professional) Fix a problem where JVM cleanup, including cleanup of child processes, was not always being done completely if the user requested an immediate shutdown by pressing CTRL-C twice. 3.5.21 * Add a new 'R' log format which will track the number of milliseconds since the previous JVM log output. Useful for simple performance checks. See the wrapper.console.format, wrapper.event.default.email.maillog.format, wrapper.logdialog.format, and wrapper.logfile.format properties. * When the ACCESS_VIOLATION testing command of the wrapper.commandfile was used to kill the Wrapper some log output was not making it into the wrapper.log file. Add a forced flush just before crashing the Wrapper to make sure everything makes it into the log file. * Add a new wrapper.javaio.buffer_size property which makes it possible to control the size of the internal buffer used to process console output from the JVM. Also increased the default from the system default to 65536 bytes. * Renamed the wrapper.use_javaio_thread property to wrapper.javaio.use_thread. The old property still exists as a deprecated alias. * Added a new wrapper.console.direct property on Windows which tells the Wrapper to use Windows APIs to render log output to the console rather than writing to stdout and stderr. This results in a major speed improvement. The drawback is that this removes the ability to pipe the output to another program on the command line. We chose to enable this by default so the majority of users can take advantage of the speed improvement. If your application takes advantage of piping on Windows, you will need to disable this property to regain the old behavior. * Add a new "wrapperm" logging source on Windows to help differentiate which log entries are coming from Wrapper invocations used to control the Wrapper as a service such as starting, stopping, installing, etc. Previously the log entries from the Wrapper service process and launching process both used a "wrapper" logging source, which could be confusing. * On UNIX, modify the way we keep track of whether the process is daemonized or not. This was done to clean up a bit, but should not effect how the Wrapper works. * On Windows, change the timing of when PID files are created when running as a service so any failures creating them will correctly be reported as a service error. If the Wrapper was unable to write to a PID file because it was read-only then the user was presented with a confusing message about the service timing out on startup. This was in addition to the correct error being logged. * Fix a potential problem where internally queued log entries could fail to be logged on shutdown. The log queue is now always processed as part of the shutdown process. * Modify UNIX shell script to remove all existing run level rc files for the application on both install and remove, rather than only the ones for the currently configured run level to avoid unexpected behavior due to old rc files being left around. This only affects platforms which make use of rc files. * Add a new RUN_LEVEL variable to the UNIX shell script to make it easy to configure the run levels when installing as a daemon on various platforms. * Add new wrapper.logfile.close.timeout and wrapper.logfile.flush.timeout properties, and deprecate the wrapper.logfile.inactivity.timeout property, to increase control over when and how the logfile is flushed and closed. * Add a new PIDFILE_CHECK_PID setting in the UNIX shell script which makes it possible to control whether or not the script double checks that the pid in an existing pidfile is actually the pid of the application's Wrapper. This property makes it possible to disable this check so multiple applications can be tied to the same pid file. * Go through and make sure that none of the Wrapper native JNI methods are called after the WrapperManager shutdown has completed. Doing so was causing a JVM crash on some Linux JVMs. This was happening when a WrapperResources instance was finalized by the garbage collector on shutdown. * (Professional) Fix a problem where processes created by calling the WrapperManager.exec functions could fail to be registered with the Wrapper for cleanup if the call was made as the JVM was shutting down. This was resolved by making sure that JNI calls can not be called after the WrapperManager shutdown has completed. * Modify the internal WrapperManager tick thread so it is allowed to complete once the WrapperManager has fully shutdown. This was the only remaining reference to the WrapperManager class. * Add a new wrapper.property_warning.loglevel property which controls the log level at which the Wrapper will log warnings about undefined but referenced environment variables, as well as invalid boolean or integer values. * Update the way environment variable references within property values are parsed to make it possible to report those which are not defined. Each pair of '%'s is now expected to be part of a variable reference. For example "%AAA%BBB%CCC%", previously if "AAA" was not defined, "BBB" would be located, but now only "AAA" and "CCC" will be recognized as variables. * Fix a problem on Windows where a non-existent wrapper.working.dir directory was causing multiple error messages in the log file. * Modify the way the wrapper.environment.dump property works so it will now log at the INFO level with the rest of Wrapper output when set to true. When false however, the output will be logged as DEBUG output if enabled. Previous versions always logged the output to the INFO log level in either case. * Fix a problem on Linux IA64 where the WrapperActionServer was throwing an IOException when the JVM was shutdown by calling System.exit. It did not cause any problems other than the message in the log. * (Professional) Added new "jvm_ping_timeout", "jvm_ping_slow", and "jvm_ping_response_slow" events to help respond to ping related issues. * Fix a problem where a value of 0 for wrapper.ping.alert.threshold was not correctly disabling ping threshold alerts. * (Professional) Fix a problem where the thread that handles events would permanently get stuck if the event queue filled up. This was very unlikely but not impossible if a large number of filter events were triggered in a very short time. Corrected the problem so it now recovers correctly, but also increased the queue size to make the overflow even more unlikely. * (Standard, Professional) Fix a problem where console output of a wrapperw.exe processes launched when the wrapper.ntservice.console property was TRUE was not being shown correctly. This issue was introduced in 3.5.19. 3.5.20 * Further improvements to the memory footprint of the Wrapper to minimize the memory required when logging JVM output consisting of very long lines. * Fix a minor potential buffer overflow, which could occur if the path of the first classpath element is larger than 1024 characters. This overflow was detected during a code review and we have no reports that it actually ever caused any problems. * Improve the error message displayed when the Wrapper's configuration file could not be loaded so that it now includes the name of the file. * Work around a libc system library bug on some HPUX platforms in which calls to vswprintf can cause a crash if the expanded string does not fit into the buffer. Worked around the problem with the help of HP support by making sure the buffer length followed a rule so that its length was 1+N where N is a multiple of 8. * Fix a problem on HPUX platforms where the JVM would sometimes get stuck on shutdown, when the shutdown was initiated within the JVM, leading to the Wrapper having to forcibly kill it. This was caused by the Wrapper attempting to close the backend socket when another read was blocking attempting to read from the same socket. This was introduced in version 3.5.8. * Fix a potential log corruption when queued log messages were larger than the internal buffer size. Found during a code review and is not known to have actually caused any problems. * Fix a typo in the shell script which was breaking the 'install' command on Solaris platforms. * Fix a potential crash on HPUX platforms if the value of the wrapper.port.address property had an encoding problem. 3.5.19 * Fix a problem in the batch file, where a space in the path to the Wrapper.exe file would cause the script to locate the Wrapper.exe file. Introduced in 3.5.18. * When running as Windows service with hiding the console of the Wrapper will cause the Wrapper to disable unnecessary logging to the console in order to enhance performance. 3.5.18 * Fix a problem, where an unclosed percentage character '%' was opening the chance of a dangling pointer in the additional java parameters. The '%' character is a special character, specifying an environment variable. * Added variable _WRAPPER_DIR the batch files to make it possible to specify any other directory where the Wrapper binary file is located. Until now the batch file and exe file had to be in the same location. Thanks and credits go to Geoff. * Added property wrapper.port.address, which makes it possible to specify a different address to bind the socket to when using the socket backend connection between the Wrapper and the JVM. Until now, the socket was always bound to the localhost loopback interface. * The script will from now on also use the update-rc.d tool for installing an application as daemon on Debian. Thanks and credits go to Haifeng. * Whenever the Wrapper is causing the JVM to be forcibly terminated, the Wrapper will make sure the JVM has actually been terminated. If it wasn't after wrapper.jvm_terminate.timeout seconds, a pending restart will be canceled and the Wrapper exit. * Reworked the way the Wrapper is processing output from the JVM, in order to increase performance on huge output on a single line and also reduce memory usage. 3.5.17 * Add a new wrapper.java.additional.default.stripquotes property to make it possible to specify the default value of wrapper.java.additional..stripquotes * Fix a bug where the timer failed to calculate the fire time when that time was more than one week in the future. This was possible for weekly timers which spanned a daylight savings time change which rolled the time back by an hour in the fall. * Fix problem in the shell script, where it might fail to remove an installed daemon after the location of the script has been changed. * Add additional advice messages when a Windows service fails to be started due to file access problems involving the Wrapper binary, configuration, or log files. * Fix a problem where the dynamic library on MacOSX was not able to load it's functions. * Added wrapper.app.parameter_file property, which works similar to the wrapper.java.additional_file property * Reduce CPU-consumption of WrapperProcess.waitFor() function 3.5.16 * (Standard, Professional) Retry failed share mappings if the target host or network is unreachable as that may be a temporary problem. * (Professional) There was a problem where the IO-redirection of a child process which got created with the WrapperManager.exec API and used the feature to run the child process in the logged on users desktop was only allowing to create a process once per second. * Include information about the base configuration file in the debug output when debugging of cascading configuration files has been enabled. * Add a check in the UNIX script to output a more descriptive error message, when the user specified in the RUN_AS_USER variable doesn't exist. * (Standard, Professional) Fix a problem where console log output was not being displayed correctly when running with the WrapperW.exe binary with the wrapper.ntservice.console property was set to true. * (Standard, Professional) Implement the wrapper.ntservice.generate_console property when using the WrapperW.exe binary so it is now possible to disable the creation of the hidden console. * Modify the way the the wrapper.ntservice.generate_console property works so it is now easier to disable the generation of the console using just this property. * Improve the message logged when the the Wrapper attempts to perform a thread dump without a valid console being available. * Add new wrapper.ping.alert.threshold and wrapper.ping.alert.loglevel properties which make it much easier to debug ping timeout issues by asking the Wrapper to log messages about ping responses which were shorter than the registered wrapper.ping.timeout, but longer than the threshold. * Add a new WrapperManager.appearSlow method which makes it easier to test how the Wrapper behaves when the JVM is being slow to respond to commands. * Add a new wrapper.disable_tests property which can be used to disable all of the testing methods of the WrapperManager class. It has always been possible to control their access with a SecurityManager, but this is simpler for most applications. * Update the default wrapper configuration file template so a restart due to a matched OutOfMemoryError filter will no longer be triggered by default if the user enables -verbose:class output. * Fix a problem on UNIX platforms where the Wrapper would fail to start if it was located on the system PATH. This had been a problem since version 3.3.0 but had gone unnoticed as the Wrapper is not usually referenced in this way. * Rework the internal flags governing the generation and hiding of the backend console on Windows so we are able to almost always obtain the console's window handle. * Cleanup some startup code to reduce duplication and make sure that more debug and warning messages are logged after the "Wrapper Started" message. * Add new wrapper.java.additional_file and wrapper.java.additional_file.stripquotes properties to make it possible to specify JVM parameters in a file. * Add support for Linux on ARM systems. * Re-Enabled the forced reloading of the SYSTEM (and if set to a specific account, the user) registry before launching the Wrapper as a service on Windows XP and 2003. This has been originally disabled for Windows XP and 2003 since version 3.5.5. * (Standard, Professional) Fix a problem where the instance class names logged when a deadlock involving ReentrantLock instances were corrupted. The actual deadlock detection was working correctly, but this could have lead to other problems caused by the corruption. A workaround was to set the wrapper.check.deadlock.output property to SIMPLE. * (Standard, Professional) Make it possible to completely disable the details of a deadlock by setting the wrapper.check.deadlock.output property to NONE. * (Standard, Professional) Object Ids in thread dump reports were not correctly being logged as 64-bit ids on 64-bit JVMs in some cases. * Fix a problem where the source code values returned by the WrapperServiceActionEvent.getSourceCode() method were incorrect. The constant values were incorrect and have been corrected from this release. * Add new WrapperServiceActionEvent.getSourceCodeName() and WrapperServiceActionEvent.getSourceCodeName(int actionSourceCode) methods which returns a localized name of the source where the event originated. * Fix a minor problem where a couple uncommon backend packet codes were not being correctly identified by name in the debug log output. Functionally they were all working correctly. * Added property wrapper.ping.timeout.action, which will let you specify an action in case the timeout triggers. So far the only action was to restart the JVM. * Fix a problem where a JVM process was not stopped completely on a UNIX platform and stayed defunct after a forced kill until the Wrapper process itself stopped. This was especially noticeable if the JVM is frozen and the JVM is being killed forcibly. * Add additional debug log output showing the various timeout values to help with debugging user issues. 3.5.15 * Add a new _WRAPPER_CONF_OVERRIDE setting to the Wrapper dedicated command batch files on Windows so it is now possible to control whether or not the first parameter is the configuration file name. The ability to specify an alternate configuration file is now disabled by default as it was confusing for users who tried to pass other parameters to the JVM. * Correct a couple log messages in the WrapperManager class which were missing the correct prefix identifying where they originated. * Remove some old reflection code needed for Java 1.2.x support as we have required Java 1.4 since version 3.4.0. * Remove some code to try to reconnect the backend socket from Java. It has never been possible to do so without restarting the JVM, and the related messages were confusing. * Add a new wrapper.disable_forced_shutdown property to make it possible to disable the feature to forcibly kill the JVM on shutdown if CTRL-C was pressed twice. * Reduce the number of times thread priorities are changed within the WrapperManager class to simplify the startup and shutdown process. * Fixed a dangling pointer problem, which could cause undefined behaviour whenever a property contained an unset environment variable. * Fix a race condition in the timer thread, which could cause a sigkill being propagated through the whole process group rather than the timer thread. This can only happen during the shutdown of the Wrapper. * When a child process, which got launched by WrapperManager.exec() failed to start due to a runtime-error (such as missing privileges), the forked heap persisted and the child process never finished until shutdown/restart of the JVM. The error only appears on Unix platforms when using the FORK_EXEC start-type. * Change log level and message if a certificate check returned a problem, which is not directly caused by the signature of the Wrapper, but the signature chain. * Fix a problem when the silent query command wasn't returning the correct exit code on windows Vista (and later) when the command was run from an unelevated console. Thanks to Darren for pointing this out. * The java system property wrapper.backend.so_timeout was ignored if it was set to 0, making it not possible to explicitly set the timeout to be indefinitely. * Added the properties wrapper.jvm.additional.auto_bits. to individually turn on/off the feature for the supported platforms. * Fix a problem where the script was trying to use the 64-bit binaries on Mac OSX even if the CPU was only a 32-bit architecture. This only affected versions of Mac OSX greater 10.5.0, the vast majority of those machines are already 64-bit CPU's. * The Wrapper when reloading the configuration file, was trying to access data from the call stack of a function which was actually outside of the memory range of the stack. This access violation might yield a segmentation fault. This issue was introduced in 3.5.5. Thanks to Lincoln for helping finding this problem. 3.5.14 * Fix a problem in the AppCommand.bat.in file where a parenthesis in the file name of the Wrapper binary would have caused a "PATH was unexpected at this time" error. * (Standard, Professional) Fix a problem when using a localized version of the Wrapper on Windows 64-bit platforms where the Wrapper would continue to use the default system language even wrapper.lang was used to specify a different language. Introduced in 3.5.12. * Fix a problem in the Windows AppCommand.bat.in command based batch file where the 'status' command was incorrectly being reported as 'query' in the usage output. The 'status' command had always worked correctly if used. * Fix a problem on UNIX platforms where some asynchronous messages were causing a warning message "Coding Error..." to be logged in place of the intended message. This could be seen if the configured log file did not have write permissions. Other than the incorrect log message, the Wrapper worked correctly. Introduced in 3.5.2. * Fix a problem in the UNIX script where running with Upstart wasn't working correctly when RUN_AS_USER was set. * Relax security checks when running the 'status' command against the UNIX shell script so it now allows any user running the script to perform the read-only check of the pid file. * Fix a problem with the UNIX script where the 'remove' command was trying to stop a running application even when the application had not been installed. * Fix a buffer overflow which could potentially cause a crash during the installation of a Windows Service when wrapper.ntservice.account was specified. This was introduced in 3.5.12. * Fix a heap corruption which could occur on startup and potentially cause a crash. Only Windows systems, which use the System Event logs, were affected. Discovered from a code review, there had never been any reports of this causing problems for users. This could happen if the configured wrapper.log could not be written to as the Wrapper always tries to write to the Event Log in such cases. Introduced in 3.5.12. * Add a new version comparison between the UNIX shell script and Wrapper to start showing a warning in case of a version mismatch. The check will only work if the shell script and Wrapper are each of at least version 3.5.14. * Added a new wrapper.pidfile.strict property which will tell the Wrapper not to start if the pid file already existed. Defaults to false for backwards compatibility. * Make the Java side of the backend socket more resilient in case of a read or write timeout. The backend socket does not have a timeout set by default so this should not have been an issue. A couple users reported problems on specific systems however which led to this fix. * To aid in the testing of the backend socket timeout, a new wrapper.backend.so_timeout system property was added to make it possible to configure the backend socket to use a timeout. See the Javadocs of the WrapperManager class for details. 3.5.13 * Fix a typo in the script where the environment variable 'TR_BIN' should actually be 'TREXE'. This was causing the "install" command on UNIX platforms to fail. Introduced in 3.5.12. * Fix a heap corruption which could lead to a crash that would occur the second time an internal buffer used for logging was expanded. The buffer would be expanded the first time a log line over 2048 characters in length was encountered. Then the second expansion would happen when a line at least 1024 characters longer was encountered. Introduced in 3.5.11. Bug ID #3423108 3.5.12 * Put more descriptive Text in case the Wrapper is using integration method 4, but the jar file deos not specify the Main-Class correctly in its meta information. * Fix a bug when failing to grant the LogOnAsService permission to a domain user. * Fix a bug where the ident for the syslog on Unix platforms was broken since 3.5.0. This was because when opening the syslog, the Wrapper was freeing the memory for pointing to ident. However the string pointer ident will be retained internally by the Syslog routines. And must not free the memory that ident points to. Bug #3404978. * Add a check on the script to make sure the 'tr' command exists on Unix platforms. * Improve the parsing of log formats so that format tokens are recocognized even if they are lower case. This affects the wrapper.console.format, wrapper.event.default.email.maillog.format, wrapper.logdialog.format, and wrapper.logfile.format properties. * The Wrapper parses log formats by looking for known tokens, any invalid tokens are simply ignored. If the entire format is made up of invalid tokens then this resulted in the Wrapper logging an empty line, which was not very useful and caused confusion when encountered. The Wrapper now reverts to the default log format in such cases. This affects the wrapper.console.format, wrapper.event.default.email.maillog.format, wrapper.logdialog.format, and wrapper.logfile.format properties. * Improve the debug output while loading native libraries to avoid confusion about the meaning of the warning logged about attempts to load alternately named native library files. * Fix a problem on Unix platforms where the default umask was being set to 0000 rather than inheriting it from the parent process when running as a daemon process. This can be a security problem as log and other files have global read/write access. Introduced in 3.5.8. Can be worked around by setting the wrapper.umask property to a safe value. 3.5.11 * Fix a potential crash on Windows caused by a buffer overflow. This has been a problem since version 3.5.0 and affects configurations which define more than one wrapper.ntservice.dependency.. Depending on what was in memory, this did not always result in a crash. It has very reproducible behavior for a given configuration file. * Fix a problem on Windows where the Wrapper was taking 15 seconds or longer to startup on some systems because the WinVerifyTrust system call was having problems updating the CRL. This had been a problem since the Wrapper binaries started being signed in version 3.5.7. If the WinVerifyTrust call takes longer than the configured wrapper.startup_thread.timeout then the Wrapper will continue to startup without further delay. * (Standard, Professional) Explicitly remove the certificate of the customized binary during customization. There were problems resigning the binary with another certificate otherwise. * If the Wrapper is unable to write to the configured wrapper.logfile for any reason then we always fall back to a default log file and then log a message about the failure. If the default also fails then that is also logged but the messages would only be logged to the console in most cases. Modify the Wrapper so we now always send both messages to the syslog or EventLog regardless of what the wrapper.syslog.loglevel is set to. This is important to help track down the cause of logfile access problems. * Starting with version 3.5.0, it was internally possible to print out multi-line log messages so that all of the lines would always be grouped together in the log file. This version modifies the logging code slightly so that such multi-line log output is now logged as a single message in the UNIX sylog or Windows EventLog. * Fix a problem where very long lines of output from the JVM would cause the Wrapper to appear to hang for a while. The first time a single line of output containing several hundred thousand characters was logged, an internal buffer was being incrementally increased by 100 characters per cycle. The Wrapper now increases the size based on last known size to greatly reduce the number of cycles needed to choose a new buffer size. * Modify the PAUSE_THREAD command so it is now possible to wait indefinitely. Only useful for testing the Wrapper. * Add a new PAUSE_LOGGER command to make it possible to pause the next log entry. Only useful for testing the Wrapper. * On UNIX, the stdout/stderr pipe between the JVM and Wrapper was not being cleaned up correctly. This resulted in a small leak but was otherwise harmless. The pipes are now cleaned up and initialized for each JVM instance. * Fix a problem where the Wrapper could fail to restart the JVM when the restart request originated in the JVM if the system was experiencing very heavy IO resulting in long disk IO queues. This was causing the Wrapper's main loop to block on the write and miss the restart request, causing the Wrapper to shutdown rather than restart. This could affect all platforms. On Windows, it could also be reproduced by making a selection in the console to freeze output and then making a request from within the JVM to restart. * Add a new WrapperPropertyUtil helper class to make it easer to access Wrapper property values from within the JVM. * Fix a bug on some platforms where java log output could get corrupted due to misuse of a strncpy system function. This function warns that some implementations do not support overlapping memory copies. The problem could only be reproduced on a single Linux test machine in lines following an empty line of output. This problem has existed since 3.4.0. 3.5.10 * Setting wrapper.jvm.port to '0' (zero) will make the JVM to assign an available port for the backend socket by itself. * Add warnings in the log file if an integer configuration property value contains a non-numerical value. Previously, the Wrapper would silently ignore the problem and use the value of 0 if the number started with an invalid character, it will now return the default value. If the property value started with valid numerical characters then those were, and still will be, used to generate a value, but the invalid characters will be trimmed. The later is being kept this way to avoid breaking old configurations. * Add warnings in the log file if a boolean configuration property has any value other than TRUE or FALSE. It will still return a value of FALSE for other values to avoid breaking old configurations. * Add a warning if an invalid value is specified for the wrapper.on_exit. property. * Add a new wrapper.log.lf_delay.threshold property which makes it possible to control how long a partial line of Java log output will be allowed to be buffered until it is completed with a line feed. If the threshold is exceeded then the partial line will be logged as a full line resulting in an extra line feed in the log output. All previous versions would do this within 1-2 ms. The default is now 500ms. * (Standard, Professional) Make it possible to customize the manufacturer through the customize options. * (Professional) Fix a problem where the Wrapper was sending a CTRL-BREAK rather than a CTRL-C signal to child processes launched with WrapperManager.exec when destroying them on Windows. For most child processes this was not a problem, but if the direct child process was a JVM then the CTRL-BREAK was triggering a thread dump rather than asking the JVM to exit. The Wrapper was then timing out and forcibly killing the JVM child process. * (Standard, Professional) Fixed a bug, where the timezone ICT when set by the wrapper.timezone property got misinterpreted as IST. * (Standard, Professional) Fixed a problem where the UTC offset value in the wrapper.timezone property was not being parsed correctly on UNIX platforms. This led to the Wrapper to using an offset UTC0000. * Take out the warning about unset LANG environment variable on Linux and AIX systems. On system startup, some systems fail to set the LANG environment variable. This is not really a problem for the Wrapper and the warning was causing confusion for users so we decided to remove it. 3.5.9 * (Standard, Professional) Fix a problem on Windows where network adapters whose names contained "PRO/1000" were being removed from the list of hostids displayed when "wrapper.exe -h" was run. This did not affect existing server license key files generated for hostIds reported by 3.5.7 or earlier, or development license keys. But it did cause the Wrapper to report that no valid hostIds could be found when the Wrapper was started without a license file. This was caused by some test code added in 3.5.8 that we failed to remove. * Fix a problem where the Wrapper was not correctly yielding control back to its main loop when very large amounts of continuous output was being logged from the JVM. Introduced in version 3.4.0. In versions prior to 3.5.8, this could have caused the JVM to timeout and restart itself. That particular issue was resolved but the Wrapper process in 3.5.8 would still have been unresponsive when this was happening. The Wrapper will now always yeild back to its main loop after 250 milliseconds of continuous logging. * Fix a problem where the WrapperManager could block trying write debug output if the current user application was writing very large amounts of output to the console as well. In extreme circumstances this led to the Wrapper thinking that the JVM was frozen. This was only an issue if debug output was enabled. * Restructured the shell script so all editions now use the same script again. 3.5.8 * (Standard, Professional) Starting with version 3.5.5, we invalidated the use of all 00ff* hostids on Windows to avoid problems with changing hostids when users have a Juniper Network Connect network adapter on their system. This turned out to be too restrictive as Guest OSs running under Parallels also make use of this hostid range. The Wrapper is now more careful to only invalidate actual Juniper Network Connect hostids. * (Standard, Professional) Improve the message shown to the user when the Wrapper is unable to locate any hostids for a system. * Fixed a problem with the wrapper script on Solaris, where the option -F was not available for grep. * Added Windows version information on the wrapper debug output. * Added a wrapper.log.warning.threshold property which makes the Wrapper show a warning whenever it detects that the Wrapper took a long time to record a log message. This was added to test a reported issue caused by slow IO on very heavily loaded systems. * Added a new 'G' log format to log the time in milliseconds of the previous log message. See documentation with the wrapper.log.warning.threshold property. Added to the wrapper.console.format, wrapper.logfile.format, and wrapper.logdialog.format properties. * Fix a problem where a filter that requested the JVM to restart would be ignored if the JVM exited on its own immediately. The Wrapper is now more consistent so that restart requests from within the JVM or filters will always take priority over such exit requests. External shutdown requests, or those from other actions will still behave as they did in the past and continue to shutdown the Wrapper. The Wrapper also logs messages in debug output if an outstanding restart request is being preserved or ignored. * Fixed a problem in the AppCommand.bat batch file which could occur on some Windows platforms with certain multi-byte system encodings. The script has been rewritten and questionable parts have been simplified. The functionality of the script has been preserved. * Added the environment variable WRAPPER_CONF_DIR, which can be used for the configuration properties. Feature Request #3160644. * Made the script exit with the right exit code received when running the script as different user, specified in RUN_AS_USER. Bug #3185281. * Fix an access violation which could happen when reporting that the code signing certificate has failed to been verified. * Log an error if the backend socket is forcibly closed externally. It had been getting logged at a debug log level. The message is "An existing connection was forcibly closed by the remote host. (0x2746)". Because the message was only logged if debug output was enabled, the JVM would be restarted with no clear explanation as to what happened. The source of the socket closure is under investigation. * (Professional) Added the Java call fireUserEvent to the WrapperManager API. This enables to fire user event mails, actions without the filter trigger. * Fix a warning on Mac versions if the configured java command was not a universal binary. A check was added in 3.4.0 to make sure that the wrapper.java.command pointed directly to an executable to avoid unexpected behavior when running a script. The message is only a warning and the Wrapper continues regardless. Standard ppc, ppc_64, x86_64, i386, as well as the universal binaries will now all work correctly without a warning. * The default value of the wrapper.*.umask properties is using the current umask the process has. Before the default value was always 0022. * Add a new wrapper.backend.type property that is used to control whether the Wrapper communicates with the JVM using the traditional "SOCKET" or new experimental "PIPE". This was added as a workaround to a rare problem where some Windows machines are closing the socket at an OS level. This was only ever seen on Windows 2003, but could exist on other Windows versions as well. * Add a new experimental wrapper.use_javaio_thread property which causes the Wrapper to handle all java console output in a dedicated thread. * Add a new WrapperManager.isNativeLibraryOk() method which lets user code easily test whether or not the native library was loaded and initialized on startup. * Add a new PAUSE_THREAD command to the wrapper.commandfile property which makes it possible to test how the Wrapper behaves when various threads block or freeze. This was used to simulate and reproduce issues on heavily IO bound servers. * Improve the way the Java side of the Wrapper behaves when the Wrapper fails to ping the JVM for an extended period of time. The JVM used to exit to let itself resync itself with the JVM. This was causing problems on systems which were heavily IO bound because the Wrapper could block for a while while trying to write to the log file and the JVM was exiting. The JVM will now never exit under such circumstances. The JVM will never become orphaned because it will still exit almost immediately if the backend socket or pipe with the Wrapper is ever closed. * Deprecate the WrapperManager.appearOrphan() method as it is used to simulate a failure mode which is no longer possible with the Wrapper. * Changed the way the Wrapper is handling certificate errors regarding the code signing/timestamping certificate. The Wrapper will now only shutdown itself if the signature of the binary was not successfully verified because the binary or signature has been malformed but not if any problem with the counter-signer has been found. Starting with 3.5.7, the Windows Wrapper binaries are signed. Some users with locked down Windows 2008 systems had problems with the Wrapper refusing to start because the Comodo certificate had been disabled on their system. * Add a new wrapper.java.detach_started property which makes it possible to use the Wrapper as a simple tool to launch Java applications. When enabled, the Wrapper terminates immediately and the JVM is left to run on its own. Also add new wrapper.java.outfile and wrapper.java.errfile properties which make it possible to redirect the stdout and stderr of the JVM to files when detached. * When running the Wrapper as a specified User Account, through the wrapper.ntservice.account property, the Wrapper will add permission for the account to log on as service automatically upon install. Feature Request #3286491. * Fixed a problem binding the backend socket on Windows. If another process bound a port inside the wrapper.port.min and wrapper.port.max range using the SO_EXCLUSIVEADDRUSE option, the Wrapper would stop at this port report an Access Permission problem and omits binding any further port in the range. This problem existed ever since the Wrapper was released. 3.5.7 * Changed the way the script is installing the daemon gets installed on an AIX system. The script now uses inittab & SRC. * Fix a problem in the shell script that was preventing the script from starting the Wrapper correctly if a file or directory existed in the current working directory which was one character in length. This was only a problem when the delta-pack naming of the Wrapper was used. This was easy to reproduce on AIX systems on system restart because a "u" directory exists in the root directory by default. This had been a problem since 3.4.0 when it was introduced as a fix to a Solaris problem. The root cause was a missing set of quotes in the tr command. * Fix a problem in the shell script that was preventing the script from finding the running wrapper process when it was started when the working directory was in the same directory as the wrapper binary, but queried later from another location. It would also fail if it was started from another location, but then queried from the location of the Wrapper. This was introduced in version 3.5.6 when the script stopped changing the working directory in the script. * Add a new GC action that will cause the JVM to immediately perform a full garbage collection sweep. See the wrapper.commandfile, wrapper.filter.action., wrapper.check.deadlock.action, and wrapper.timer..action properties for details. * (Professional) Modify the wrapper.event..command.block.action property slightly so it will now correctly warn if an unknown action is encountered. It had been defaulting to CONTINUE silently. * Modify the timing of the message shown when an #encoding directive is missing from the top of a configuration file. It was only being logged if debug output was enabled. It will now also be logged if the #include.debug directive is specified. * Fix the indentation of warning messages about encoding or include problems in configuration files. * (Standard, Professional) Fix a problem where include file problems could cause the shell script to have errors due to invalid translated output from the Wrapper. * Add a warning when the maximum include depth is reached and include debugging is enabled. The Wrapper had always just silently skipped the include. * Fix a problem where #include.required directive was not correctly preventing startup if the include file was missing but the required include was in a nested include. * Fix a problem where the cause of some fatal include problems were not being logged correctly, resulting in a simple, non-informative message only that the configuration file failed to be loaded. This was a problem since 3.5.5. * Fix a Windows problem where the Wrapper could fail to start as a service if a defined environment variable would expand to a length larger than the 32k limit specified in the ExpandEnvironmentStrings system function. This was a problem on all Windows platforms prior to version 3.5.5, but only on Windows 2000 since then, when the code used to reload the environment from the registry was disabled for newer versions of Windows. We now simply skip the expansion of the problem variable and continue with a warning. Bug #3103776. * Add a set of optional system properties that the WrapperSimpleApp, WrapperStartStopApp, and WrapperJarApp helper classes are aware of to tell them to ignore uncaught exceptions thrown within the main methods of the user application. The exceptions will still be logged, but they can now be configured so that the main method is just allowed to end without causing the Wrapper to shutdown in an error state. Java on its own will stay running in such a case as long as it has launched at least one non-daemon thread prior to the uncaught exception being thrown. This does not affect most users, but an application was found that was having problems because of this difference in behavior. See the javadocs of the helper classes for details. * (Professional) Fix a problem when looking for the correct exit code to use for the wrapper.event..command.on_exit. property. The Wrapper now searches for a value as follows: wrapper.event..command.on_exit., wrapper.event..command.on_exit.default, wrapper.event.default.command.on_exit., then wrapper.event.default.command.on_exit.default. The third pattern had been getting skipped in previous versions since it was added in version 3.3.0. * (Professional) Add logic to report a warning if an unexpected value is specified for the wrapper.event..command.on_exit. or wrapper.event..command.block.action properties. * (Professional) Clean up the message log levels so the output is as expected when using the wrapper.event..command.loglevel property. * (Professional) Improve the wrapper.event..command.on_exit. property so the configured action will now work even if the command exits after the block time out has expired. In previous versions, there was no way to make the Wrapper do anything other than continue. * (Professional) Fix a problem where the Wrapper was failing to detect a JVM exit correctly if an event command had been fired first. The only problem was that the Wrapper was always reporting a JVM exit code of 0 rather than the actual exit code. * Fix a buffer overflow on Windows when either installing as a service, or updating an existing service. The problem only occurred when properties containing spaces, or Java passthrough arguments containing spaces were specified on the command line. The running service did not have any problems. This was introduced in 3.5.0. * (Standard, Professional) Improve the error message logged when an unlicensed version of the Wrapper's native library is used. * (Standard, Professional) Fix a buffer overflow problem on Windows when creating a customized Wrapper binary if the target binary name did not include the ".exe" extension. This problem existed since its intruduction in version 3.3.7. * The wrapper.exe, wrapperw.exe and wrapper.dll binaries are now being signed on Windows making it possible to verify that valid Tanuki Software binaries are being used. * Implemented a way to install, remove, start, stop, etc., the Wrapper as a Windows service from a non-elevated (UAC) console. The Wrapper is elevated transparently using a child process. This is needed starting with Windows Vista and 2008 for smooth interaction with the Windows Service Manager. * (Standard, Professional) Fix a problem where the wrapperjni_*.mo localized files were not being loaded correctly. These messages are only shown when debug output is enabled. Application and Wrapper localization was working fine. Introduced in 3.5.5. * (Standard, Professional) Enhanced the ability to run with localizations other than the system language on Windows. The Wrapper process locale was not being set correctly. So Japanese text was not always showing correctly if the wrapper.lang property was set when the OS was English or German. The Java process still has an issue where it will always start with the system default value for the file.encoding system property. This can still cause problems writing Japanese text when the file.encoding is German for example. * Added support in the shell script for starting/installing the wrapper on system boot with Upstart. * Fix a problem in the shell script where it would fail to recognize a running Wrapper if the Wrapper command line or path contained a square bracket. * Modify the way we test for the existance of the temp directory so we now generate our own file name rather than using File.createTempFile. On some systems createTempFile was taking a long time because it requires that Java initialize its internal entropy. We discovered that large numbers of files in the java.tmpdir directory makes Java's entropy initialization code very slow. This has been a potential issue since 3.5.0. * Fixed a problem on Windows where passthrough arguments after a "--" which contained spaces were not being passed through to the JVM intact, they were being split at the spaces into multiple arguments. * Fix a problem on Windows where the Wrapper could sometimes crash on shutdown if more than one thread got into the cleanup code at the same time. This did not affect running applications and was only an issue on shutdown. It was more likely if a language pack was loaded. Introduced in 3.5.3. 3.5.6 * Fix a problem on UNIX platforms where the log file path was being calculated incorrectly if an absolute path was specified for wrapper.logfile, and the file did not already exist. A warning message was being displayed but the Wrapper would continue using the default log file. There was a problem in the message displayed which caused a crash on some platforms include Mac OSX. Introduced in version 3.5.5. * Fix a problem on Windows platforms where the Wrapper would crash if it could not access the directory of the configured wrapper.logfile. Introduced in version 3.5.5. Bug #3087424. * Improve the way warnings are logged when there are problems writing to the configured wrapper.logfile so that the message will now be logged into the log file that the Wrapper ends up using in case it is successful in falling back to a default log file. * Fix a problem on Windows platforms where wrapper.java.additional. properties that were specified on the command line, and contained spaces, were not being requoted correctly when building up the Java command line. Introduced in version 3.3.6. * Fix a problem where the warning message logged for invalid values of the wrapper.java.additional. property, contained corrupted text. Introduced in version 3.3.6. * Fix a problem on UNIX platforms where an invalid value for the wrapper.java.additional. property was correctly being reported and then skipped, but the resulting command line to launch the JVM had a blank value that was causing the JVM to fail to launch. An invalid value is any value that does not begin with a "-" character. * Add a new WRAPPER_INIT_DIR environment variable which can be used to reference the working directory from which the Wrapper was launched. This is needed for certain applications because the Wrapper always changes its working directory to the location of the Wrapper binary. * Modify the UNIX shell script so it no longer changes the current working dir to the location of the script. This is no longer needed because the Wrapper has been changing the working directory to its own location since version 3.2.0. * Add a new wrapper.request_thread_dump_on_failed_jvm_exit.delay property to control how long the Wrapper will wait after doing a thread dump before killing the Java process. This delay has always been hardcoded to 5 seconds. * Clean up the text of several warning messages about invalid configuration values to make them more consistent. * (Professional) Add a new wrapper.jvm_kill.delay property which makes it possible to control the amount of time to allow between the jvm_kill event being fired and the JVM actually being killed. Useful if an external event command is fired that needs to do something with the JVM process first. * (Professional) Fix a problem where the output of the wrapper.event..message and wrapper.event..loglevel properties were not displaying correctly on UNIX platforms. * (Professional) Fix a problem on UNIX platforms where the Java side of the Wrapper was not being correctly notified if a large number of child processes that had been launched with WrapperManager.exec, exited at the same instant. Some of them were going into a defunct state until the next child exited, at which point they would be cleaned up. This was mainly an issue on JVM shutdown if the user code was calling WrapperProcess.waitFor() as part of its shutdown process. WaitFor calls at any point were getting stuck and would remain so until another child exited. As part of this fix, there were also several changes to the Windows implementation to bring the two code bases into sync. * Fix a problem on Windows when multiple threads were creating Childobjects, Handles could have been unintendedly get inherited by another Child Process, causing problems on reading/writing to the Input/Output/Errorstream. * Fix a problem on solaris and AIX when errno calls were not thread safe due to a compiler switch. * Fix a problem where debug level warning output while loading the Wrapper configuration was being displayed on startup. This could be fixed because the Wrapper actually loads the configuration twice, and such output is now only logged on the second call. * (Standard, Professional) Remove the undocumented ability to define a single file share mapping without the index. This would cause confusion if used, and complicated the code. * (Standard, Professional) Fix a byte alignment problem caused by a bad compiler directive on Windows platforms. It was known to cause a crash when defining mapped drives on 64-bit Windows versions. The problem was in the source since version 3.3.7, but is not known to cause any other issues. * (Standard, Professional) Modify the messages displayed when network shares are mapped or fail for some reason. Also add messages about them being unmapped on shutdown. * On some Windows platforms, a failure to delete a rolled log file was not being reported correctly. The system function to delete a file was returning success even if it had failed. We now double check. * Fix a deadlock in the code that is used to send data to the Java process. It was only possible if debug level output was enabled and log file rolling was enabled. Introduced in 3.3.7. * Fix a problem where the Wrapper was not notifying the JVM whenever the log file was rolled and the new name was the same as the previous one, as it is when wrapper.logfile.rollmode is anything other than NONE or DATE. * Fix a problem where the WrapperManager.getWrapperLogFile() was not returning the accurate log file name until the first time the log file was rolled after each JVM invocation. This was only noticeable if the wrapper.logfile contained either the "ROLLNUM" or "YYYYMMDD" tokens. * Correct an error message that was displayed on UNIX platforms when the configured java binary could not be accessed. The message referenced a buffer whose contents were undefined on some platforms. * Fix a problem on z/OS where due a difference in the API used to lock a mutex compared to all other UNIX platforms, the mutex's locking and unlocking code were effectively being ignored. This means that multiple threads were able to access code which was not thread safe and could lead to a crash of the Wrapper. This is a problem that has been in the code since the first z/OS release and is not known to have actually caused any problems. Starting with 3.5.1, this was only an issue if debug output was enabled. Versions 3.3.9 through 3.5.0 could have also had problems whenever the Wrapper received a system signal. 3.5.5 * Add new wrapper.filter.trigger. action, "SUCCESS". If this gets triggered then the Wrapper will treat the current JVM invocation as a success, and reset its internal failed invocation counter. This is useful for applications that need to be restarted frequently. * (Standard, Professional) Ignore Juniper Network Connect hostIds as they change on each reboot and are thus unreliable as hostIds. * Added a PASS_THROUGH setting to the UNIX shell script and Windows AppCommand.bat.in files which tells them to pass any extra arguments directly on to the JVM when it is launched. * Added a FIXED_COMMAND setting to the UNIX shell script and Windows AppCommand.bat.in files to make it possible to run either without specifying a command. Mainly useful in conjunction with PASS_THROUGH. * (Standard, Professional) Added a --passthrough option to the exe customization, in order to tell the wrapper to precede the whole command line through to the application in the JVM. * (Standard, Professional) Added a --conf option to change the default conf file, the wrapper tries opening when no conf file was explicitly specified. * Added wrapper.ntservice.account.prompt. If set to TRUE the wrapper will prompt for all account details (domain, account name, password). * Fix a minor issue in #include file declarations where a leading space was not required. * Add a new #include.required directive which works the same as the #include directive except that it will output an error and prevent the loading of the configuration if the included file does not exist. Normally include files are optional by design. * Modify the error messages displayed when configuration files fail to load so they now provide more information about where specifically the problem was. * Disabled the forced reloading of the SYSTEM (and if set to a specific account, the user) registry before launching the Wrapper as a service on Windows. This was done originally in Windows NT because changes to the configured environment were not being reflected when running a service unless the system was first rebooted. Microsoft appears to have solved this problem in Windows XP and 2003. In Windows 7 and 2008, this was actually causing a problem because the SYSTEM registry contains a setting "USERNAME=SYSTEM" by default that was overwriting the USERNAME when run as specific user. It was decided to disable this registry loading for Windows versions starting with XP and 2003. Of the supported versions, only 2000 is now reloading its environment. The only difference from version 3.5.4 and earlier that could be found is that when running as the SYSTEM user on Windows 7 or 2008, the USERNAME environment variable will now be set to the host name followed by a dollar sign rather than SYSTEM. This is actually how all other services work. But just in case this is a problem, it can we resolved by adding a "set.USERNAME=SYSTEM" property into the Wrapper configuration file. Bug #3061490. * (Standard, Professional) Fix a problem for Solaris and HP-UX where the socket timeout properties for the email notifications were ignored. * (Standard, Professional) Added wrapper.ntservice.recovery. properties to define system level actions in the event that the Wrapper process itself has a failure. * (Standard, Professional) Fixed a problem in the WrapperProcess.waitFor() and WrapperProcess.exitValue() call, where it would fail to return when called after the Wrapper had initiated the shutdown of the JVM. * (Standard, Professional) Add WrapperProcessConfig.setSoftShutdownTimeout(int) method to tell the Wrapper how long to wait after nicely asking the child process to shutdown cleanly when calling WrapperProcess.destroy(). Once the timeout has ellapsed, the child process will be forcibly terminated. This timeout had been hard coded to 5 seconds in earlier versions. * Add more detailed usage output to the UNIX shell script. * Make it possible to 'pause' and 'resume' the JVM from the UNIX shell and Windows batch scripts. * (Professional) Fix a minor memory memory leak while initializing timers. * Fix a memory leak which could happen if there were any invalid strings in localization resources. * (Professional) Fix a bug where the wrapper.event..command.argv. properties were not correctly parsed on Windows. This issue was introduced in version 3.5.0. * (Professional) Add the ability to define wrapper.event.default.command.argv. properties that will be used if the event specific specific commands are not defined. Mainly useful for testing. * Fix a problem occuring when the wrapper failed to roll the log file causing to write to the wrapper's default log (wrapper.log) file rather than continuing to write to the current logfile. * (Standard, Professional) Fix a put problem in the internal hash map implemenation used for localization where values could be lost. This was not a visible issue because of the data used. * Add new wrapper.filter.allow_wildcards. property and make it possible to specify wrapper.filter.trigger. patterns which contain '*' and '?' wildcards. * Add a commented alternative in the default OutOfMemoryError filter configuration to make it more specific to only trigger on uncaught exception stack traces. This is to avoid output like that from the -XX:+PrintClassHistogram JVM argument from causing the JVM to restart with a false out of memory warning. See the wrapper.filter.trigger. OutOfMemoryError example for more details. * Localize the default filter message. * Added ISO-8859-* encoding support and a few other encodings. * (Standard, Professional) Fix a problem on UNIX versions, parsing dates in license keys that was introduced in version 3.5.0. Windows verisons did not have this problem. All license upgrade terms and lease terms which contained "08" or "09" as either a month or day were being parsed incorrectly. This was leading the Wrapper to interpret those date components as "00". If the number was the date, then this would cause the date to be set to the last day of the previous month. If it was the month however, it would cause the date to be set to December of the previous year. For example "2010-08-20" was being interpreted as "2009-12-20", and "2010-10-08" was being interpreted as "2009-09-30". This would have prevented some licenses from being able to start because the upgrade terms were in effect prior to the Wrapper's release date. Some trial licenses could also have stopped early because their lease term end was earlier that it should may have been. For normal licenses, his will have no effect on installations once they are up and running because they do not use the lease term. * Fix a problem on Windows when a service received several service control codes in rapid succession. Since version 3.5.1, the Wrapper was only to process a single control code in each cycle of its main loop. This was resulting in messages like "Previous control code (4) was still in queue, overwriting with (4)." in the logs. The Wrapper can now handle up to 25 control codes per 10ms cycle. * Fix a problem where it was not possible to send passthrough arguments to the JVM when installing or updating a Windows Service. Passthrough using the "--" argument was added in 3.5.2. * Add a new wrapper.pause_on_startup property which makes it possible to tell the Wrapper to go directly into a paused state without ever launching a JVM. * Fix a problem where the STOP command set in a command file was being ignored if the Wrapper was currently in a paused state. * Make it possible to specify DEFAULT for the configuration file encoding. This will cause the file to be loaded using the default system encoding. We added this by request, but recommend using a portable encoding like UTF-8 to ensure that the configuration file will load correctly on all systems. * Added a WRAPPER_LANG environment variable which makes it possible to reference the current locale language code in the configuration file. One common use is to do localization using inclues. (e.g. #include ../conf/wrapper-%WRAPPER_LANG%.conf) 3.5.4 * Add optional support for custom public static methods in the WrapperSimpleApp and WrapperStartStopApp helper classes. Feature Request #2812276. * Add a new special configuration file directive "#properties.debug" which enables debug output about the properties as they are loaded by the configuration file. This can be useful to tell if and why certain properties are being overwritten. Feature Request #3042959. * Fix a minor problem where the "#include.debug" configuration file directive was sticky so it would be enabled when the configuration file was reloaded even if the reloaded configuration file no longer had the directive set. This was only an issue if the wrapper.restart.reload_configuration property was set. * Messages about missing included configuration files that were output when the #include.debug" configuration file directive was active were being logged at the ERROR level even though they were not problems. * Fix a minor problem where the WRAPPER_JAVA_HOME environment variable was not correctly being set to final when it was set internally by Wrapper. This could lead to unexected results if the user overwrote it later in their configuration file. * Fix a problem on AIX and z/OS, when running the Wrapper without any arguments. The Wrapper was attempting to use the default wrapper.conf file but the check for the file was failing causing the Wrapper to continue even though the file did not exist. This caused a confusing error message to be displayed, but was otherwise harmless. * Clean up some debug code associated with sleeping where log output was being queued when it did not need to be. * (Standard, Professional) Consolidate some redundant code associated with waiting for interfaces on startup. * (Professional) Fix a problem in the email feature of the Wrapper where a subject of more than 27 bytes in length when encoded as UTF-8. This was caused by a miscalculation in the Base64 conversion of the subject. * (Professional) Fix a problem when the WrapperManager.exec method which takes an array of command elements was called on Windows. The command elements need to be combined into a single command line, but if any of the elements contained spaces, the resulting command line was not being correctly quoted. * Add a new wrapper.java.command.resolve property to control whether or not the Wrapper tries to resolve any symbolic links in the Java command, specified with the wrapper.java.command property. Historically, it has always done so, but some jvm started applications like run-java-tool on Gentoo will fail if it is run directly as they have a check to make sure it is launched via a symbolic link. * Fix a problem on Windows versions where a path to the Wrapper binary, including the Wrapper binary itself, which was more than 100 characters would cause a buffer overflow when installing the service. A second similar problem would happen if the same path was more than 128 characters, whenever the Wrapper was launched. These were both very old issues and only happened on 32-bit versions of Windows XP and 2000. Microsoft documentation says that the issue should also exist on the 64-bit versions, but we were unable to reproduce it there. Newer versions of Windows are all fine. 3.5.3 * Fix a typo in the UNIX shell scripts that was causing "command not found" errors to be shown when running the Community Edition. * Add new wrapper.console.fatal_to_stderr, wrapper.console.error_to_stderr, and wrapper.console.warn_to_stderr properties to control whether the output at the FATAL, ERROR, and WARN log levels go to stdout or stderr. In the past they all went to stdout. With this change, FATAL and ERROR log levels now default to stderr output. * Fix a problem where the shell script would produce unexpected results if the Standard or Professional Edition shell scripts were used with the Community Edition Wrapper. Fix was in Wrapper binary by changing the default ERROR and FATAL log level console output to stderr rather than stdout. * (Standard, Professional) Fix a problem where script error message output was not being shown if the wrapper.conf file specified in the script did not exist. * Fix a problem where errors from failed forks on Windows were always being flushed immediately rather than honoring the value of the wrapper.console.flush property. * Fix a problem on Windows 2000 systems where a new feature added in 3.5.2 was preventing the Wrapper from running because the API used was too new. * Change the font of the wrapperw dialog in order to have prettier output of multibyte characters. * Add a line feed after the first message when starting the Wrapper from the UNIX script. * Add a note in the debug output so the configured java temporary directory is always logged to help with debugging. * Add a workaround for a bug in both Sun and IBM JVMs which cause an invalid exception to be thrown when a socket is already bound. It had been causing the Wrapper to report: "Unexpected exception opening backend socket: java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind": http://bugs.sun.com/view_bug.do?bug_id=6965962 * Add the encoding of the subjects in the event mails to be always UTF-8 Base-64 encoded. * Add new wrapper.event..email.smtp.auth.type, wrapper.event..email.smtp.auth.userid, and wrapper.event..email.smtp.auth.password properties which make it possible to do LOGIN and PLAIN connection authorizations. Currently SSL (STARTTLS) connections to the mail are server are not yet supported. * Fix a buffer overflow while loading the configuration file on Mac OSX versions. Introduced in 3.5.0. * Fix a several memory leaks on UNIX versions that were added in 3.5.0, as well as a few others on all platforms, some from quite early versions. * Fix some places where a resolved path of exactly MAX_PATH characters in length could have resulted in a buffer overflow. * (Standard, Professional) Fix a memory leak disposing language packs. * Go through and increase the consistency of text strings. * Fix a problem on HP-UX where the Wrapper was logging a warning that the configured JVM was invalid if it was a PA-RISC 2.0 binary. Bug #3037317. * Fix a problem where the WrapperManager was failing to trap and hide errors initializing the MBean server on some JVMs that did not support it. 3.5.2 * Added new command line argument "--" . All arguments following will be preceded and passed to the java application. The arguments are attached after the arguments used in wrapper.app.parameter. * Fixed a problem in the shell script which could lead to report failed starts of a daemon incorrectly on the command line. * Implemented some small logic in the wrapper script which tries to change the permissions of the wrapper binary to executable if it wasn't set. * The Demo Application had problems locating the right conf file on Unix platforms and failed to launch the internal demonstration wrapper process. * Improved the error message logged if the Windows version of the Wrapper exits with an internal error. It now logs more information about the internal state of the Wrapper as well as saving a mini dump file which can be sent to support to make it easier to diagnose the cause of the problem. * Fix a problem where the names and displayNames in WrapperWin32Service instances were corrupted. List affected the WrapperManager.listServices() and WrapperManager.sendServiceControlCode() methods. There was a similar problem with the WrapperManger.getUser(), WrapperManager.getInteractiveUser() and WrapperManager.setConsoleTitle() methods. Introduced in 3.5.0. * Fix a problem on Windows where wildcards would sometimes fail to be resolved or cause the Wrapper to crash. This affected the generation of classpaths and logfile rolling. Introduced in 3.5.0. * Fix a problem on UNIX platforms where some error messages related to a failed fork to launch the JVM were not being logged correctly. Introduced in 3.5.0. * Fix a problem where invalid characters in configuration files that did not declare an encoding could cause the Wrapper to crash on startup. This could be issue for users upgrading from versions prior to 3.5.0 as older versions did not do any character set translations and would not have had a problem. * Fix a problem in code to check whether a drive was a mapped network drive or not was failing. This would sometimes lead to a false warning that the drive could not be identified. Introduced in 3.5.0. * Add a new ACCESS_VIOLATION command to the wrapper.commandfile property to test how the Wrapper and external systems behave if the Wrapper were to crash. Only enabled when the wrapper.commandfile.enable_tests property is enabled. 3.5.1 * Start using a system function to determine whether or not a character in the configuration file is a control character or not. This way it works on non-ASCII platforms. * (Standard, Professional) Fix a crash on Windows platforms caused by freeing up unallocated memory while loading the Wrapper's configuration. * Add debug output describing the system and current code pages on Windows versions to help understand encoding and mojibake issues. * Add a Japanese localized src/conf/wrapper.conf.in_ja template configuration file to assist Japanese users. * Fix an potential deadlock on UNIX platforms if the JVM exits while logging is taking place and the wrapper.debug or undocumented wrapper.state_output properties were set to TRUE. * Fix a problem where a failed JVM invocation that happened immediately after being launched would cause the Wrapper to immediately give up and shutdown. This should not have been possible with normal JVM configurations, but was turned up in testing. * Fix a problem where some startup output of the tick timer debug output was corrupted. This was only an issue if the wrapper.tick_output property was set. * (Standard, Professional) Rework the way text is localized so that mallocs are all handled on initialization. 3.5.0 had problems with occassional freezes and crashes caused by mallocs being made within signal handlers. The problems were rare unless debug output was enabled. * Greatly simplify signal handlers on all platforms so they now do as little as possible, actions are now queued and then processed by the main thread. * (Standard, Professional) Fix a problem where the hostname in the wrapper.syslog.remote.host couldn't resolve a hostname (IP Address was working). * (Standard, Professional) Add debug output on Windows versions to help debug localization and code page issues. * (Standard, Professional) Fix a localization problem on Windows where the Wrapper was using the system-wide language rather than that of the current process. This was resulting in mojibake if the Wrapper was launched in a new console if that new console did not support the required code page. This was only an issue if the user had changed the active code page from the default for their Windows desktop. * Fix a problem on Windows platforms where the JVM child output was being logged with an extra line feed in some cases. * Fix a problem running the DemoApp from some Network shares on Windows. * Add a new WrapperManager.isWindows() and WrapperManager.isMacOSX() methods to make it easy to write such conditional code as both platforms can require non standard code. * (Standard, Professional) Make the GetHostId.bat file more robust so it can be executed using a relative reference from the command line. It also now supports Delta-pack style Wrapper binary naming and falling back to use which binaries are available. * Change the timing of when the wrapper.working.dir is set so that any error messages generated while loading the configuration will be logged to the correct log file. It is also needed for Standard and Professional Editions to ensure that the language pack is loaded from the correct location so that all such messages will be in the correct locale. * Fix a problem on UNIX platforms where the status command was failing with an error due to the localization feature added in 3.5.0. 3.5.0 * (Standard) Added the ability to detect and react to thread dead locks in the JVM. Requires at Java 1.5. Added wrapper.check.deadlock, wrapper.check.deadlock.interval, wrapper.check.deadlock.action, and wrapper.check.deadlock.output properties to configure the detection. * (Professional) Add a new jvm_deadlock event which is fired in response to a thread deadlock being detected within the JVM. * Fix a problem where the intervals like wrapper.ping.interval were all rounding down causing them to function at a rate one second shorter than configured. * Fix a minor memory leak calling WrapperManager.exec. * Add a new wrapper.filter.message. property which can be used to control the message which is logged when a wrapper.filter.trigger. is matched. * Rework the way actions are fired for the wrapper.filter..action and wrapper.timer..action properties so there is no longer any duplicate code. * Modify the way the wrapper.filter..action and wrapper.timer..action properties work so it is now possible to specify a list of actions which will happen in the order specified. This makes it possible to do a thread dump and then restart in response to an error. * Add the DEBUG action to the wrapper.filter..action property for consistency. * (Professional) Implement the ability to fire user defined events as actions of the wrapper.filter..action, wrapper.timer..action, and wrapper.check.deadlock.action properties. * Fix a problem in the WrapperProcess.destroy() function, when a child process couldn't have been forcibly killed. * Add GetHosdID.bat file for Windows platforms. This file will open a dialog displaying the HostId of the machine. * Fix a problem in the shell script which, on a rc based OS, could lead to problems starting the Wrapper when the APP_NAME in the script contained capital letters. * (Standard, Professional) Added a set of wrapper.share..* properties which makes it possible to configure the Wrapper to map specific network resources before launching the JVM on Windows. * Corrected the way the Wrapper is installing itself as a Windows service when the binary and/or conf file are located on a Mapped Drive. * Add new wrapper.pausable and wrapper.pausable.stop_jvm properties to control whether the JVM can be paused or not, and deprecate the use of the Windows specific wrapper.ntservice.pausable and wrapper.ntservice.pausable.stop_jvm properties. * Modified the wrapper.commandfile property so PAUSE and RESUME commands are now supported on all platforms at any time. * Modified the wrapper.filter.action. property so PAUSE, RESUME, and DEBUG actions are now supported. * (Professional) Modified the wrapper.timer..action property so PAUSE and RESUME actions are now supported. * (Professional) Modified the wrapper.event..command.block.action property so PAUSE and RESUME actions are now supported. * Added new WrapperServicePauseEvent and WrapperServiceResumeEvent classes to make it possible to notify an application that it has been paused or resumed. To date, this was only possible when the Windows service was paused or resumed * (Professional) Add new "wrapper_pause" and "wrapper_resume" event types that are fired whenever the Wrapper is paused or resumed. * Enhance the command line parsing for the WrapperManager.exec() command. The single commandLine version of the exec call will handle quotes more sophisticated. * Modified the wrapper.syslog.ident property so its value is now silently trimmed to 32 characters in length. This is needed to avoid problems with syslog servers. (See RFC 3164 section 4.1.3) * (Standard, Professional) Add new wrapper.syslog.remote.host, wrapper.syslog.remote.port, and wrapper.syslog.local.host properties which can be used to redirect all syslog (UNIX) or Event Log (Windows) output to a remote syslog server. * Add support for the wrapper.syslog.facility property on Windows so remote syslog entries can be sent from Windows versions of the Wrapper. * Add debug output from the WrapperManager class which shows information about the current wrapper.jar, including its size, location, and MD5 hash. * Add a check for wrapper.java.classpath. entries containing quotes. The quotes are now stripped and a debug warning logged. * (Standard, Professional) Increase the size of the wrapperw.exe error dialog so it is a little easier to read. Also changed the font for the same reason. * (Standard, Professional) Modify the title of the wrapperw.exe error dialog so it now includes the value of the wrapper.displayname property. * Add a new check for the writability of the configured Java temporary directory. When running on Vista, it will not be writable and can lead to errors. * Added new wrapper.java.tmpdir.required and wrapper.java.tmpdir.warn_silently properties to control whether the temporary directory is required. * Add a note in Wrapper conf template showing users how to configure a specific Java version to use. * Add a new CLOSE_SOCKET command to the wrapper.commandfile property and added a new wrapper.commandfile.enable_tests property to control whether it can be used. * Fix a debug warning while shutting down caused by one thread closing the backend socket when another expected it to be open. * If the backend socket between the JVM and Wrapper is somehow closed, make the JVM respond promptly by restarting the JVM immediately to resync with the Wrapper. Added log information to make it clear when this happens. * Add a new wrapper.use_tick_mutex property to control whether or not the internal tick timer is protected by a mutex. (Experimental) * (Standard, Professional) Add support for zLinux 32 and 64-bit on s390 and s390x systems. * Change the internal encoding of the wrapper from native characters to UNICODE. This will allow the wrapper to handle correctly any characters in its configuration file and internally. * (Standard, Professional) Implement a new WrapperResources class which makes it possible for user applications to localize their applications using the same methods common to native applications. The Wrapper uses this internally to provide localized versions of the Wrapper. * Remove the old org.tanukisoftware.wrapper.resources package as it is no longer being used. * (Standard, Professional) Add Japanese language pack to localize the Wrapper to Japanese. * Fix a problem in the WrapperManager class where unexpected exceptions thrown in the main socket loop were being thrown away without being logged. * Make the Wrapper more robust against failures removing the Wrapper's shutdown hook on shutdown. It had been causing the clean shutdown of the JVM to fail as an unexpected exit. * Fixed a problem in the wrapper customize code where customized multi layer icons may get scaled incorrectly by Windows. Bug #3015848 * Modify the wrapper.on_exit. property so it is now possible to PAUSE the Wrapper when a JVM exits. This delays the restart of the JVM until the Wrapper is resumed. * Add a new log format, 'U', which logs the approximate time in seconds since the Wrapper was launched. It is based on the internal tick timer and will be a few percent lower than the actual number of seconds that have elapsed. Added to the wrapper.console.format, wrapper.logfile.format, and wrapper.logdialog.format properties. * Fix a problem where deleting the configured anchor file was not recognized if the JVM was not running at the time. The Wrapper was not noticing that it was missing until the next JVM was launched. * (Standard, Professional) Add a new NOTICE log level which is used to log license related message. These will only show up trial license log output. * (Standard, Professional) Add a new default 15 minute trial license which can be used out of the box on any machine without the need to register and obtain a trial license or purchase a license. * Add a new wrapper.environment.dump property which will dump all of the environment variables to the log, along with where the variables originated. * Force the Wrapper to flush all logfile output for each line until the configuration file has been loaded. There is normally no output up to this point anyway, but this ensures that any errors are logged in a consistent location. * Move the registration of the main thread with the logging system up a bit to make it possible to perform low level debug logging earlier. * Add a set of checks to display an error and prevent the Wrapper from starting if the batch or shell scripts being used are based on the TestWrapper demo application. It is important that the user start with the default template files in the distribution src/bin and src/conf directories to make sure the integration goes smoothly. 3.4.1 * Fix a problem where the wrapper.app.parameter.1 property was always being set to an empty string when launched from launchd on Mac OSX. It worked correctly with the testwrapper application, but would fail for most user applications. * (Professional) Fix a potential synchronization problem in the log output of the tick timer, event command and event email code. This had been in the code since 3.3.0 without any reports of problems. * Improve the error message displayed when the configured wrapper.java.command can not be found on the path. * Log the name of the signal in the logs when a SIGSEGV is detected from the JVM. It had been logged as Unknown. * Add some comments to the wrapper.conf.in template to help users get started with a new license key file. * Add some default properties to the wrapper.conf.in template file to make it easier to get up and running with out of memory checks, as well as sending out alert emails. * Add a small debug message when running wrapperw.exe so it is clear which wrapper binary is being used. * Fix a problem where the wrapper.logfile.maxfiles was not being applied on startup when the current log file did not yet exist. This was true for any wrapper.logfile value which contained a unique value like a PID. * (Professional) Fix a problem in the WrapperProcess.destroy() function, where the function was failing to forcibly kill the child process. * (Standard, Professional) Add a new GetHostID.bat file for Windows platforms. This file will open a dialog displaying the HostId of the machine to help new users get up and running. * Add a new WrapperManager.appearOrphan() method which can be used to test how the WrapperManager shuts down the JVM in the event that the Wrapper process ever crashes or freezes. This was not due to any particular problem and was added to fill out our test coverage. * (Professional) Fix a problem where event commands were being left in a defunct state after execution on UNIX platforms. * Fix a potential problem on 64-bit versions where the internal tick timer was not rolling over in the same way as the 32-bit versions. This has been in all previous versions but is not known to have caused any problems. It was fixed for consistency. * Modify the WrapperManager class so it will now request a JVM hard exit only after 4-times the ping timeout, in seconds, since the last contact with the JVM. This had been 90 seconds more than the ping timeout, which was not always long enough when the wrapper.ping.timeout was very large. * Shift the initial start point of the tick counter so it will roll over 50 seconds after startup. This shouldn't be noticeable to the user, but makes sure that this roll over is much better tested as it always happens the first time on startup. * Add a new wrapper.java.classpath.use_environment property which makes it possible to set the classpath using the CLASSPATH environment variable rather than including it on the Java command line. * Fix a problem where requests to shutdown the Wrapper when in the state where it was just about to launch a JVM would being ignored. This was fixed in all editions, but was only an issue in the Professional Edition when the wrapper.event.jvm_prelaunch.command.on_exit.=SHUTDOWN property was being used with the wrapper.event.jvm_prelaunch.command.block=TRUE property and the command exited with a code that triggered the SHUTDOWN. * (Professional) Add a new wrapper.event..command.block.action property to control how the Wrapper behaves when a command does not complete execution within the configured timeout. Accepted values are CONTINUE, KILL, KILL_SHUTDOWN and KILL_RESTART. Default value is CONTINUE. * (Professional) Made it possible to use the "default" event type with the wrapper.event..command.loglevel, wrapper.event..command.block, wrapper.event..command.block.timeout, wrapper.event..command.on_exit., and wrapper.event..command.on_exit.default properties. * Fixed a single byte buffer overflow which takes place just before the JVM is launched on Windows platforms. This was introduced in 3.4.0. * Add a message pointing the user to the Wrapper's log file when the service fails to start after it has been launched. * Update the debug message displayed when attempting to open the backend socket if the port is unavailable so it doesn't seem like a problem. It will retry with another port. * Work around an issue on some Solaris problems where the shell script would fail if /usr/ucb/ps wasn't installed. * Fix a problem on UNIX versions where the Wrapper would fail to resolve the correct location of java if it was located using the system PATH, and that PATH element pointed to a binary via a relative symbolic link. This was introduced in 3.4.0. 3.4.0 * Increased the minimum supported Java version from 1.2 to 1.4. * Removed the reflection code used to manage the Wrapper's shutdown hook. The Runtime methods are now called normally. * Add a note in the TestWrapper shell script to make it clear that the user should always use the scripts in the WRAPPER_HOME/src/bin/ directory when generating scripts for their own applications. This became more of an issue because of changes to the TestWrapper script starting with 3.3.8. Bug #2902843. * (Professional) Added new WrapperManager.exec methods and a new WrapperProcess class to allow the launching and management of child processes through the Wrapper rather than using the standard Runtime class. This makes it possible to clean up child processes when the JVM crashes or is restarted, as well as solves severe memory issues with the way processes are forked on some UNIX platforms. * (Professional) Added a new wrapper.child.status.loglevel property to make it easier to debug the status of child processes. * (Professional) Added a new wrapper.child.count.interval property to control the interval at which the number of waiting child processes is logged after a JVM is shutdown. * (Professional) Added a new wrapper.jvm_cleanup.timeout property to control the amount of time that managed child processes still running after the JVM has exited are given to shutdown before being forcibly killed. * Fix a problem with WrapperManager.getUser() and getInteractiveUser() methods which was preventing us from using the latest compiler on 32-bit Windows. (The compiler used to build 32-bit Windows versions was rolled back to the version used through the 3.3.5 release in 3.3.9 to work around the problem that was causing these methods to always return null.) The change in this version should not affect how the Wrapper functions. * The old compiler used in 3.3.9 for Windows 32-bit builds was causing a false hit on Symantec security software. The new compiler causes the Wrapper to once again pass without any warnings. * Added a warning while starting up the JVM which will be displayed if the Java command in wrapper.java.command does not point to a valid java binary file. * [Changed the scripts and batch files to try to load the wrapper executable according to the system, i.e. on 64-bit systems the 64bit binary of the wrapper is attempted to be executed first and after this fails the 32 bit gets attempted to be loaded. This behaviour is primaly useful with the delta-pack of the wrapper.] * Add some debug output logging the current timezone to assist supporting time related problems. * (Standard, Professional) Added a new wrapper.license.debug property which will log information about the license key(s) being tested on startup. * (Standard, Professional) Fix a problem where license validation was failing at certain times of the day for servers with timezones east of Japan. Development license keys which have their update times obfuscated were not affected. This was a problem introduced in 3.3.7. * Fixed a bug in the wrapper shell script which occured when running the script on a Solaris within a non singlebyte locale. Bug #2910327 * Fixed a potential bug in the wrapper script where requesting a Thread Dump, the shell is sending the wrapper console to the background and returning with a prompt. * Fix a problem where Java log output would sometimes get extra line feeds when under heavy load. * Fix a problem which was leading to a resource not found error when trying to start a service, if it was installed on a Mapped Network Drive under Windows. * Added some advice messages recommending the use of UNC paths if a resource located on a Mapped Network Drive is used in the configuration file on Windows versions. * (Standard, Professional) Fix a bug in the wrapper binary customization, which occured when the source binary file was set to read only. * Fixed a null string problem in the error message if a classpath value wasn't found. * (Professional) Added the option to include a logfile into the wrapper's EmailNotification mails via wrapper.event.default.attach_log=TRUE * Improve the message displayed when a user calls WrapperManager.requestThreadDump() in JVM which does not have console window on Windows. This should never be an issue when run with the Wrapper, but can happen if running standalone without the wrapper binary. * Update the Windows batch scripts so they now take AMD64 and IA64 architectures into account when deciding which version of the Wrapper to run when using the delta pack. * Update the UNIX shell script so it now does a much better job of resolving the ideal platform bits to run the correct version of the Wrapper when using the delta pack. Thanks to Leo Leung for the patch. * Add install and remove commands to the UNIX shell script so it is now much easier to install and remove the Wrapper on many UNIX plattforms to start and stop on system startup and shutdown. Thanks to Leo Leung for the patch. * Update the Windows batch scripts so it is now easier to change the location of the Wrapper configuration file or rename the Wrapper binary when using the scripts. * Added a new QueryApp-NT.bat.in template script which can be used to query the current running status of the service on Windows. * (Standard, Professional) Add a new "-u" or "--update" command to the Wrapper which allows you to effectively reinstall the Wrapper as a service without having to provide the account credentials if the service is running as a specific user. This is very useful for installers upgrading an application to a new version. * Add a new "update" command to the Windows AppCommand.bat.in batch script. * Go through and clean up the messages displayed when controlling the Wrapper as a service so the messages are consistent and more meaningful to the user. * Add wrapper.wait_for_hostid and wrapper.max_hostid_timeout property. This properties set if and how long the wrapper shall wait when starting up until the hostid is available. This is important to make sure that server licenses are validated correctly on UNIX platforms as the OS is booting up. * (Professional) Fix a problem where environment variables referenced in property values were not being expanded correctly the first time they were referenced if the property's value was a default value. The underlying fix was in all editions, but this was only causing a problem in the Professional Edition where the WRAPPER_HOSTNAME variable was not being expanded in the subject and body of emails sent out for the "wrapper_start" event if the defaults were used. * (Professional) Fix a problem where backslashes in the body of emails, configured with the wrapper.event..email.body property, were not being handled correctly when displaying things like paths from environment variable references. * Fix a problem on UNIX platforms where the Wrapper was displaying an error about not being able to locate the configuration file when the Wrapper was run without any arguments. * (Standard, Professional) Improve the message shown when a License Key is not found. * Add a new message to the Community Edition when the user requests a HostId. * Add WAIT_FOR_STARTED_STATUS and WAIT_FOR_STARTED_TIMEOUT to the script. This lets the script wait (up to timeout sec.) when starting a daemonized process until the process has been started. Thanks to Dobes V. Feature Requests #2917391. * Improve the error message displayed when the user tries to run the Wrapper with the internal -s or --service commands. * Fix a problem where the WrapperSystemPropertyUtil.getBooleanValue() method was not correctly returning the specified default value when the looked up property was missing. Also added a new getStringValue() method. * Improve the error message displayed when the user tries to install and remove the wrapper as Service on Windows Versions after Windows Vista. * Add an advice message when MacOSX applications launched with launchd encounter a "Returning nil _server" error when displaying a GUI. 3.3.9 * Modify the way JNI functions are called from within the native library so they work correctly on platforms which are not ASCII based. * (Professional) Add support for IBM z/OS 390 servers. This is still an alpha release and will be made available on request. * Improve the message displayed when a server license key is used on a different server. * Add a minimum max file size of 1024 bytes to the wrapper.logfile.maxsize property to avoid the log file rotating too often if the user enters a very small value. * Add a message that shows up in the console when the Wrapper fails to write to the configured log file. As with previous versions, it will then fall back to writing to wrapper.log in the current working directory. * On UNIX platforms, automatically set the wrapper.disable_console_input property when wrapper.daemonize is set. * Fix a problem introduced in 3.3.8 where relative configuration file includes were failing to resolve correctly when the wrapper.working.dir and wrapper.daemonize properties were used together. The wrapper.daemonize property causes the configuration to be loaded twice on startup and the working directly was not being reset correctly before it was loaded the second time. * Fix a problem introduced in 3.3.8 where wildcard selection of files on Windows failed in some cases. * Fix a problem introduced in 3.3.8 where setting the wrapper.logfile.maxfiles property to 0 was causing all log files to be deleted rather than none when the ROLLNUM file pattern was used. * Revert the way rolled log files are deleted when using the ROLLNUM file pattern to the functionality used in versions 3.3.7 and earlier. Files such as wrapper.log.bak or other files manually created with the same log file base name were also being deleted with 3.3.8. * (Standard, Professional) Fix a problem where the close window button in the title of the WrapperW log dialog was not correctly cancelling the dialog. * (Standard, Professional) Fix a problem where the WrapperW log dialog would sometimes fail to show itself on top of other windows if the splashscreen had been displayed on startup. * Fix a problem on 32-bit Windows versions where starting with he Wrapper, the WrapperManager.getUser() and getInteractiveUser() methods were always returning null. This problem was introduced in version 3.3.6. * (Professional) Fix a buffer overflow when sending alert emails to multiple addresses. This would sometimes cause crashes in versions 3.3.7 and 3.3.8 when sending alert emails to even a single recipient. Because of the nature of the overflow, in most cases did not cause any problems. 3.3.8 * Add the new start type DELAY_START for NT Services, which startes the service after other auto-start services are started plus a short delay. * Fix a problem where the Wrapper's PID file was not being set to the correct PID when the wrapper was launched daemonized. With the shell scripts that ship with the Wrapper, this means that it would not be possible to stop the Wrapper using the script because the expected PID did not exist. This was a problem introduced in 3.3.7. * Changed the timing for the wrapper's splashscreen when the splash screen mode was set to JVM_STARTING. Now the splashscreen will disappear when the JVM has been initialized. * Fix a problem where the splashscreen was being shown when starting a service or performing other command line operations. * Remove some extra debug output on startup for Mac versions. * Fix a crash in the Community Edition on PPC platforms of the Mac OSX version. This crash has been reproduced in all versions starting with 3.3.1. The OSX distribution is a universal binary but does not appear to result in a crash on x86 servers. Standard and Professional Editions were not affected. * Fix a problem on Windows versions where problems accessing the registry were not reporting the correct error message. This did not cause any problems in and of itself, but it made it difficult to track the down the cause. * When wildcards are used in the classpath elements, the list of matching jar files included in the classpath are now sorted to ensure that their order is consistent across installations. Normally it would not matter, but if certain classes or resources are redefined in multiple jars this will ensure that the application now always works the same. * Fix a problem where wrapper.logfile.maxfiles was being ignored when wrapper.logfile.rollmode=JVM was set. * Changed the way the wrapper.logfile.maxfiles property works with the ROLLNUM token. Now when the log files are rolled, all files greater than maxfiles count will be deleted. Previously, the Wrapper would roll within the maxfiles count and ignore extra files if they existed. This would cause extra files to be left around if the maxfiles property value was decreased. * Add new wrapper.logfile.purge.pattern and wrapper.logfile.purge.sort properties which make it possible to limit the number of log files in some advanced cases. Be sure to read the documentation before playing with them. * Fix a potential crash when referencing non-existent environment variables in the value of wrapper.logfile. * Modify the way all properties used to define file names behave so that undefined environment variable references will now have their '%' characters replaced by '_'. This is to avoid problems caused by file names containing '%' characters on some platforms. * Fix a problem introduced in 3.3.6 where the windows shown by the JVM or its child processes could not be displayed when running in iteractive mode. * Rework the TestWrapper application a bit so it can now be run in headless mode for testing. * Fix a problem on some UNIX platforms where the shell script was showing an extra '-n' when run with the "start" command. * Fix a problem for FreeBSD which could cause the wrapper being unable to stop the wrapper daemon if the ps command buffer size (kern.ps_arg_cache_limit) was too small to contain the wrapper command line. 3.3.7 * (Professional and Standard) Added the ability to customize the wrapper.exe and wrapperw.exe binaries on Windows with a user specified icon and splash screen. * (Professional and Standard) Added a new wrapper.splashscreen.mode property to control how long the splashscreen is visible. * Fix a problem on SELinux where a strict security policy could lead the Wrapper fail to load the libwrapper library. Thanks to Jean for the hint. * Fixed a problem in the obfuscated license date, which caused a license to be reported as invalid if run in a timezone west of Japan. This feature was implemented in 3.3.6, but disabled on the site until the release of version 3.3.7. Thanks to Leo for the hint. * Added a new WRAPPER_PID environment variable. Feature Request #2870136. * Added a new WrapperManager.getWrapperLogFile() method and WrapperLogFileChangedEvent class that can be used to receive notifications of changes to the Wrapper log file currently in use. Feature Request #2870133. * (Profesional) Improved the wrapper.event..email.to property so it now supports the ability to specify multiple recipients. 3.3.6 * Introduce the wrapper.timezone property. This property allows to set the timezone in which the wrapper will be executed. This property is available in the standard and the professional Edition of the Java Service Wrapper. * Fix a potential problem on Windows platforms where a failure to register the control handler was not being logged. If this happened, user logoffs would not be trapped correctly but no other problems would have occurred. * Fixed a problem in the shell script on Solaris platforms where a deep directory structure would cause the script to incorrectly report that the Wrapper was not running. That could lead to multiple zombie copies of the Wrapper and its application running in memory. Bug #1664303. * Fixed a problem in the shell script on HP-UX platforms where a deep directory structure would cause the script to incorrectly report that the Wrapper was not running. That could lead to multiple zombie copies of the Wrapper and its application running in memory. Bug #2812207. * Improve the error message displayed when there are problems initializing the main class specified for the WrapperSimpleApp, WrapperStartStopApp, or WrapperJarApp helper classes. * (Professional) Add new wrapper.event..loglevel and wrapper.event..message properties which can be used to output a customizable message like "Event: " to the logs at an arbitrary log level. * Add debug output in the Windows version to log the full path of the native library. * Add a new wrapper.java.detect_debug_jvm property which will control whether or not the Wrapper disabled timeouts when java's debugger is in use. The Wrapper has automatically disabled timeouts in this case since version 3.2.1. Thanks to Ruslan Gainutdinov for the patch. * Fix a buffer overflow problem for values of wrapper.ntservice.name. * Fix a problem with where the wrapper.syslog.ident property was not working as documented. It had been necessary to use wrapper.ntservice.name in its place. * Add a new wrapper.ignore_sequence_gaps property which makes it possible to have non sequential numbered property values. This affects the wrapper.app.parameter., wrapper.event..command.argv., wrapper.filter.trigger., wrapper.java.additional., wrapper.java.classpath., wrapper.java.library.path., wrapper.ntservice.dependency., and wrapper.timer..interval, properties. The default value maintains past functionality. Feature Request #1930298. * (Professional) Fix a problem where the Event Handler Variables were not being set correctly in the values of the wrapper.event..command.argv. properties. * (Professional) Fix a potential access violation if memory allocations fail while sending event mails or executing event commands. * Add a new WRAPPER_HOSTNAME default environment variable as an alias of the existing WRAPPER_HOST_NAME variable. * (Professional) Deprecate the use of the wrapper.event..set_environment property. It will remain in the product for compatibility but its use is discouraged as it does not always work correctly when the configuration file is reloaded. See the property's documentation for more details. * Add a new DUMP action to the wrapper.filter.action. property to make it possible to invoke a thread dump in response to a specific string in the JVM's console output. * Fix a problem where the WrapperManager.stopAndReturn method was dead locking if called when the JVM was being run in standalone mode without the Wrapper. Bug #2711872. * (Standard, Professional) Modify the way the licensing times work so the Wrapper compares the License Upgrade Term to an official release date rather than the build date. This makes it possible to release additional platforms at a later date while keeping the use of a license consistent. * (Standard, Professional) Make it possible to obfuscate the upgrade term in License Key files for development licenses so it is not visible to an end user what the development license holder's upgrade term is. This feature is accessed from the License Management Page when downloading a new or existing License Key file. 3.3.5 * Fix a problem on some UNIX platforms introduced in 3.3.4 where the Wrapper would crash on startup if the configured JVM could not be found. * Fix a problem introduced in 3.3.2 where the Wrapper could crash if the system host name was longer than 27 characters in length. * Fix a potential problem with the way thread ids were being compared on UNIX systems. * Add a new wrapper.java.additional.auto_bits property which will automatically add the -d32 or -d64 arguments to the JVM for platforms whose JVMs typically expect the argument. * (Professional) Fix a problem with the Date field of outgoing event emails. 3.3.4 * (Standard, Professional) Update the development license to version 1.1 so that a new copyright notice file can be shipped with user applications rather than the full license text. * The Community Edition may be licensed under either the GPL2 based Community License, or the Development License. The source for the Standard and Professional Editions of the Wrapper are proprietary. http://wrapper.tanukisoftware.org/doc/english/licenseOverview.html * Fix a problem introduced in 3.3.2 where querying a the status of a Windows service with the -q or -qs commands resulted in an access violation. The running status of the service was reported correctly but additional configuration information was failing. Bug #2644515. * Add a new wrapper.disable_restarts.automatic property to disable only restarts caused by JVM timeouts, crashes, etc. Manual or configured restarts will still be allowed. * Switch to using make for HPUX IA 32/64 builds. * Add Advice comments when the Wrapper fails to launch the JVM process. * Fix a problem on UNIX platforms where log entries made by the forked Wrapper process would result in two blocks of log entries in the log file because the parent Wrapper process would think they were console output from the JVM process. * Add a set of new wrapper environment variables that can be referenced in the wrapper.conf file to generate random numbers, or timestamps for use in generating unique file names, etc. See the Default Environment Variable definitions section for more details. * (Standard, Professional) Fix a problem with Development licenses being able to authorize applications using Integration Method #4 which was added in version 3.3.3. * Add the number of bits of the current Wrapper to the startup banner to aid in support requests. * (Standard, Professional) Fix a crash problem on HPUX versions which would reliably happen on some machines at startup. 3.3.3 * Modify the wrapper.ignore_signals property so it now takes the values WRAPPER, JAVA, and BOTH, in addition to TRUE and FALSE. * Modify the WrapperManager so it is now careful never to poll the native library once the JVM is flagged as being ready to shutdown. This is to make sure that the JVM never exits in the middle of a call as that could lead to the JVM crashing. * Add a pair of methods to allow threads to request and release locks which will prevent the Wrapper from letting the JVM exit while certain operations are in progress. See WrapperManager.requestShutdownLock() and WrapperManager.releaseShutdownLock(). * Fix a problem where interactive services would sometimes leave a console window visible when after starting up. The Wrapper is now more resilient about closing the window even if it fails to do so initially. * Add a new integration method (#4), which makes it easy to configure the Wrapper to execute an executable jar file. * Fix a problem where the random generator was not being seeded correctly before naming the Wrapper's console window when running as a Windows service. This was leading to problems identifying the wrapper's console when more than one service was running on the same machine. 3.3.2 * Add a file information record to the wrapper.exe and wrapperw.exe binaries so the Version tab will be displayed correctly in the Properties dialog of the file. * (Standard, Professional) Fix a problem with the wrapperw.exe binary where the log dialog was not being displayed correctly when the Wrapper was launched with the "-?", "-v", or "-h" arguments. * (Standard, Professional) Fix a problem with the wrapperw.exe binary where a message was being displayed in the dialog with the location of the full log file even if there had not been any entries written to the log. * (Professional) Improve the debug output produced when sending event emails when the wrapper.event..email.debug property enabled. * (Professional) Add wrapper.event..email.send.timeout and wrapper.event..email.receive.timeout properties to avoid the wrapper hanging waiting for a response from a remote mail server. Bug #2064885. * (Professional) Fix a problem where the Wrapper would get stuck and fail to send emails with some mail servers. Problems was being caused by incorrect linefeeds in the body of the email. * Add a warning if the leading '#' is missing from an '#include' in the configuration file to assist users with include file problems. * Added a new wrapper.ntservice.generate_console property which will cause the Wrapper to always generate a console when running as a service and then hide it immediately. This will cause a slight flicker but is needed to support thread dumps. Bug #2060181. * Fix a problem in the Windows version where the console window would sometimes be left visible when running as an interactive service even when it was configured to be hidden. * Add support for PowerEvents so Windows services can respond to suspend and resume events. * Fix a problem where the wrapper.key system property passed to the JVM was being generated incorrectly randomly, 1 in 2048 times the JVM was launched. This would result in the JVM failing to start and the Wrapper shutting down. * Add a new wrapper.disable_console_input to disable to feature which allows the Wrapper to pass console input on to the Java process. * Fix a buffer overflow problem in the logging code which would happen once on startup. This was benign on most platforms but was causing intermittent crashes in the 32-bit AIX version. * Modify the way configuration properties are parsed so that their names are no longer case sensitive. * Modify the WrapperServiceException so that a new getErrorCode method can be used to obtain the integer error code which caused the exception. Feature Request #2188280. * (Standard, Professional) Fix a problem where on some Windows machines the Wrapper would return a random hostId that changed each time the system was rebooted. * (Standard, Professional) Make it possible to define License Keys so that their property names are encoded using either the host name or hostId. This makes it possible to define multiple keys within the same configuration file, visible on the same host. This was necessary to support some load balanced network adapters where the visible hostId changes depending on the active physical network adapter. * Rework the Java side state engine so it is now possible for the Java side of the Wrapper to respond to stop events while the WrapperListener.start method is still in progress. * Add a new wrapper.listener.force_stop property which allows control over whether the WrapperListener.stop method is called on shutdown even if the WrapperListener.start method has not yet completed. * Fix a problem on Windows where the ability to start and stop the Wrapper as a service using the Wrapper itself was requiring the Administrator permission when a lower permission should have been possible. The Wrapper should now allow service control to do whatever is possible from the Services control panel. * Fix a memory corruption error if the value of wrapper.java.maxmemory was more than 4 digits in length. wrapper.java.initmemory did not have any problems. * (Professional) Add a new wrapper.event..email.client.host property which makes it possible to configure the host name sent in EHLO and HELO commands to the SMTP server. * Add a new default environment variable, WRAPPER_HOST_NAME, which stores the name of the machine where the Wrapper is running. 3.3.1 * Add debug output showing the current os name and architecture to aid in debugging problems. * (Standard, Professional) Improve the message displayed when a license key is found but is deemed to be invalid. * Modify the template wrapper.conf file to help users debug include file problems. * Disable the console title feature on all UNIX platforms other than LINUX because the console title does not get reset correctly when the Wrapper process terminates. * Add support for HP-UX IA64 CPUs. * Update the license banner in source files so it is clearer that the user is restricted by the license they agreed to. * Modify the Community edition so it will now display a Licensed to banner on startup if shipped with a Development License. This is required to enable the distribution of the Community Edition under the Development License. * (Professional) Fix a problem where the UNIX versions of the Professional Edition would sometimes deadlock on startup when run as a daemon process. Bug #1989355. * (Professional) Added two new events; jvm_failed_invocation and jvm_max_failed_invocations. Feature Request #1994718. * Fix a problem where the Windows service exit code was not being set correctly when the JVM exited with a non-zero exit code. The problem could be seen by running "sc query {service}" from the command line. Bug #1859061. * Added support for the Windows Itanium 64-bit platform. * Added support for the HP-UX Itanium 32 and 64-bit platforms. * Added support for the MAC OSX 64-bit platform. * (Standard, Professional) Fix a problem on Windows versions where servers which reported a large number of possible host ids could cause a buffer overflow on startup. This crash was possible when using either Development or Server licenses. Removed duplicate host ids from the list of possible ids. * Add a new "condrestart" command to the shell script which will restart the Wrapper only if it is already running. Feature Request #1928045. * Fix a problem where the 64-bit Solaris x86 version was unable to load its JNI library. Bug #1992039. * Fix a problem on Windows versions where a frozen JVM process was not always being killed. This could result in the zombie JVM processes being left around that consumed memory and other resources. * Add a new wrapper.ignore_console_logouts property which allows the Wrapper and JVM to survive logouts when launched as a console application from another service. * (Standard, Professional) Add a wrapperw.exe binary in Windows implementations which makes it possible to run the Wrapper without a console. A console still flickers for an instant when the Wrapper starts. This is the same issue that has existed when running as an interactive service and is required to make thread dumping possible. * (Standard, Professional) Add new wrapper.logdialog.enable, wrapper.logdialog.format, wrapper.logdialog.lines, and wrapper.logdialog.loglevel properties used to configure the display of a Log dialog when the wrapperw.exe binary exits in an error state. * Fix a problem where the Wrapper was attempting to reopen its backend port even when the JVM was down. This was only a problem when the defined port range was limited to a single port with the wrapper.port.min and wrapper.port.max properties. In such a case one or more warning messages were being displayed because the port is locked for a few moments after being closed. * (Standard, Professional) The wrapper.initmemory.percent and wrapper.maxmemory.percent properties were not correctly being calculated relative to a maximum of 2048MB for 32-bit versions of the Wrapper. Bug #2053167. 3.3.0 * Add a new wrapper.ping.interval.logged property which makes it possible to reduce the debug output caused by ping transactions between the Wrapper and JVM. * Fix a problem on Windows where the Windows Service Manager was not waiting the full configured time of the wrapper.jvm_exit.timeout and wrapper.shutdown.timeout properties. This was leading to the net stop command timing out and the system shutting down without the java application having fully stopped. Bug #1582568. * If internal firewalls were preventing the backend socket from being created, it was not being made clear what the cause was. It was also possible that the JVM would deadlock on shutdown. This second problem was recovered from when the Wrapper killed the JVM. * Rework the console output from all Wrapper classes to make it much more obvious that that is their source. * Submit a patch to the UNIX sh script by Chris Dance which makes it possible to tell the shell to wait a few seconds for the wrapper to start up. Also includes some modifications to work correctly on older Debian and RedHat systems. * Fix a problem where the local copy of ant was not always being used correctly on UNIX systems which have a default copy of any installed. Thanks to Robey Pointer for the patch. * Add the -lm to the command line when building Linux 32 and 64 bit versions of the wrapper on Linux. This is to support building on recent Debian and Ubuntu versions. Thanks to Robey Pointer for the patch. * Add support for the SIGUSR1 and SIGUSR2 signals so they can now trigger a shutdown, restart or be forwarded to the JVM for custom functionality. See the wrapper.signal.mode.usr1 and wrapper.signal.mode.usr2 properties. Based on a patch by Robey Pointer. Note that the JVM process does not trap SIGUSR1 or SIGUSR2 signals as they are used internally by the JVM as part of the garbage collection process. * Fix a problem where the WRAPPER_OS, WRAPPER_ARCH, and WRAPPER_BITS environment variables were not being initialized correctly for the various unix platforms. * Removed the 4096Mb upper limit set on the wrapper.java.initmemory and wrapper.java.maxmemory properties. 64bit users need to go way beyond that. * Fix a problem where relative include file references in the configuration file were not working correctly if the wrapper.working.dir was used to change the working directory. The working directory is now always reset to its original value as the configuration file is being loaded. * Added a new wrapper.registry.java_home property which makes it possible to specify the location of java within the registry. * Set a new WRAPPER_JAVA_HOME environment variable if the JAVA_HOME is located in the Windows registry. * Modify the way properties are looked up so that any unreplaced environment variable references will be reevaluated in case they were set after the property was originally set. This is possible with some WRAPPER_* environment variables or depending on the placement of set.* properties in the configuration file. * Set any unset properties to their default values internally. This is necessary so the WrapperManager.getProperties() method returns the correct set of active properties. * Fix an occasional crash with 64-bit UNIX caused by a native synchronization problem when system signals are trapped. Bug #1614010. * Fix a problem on Solaris versions, where the Wrapper was not correctly recovering and attempting another back end port when the first was already in use. Bug #1594073. * Fix a problem on Solaris and AIX where the RUN_AS_USER feature of the shell script was not working due to lack of support for the "-m" option of su. The shell script now uses "su -". Bug #1590168. * Add HP-UX Makefiles for building with make. Fix some problems in the shell script to make the script work better on HP-UX. Thanks to David Brown and Nicolas Varney for the patches. * Fix a problem where any signals received by the JVM and triggering a SIGCHLD signal in the Wrapper were being interpretted as the JVM having stopped. This was not always true. Bug #1643666. * The Wrapper is now able to detect when the JVM process is stopped and continued. It will still timeout if stopped, but a descriptive warning is now logged. * Increase the maximum number of log entries which can be queued to avoid losing them. These are only used for log entries outside of the primary thread. * Fix a problem in the shell script which was making it impossible to stop the Wrapper or query its status on OSX. * Add support for 64 bit AIX. Thanks to Nicolas Varney for supplying a Makefile. * Correct the AIX library extension to be ".a". * Rename the UNIX Makefiles so it is more obvious which tool must be used to build with them. * Fix a problem where the HP-UX native library would not be located correctly for some processor types if the file had a platform specific name. * Internally rename the WRAPPER_JSTATE_LAUNCH state to WRAPPER_JSTATE_LAUNCH_DELAY for clarity. * Fix a problem where the UNIX versions of the Wrapper would shutdown rather than restarting a frozen JVM if the arrival of the SIGCHLD signal from the old JVM process was delayed by more than a second or two. * Rework the Windows build so it now uses nmake and a Makefile rather than vcbuild. This is probably not as clean, but it was needed to get the 64-bit build working. * Fix a problem on Windows versions where quoted values specified from the command line were not always being requoted correctly when generating the java command line. * Add validation checks for Windows versions to make sure that all additional parameters, application arguments, the classpath, and library path all contain values which are quoted correctly. Incorrectly quoted values will now result in a warning message that will help resolve the problem. * Fix a memory leak when calling WrapperManager.listServices() on Windows. Bug #1665947. * Fix a buffer overflow problem if the Wrapper was launched without explicitly specifying a configuration file. * Add tests of the return values of all malloc calls to catch out of memory errors and recover as gracefully as possible. Bug #1649880. * Modify the WrapperManager.signalStarting and signalStopping methods so that they will never have the effect of shortening the existing timeout. Updated the javadocs of both methods so they more accurately reflect what the methods do. * Move the Wrapper Copyright banner into the Wrapper process so it will be output more consistently. * Branch the code to support Community, Standard, and Professional Editions of the Java Service Wrapper. * (Standard, Professional) Add support for Server (Fixed) as well as Development (OEM based) licenses. * (Standard, Professional) Add 64-bit versions of the Windows version. The 64-bit Community Edition will not be distributed initially to support ongoing development costs. * (Professional) Add event handling callbacks for Wrapper start/stop, JVM start/stop, JVM started/stopped, JVM restart, JVM killed, and JVM unexpected exit events. * (Professional) Add the ability to send emails in response to any event callback. * (Professional) Add the ability to execute a a user configured command in response to any event callback. * Add WRAPPER_BIN_DIR and WRAPPER_WORKING_DIR environment variables which are now available for use within the wrapper.conf file as well as by any child processes. * Add documentation to the integration pages about existing system properties that be used to control the way the WrapperSimpleApp and WrapperStartStopApp handle application startup. * Remove support for native PPC and x86 distributions of the Wrapper for MAC OSX in favor of the universal X-Code distribution. This appears to be the standard for the market and saves lots of time on testing. * Add a new '-it' command to the Windows version which makes it possible to install and start a service as a single command. * Fix a problem where the PATH environment variable was not being set correctly on Windows versions when run as a service if the wrapper.ntservice.account was set and a PATH was set for both the SYSTEM and user accounts. Bug #1702274. * Modify the shell script to set JAVA_HOME to the default JVM location on OSX systems if it is not already set. OSX always places the JVM in a known location so this is possible. Thanks to Andrew Williams for the patch. * Fix a problem where the UNIX shell script would fail if the APP_NAME was set to a value containing spaces. Thanks to Andrew Williams for the patch. Bug #1695678. * Fix a problem where the DIST_ARCH was not being resolved correctly on HP-UX systems. Thanks to Matej Kraus for the patch. Patch #1697421. * Log output from the timer thread was not being queued correctly, this could have lead to timing problems if there were any delays writing to disk. * Add partial support for OS/400 into the build file. Still needs a Makefile. * Fix a problem where the WrapperActionServer would deadlock in its stop method if the JVM shutdown was initiated by a call to the shutdown or restart actions. * Add support for wrapper.console.title on UNIX platforms. Add a set of wrapper.console.title. properties which make it possible to set the title based on the platform. * Fix a problem where the wrapper.ntservice.account and wrapper.ntservice.password properties were being stored in the system registry if the they were specified on the command line when the Wrapper was installed as a service. This was broken in version 3.2.2. Bug #1538725. * Fix a problem where the DUMP command was not working with the wrapper.commandfile property when run as a service on Windows. Bug #1644421. * Fix a problem where wildcards like "*.*" or "*" in a classpath property were including the "." and ".." files on Windows versions. Bug #1517928. * Modify the debug log output when the Wrapper is attempting to load its native library in an attempt to make the expected failures less threatening. * Commit a patch by Rob Oxspring which adds the start_msg and stop_msg commands to the shell script. These are expected by init scripts on HP-UX. Patch #1750027. * Add a DETAIL_STATUS flag to the UNIX shell script which will cause the status, start_msg, and stop_msg commands to display the current internal status of both the Wrapper and Java processes. * Commit a patch by Rob Oxspring which adds an init block to the UNIX shell script to make it work with install_initd and remove_initd scripts used by SUSE linux. Patch #1750028. * Commit a patch by Travis Carlson, ia64 systems were being grouped as "x86" systems. They now are assigned the name "ia" which makes it possible to create a distribution for them. Patch #1663887. * (Standard, Professional) Add new wrapper.java.initmemory.percent and wrapper.java.maxmemory.percent properties which make it possible to set the initial and maximum memory values relative to the amount of physical memory on the system. Feature Request #1741051. * Add a new #include.debug declaration in the wrapper configuration file which makes it much easier to debug problems with cascading include files. * Add -l and --controlcode commands to the Windows version which make it easy to send user defined control codes to the Wrapper running as a service. * Fix a synchronization problem in the logging code which could result in data corruption or access violations. * Add version numbers to the bat and sh scripts to make them easier to support. * Make the wrapper.ntservice.name, wrapper.ntservice.displayname, and wrapper.ntservice.description properties aliases of new wrapper.name, wrapper.displayname, and wrapper.description properties as they are now used on UNIX platforms as well as Windows. * Fix a problem where the wrapper would sometimes fail to send a packet to the JVM because the sending of the packet would block. Thanks to Peter Gorgon for the patch. * Fix a problem where CPUs identifying themselves as 'ia64n' or 'ia64w' were not correctly being categorized as 'ia'. Thanks to Stirling Chow for the patch. Patch #1859412. * Add -d and --dump commands to the Windows version which make it possible to send thread dump requests to the Wrapper when running as a service. Works in association with the new wrapper.thread_dump_control_code property. Feature Request #1118110. * (Professional) Add wrapper.timer..interval and wrapper.timer..action properties which make it possible to schedule Wrapper shutdowns, JVM restarts and thread dumps at arbitrary times. * Fix a problem where the default configuration file name was being corrupted by a buffer overrun. Thanks to Rob Joyce for the patch. Patch #1879049. * Fix a problem where the WrapperManager would sometimes attempt to unregister its shutdown hook after the shutdown hook had been initiated. Bug #1799489. * Fix a problem where log files were limited to 2GB on Linux systems. Bug #1881038. 3.2.3 * Add support for x86 Mac OS X distributions. * The 3.2.2 Windows version was accidentally released with its MFC libraries dynamically linked. This meant that anyone who did not have VS8 installed were not able to run the Wrapper due to missing DLLs. This version fixes that snafu by correctly using statically linked libraries as was done in previous versions built with VS6. Bug #1578554. 3.2.2 * Correct a typo in the usage output of the WrapperStartStopApp. Thanks to Michael Giroux for pointing it out. * Fix a problem on OSF1 systems where the backend socket was not listening correctly due to a backlog of 0. This was broken in 3.2.0. Thanks to Phillip Gussow for supplying a patch. * Remove the com.silveregg.wrapper package classes that were deprecated in version 3.0.0. * Fix a potential problem in the UNIX script where the lock file permissions were not being set correctly if the LOCKFILE and RUN_AS_USER variables are specified but the group of the specified user could not be resolved. * Fix a problem where the exit code returned by WrapperListener.stop was being ignored in some cases. * Fix a problem where the shell script would not work correctly when the wrapper or its configuration files were located in a directory path containing spaces. * Apply a series of patches by Michael Saya to get the Windows 64 bit build working. * Fix a problem in UNIX versions where the SIGTERM handler was being disabled when a SIGCHLD was received. * Added support in UNIX versions for the SIGHUP signal. * Migrated the source to Subversion from CVS. Did a bunch of cleanup in the source, removing CVS specific tags. * Fix a problem in UNIX versions were the pid file specified by the wrapper.java.pidfile property contained the wrapper pid rather than the jvm pid. Bug #1565011. * Fix a problem in UNIX versions where the file specified by the wrapper.java.pidfile property was not always being deleted when the JVM process went away. * A user encountered a JVM bug where calls to System.exit were resulting in an IllegalThreadStateException being thrown. Added some code to trap this and shut down the JVM using other means to avoid a hang during shutdown. * Fix a NullPointerException caused by users incorrectly implementing an Integration Method #3 class and then calling WrapperManager.start with a null value for the args parameter. * Update the banner displayed by the Wrapper on startup to include a copyright notice. Please see the license page of the documentation for details. * Add a new 'Z' log format which will log the time to millisecond accuracy. * Fix a problem where the JVM exit code was not being set correctly when the JVM was shutdown using WrapperManager.stopImmediate(). The exit code of the Wrapper was being set correctly through other means however. * Fix a potential synchronization problem in the logging code if a JVM exits with debug output enabled. * Updated the WrapperListener.stop method javadocs to better explain the exitCode value under certain exit modes. * On UNIX versions, add a log message which records the signal that caused the JVM process to exit when it terminates unexpectedly. * Fix a problem where the wrapper.on_exit. property was not working correctly in some cases on UNIX. With help from Andreas Schafer. * Add support for building the Wrapper with Visual Studio 8 for Windows. Releases will now be done using this compiler. * Fix a CRITICAL bug in the 3.2.0 and 3.2.1 Windows versions of the Wrapper where the Wrapper would crash under rare circumstances when running as a service. If the service manager interrogated the service at the same instant as the wrapper was pinging the JVM, the wrapper was sometimes crashing due to a synchronization problem. The problem did not exist prior to 3.2.0. Bug #1574537. * Fix a minor logging problem where the 'D' format was not displaying the correct thread name for queued log messages. 3.2.1 * Fix a problem with the solaris-sparc-64 makefile. * Add a solaris-x86-64 makefile. * Merge in a patch by Hugo Weber to make it possible to configure the Wrapper to pull the JRE from the system registry on windows. * Fix a batch file bug added in 3.2.0 where the scripts would not function correctly if the full path to the batch file contained spaces. Bug #1450601. * Modify the message shown when a native library fails to load so the exception message text is now shown in the log without having to enable debug log output. * Modify the UNIX shell script to be more informative if the script is unable to locate a wrapper binary due to a executable bit permission problem. * Fix a minor permission problem with the build for the delta-pack. * Commit a patch by Juergen Hermann to make the error shown when realpath fails clearer. * Add the ability to use a default wrapper.conf file that is in the same directory as the wrapper binary. The file will be named based on the name of the wrapper binary. * Synchronize the command line so that both the Windows and UNIX versions are now the same. The old command line syntaxes are now supported everywhere so there will be no compatibility problems. * It is no longer possible to specify arguments using the '/c' syntax. This was undocumented so hopefully it is not being used. The documented '-c' syntax must now be used. The change was necessary to synchronize the command line between UNIX and windows platforms. * The 32-bit HP-UX 3.2.0 build was generating a libwrapper.so file rather than libwrapper.sl. * Make the WrapperManager.setConsoleTitle, getWrapperPID, and getJavaPID methods available through JMX. * Fix a state engine problem introduced in 3.2.0 which was causing the wrapper.on_exit. properties to be ignored in most cases. * Fix a potential problem that could have caused crashes when debug logging was enabled. * Fix a problem where signals were not being handled correctly on some UNIX platforms, including AIX. This was making it impossible to shutdown the wrapper cleanly with the TERM signal. Bug #1477619. * Add new default environment variables which can be referenced in a configuration file to configure platform specific directories and file names. WRAPPER_OS, WRAPPER_ARCH, and WRAPPER_BITS. * Add a -v argument to make it possible to request the version from a wrapper binary. * Add support for registering the WrapperManager MBean with the PlatformMBeanServer when run on a 1.5+ JVM. See the JMX section in the documentation for details. * Rework the way timeout properties are handled. Values of 0 now actually disable the timeouts rather than setting them to a large value. To avoid overflow problems when converting to internal timer ticks, timeouts are now restricted to a maximum of 20 days, or 1728000 seconds. Change affects the wrapper.cpu.timeout, wrapper.startup.timeout, wrapper.ping.timeout, wrapper.shutdown.timeout, and wrapper.jvm_exit.timeout properties. For values less than 20 days, there should be no change in functionality. * Add support for debuggers. The Wrapper will now show a warning on startup and then again the first time a timeout occurs. But all timeouts will be ignored. This is to avoid problems with the Wrapper restarting a suspended JVM in the middle of a debugging session. The wrapper enters this mode if the wrapper.java.command ends with the string "jdb" or "jdb.exe", or the "-Xdebug" parameter is passed to the JVM. * Add 'athlon' to the list of supported architectures. * Fix a problem where the environment variables loaded when a service was started were always the system environment even if the service was running as a specific account. The environment of a specific account will now be loaded on top of the system environment if the USERNAME environment variable is set by the system. Bug #1491138. * Added new wrapper.ntservice.pausable and wrapper.ntservice.pausable.stop_jvm properties to make it possible to pause and resume the Wrapper when installed as a Windows service. * Added new Pause and Resume batch files as well as modified the command batch file to support pause and resume. * Added PAUSE and RESUME commands for use by the wrapper.commandfile property. * Fix a problem with the wrapper.pidfile, wrapper.java.pidfile, wrapper.anchorfile, wrapper.commandfile, wrapper.statusfile, wrapper.java.statusfile, wrapper.java.idfile, and wrapper.lockfile properties where forward slashes in paths were not being changed to back slashes on Windows versions. * Simplify the code used to load a native library by using the System.mapLibraryName method rather than doing the same thing manually. * Add a new wrapper.syslog.facility property which makes it possible to specify the syslog facility on UNIX systems. Thanks for the patch from Bruce Pennypacker. * Removed the custom thread counting used to keep track of when the wrapped Java application has completed. It is now done in a different way that will work on all Java implementations without requiring any special consideration of the current JVM. Deprecated the wrapper.monitor_thread_count and wrapper.thread_count_delay properties. Bug #1470265. * The WrapperStartStopApp helper class still requires thread counting if the stopWait parameter is set to true. Previous versions all hardcoded the system thread count to 1 which worked for most JVMs. A new system property, org.tanukisoftware.wrapper.WrapperStartStopApp.systemThreadCount, was added to make it possible to customize. It currently defaults to 1. * Make it possible to extend the WrapperSimpleApp and WrapperStartStopApp helper classes. Feature Request #1510274. * Add warning messages if the old org.silveregg.wrapper package classes are still being used. They will be removed in the next release. 3.2.0 * Rework the release cycle so that the wrapper.jar file released for all platforms is now built on the same machine. This resolves a few incompatibility problems caused by jars built on very new JVMs but run on old JVMs. * Add additional output when the JVM can not be launched due to security restrictions on Windows. * Greatly improved the performance of file logging. On a windows test machine 3.1.2 could log 67210 lines of output in 20 seconds with a 80-15% split between the Wrapper and JVM process CPU usage. It now outputs 215214 lines with a 64-34% split, also showing less load on the system process. This is a 220% increase in performance. In both cases, the JVM was completely idle other than the console output which makes the Wrapper appear to be a bit of a CPU hog. In fact it is the only process doing any work in this case. This improvement was accomplished by keeping the log file open unless idle. The idle time can be controlled using the new wrapper.logfile.inactivity.timeout property. The speed increase on UNIX platforms was much smaller at around 10%. * Add a new property, wrapper.disable_restarts, which will completely disable the Wrapper's ability to restart JVMs. * Add a pair of new properties, wrapper.port.min and wrapper.port.max, which make it possible to define the port range used when a specific wrapper.port is not specified. * Fix a problem where certain characters like umlauts were being stripped from property values. Bug #1049528. * Make the PIDs of the Wrapper and Java process easier to access by providing a new pair os system properties; wrapper.pid and wrapper.java.pid, as well as a new pair of methods; WrapperManager.getWrapperPID() and WrapperManager.getJavaPID(). * Add a new WrapperEventListener class which can be implemented to receive a wide variety of events from the Wrapper. * Add a WrapperServiceControlEvent class which will report any service control codes received by the Wrapper as it is running as an NT service. This was added to make it possible for other applications to sent custom codes to the Wrapper using the Window Service Manager. * Add a WrapperManager.listServices() method which can be used to obtain the status of all services on a Windows system. * Add a WrapperManager.sendServiceControlCode() method which makes it possible to start, stop, pause, continue, any service on Windows systems. It is also possible to send custom user codes via the service manager. * Add comments in the sh script to support the chkconfig command. * Implement the ability to read from standard input via System.in. Feature Request #1024693. * Made the tick based timer the default by changing the default value of the wrapper.use_system_time property to false. Most users should see an improvement in reliability under heavy loads with this new setting. If you have extended any timeouts in the past, you may wish to try going back to defaults as they may no longer need to be extended. * Add a new wrapper.restart.reload_configuration property which causes the Wrapper to reload its configuration file immediately before a JVM restart. Properties which can not be reloaded have comments stating that fact in their documentation. Feature Request #981060. * Fix a problem in the UNIX shell script which was preventing the script from locating the PID and anchor files when the wrapper.working.dir property was used. * Modify UNIX versions so that the wrapper binary will now force its working directory to the location of the wrapper binary. This change was made to make the UNIX version work the same way as the Windows version and thus make configuration files that modify their working directory work correctly on a cross platform basis. Users which have been using the scripts supplied with the Wrapper should not encounter any problems. Other users may require slight changes to their configuration file to deal with the new way that the Wrapper deals with its initial working directory. * Add a new method WrapperManager.getProperties() which makes it possible to access any property in the Wrapper configuration file. * Fix a problem where TERM signals were not being correctly ignored by the JVM process on UNIX platforms even if the wrapper.ignore_signals property was set to true. Earlier versions of the Wrapper would generate a WRAPPER_CTRL_SHUTDOWN_EVENT when a TERM signal was received. On Windows that signal should never be ignored. To resolve this a new WRAPPER_CTRL_TERM_EVENT was added making it possible to selectively ignore the TERM signals. This change may affect user implementations of the WrapperListener.controlEvent() method. Bug #1086344. * The Windows version has a feature which allows the user to immediately kill the Wrapper and its Java application without waiting for a clean shutdown by pressing CTRL-C twice. Windows sends the CTRL-C signal to both the Wrapper and Java processes. Due to a rare timing problem, it was possible for the Java process to get the signal first and initialize a shutdown before the Wrapper could respond to the signal. In this case the Wrapper was interpreting this as a second CTRL-C signal even though the user only pressed it once. * If the wrapper.anchorfile or wrapper.pidfile properties are used on Windows they were being unintentionally deleted if the -t, -p, -i, or -r commands were used while another Wrapper instance was running. In the case of the anchor file, this would result in the Wrapper being shutdown unintentionally. This was not an issue on non-Windows versions. Bug #1108517. * Fix a security problem where the value of the wrapper.ntservice.account and wrapper.ntservice.password properties were being stored in plain text within the registry if they were specified on the command line when installing the Wrapper as a Windows service. Bug #1110183. * Add a pair of properties wrapper.ntservice.password.prompt and wrapper.ntservice.password.prompt.mask which which will cause the Wrapper to prompt the user for an account password when it is being installed as an NT service. * Added system properties to make it possible to configure whether or not the WrapperSimpleApp and WrapperStartStopApp helper classes will wait for the configured main methods to complete before reporting that the application has started. See the javadocs for these classes for more details. * Modify the HP-UX build so that it now dynamically links with the pthread library. This was to make the binaries work with HP-UX 11.00. Thanks to Sun Kun Choi for the patch. * Add new wrapper.statusfile and wrapper.java.statusfile properties which can be used by external applications to monitor the internal state of the Wrapper or JVM at any given time. These will not be useful to most users. * Add a new wrapper.commandfile property which can be used by external applications to control the Wrapper and its JVM. * Add a new wrapper.java.idfile property which can be used by external applications to monitor the internal state of the JVM at any given time. * Add a warning on startup if the JVM has a SecurityManager set but the wrapper.jar has not been granted the AllPermissions permission. Failure to do so will almost certainly lead to the Wrapper throwing a number of errors and this helps to point out the cause. * Add a security model which protects most Wrapper method calls when a SecurityManager has been registered. See the Security Model section for more details. * Add a new pair of batch files which can be used to start and stop the Wrapper when installed as a service. * Add new -q and -qs commands to the Windows version of the Wrapper which make it possible to query the currently installed status of the service. * Fix a problem where the wrapper.java.library.path.append_system_path property was not working correctly on Windows when the system PATH contained quotes. Bug #1238726. * Modify the usage output of the Wrapper on all platforms so the Wrapper's version is now included. It was not previously possible to get the version of the Wrapper being used without launching a JVM. * Add a pair of new methods WrapperManager.stopAndReturn() and WrapperManager.restartAndReturn() which make it possible for code to stop or restart the JVM and then continue until the JVM is shutdown. This can be useful for shutdowns initiated within places like servlets, whose operation is expected to complete. * Fix a problem on UNIX where the child JVM was sometimes leaving around zombie processes after a restart. The SIGCHLD signal was not being handled correctly. Thanks to Traun Leyden for the patch. Bug #1291201. * Implement the ability to catch control events using the WrapperEventLisener. Feature Request #836975. * Add new wrapper.jvm.port, wrapper.jvm.port.min, and wrapper.jvm.port.max properties which make it possible to control the port the JVM uses to open a connection back to the JVM. The Wrapper uses to leave this up to the OS, but some users were having problems with the default conflicting with other ports. * Switch from using ftime() to gettimeofday() on UNIX platforms to work around a problem where the Wrapper would not run on new versions of OSX because they deprecated the ftime() function call. Thanks for the patch by Michael Macaluso. Bug #1313162. * Remove the shutdown timeout from the UNIX shell script. It is not needed and can cause a zombie JVM if the wrapper's internal shutdown timeout was longer than that of the shell script. * Add the ability to specify integer property values in base 8 or 16 in addition to base 10. Base 8 values start with a '0' and base 16 values start with a '0x'. * Make it possible to set the umask on all files created by the Wrapper as well as the default umask of files created by the JVM. Added new wrapper.umask, wrapper.java.umask, wrapper.pidfile.umask, wrapper.lockfile.umask, wrapper.java.pidfile.umask, wrapper.java.idfile.umask, wrapper.statusfile.umask, wrapper.java.statusfile.umask, wrapper.anchorfile.umask, and wrapper.logfile.umask properties. * Improve the message when the native library can not be loaded to make mention of the possibility of a 32/64 bit mismatch. * Add a new wrapper.monitor_thread_count property which makes it possible to disable the Wrapper's counting of non-daemon threads and thus the shutting down of the JVM when they have all completed. * Add support for BELOW_NORMAL and ABOVE_NORMAL options to the wrapper.ntservice.process_priority property. Feature Request #1373922. * Ignore '#' characters which are included within double quotes in the value of a property in the configuration file. Unquoted values must be escaped with a second '#' characters or it will be interpreted as a comment. * Display the Wrapper banner in the JVM earlier so that it is displayed even where there are startup errors. * Modify the WrapperSimpleApp and WrapperStartStopApp classes so that the WrapperManager is always initialized immediately. This makes the output clearer in the event of startup errors. * Fix a problem where the Windows ServiceManager was not correctly reporting a startup error if a service failed on startup. The service was being reported as having started even though it failed to start. * Fix a problem on UNIX versions where the Wrapper would go into a recursive state of attempting to launch the JVM from failed child processes if there was any problems executing the configured java process. * Rework the way the RUN_AS_USER setting in the UNIX shell script works so the specified user is now set regardless of the command being executed. To make sure the user never has to enter the password twice when running the script, it now recurses after changing the user. The script then runs entirely as the configured user. * Improve the message that is displayed when attempting to start, stop, or remove a windows service which is not installed. * Add new wrapper.lockfile property which makes it possible to specify a lock file containing a pid. * Modified the sh script so it now creates a lock file on startup in the /var/lock/subsys directory if it exists. This is needed by fedora systems on shutdown. * Store javadocs in tar distibutions in a nested tar file to avoid problems with long filenames in some tar distributions. * Fix a problem with the WrapperSimpleApp and WrapperStartStopApp helper classes where on heavily loaded systems it was possible for the Wrapper to get a running thread count of 0 and shutdown before the main thread had a chance to be started. * Add a new wrapper.thread_count_delay property which will force the WrapperManager to wait the specified number of seconds before it begins to check the number of running threads. * Fix a problem where the wrapper.java.library.path.append_system_path property was appending the PATH rather than the LD_LIBRARY_PATH environment variable on Unix systems. PATH is correct for Windows systems. * Add a new wrapper.logfile.rollmode property which makes it possible to control how and when the logfile is rolled. Feature Requests #864463, #1085097, and #1085850. * Fix a problem on Linux where the test for the status of the Java child process would sometimes fail causing the Wrapper to shutdown with the error "Critical error: wait for JVM process failed (No child processes)" rather than restart the child JVM. Users who encountered this problem found it easy to reproduce, but it only happened on some systems. * Modify the way the UNIX shell script tests for the existence of a process matching the pid in an existing pid file. It now verifies the process command as well as the pid to fix a system reboot problem where a stale pid has been reused by another application, making the script think the wrapper was already running. * Add support for the GNU libjcj JVM. Like JRocket, it requires slightly different thread counting. * Add support for Linux 64-bit PPC and Solaris 32-bit x86 versions. * Add a new set.default.ENV syntax to the configuration file making it possible to environment variable values which do not overwrite existing values, ie. to specify a default value. * Added a new wrapper.console.flush property which forces the wrapper to explicitly flush stdout after each line of log output. * Change the error shown when the JVM shuts down prematurely during a shutdown to a warning message. * Fix a problem where the Wrapper would show the following error message if user code called System.exit from within the WrapperListener.stop callback method. This would happen if the stop class's main method registered with the WrapperStartStopApp called System.exit. "JVM exited unexpectedly while stopping the application." Bug #945976. * Add a new wrapper.syslog.ident property which makes it possible to specify the identity used in syslog entries on UNIX. This was possible in older versions but was set using the wrapper.ntservice.name property. Bug #1432855. * Add support for MacOSX Universal Binary distributions. * Add support for Delta Pack distributions. This is a distribution that contains the binaries of multiple platforms. 3.1.2 * Modify the way boolean system properties are resolved by the WrapperManager so it is now possible to set them to true or false rather than assuming they are true if set. * Fix a problem where some localized error messages were not having their tokens replaced correctly. * Fix a problem when using the WrapperStartStopApp helper class. The usage text was incorrectly being displayed in the console if an exception was thrown while executing the main method of the configured stop class. This did not change the functionality of the application, but it did cause some confusion. * Fix a problem on Windows where a library path or class path which ended in a backslash was preventing the Wrapper from launching the JVM. The Windows OS was using the backslash to escape the quote used to close the path. The fix was to add a second backslash where needed. * Added a new wrapper.java.command.loglevel property which makes it possible to control the log level of the generated java command. * Add support for escaped quotes when stripping quotes on UNIX for the wrapper.java.additional. and wrapper.app.parameter. properties. * Change the default value of wrapper.jvm_exit.timeout from 5 to 15 seconds. The old default was too fast for some applications which take a while to exit. Applications which were exiting promptly will not see any difference. * Fix a problem where the JVM would restart at certain times when using the system time based timer due to an overflow error. This problem was introduced in 3.1.0. Due to a separate bug in 3.1.0, the Wrapper would shutdown rather than simply restarting the JVM as was happening in 3.1.1. The last restart happened on Aug 21, 2004. It will next occur Oct 10, 2004 and repeat at regular intervals. There are no problems when using the new Tick based timer. Bug #1014405. * Correct the wrapper.logfile.maxsize property so that a a kilobyte is now 1024 rather than 1000, and a megabyte is a megabyte. We aren't a hard drive manufacturer after all. * Add try-catch blocks around all thread entry points in the Windows version. This has always been done in the main function, but these blocks will help to narrow down the cause of problems should they ever be encountered in control or service handlers. * Centralize shutdown code on UNIX version in an appExit method as was already being done for Windows versions. * Fix a problem where the build.sh was not correctly using the included ant if an ANT_HOME environment variable was defined. * Add a new wrapper.single_invocation property which will prevent multiple invocations of an application from being started on Windows platforms. The shell script handles this on UNIX platforms. Feature Request #889123. * Fix a crash problem introduced in 3.1.1, caused by a pair of uninitialized pointers. The crash was possible on all platforms but would only happen if the Wrapper was started without any arguments. It would not affect users running the Wrapper normally. Bug #1018481. * Fix a problem with the run as user feature of the shell script on Solaris. Needed to be using /usr/xpg4/bin/id rather than /usr/bin/in if available. Bug #1024008. * Replace calls to usleep with nanosleep on platforms where it is available. This was to fix an occasional hang on a specific Solaris machine. It would occasionally hang on calls to usleep. From research, it appears that usleep has problems when signals are encountered while sleeping. Still testing whether or not this change solved the problem. * Upgrade the version of Ant included with source releases to 1.6.2 to fix some problems generating jni headers when building with Java 1.4.2. * Upgrade the version of Cocoon included with source releases to 2.0.4 to fix some problems generating documentation using Java 1.4.2. * Display a warning if the exit status of a JVM process ever returns the STILL_ACTIVE status on Windows. There was no known problem here, just noticed it while looking over the code. * Display a descriptive error message on Windows if the the JVM process crashes due to an uncaught exception in native JVM code. * Add a test for invalid jvm arguments set using the wrapper.java.additional. properties. Invalid arguments could cause the Wrapper startup to fail in non obvious ways if they are mistaken by the JVM as the main class. 3.1.1 * Modified the way libwrapper.so is built on Solaris and Linux so that it no longer statically links its required libraries. * Fix a file handle leak when calling WrapperManager.getUser or WrapperManager.getInteractiveUser on Windows platforms. * Fix a problem introduced in 3.1.0 where the JVM would not be restarted correctly if it quit after a ping timeout to let the Wrapper resynch and restart it. * Fix a problem where CTRL-C was not being handled correctly if the console was configured to be shown when running as an NT service. * Fix a problem where signals fired at UNIX versions of the wrapper were not being handled correctly when the tick timer was being used. * Fix a synchronization problem in the logging code which would occassionally cause the Wrapper to crash with an Access Violation. The problem was only encountered when the tick timer was enabled, and was only seen on multi-CPU systems. Bug #949877. * Fix a problem when using the tick timer where the Wrapper would sometimes exit on startup due to an uncaught SIGALRM. Only reported on multi-CPU Solaris systems. * Fix a problem where the Wrapper would sometimes hang on shutdown if another thread called System.exit while the Wrapper was shutting down. Bug #955248. * Fix a problem introduced in 3.1.0 where a very very large CPU timeout warning message was being displayed if the system time was set back while using the default system timer. * Added a new property, wrapper.anchorfile, which makes it possible to cause the Wrapper to shutdown by deleting an anchor file. The UNIX sh script has been modified to optionally make use of this feature. * Add a debug message at startup which makes it clear which timer is being used. * A Windows user reported that using forward slashes in the path the log file was failing. Avoid this problem by always converting '/' to '\' in the wrapper.logfile property on Windows. * Fix a problem where it was not possible disable the wrapper log file as documented in the wrapper.logfile property. Most likely broken way back in version 2.2.5. * Add some additional error checks after calls to control the pipe between the JVM and Wrapper as well as improving the messages around other socket related error messages. * Fix a problem on some HP-UX systems were not working correctly because the EAGAIN and EWOULDBLOCK constants are not equal with some compilers. * Change some of the defaults in the src/conf/wrapper.conf.in file which ships with the Wrapper to avoid confusion with new users. * Rewrote the routine which reads and logs console output from the JVM for Windows versions. Internal buffers are now scaled dynamically, fixing a problem where long lines were being wrapped at 1024 characters. This rewrite also resulted in a 4 fold increase in speed when the JVM is sending large quantities of output to the console. * Increase debug output on UNIX platforms when a signal is caught. When possible, information about where the signal came from is now logged. * Modified the way log output from within signal handlers is handled so it is now queued and then logged by the main event loop. * Back out a 3.1.0 change where a JVM that had failed to exit cleanly was sent a SIGTERM prior to a SIGKILL. The SIGTERM made no difference and slowed down the forced shutdown. A modification to the event loop made the functionality more difficult to implement. * Add the ability to set the user that the Wrapper and its JVM will run as from within the sh script on UNIX platforms. * Add an icon resource to the Wrapper binary on Windows versions. * Fix a typo in the UNIX sh script which caused an extra slash to be included in the path of the pid file. Was not causing any known problems. * Added support for 64-bit HP-UX. Big thanks to Venkatesh Sellappa for supplying the patch. * Fix a deadlock problem introduced in 3.1.0 with some FreeBSD systems. Not all users were experiencing it, but those who did were able to reliably reproduce the problem. The problem appears to have been caused by FreeBSD bug #kern/64313. * Make the signal handling variables in the wrapper native library volatile. Directly this was to fix a compiler warning on HP-UX64 systems but it should also make the calls more efficient. 3.1.0 * The license was revised for this version to include a copyright omission. This change is to be retroactively applied to all versions of the Java Service Wrapper starting with version 3.0.0. The changes should have no effect on users. * The Online documentation and web site were both reworked. The logo has been updated so that Duke is no longer used. The new online site now has the ability for users to logon and append comments to any page. * Added a new batch file which accepts commands like the UNIX shell script. The new file is offered as an alternative to the default batch files, and can be found at src/bin/AppCommand.bat.in. Thanks to Mike Castle for donating the new script. * The Windows version of the Wrapper was not correctly registering that it would accept SHUTDOWN messages when running as a service. The Wrapper was getting the message anyway so this should not change functionality. Thanks to Jason Tishler for noticing this and sending in a patch. * Add a new property, wrapper.native_library, which can be used to specify the base name of the native library which is loaded by the WrapperManager class. * Modify the WrapperManager class so it now stores references to System.out and System.err on initialization and always writes to those stored streams. This makes sure that all Wrapper console output always goes to the wrapper.log file even if user code overrides those streams with calls to System.setOut and System.setErr. This was necessary to prevent deadlocks in such user code from affecting the functionality of the Wrapper. * Fixed a problem where some environment variables where not being correctly loaded from the system registry when running as an NT service. Big thanks to Eric Smith for tracking this down and submitting a patch. It turns out that the putenv function was not being used correctly. * Modified the way the wrapper.conf file is loaded so it will now read the contents correctly even if the line feeds in the file are incorrect for the current platform. Windows line feeds had been causing problems when used on UNIX platforms. Feature Request #829896. * Added a new property, wrapper.ntservice.console, which allows a console to be displayed when running as an NT service. * Fixed a problem where the request thread dump on failed JVM exit feature had never worked when running as an NT service. Bug #831775. * Add a new property, wrapper.console.title, which makes it possible to set the title of the console in which the Wrapper is currently running. This currently only works on Windows platforms. * Added a new method, setConsoleTitle, to the WrapperManager class which enables the application to dynamically set the console title. Like the wrapper.console.title property, this only works on Windows platforms. * Improved the algorithm of the request thread dump on failed JVM exit feature so that extremely large thread dumps will not be truncated when the JVM is killed. * Fix a problem where CTRL-C was being ignored by the WrapperManager if a WrapperListener is never registered. This is not possible if the Wrapper is being used correctly but never the less a user did come across it. * Add some additional debug output to help identify the cause of problems loading the native library. * The WrapperManager class now checks to make sure that its current version matches the version of the native library and Wrapper. If there are any discrepancies found then appropriate warnings will be displayed, but the Application will still be allowed to start. This was added to make obvious the cause of problems resulting from mismatched versions. * Added a new property wrapper.use_system_time system time. By setting this property to false, the Wrapper will start using a new experimental timer which uses a background thread to manage time rather than the system time. This has a number of advantages over using the system time and should give most users even more reliable behavior when the system is under high load or there are changes being made to the system time. The timer is very critical to the operation of the Wrapper so the old behavior is left as the default for the time being until this feature has had the chance to be "time" tested. If all goes well then this will be enabled as the default in a future version of the Wrapper. A pair of related properties, wrapper.timer_fast_threshold and wrapper.timer_slow_threshold were also added to aid in debugging. * Rework the logging code so it is now thread safe. The addition of the timer thread means that there is now more than a single thread accessing that code. This was causing problems as the two threads tried to use the same buffers. As part of this change, a new format variable 'D' was added to display the thread which is doing the logging. * Fix a problem where a thread dump would be invoked if the request thread dump on failed JVM exit was enabled and the user forced an immediate shutdown by pressing CTRL-C more than once. * Add getUser and getInteractiveUser methods to the WrapperManager class to make it possible for user code to query information about the user running Wrapper or the user who is interacting with the Wrapper and its JVM. Feature Request #812175. * The Wrapper will now always exit with the exit code used to terminate the JVM whether System.exit is used or WrapperManager.stop. When running as an NT service the Wrapper now correctly returns the correct exit code to the service manager so failure recovery tools should now work correctly. Feature Request #852491. * Add a status command to the UNIX shell script which can be used to find out whether or not the wrapper is currently running. Patch submitted by Joseph Benavidez. * Modify the WrapperSimpleApp and WrapperStartStopApp so that the main method of a class is located even if it exists in a parent class rather than the class specified. * To make debugging classpath problems easier, the Wrapper now verifies all classpath entries before launching a JVM and logs debug level warnings for any entries that do not exist. * Fix a problem where it was possible to define a zero length filter that would trigger on any output. * Add some additional debug output to make it easier to debug startup, shutdown and restart problems. * Modify the way the Wrapper forcibly kills a frozen JVM on UNIX platforms so that it now sends a SIGTERM, waits up to 5 seconds, then sends a SIGKILL. * Add a new wrapper.java.library.path.append_system_path property which will cause the Wrapper to append the system path to the generated library path. Feature Request #917902. * Fix a problem where spaces around the '=' character of a property definition were rendering the property invisible to the Wrapper. Bug #916001. * Fix a problem where the first ping timeout after the JVM was started was still hard coded at 30 seconds. This was causing a combination of large values of wrapper.ping.interval and wrapper.ping.timeout to fail. * Fix a problem where the JVM would fail to shutdown cleanly if the Wrapper was asked to stop too soon after launching a JVM. This was leading to the JVM being killed after the shutdown timeout expired. Bug #917281. * Added an adviser which will print out explanatory messages to the console and wrapper log file when the Wrapper encounters a commonly made configuration mistake. This is designed to cut down on support requests by new users. Can be disabled using the wrapper.adviser property. * The bash script and the realpath utility have been deprecated since version 3.0.3. They have been removed in this release. The sh script is recommended on all UNIX platforms, and the realpath utility which was used by pre-3.0.3 bash and sh scripts has not been used since. * Add the wrapper.startup.delay property along with console and service specific variants which make it possible to configure a delay between the Wrapper being launched and the first JVM being launched. * Promote the wrapper.debug property back from being "deprecated". It has continued to be useful and deserved documentation and official status. * Add wrapper.on_exit. properties to control what happens when a exits based on the exit code. * Modify the way calls to System.in.read() are handled so that they now block rather than throwing an exception. Currently, System.in can not be used with the Wrapper because of the way I/O is passed between the Wrapper and JVM. * Modified the Windows batch files to fix a problem where the path to the Wrapper.exe contained more than one "/bin". The new batch files are much simpler and should be easier to customize if needed. Bug #925308. * Modified the wrapper.java.initmemory and wrapper.java.maxmemory properties so that they now default to a value of 0 which causes the -Xms and -Xmx parameters to be omitted from the command used to launch Java. This will cause the JVM to use its own default values and also makes it possible to specify the memory parameters using the wrapper.java.additional. properties. * Added a pair of environment variables, WRAPPER_FILE_SEPARATOR and WRAPPER_PATH_SEPARATOR, whose values are set to either '/' and ':' or '\' and ';' on startup. They can be used in the wrapper.conf file to construct platform independent property values. * Add a new wrapper.working.dir property which makes if possible to change the Wrapper and JVM's working directory to a location other than the location of the Wrapper binary. Feature Request #738160. 3.0.5 * Added support for SGI Irix. Big thanks to Andreas Wendt for supplying the patch. * Due to a bug in the build, the native library was not included in the 3.0.3 or 3.0.4 binary releases for OSX, building from source was working correctly. This has been fixed and the build greatly simplified to avoid such problems in the future. Bug #791755. * Changed the default location of the pid file generated by the sh script to exist in the same directory as the sh script rather than in the /var/run. This can be changed by setting the PIDDIR variable in the sh script used to launch the Wrapper. * Added support for the wrapper.pidfile property on the Windows platform. * Added the wrapper.java.pidfile property which will cause the pid of the java process to be written to a specified file. (WINDOWS USERS) If you are using a wrapper.conf file that was created prior to version 3.0.0 of the Wrapper, then you may have this property defined in your configuration file. You will get an error on startup if the specified path does not exist. * Stop clearing the file creation mask when the Unix version of the Wrapper is run as a daemon process. The file creation mask will not be inherited from the process which launches the Wrapper. Bug #788849. * Modify the sh script so it works on Linux, then deprecate the bash script. This means that all Unix platforms can now use the same script to control the Wrapper. Thanks to Mike Castle for the patch. The bash script can still be found in the release, but it is deprecated and will be removed in a future version. * Modified the sh script so it is now possible to set the nice priority in the script configuration block. * Remove output to System.out in the WrapperManager.requestThreadDump() method. If some JVM threads were hung while accessing the System.out object, attempting to do a thread a dump would cause the calling thread to hang as well. Thanks to Thomas Hart for the patch. * Make it obvious in the log whether or not the Wrapper was started as a daemon process on UNIX systems. * Modify the way restarts requested from the JVM, or caused by a filter are handled. The Wrapper will no longer reset the restart count in either of these cases. If an application runs for longer than the wrapper.successful_invocation_time timeout then the count will still be reset back to 0. * Added a new wrapper.ignore_signals property which makes it possible to configure the Wrapper so it will ignore CTRL-C, HALT and INT signals. * Modify the WrapperManager.isLaunchedAsService() method on UNIX systems so it now returns true if the Wrapper was launched with the wrapper.daemonize flag set. * Added a pair of MBean interfaces which allow the Wrapper to be controlled using JMX. See the new JMX section in the documentation for details. Thanks to Sal Ingrilli for help with testing. * Modify the Windows build so the Wrapper.exe and Wrapper.dll files can now be built from Ant if MSVC is installed. * Added a new wrapper.ping.interval property which lets users control the frequency that the Wrapper pings the JVM. Feature Request #607768. * When a JVM refuses to shutdown, the Wrapper can be configured to request a thread dump using the wrapper.request_thread_dump_on_failed_jvm_exit property. The Wrapper was then waiting 1 second before the process was killed. This was not always long enough, resulting in a truncated thread dump. Increased the pause to 3 seconds. Feature Request #633761. * Fix a bug where wrapper.app.parameter. and wrapper.java.additional. properties declared from the Windows command line were not correctly handling spaces in their values. Support Request #802139. 3.0.4 * Fix a problem on UNIX systems where requesting a second thread dump any time during the life of a single Wrapper process would cause the Wrapper and JVM to shutdown rather than perform the thread dump. * Fix a problem where a, user without permission, attempting to stop an application was able to delete the pid file even though they were unable to stop the application itself. This would make the scripts think that the application was stopped when was actually still running. * Fix a problem where an application was being killed prematurely if it took longer than 6 seconds to exit on its own. The scripts now make sure that an application always has enough time to shutdown cleanly. * Improve the debug output so that packet codes are now shown using a name rather than a raw number. * Reduce the frequency of "Waiting to stop..." messages displayed when removing an NT service that is currently running. Decreased frequency from once per second to once every five seconds. * Fix a minor problem where the hour in the date returned by WrapperInfo.getBuildTime() was not base 24. * Added -t and -p command line options to the Windows version of the Wrapper to sTart and stoP the Wrapper as an NT service. This can be used in place of "net start" and "net stop", which do not always work correctly when a service takes a long time to start up or shutdown. See the Launching Your Application (Win32) section for more details. * Add a new method WrapperManager.stopImmediate which will cause the JVM to exit immediately without calling any stop methods or shutdown hooks. * Add a new class, WrapperActionServer, which makes it easy to remotely control the Wrapper remotely by opening a socket and sending commands. See the javadocs of the class for more details. * Fix bug #744801. A Java GUI was not being displayed when the application was run in either console mode or as a service with wrapper.ntservice.interactive enabled. This problem was introduced in Version 3.0.0 when using 1.2.x or 1.3.x versions of Java. To use interactive services with 1.2.x or 1.3.x versions of java, please review the documentation for the wrapper.ntservice.interactive property. * Fix a problem where the JVM was not receiving CTRL-C and CTRL-CLOSE events when running under the Wrapper on Windows. This was not a problem in most cases as the Wrapper was taking care of the processing of the events. But the WrapperListener.controlEvent() method was not being called as documented. * Changed the way the WrapperSimpleApp and WrapperStartStopApp respond to control events so that the JVM will respond and call WrapperManager.stop() even when being controlled by the Wrapper. * Modified the suggested behavior of the WrapperListener.controlEvent() method. Users who have implemented the WrapperListener interface themselves should review the Javadocs. The changes are not required and applications will continue to function as they did before. * Added support for DEC OSF1 (Alpha). Big thanks to Andreas Wendt for supplying the patch. * Fix a problem where the sh and bash scripts were failing if the path to the script contained spaces. * Fix a problem where the JVM would sometimes hang when trying to shutdown if the wrapper.key parameter was passed to the JVM while not being controlled by the Wrapper. This would happen if a user copied the command from the Wrapper's debug output and attempted to run it as is without first removing the wrapper.key parameter. * Implement the ability to specify an NT service's load order group in response to feature request #764143. See the javadocs for the new wrapper.ntservice.load_order_group property for details. * Improve the error message displayed when the NT EventLog is full in response to feature request #643617. The EventLog output will now be disabled if any errors are encountered while logging events. This prevents the error from repeating. * Improve the error message displayed on Windows when the configured Java command can not be executed or does not exist. * Fix a problem where the Wrapper was leaving a pipe unclosed each time the JVM was restarted on all UNIX platforms. This was causing the Wrapper to run out of file handles. Bug #767267, discovered and patched by David Wong. * Fix a problem where the '#' character, which signifies a comment, could not be included in property values. A double hash, '##' will now resolve into a '#' within the property value. Bug #777303. * Added support for FreeBSD. Big thanks to Alphonse Bendt for supplying the patch. * Make the wrapper.port property optional. * Changed the way environment variables are loaded from the registry on Windows platforms so users will no longer get warning messages about not being able to handle very large environment variables. Prior versions could only handle environment variables whose expanded value was less than 2048 characters in length. * Fix a problem on UNIX platforms where a shell used to start the Wrapper running as a detached process would hang when the user attempted to exit the shell. Thanks to Mike Castle for this patch. 3.0.3 * Added support for Mac OS X. Big thanks to Andy Barnett for supplying the patch. * Fix a segmentation fault on UNIX systems when the first console output from the JVM was an empty line. Thanks to Mike Castle for finding this. * Fix a problem where a 0 length malloc was being called if there were no configured filters. This was fine on most platforms but caused a crash on MAC OS X. * Rework the initialization of the bash and sh scripts so that they will work correctly when referenced as symbolic links. Thanks go out to Richard Emberson for the code to resolve symbolic links. * Deprecated the realpath binary in the *NIX distributions as it is no longer used by the bash or sh scripts. It is being left in for now so as not to break the build scripts of other projects, but it will be removed after a couple more releases. * Added a test to make sure that wrapper.ntservice.interactive is not set to TRUE when an account is specified using wrapper.ntservice.account. 3.0.2 * Modified the sh and bash scripts so that console log output is disabled by default when the scripts are launched with the 'start' action. Running with the 'console' action will still send output to the console. Logging to the file is still enabled. * Modified the wrapper.ping.timeout property so it also controls the ping timeout within the JVM. Before the timeout on responses to the Wrapper could be controlled, but the ping timeout within the JVM was hardcoded to 30 seconds. * In the last release, some work was done to avoid false timeouts caused by large quantities of output. On some heavily loaded systems, timeouts were still being encountered. Rather than reading up to 50 lines of input, the code will now read for a maximum of 250ms before returning to give the main event loop more cycles. * Fix a problem where the values of environment variables set in the configuration file were not correct when those values included references to other environment variables. * Fix a potential buffer overflow problem if configuration properties referenced extremely large environment variables. * Fix a potential problem where the inability to expand very large environment variables would have led to an access violation when run as an NT service. * Add some extra checks in the event where the native library can not be loaded so that the WrapperManager can differentiate between the library missing and not being readable due to permission problems. * Remove the wrapper.ntservice.process_priority from the default wrapper.conf because its use can produce unexpected results if used improperly. Please see the property documentation for details. * Fix a problem where environment variables in the registry which had no value were causing the Wrapper to crash with an access violation. This was introduced in version 3.0.0 with the feature to load environment variables from the registry. The offending registry entry was WV_GATEWAY_CFG which appears to be related to Oracle. 3.0.1 * Fix a problem with the wrapper.disable_shutdown_hook. Due to a typo in the source, the property was being ignored. This was broken in the 3.0.0 release. * Fix a problem with the HP-UX release build reported by Ashish Gawarikar. * Add the ability to set environment variables from within the configuration file or from the command line. * Fix a problem on HP-UX and AIX machines where the stop() function in the shell scripts was causing a syntax error due to a conflict with a like named shell command on those platforms. This appears to be an issue with the Korn shell on all platforms. * Fix a problem where very heavy output from the JVM can cause the Wrapper to give a false timeout. The Wrapper now only reads 50 lines of input at a time to guarantee that the Wrapper's event loop always gets cycles. * Fix a problem on UNIX versions where extra line breaks would sometimes be added to the logged output when there was large amounts of output being sent from the JVM. * Fix a problem where a large number of calls to WrapperManager.log() immediately before the JVM exits could lead to the Wrapper incorrectly reporting that the JVM exited unexpectedly. 3.0.0 * Deprecated the com.silveregg.wrapper package in favor of org.tanukisoftware.wrapper. The classes and interfaces in the silveregg package will continue to function, but migration to the new package should be done when possible. See the project history for details. * On Windows systems change any forward slashes in the wrapper.java.command property to back slashes. Some users had reported having problems on Windows XP. * Implemented feature request #633178. Added WrapperManager.requestThreadDump() to force the current JVM to immediately perform a thread dump. * Fixed bug where wrapper.logfile.maxsize was being set to 0 if the 'k' or 'm' unit was omitted. * Add the ability to specify an account name and password when installing an NT service. * Add a property, wrapper.ntservice.interactive, which makes it possible to control whether or not the Java process can gain access to the desktop while it is running as an NT service. * Add limited support for 1.2.x versions of Java. Shutdown hooks are supported until Java 1.3 so those functions will be disabled. If the application displays a GUI then Java 1.3 should be used as the GUI can not currently be displayed when using Java 1.2.x. * Made it possible to use the wrapper.pidfile property on all *nix platforms. Please notice that the property has been removed from the default wrapper.conf file. The property is not needed when the wrapper is launched with the bash shell script. The sh shell script will set the wrapper.pidfile when the wrapper is launched. If either of the scripts provided with the Wrapper distribution are used then the wrapper.pidfile should always be removed from your wrapper.conf file. * Added a new wrapper.daemonize property which, when set, will form the wrapper process to be a detached non-session group leader. This makes it possible to launch the wrapper in such a way that it will not be terminated when the user launching the process logs out. This had been a problem on Solaris systems when using the sh shell. The default sh and bash scripts both make use of this in the default. Please update your scripts for use with this version. Thanks to Rajiv Subrahmanyam for the patch. * Fix a problem where the Wrapper was incorrectly counting the number of non-daemon threads in BEA's JRockit Virtual Machine. This was causing the application to shutdown when the non-daemon thread count dropped to 1. * Added support for building the wrapper on AIX and HP-UX systems. Thanks for the patches involved go out to Ashish Gawarikar and William Lee. * Implement feature request #653131 to force the JVM to immediately exit when the user presses CTRL-C multiple times. * Added a 'console' action to the bash and sh scripts to make it possible to launch the Wrapper in the current shell process. The 'start' task will launch the Wrapper as a spawned daemon process. * Fixed a problem where missing environment variables specified in classpath or library path properties were not being handled correctly. * Implemented feature request #676599 to enable the filtering of JVM output to trigger JVM restarts or Wrapper shutdowns. See the new wrapper.filter.trigger.n and wrapper.filter.action.n properties. * Modify the Win32 version of the Wrapper so that Environment Variables are always read from the system registry when the Wrapper is run as a service. By doing this, it makes it possible to change or add the system environment variables and have them take effect without having to first reboot the machine. * Implemented cascading configuration files. * Changed the default value for the wrapper.java.initmemory property to be 3Mb. The default on Windows and Linux JVMs is 2Mb, but the Solaris JVM requires a minimum of 3Mb. The minimum value accepted by the Wrapper was changed from 8Mb to 1Mb to make it possible to reduce the footprint of applications to what is possible without using the wrapper. * Improve the parsing of configuration files so that leading and trailing white space is now correctly trimmed. It is also now possible to have comments at the end of a line containing a property. * Modify the way exceptions thrown by an application's main method are presented to the user by the WrapperSimpleApp and WrapperStartStopApp so they no longer look like a problem with Wrapper configuration. 2.2.9 * Added a new property, wrapperper.restart.delay, which allows the user to control the amount of time to pause between a JVM exiting and a new JVM being launched. * Fixed bug #611024. The Wrapper would sometimes fail to start if wrapper.max_failed_invocations is set to 1. * Fix a problem where the number of non-daemon threads was not being calculated in some cases. * Implemented feature request #491443. Environment variables referenced in the wrapper.conf file will now be evaluated as the file is loaded. The windows syntax for environment variables is used on all platforms to make them platform independent. * Fixed a problem where the wrapper.conf was being open with both read and write locks when a read lock is all that is needed. Made the wrapper fail on startup if another application held a read lock on the conf file. * Modified the message displayed when the native library could not be found, so that it is much more descriptive. Hopefully it will cut down on questions caused by configuration problems. * Implemented feature request #613539. Modified the wrapper.java.library.path to function like the wrapper.java.classpath.n properties so that multiple directories can be specified in the library path in a platform independent way. The old property is still supported, but deprecated. * Fix Bug #632215. The WrapperManager.isLaunchedAsService() method was always returning false, even when run as a service under Windows. On linux, the Wrapper is always run as a console app, so this method will always return false. * Improve the message thrown when user code attempts to access System.in from within a JVM being controlled by the Wrapper. System.in will not work because the JVM is a spawned process. 2.2.8 * Fixed a compiler problem on Solaris some systems. * Added a new property, wrapper.cpu.timeout, which allows the user to control how much time without receiving any CPU the Wrapper will tolerate before displaying a warning message. The CPU timeout feature was added in 2.2.7 but the default timeout of 10 seconds was not configurable. * The Wrapper was only allowing 5 seconds between the JVM informing the Wrapper that it was going to exit and the JVM process actually exiting. This would cause the Wrapper to terminate the process prematurely in cases where an application shutdown thread took longer than 5 seconds to complete. The Wrapper now allows wrapper.jvm_exit.timeout seconds for the JVM process to exit on its own before being forcibly terminated. * When there is a configuration problem or a resource is unavailable, a JVM will sometimes exit abnormally very shortly after being launched. This can lead the the JVM being infinitely restarted due to a simple class path misconfiguration. To work around this, the Wrapper has always had a hard limit of 5 restarts within a short period of time. If the JVM has been running for more than a few minutes, then the count was reset. In this version, a new property. wrapper.max_failed_invocations was added to allow the max value to be set. The time period which the JVM must now be running for the JVM launch to have been considered a success for restart purposes is set using the new wrapper.successful_invocation_time property. * The number of advanced properties which most users do not need has been increasing as the Wrapper has been made more and more flexible. This has been causing confusion in their usage by people who play with them without first reading the documentation. To solve this, the advanced properties were removed from the default configuration file. They still function. But users must now read to the advanced configuration documentation to learn about their existence. Added quite about to the descriptions of these properties to hopefully clear up any confusion about their usage. * When the JVM exits abnormally, the Wrapper will pause for a few seconds before starting another JVM. If the user pressed CTRL-C during this pause, a new JVM would still be launched. The new JVM was exiting immediately but it was a waste of time. The Wrapper now recognizes the event and aborts launching the new JVM. * Added a page to the documentation which shows inline javadocs. This will hopefully make it easier to navigate them as part of the full documentation set. * Added a new method to the WrapperManager which enables user code to log at any log level. * Added a new Helper class WrapperStartStopApp which allows users to easily integrate applications like Tomcat which use a separate class to stop the application. * Added a samples section to the documentation. Just includes Tomcat 4 for now. 2.2.7 * Fix a problem where the JVM was trying to reconnect the Wrapper as it was being shutdown. This was causing problems if the JVM was being restarted. * Added support for the system being suspended to RAM or disk. Also improved wrapper performance when a system is under 100% load. See the new example output in the example section. * Fix a problem where the log output was not being directed to a file called wrapper.log in the same directory as the Wrapper binary in the event that the configured wrapper log file could not be accessed. * Fix a problem where the Wrapper was not shutting down the JVM correctly when all non daemon threads completed. Normally a JVM will exit when all of its non daemon threads have completed so this was causing some problems. (Thanks to Jung Tamas) * Added the ability to set the priority of the Wrapper and its JVM when run as an NT service or console application. The same thing can be better achieved on Unix systems by using "nice" in the shell script used to launch the Wrapper. See the documentation for for details. * JVM information was not being displayed correctly when the Wrapper native library could not be loaded. * Added a new property to cause the wrapper to attempt to request a thread dump when the JVM does not exit on request. * Improved the documentation of the WrapperSimpleApp and WrapperListener classes. * Adding a new property wrapper.shutdown.timeout to allow the user to extend the length of time that an application is allowed to take shutting down. * Rework the way the shutdown process works so that System.exit will never be called before the stop method in WrapperListener has had a chance to complete. * Add a Restart button to the TestWrapper application. * Fix a problem on Unix versions where '%' characters in Java output would sometimes cause the wrapper to crash. Somehow missed getting this into the last release. * Added a test to make sure that WrapperManager.stop is not called recursively. * Added support for building under Windows XP. Prebuilt installations had already been working. 2.2.6 * Fix a problem where '%' characters in Java output would sometimes cause the wrapper to crash. (Thanks to Frode Moe) * Added support for requesting a Java thread dump without shutting down the Java process. * Fixed a problem on windows where the java command was looking in the windows system and system32 directories for the java executable before checking the path when the full path to the java executable was not specified in the configuration file. This could lead to different JVM being run from the Wrapper than was run if java -version was run from the command line. The Wrapper will now attempt to resolve the full java path using the PATH environment variable. * Added debug output showing Java version information when the JVM first starts. * Modified c source to use /* */ style comments rather than // style comments. Some people were having problems with some compilers. 2.2.5 * Added support for service descriptions for Win2k and XP. * Fixed bug issue when reading configuration files from Windows on Unix. * Deprecated the wrapper.debug property in favor of loglevels. * Added new logger functionality includes the following features: Loglevels like Log4j, NT Eventlog support, UNIX syslog support and rolling log files. * Added wildcard support for classpath entries in wrapper.conf. * Added the ability to specify configuration properties from the command line. * Changed the way NT services are installed so that a patched version of the Wrapper.exe file no longer needs to be created to reference the wrapper.conf file. 2.2.4 * The value of APP_NAME in the bash or sh scripts no longer needs to be the same as the script. * Added the ability to format and/or disable file logging and output to the console. * Set mode of executables in binary release tar files so that they can be run without modification after being extracted. * Fixed line feeds in release so that bat files are always CRLF, unix scripts are always LF. Other source files are always CRLF in ZIP archives and LF in tar.gz archives. * Make the build fail if Wrapper.exe or Wrapper.dll do not exist for Windows builds. * Added an empty wrapper.log to the releases so that the TestWrapper example program runs out of the box. 2.2.3 * Added template scripts and conf files for ease of integration with other applications. * Cleaned up the build. * The WrapperSimpleApp method of launchine applications was not working correctly with applications whose main method did not return. * Add sample scripts and wrapper.conf files in the bin and lib directories. These scripts are used to start a sample application which runs out of the box. See the new example.html page in the documentation for more details. * Get rid of the platform specific directories in the bin and lib directories. * Enable relative paths for Windows version. In previous versions of Wrapper, it was necessary to always use absolute paths because the working directory of the wrapper would be then NT System32 directory when run as a service. * On the windows version, the wrapper always sets the current working directory to the location of the wrapper executable immediately after startup. * Improvements to the documentation / web page. 2.2.2 * Added HTML based documentation. 2.2.1 * Added Linux and Solaris build files. * Added Linux and Solaris documentation. 2.2.0 * Initial Public Release.