/*
 * 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 Felix Karaf 1.0.0
                    ========================

  Overview
  --------

 The Apache Felix Karaf 1.0.0 release is the first release since the move of ServiceMix Kernel to Apache Felix.
 This release brings a lot of new features:
  * Switch from Spring-DM to Blueprint for the default Dependency Injection container (Spring-DM is still
       fully supported and easy to install through the features service)
  * Switch from Geronimo GShell to Felix Gogo
      This changes is a bit disruptive for the command line syntax, but offers much more features such
      as closures
  * Integration with the Felix Web Console (easily installed using the features service).
  * Built-in support for Equinox
  * Upgrade to OSGi 4.2 frameworks (both Felix and Equinox)
 This release also contains a lot of small improvements and bug fixes.  The changelog below contains the whole
 list of changes.


 Changelog
 ---------

 The following list shows the bug fixes and enhancements included in this release:

 ** Bug
     * [FELIX-1087] - Unable to log into ServiceMix Kernel using Windows putty SSH client
     * [FELIX-1097] - ServiceMix -> Karaf in base directory notices
     * [FELIX-1100] - Cat Command fails to display ?wsdl files 
     * [FELIX-1125] - "features/list -i" returns "ERROR CommandLineExecutionFailed: org.apache.geronimo.gshell.command.CommandException: java.lang.ArrayStoreException: org.apache.servicemix.kernel.gshell.features.internal.FeatureImpl"
     * [FELIX-1128] - Features installed via the deploy directory aren't listed by the "features/list" command
     * [FELIX-1152] - wrapper scripts fail to start Karaf
     * [FELIX-1153] - change parent artifact id from kernel to karaf in some modules to make the build pass from clean local maven repo
     * [FELIX-1161] - Stange classloading issues when using compendium services
     * [FELIX-1192] - KARAF: Locking error in DefaultJDBCLock, also contains an eventual OutOfMemory error on locked processes.
     * [FELIX-1199] - Karaf: closing IO stream, removal of minor file descriptor leak.
     * [FELIX-1212] - Possible infinit loop when a remote ssh connection is closed
     * [FELIX-1218] - Existing configurations are not retrieved when installing a feature
     * [FELIX-1222] - [features-maven-plugin:add-features-to-repo] Incorrect parsing of pax mvn url string
     * [FELIX-1243] - Change the default port for the OSGI HTTP Service from 8080 to 8181
     * [FELIX-1253] - Cursor is blocked when the correct syntax is not displaed
     * [FELIX-1265] - The command refreshUrl does not work if the features.xml file is embedded in a Jar. The JVM caches jar entries
     * [FELIX-1274] - Spring deployer fails when bean class is from java.* packages
     * [FELIX-1315] - Karaf console is garbled on Windows
     * [FELIX-1320] - Authentication failed connecting via ssh on Windows
     * [FELIX-1361] - Issue with import/export version of the package : org.osgi.util.tracker in Apache Felix Karaf
     * [FELIX-1373] - featuresBoot in etc/org.apache.felix.karaf.featues no longer works
     * [FELIX-1375] - [Karaf] There's no 'help' command
     * [FELIX-1378] - Optional branding does not work in new gogo console
     * [FELIX-1391] - Unable to create new ConfigAdmin PID through karaf console
     * [FELIX-1423] - karaf fails to start in cygwin bash
     * [FELIX-1431] - Add a web console plugin to have access to the gogo shell
     * [FELIX-1449] - Tab completion doesn't work on Windows
     * [FELIX-1454] - install --help throws exception
     * [FELIX-1458] - 'servicemix server' and servicemix client' not working properly on windows
     * [FELIX-1459] - bin/karaf may fail to start when CDPATH is set (on POSIX shells)
     * [FELIX-1465] - Make symbolic names of Karaf webconsole bundles consistent with other bundles
     * [FELIX-1466] - org.apache.felix.karaf.features.FeaturesServiceTest fails
     * [FELIX-1468] - wrapper:install and admin:create prints old ansi output that need to be converted to real ansi 
     * [FELIX-1472] - Better handling of configurations from the deployer and feature service
     * [FELIX-1515] - Entering an illegal command has an unusual effect
     * [FELIX-1517] - Manually deleting an instance breaks admin:list
     * [FELIX-1519] - Karaf Failover does not work with PostgreSQL and Oracle
     * [FELIX-1529] - The console does not work anymore when connecting to another karaf instance
     * [FELIX-1564] - Authentication failed when using admin:connect to connect to a newly created instance
     * [FELIX-1566] - Possible NPE when uninstalling a feature
     * [FELIX-1567] - When dropping an empty xml file (i.e. just an empty file with an xml extension) in the deploy folder, errors are printed to the console
     * [FELIX-1575] - The JMX connector can not be registered because of a clash in the name in the RMI registry
     * [FELIX-1576] - The features service should do a PackageAdmin.refresh() after uninstalling a feature
     * [FELIX-1602] - Unable to configure boot features on admin:create-d instance
     * [FELIX-1618] - in spring-dm feature, optional imports in spring-context won't get resolved

 ** Improvement
     * [FELIX-1062] - Upgrade to latest Felix Runtime
     * [FELIX-1063] - Upgrade to latest Felix Bundle Repository
     * [FELIX-1092] - The client jar / ssh deamon should support direct commands
     * [FELIX-1102] - Make gshell-core really independant of the MainService
     * [FELIX-1104] - Allow osgi/stop command to specify more than one bundle per command entry.
     * [FELIX-1107] - Make org.apache.servicemix.kernel.gshell.features dependency on org.apache.servicemix.kernel.filemonitor optional
     * [FELIX-1110] - Refactor filemonitor / deployers inside a deployer sub module
     * [FELIX-1112] - [PATCH] Allow osgi/start command to specify more than one bundle per command entry
     * [FELIX-1115] - Use better version ranges for imports
     * [FELIX-1121] - Add feature for installing Felix Web Console 
     * [FELIX-1126] - No errors are generated for a bad URL passed to the "features/addUrl", "features/refreshUrl", or "features/list" commands.
     * [FELIX-1127] - Add a name for a repository
     * [FELIX-1133] - Allow usage of fragments in Karaf features
     * [FELIX-1149] - Describe ConfigAdmin configurations using metatype
     * [FELIX-1150] - Upgrade to SpringDM and SpringFramework 
     * [FELIX-1172] - Rebrand Karaf locking mechanism.
     * [FELIX-1180] - Improve Karaf DefaultJDBCLock to use proper logging mechanism instead of System err prints.
     * [FELIX-1196] - Felix Web Console can't list Karaf features
     * [FELIX-1204] - Fix the karaf client to allow direct execution of commands
     * [FELIX-1220] - Remove unnecssary parts of a filter
     * [FELIX-1276] - There is no way to get all the Feature information from the FeaturesService
     * [FELIX-1303] - add an osgi/imports and osgi/exports to show a pretty-printed output of the imports/exports packages for a bundle
     * [FELIX-1450] - Karaf branding and plugins for Felix webconsole
     * [FELIX-1455] - OSGi Storage is hardcoded to be data/cache
     * [FELIX-1457] - Externalize and refactory management layer for FeatureService to be more scalable and more consistent with the OSGi management (using open mbeans)
     * [FELIX-1463] - Switch to Felix Fileinstall instead of our own file deployer
     * [FELIX-1467] - Add Karaf to top-level build files
     * [FELIX-1469] - Add svn:ignore property to a few Karaf projects
     * [FELIX-1528] - [karaf] Use a defined location for storing the list of managed instances create by the admin service
     * [FELIX-1555] - The osgi:list command should print spring-dm bundle state if spring-dm has been deployed
     * [FELIX-1558] - use com.sun.* instead of com.sun.management* for boot delegation
     * [FELIX-1594] - include blueprint bundle in karaf kit system folder

 ** New Feature
     * [FELIX-1109] - Deployer for blueprint applications
     * [FELIX-1111] - Ability to run Karaf on Equinox
     * [FELIX-1206] - [PATCH] config/propappend
     * [FELIX-1261] - Install/Uninstall Karaf Features from Felix WebConsole
     * [FELIX-1485] - Admin commands support in Karaf webconsole
     * [FELIX-1524] - Implement a better tac command
     * [FELIX-1547] - OS shell level admin commands for Karaf

 ** Task
     * [FELIX-1098] - Switch from spring-dm to blueprint
     * [FELIX-1099] - Switch from spring-dm integration tests to pax-exam
     * [FELIX-1116] - Rename to Apache Felix Karaf
     * [FELIX-1200] - Move features-maven-plugin into Karaf
     * [FELIX-1312] - Switch from gshell to gogo
     * [FELIX-1523] - Fix Karaf version to 0.9.0-SNAPSHOT as next release will be 1.0.0

 ** Sub-task
     * [FELIX-1117] - Update branding
     * [FELIX-1118] - Update shell scripts
     * [FELIX-1132] - Get rid of the JMX spring stuff in gshell-features




                    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

