/*
 * 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.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

