/*
 * 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 Shell console
     * [SMX4KNL-140] - Shell 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] - Shell group name variable doesn't resolve
     * [SMX4KNL-151] - Update displayed version in Shell 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 Shell#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 Shell 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

