/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


                    Apache ServiceMix Kernel 1.1.0
                    ==============================

  Overview
  --------

 The Apache ServiceMix Kernel 1.1.0 release brings a lot of new features enhancements and bug fixes:
  * remote connection using SSH protocol
  * provisioning enhancements: versioning / hot deployment of features
  * new commands, including OSGi related commands for the Configuration Admin and Package Admin services
  * improved spring integration: upgrade to spring 2.5.6 and spring-dm 1.2.0-m2, the osgi/list command
       now displays spring applications status
  * container level locking for master / slave deployments
  * support for JAXP 1.4 on all platforms
  * improved JMX support for managing the OSGi framework and features
 Note that the commands syntax has changed due to the upgrade to the latest gshell version.

  Known issues
  ============

     * [SMX4KNL-141] - The config/edit command changes does not takes precedence over configuration files in the etc folder at restart
     * [SMX4KNL-183] - features/uninstall behaves different in version selection than features/install
     * [SMX4KNL-189] - Shell completion works only in the root shell
     * [SMX4KNL-200] - The client jar / ssh daemon should support direct commands
     * [SMX4KNL-227] - Full support of fragment bundles
     * [SMX4KNL-228] - Warning messages when using OpenSSH 5.1 to connect to ServiceMix Kernel
     * [SMX4KNL-231] - Unable to log into ServiceMix Kernel using OpenSolaris SSH client
     * [SMX4KNL-232] - Unable to log into ServiceMix Kernel using Windows putty SSH client

  Changelog
  ---------

  The following list shows the bug fixes and enhancements included in this release:

 ** Bug
     * [SMX4KNL-72] - If there is no etc/startup.properties, the kernel hangs without displaying any error
     * [SMX4KNL-79] - When starting the kernel, a log entry states "Can not install feature ''"
     * [SMX4KNL-86] - When running integration tests, the container classpath contains all the test bundles which may cause problems
     * [SMX4KNL-87] - Problems with batch files on windows
     * [SMX4KNL-95] - kernel build failed in testing/itests
     * [SMX4KNL-96] - package missing for felix.config.properties
     * [SMX4KNL-97] - Dissociate the name and the location of ServiceMix Kernel instances managed by the admin shell
     * [SMX4KNL-100] - The client does not close when running "osgi shutdown" command
     * [SMX4KNL-102] - The file monitor should use ${servicemix.base} for default polling locations
     * [SMX4KNL-104] - When using a remote connection, errors are not reported correctly
     * [SMX4KNL-105] - Features are reinstalled on restart of servicemix
     * [SMX4KNL-112] - gshell pom needs to include gshell-config and gshell-packages modules
     * [SMX4KNL-115] - config.properties for SMX-Kernel needs to be updated
     * [SMX4KNL-117] - The Smx testing platform should take into account the boot delegation packages specified in the configuration file
     * [SMX4KNL-118] - The configuration file for felix comes from 3 different places in the svn tree, only one copy should be used
     * [SMX4KNL-122] - When using the client and trying to connect to another instance using the "admin connect" command, the console hangs
     * [SMX4KNL-123] - XML parsing does not work on non Sun JVMs and Sun's SAAJ bundle requires Sun's JAXP implementation
     * [SMX4KNL-124] - Issuing command "log d" fails with NullPointerException on AIX.
     * [SMX4KNL-126] - The user is no more authenticated with the new gshell integration
     * [SMX4KNL-128] - Remove OBR support from default distribution
     * [SMX4KNL-132] - osgi/list command should display the spring application state
     * [SMX4KNL-133] - jaxp-ri bundle miss javax.xml.datatype.DatatypeFactory factoryId under META-INF/services
     * [SMX4KNL-134] - XPathFactoryFinder in jaxp api should use factoryId to load the spi class in osgi enviroment
     * [SMX4KNL-135] - Remote shell missing help resources
     * [SMX4KNL-138] - No command history with GShell console
     * [SMX4KNL-140] - GShell commands references not cleaned up when bundle uninstalled
     * [SMX4KNL-142] - Starting a new instance that was created with admin on windows fails to start
     * [SMX4KNL-145] - java.lang.IllegalStateException: Streams not registered for thread
     * [SMX4KNL-148] - OPS4J maven repo missing form default search list
     * [SMX4KNL-149] - Build failure due to new sshd snapshot
     * [SMX4KNL-150] - GShell group name variable doesn't resolve
     * [SMX4KNL-151] - Update displayed version in GShell to be 1.1.0-SNAPSHOT for trunk
     * [SMX4KNL-153] - Stopping one of the "core" bundles of the servicemix engine block the server
     * [SMX4KNL-155] - Error changing manifest while bundle is deployed
     * [SMX4KNL-162] - The default jaas realm uses the config admin to store clear password
     * [SMX4KNL-164] - features/removeUrl does not remove the repository
     * [SMX4KNL-165] - Initial provisioning using features is very slow especially when using snapshots
     * [SMX4KNL-170] - Unknown protocol: org.apache.servicemix.kernel.gshell
     * [SMX4KNL-172] - the new command optional/cat from gshell can't support mvn/http protocol
     * [SMX4KNL-174] - NoClassDefFoundError jline/ConsoleReader when invoking servicemix-client
     * [SMX4KNL-176] - 'features/install xxx' tries to install version 0.0.0 instead of the latest one
     * [SMX4KNL-177] - Some of the Optional commands have moved to different packages in the latest snapshot of geronimo gshell
     * [SMX4KNL-178] - Remove debug log statements when booting
     * [SMX4KNL-180] - features/install xxx barfs when using non osgi compliant versions
     * [SMX4KNL-181] - osgi/install -s throws a NPE if the bundle can not be resolved
     * [SMX4KNL-182] - Upon restart, the list of previously  installed features is not available anymore
     * [SMX4KNL-185] - Features JMX view does not reload persistent state on restart
     * [SMX4KNL-187] - Features JMX view making too much log noise
     * [SMX4KNL-188] - Gshell itests fail on windows
     * [SMX4KNL-190] - Deployment / Startup of spring xml configurations doesn't work correctly
     * [SMX4KNL-192] - ServiceMix Kernel startup blocks
     * [SMX4KNL-198] - The console / server / client arguments to servicemix shell script are broken
     * [SMX4KNL-199] - Missing resource bundle for obr shell
     * [SMX4KNL-201] - The client jar does not exit when running with --help argument
     * [SMX4KNL-202] - Startup of a pending to deploy Spring config file fails when all required bundles got installed
     * [SMX4KNL-204] - OsgiConfiguration.unregister() throw NPE when exit smx
     * [SMX4KNL-205] - "ld | grep WARN" does not filter while "log/display | grep WARN" does
     * [SMX4KNL-207] - features/install should install latest feature version for any dependency that does not explicitly specify a dependency
     * [SMX4KNL-208] - Bundle#loadClass sometimes return null instead of throwing a CNFE
     * [SMX4KNL-212] - Exceptions are displayed in the console when trying to load default xml catalogs
     * [SMX4KNL-215] - Don't attempt to stop fragments in filemonitor
     * [SMX4KNL-218] - Can't find bundle for base name org.apache.servicemix.kernel.gshell.wrapper.InstallCommand, locale fr_BE
     * [SMX4KNL-220] - The org.apache.servicemix.kernel.management bundle should not use DynamicImport-Package=*

 ** Improvement
     * [SMX4KNL-36] - Investigate having a different bootstrap mechanism for a remote client to not start all the bundles installed (maybe by not using osgi)
     * [SMX4KNL-62] - Enhance admin shell create command to allocate unique ports to new instances.
     * [SMX4KNL-74] - When using the spring deployer, allow the customization of the OSGi manifest entries
     * [SMX4KNL-78] - Small refactoring of the Feature interface
     * [SMX4KNL-85] - Extend GShell#waitForFrameworkToStart to wait 60 seconds instead of 5 seconds.
     * [SMX4KNL-101] - Reduce the amount of logging issued by mina
     * [SMX4KNL-106] - Support for container level lock to support master/slave deployments
     * [SMX4KNL-114] - prompt should print username@instance-name when using remote shell
     * [SMX4KNL-119] - Use boot delegation instead of listing sun packages for jaxp / url handlers
     * [SMX4KNL-120] - The ServiceMix Kernel testing platform should use the servicemix kernel main jar instead of the felix one
     * [SMX4KNL-121] - Improve the Main class to easily embed the whole ServiceMix Kernel distribution in another web application
     * [SMX4KNL-125] - Show command environment in kernel shell
     * [SMX4KNL-127] - Add the update command in the osgi shell
     * [SMX4KNL-130] - Support configurable lock directory for container level locking (for master/slave deployments).
     * [SMX4KNL-136] - Upgrade to pax logging 1.2.0
     * [SMX4KNL-154] - some Action moved from to another package cause kernel start up failed
     * [SMX4KNL-158] - Move jline into its own bundle instead of using a private package in gshell-core
     * [SMX4KNL-169] - Use the start level to implement the container level locking
     * [SMX4KNL-184] - Align the commands name with the gshell ones
     * [SMX4KNL-186] - features/uninstall should select the right version if only one version has been installed
     * [SMX4KNL-191] - Upgrade to pax-logging 1.3.0
     * [SMX4KNL-203] - When installing a feature, the service should first install all bundles, then start them all in order
     * [SMX4KNL-206] - Felix version in servicemix-kernel-1.1.0-snapshot doesn't seem to support fragment bundles.
     * [SMX4KNL-216] - Display fragments informations in the osgi list command
     * [SMX4KNL-230] - Log statements using java.util.logging are logged into both stderr and data/log/servicemix.log file

 ** New Feature
     * [SMX4KNL-28] - Create a config command to administer the ConfigAdmin service
     * [SMX4KNL-33] - Enhance admin shell to provide commands to start / stop / list / connect to known ServiceMix instances
     * [SMX4KNL-60] - Versionning of features
     * [SMX4KNL-76] - support to install/uninstall different version of features
     * [SMX4KNL-90] - Create new commands to leverage the PackageAdmin OSGi service
     * [SMX4KNL-94] - Provide a JMX frontend on top of the features service
     * [SMX4KNL-107] - Create a new "admin connect" command to easily connect to a named instance of servicemix
     * [SMX4KNL-108] - Add a new 'log de' command that displays the last exception from the log
     * [SMX4KNL-109] - Include the pax wrapper url handler in the kernel for ease of use of non osgi third party dependencies
     * [SMX4KNL-111] - Add a "starting" state to the admin list command
     * [SMX4KNL-113] - Upgrade to Felix 1.2.1
     * [SMX4KNL-116] - Allow repository descriptors to reference other repository descriptors
     * [SMX4KNL-131] - Include JAXP 1.4 API
     * [SMX4KNL-143] - Provide a way to make BouncyCastle work in ServiceMix Kernel
     * [SMX4KNL-144] - Use SSH as a remoting protocol to connect to a servicemix kernel
     * [SMX4KNL-147] - Upgrade to spring-DM 1.2.0-m2
     * [SMX4KNL-152] - The version number displayed in the console should be extract from resources (using maven filtering + properties file) but the branding should be easy to change so that people embedding the Kernel can define their own
     * [SMX4KNL-156] - Move core management feature to the kernel
     * [SMX4KNL-157] - Add a JAAS realm for authenticating users from SSH and JMX
     * [SMX4KNL-163] - Provide default jdbc lock impl for master/slave deployments
     * [SMX4KNL-167] - Upgrade to spring 2.5.6
     * [SMX4KNL-171] - Include RFC0139 (JMX management of OSGi)
     * [SMX4KNL-179] - Upgrade to felix 1.5.0-SNAPSHOT
     * [SMX4KNL-214] - Hot deployment of features through the deploy folder

 ** Task
     * [SMX4KNL-43] - Upgrade to latest gshell
     * [SMX4KNL-93] - Extract the admin commands in their own module
     * [SMX4KNL-98] - Use dependency management section for all dependencies
     * [SMX4KNL-99] - Remove ant from the kernel distribution and replace its use in the filemonitor
     * [SMX4KNL-129] - Make sure aliases and links commands work with the new gshell integration
     * [SMX4KNL-166] - Move the embedded smx demo into trunk
     * [SMX4KNL-168] - Downgrade to junit 3.8
     * [SMX4KNL-196] - gshell-core source jar should use the shade plugin to include the gshell sources
     * [SMX4KNL-197] - The client source jar should include the slf4j sources using the shade plugin
     * [SMX4KNL-211] - Remove one of jmock or easymock from the kernel




                    Apache ServiceMix Kernel 1.0.0
                    ==============================

  Overview
  --------

 This release is the first GA release of ServiceMix Kernel.  A few bugs and enhancements have been done 
 to the Kernel since the second release candidate. The most two important fixes from a user point of view
 are SMX4KNL-70 which makes sure the bundles provided in the distribution are used first instead of the ones
 from the user's local maven repository and SMx4KNL-77 which allows artifacts in the /deploy folder to be 
 started when the needed dependencies have been installed successfully (the previous behavior was to fail
 if there were missing bundles when the artifact is processed).
 See the change log below for more informations.

  Changelog
  ---------

  The following list shows the bug fixes and enhancements included in this release:

 ** Bug
     * [SMX4KNL-70] - Bundles in /system folder should take precedence over local Maven repository
     * [SMX4KNL-79] - When starting the kernel, a log entry states "Can not install feature ''"
     * [SMX4KNL-80] - "features list" output has a "version" column but no infos
     * [SMX4KNL-81] - The wrapper feature can not be installed out of the box
     * [SMX4KNL-82] - The installation state of a feature is not displayed correctly after a restart when using the "features list" command
     * [SMX4KNL-83] - When using the wrapper command, ServiceMix Kernel does not start correctly

 ** Improvement
     * [SMX4KNL-69] - Add installation status for the 'features list' result.
     * [SMX4KNL-71] - Export the gshell CommandExecutor in the OSGi registry
     * [SMX4KNL-73] - Require work around for blocking in.read() call in ProxyIO for automated testing.
     * [SMX4KNL-75] - Modify GShell argument processing to execute multiple commands.
     * [SMX4KNL-77] - The deployer should keep a list of installed bundles that failed to start and retry those when new bundles have been resolved
     * [SMX4KNL-78] - Small refactoring of the Feature interface



                  Apache ServiceMix Kernel 1.0.0-rc2
                  ==================================

Overview
--------

This second Release Candidate of Apache ServiceMix Kernel includes a few bug fixes and a few new features.
The main change is that the system folder that contains the OSGi bundles to install in the runtime is now
organized as a maven 2 repository, though it should not directly affect users.  A more detailed changelog
is following. 
    
Changelog
---------
    
The following list shows the bug fixes and enhancements included in this release:

** Bug
    * [SMX4KNL-34] - snapshot jar name mismatch in startup.properties and in the system folder
    * [SMX4KNL-52] - Deployment of pain spring files does not work when using xml extensions because these are not available in the classpath
    * [SMX4KNL-53] - During starting, files are redeployed several times, one each time a new Deployer is registered in OSGi
    * [SMX4KNL-54] - Kernel does not start if system property "felix.cache.profiledir" is not defined
    * [SMX4KNL-56] - Kernel does not start on Windows if classpath contains spaces
    * [SMX4KNL-58] - Hot-deploy capability of FileMonitor does not update bundles properly on Windows.
    * [SMX4KNL-63] - Possible deadlock at startup caused by the filedeployer not running in its own thread the first time
    * [SMX4KNL-64] - The list of repositories for the features shell is not persisted across restart
    * [SMX4KNL-65] - After copying or moving the kernel, it does not start in a very clean way anymore
    * [SMX4KNL-68] - failed to start smx4

** Improvement
    * [SMX4KNL-51] - Add a configuration file for the maven url handler so that adding default repositories is easy enough
    * [SMX4KNL-55] - Use maven shade plugin on the main module so that sources jar is correct
    * [SMX4KNL-66] - When the file monitor loads configuration for the config admin, allow the use of system properties using ${xxx}

** New Feature
    * [SMX4KNL-61] - Organize the system folder as a maven 2 repository
    * [SMX4KNL-67] - Allow the features service to obtain a list of features to install at startup

** Task
    * [SMX4KNL-57] - Extract bundles from the svn tree
    * [SMX4KNL-59] - Upgrade to spring 2.5.5 / spring-dm 1.1.0



                  Apache ServiceMix Kernel 1.0-rc1
                  ================================

This first Release Candidate of Apache ServiceMix Kernel includes a security framework based on
JAAS allowing authentication using JAAS realms deployed at runtime and also allow keystores and
trustores to be deployed and accessed through OSGi.  This allow the remote console to be secured
correctly (if the console is activated in a production environment, we strongly recommand to 
deploy a custom JAAS realm and new keystores when using the SSL connection).  A few bugs have been
fixed too.

A release candidate (RC) is a distribution that has not been proven completely stable, but the 
feature set is the one that will be available in the final release.   The number of RCs has not 
been fixed and it will depend on the feedback we obtain from this release, so please give it a try
and report any problems you can find.

** Bug
    * [SMX4KNL-38] - Fix NullPointerException instead of Command not found in the console
    * [SMX4KNL-40] - Remote console does not display output
    * [SMX4KNL-41] - When using the remote command on the client from the command line, the process does not exit correctly
    * [SMX4KNL-44] - Changed bundles restarted twice
    * [SMX4KNL-45] - The "log display" command does not display anything when running from an instance that has been created using the "admin create" command
    * [SMX4KNL-46] - After using the 'admin create' command, cpu goes to 100% until another command is entered
    * [SMX4KNL-48] - ulimit error on MacOS X Leopard 10.5
    * [SMX4KNL-50] - Kernel does not start on Windows

** Improvement
    * [SMX4KNL-39] - Make bundle locations for SMX configurable
    * [SMX4KNL-49] - Upgrade to Spring 2.5.4, Spring-DM 1.1.0-m2, PaxLogging 1.1.1

** New Feature
    * [SMX4KNL-35] - Secure the connection between the client and the kernel in some way
    * [SMX4KNL-37] - JAAS support


                  Apache ServiceMix Kernel 1.0-m3
                  ================================

This third milestone of Apache ServiceMix Kernel brings a lot of new features:
  * a provisioning system to install applications easily
  * a log shell to visualize the logging output and change log levels
  * pipe support on commands
  * a bunch of new commands: history, grep, cat, ava, exec, sleep

Note that this milestone does not include the latest spring version because 
the latest ones have wrong OSGi manifest headers and do not work.

** Bug
    * [SMX4KNL-22] - The console can not be reloaded at runtime
    * [SMX4KNL-29] - Shell commands are not unregistered automatically when the last command is unregistered
    * [SMX4KNL-31] - Aliases do not work when inside a subshell

** Improvement
    * [SMX4KNL-5] - Show gshell sub-shell name in prompt
    * [SMX4KNL-6] - Error Message improvement on Gshell console.
    * [SMX4KNL-10] - Handle dependant features correctly
    * [SMX4KNL-21] - Allow pipes in command syntax
    * [SMX4KNL-25] - Feature commands enhancement.
    * [SMX4KNL-32] - Lazy load feature repositories to avoid delay when the url can not be accessed or things like that

** New Feature
    * [SMX4KNL-1] - Implements a log command
    * [SMX4KNL-11] - Provisioning system
    * [SMX4KNL-20] - Adding a new OBR command to reload the repository url's
    * [SMX4KNL-23] - Add a grep command
    * [SMX4KNL-24] - Add a few utils commands: cat, java, exec, sleep
    * [SMX4KNL-26] - Spring URL handler to wrap xml spring files into bundles for direct installation.
    * [SMX4KNL-27] - Include an implementation of the Preferences service
    * [SMX4KNL-30] - Create an history command to be able to browse previous commands easily


                  Apache ServiceMix Kernel 1.0-m2
                  ================================

This is the second milestone of ServiceMix Kernel, but mostly a bug fix release
compared to the first milestone.

** Bug
    * [SMX4KNL-13] - startup issue in recognizing new files in deploy folder
    * [SMX4KNL-15] - Display of memory size using the info command on Windows is ugly
    * [SMX4KNL-16] - Bad error message when startup.properties lists a unknown file (the file name is not displayed, but 'null' instead)
    * [SMX4KNL-18] - No need for DynamicImport-Package=* in filemonitor
    * [SMX4KNL-19] - Performance problems when using the OSGi classloaders in a certain way

** Improvement
    * [SMX4KNL-4] - Add a start option on the 'osgi install' command so that the bundle is automatically started

** Task
    * [SMX4KNL-17] - Remove all the warnings when building the distribution tar.gz

See the README.txt file for more general informations about ServiceMix Kernel.


                  Apache ServiceMix Kernel 1.0-m1
                  ================================

See the README.txt file for more general informations about ServiceMix Kernel.

This is the first milestone of ServiceMix Kernel.  All the features are not 
fully implemented yet and things may be changed until the final 1.0 release.
Please refer to the web site for more informations and feel free to ask any
questions on the ServiceMix mailing lists or simply to provide feedback 
(we appreciate it very much).

Thanks you for downloading ServiceMix Kernel.  Enjoy !

The ServiceMix Team
http://servicemix.apache.org/team.html

