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