/*
 * 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 NMR 1.0.0-m2
                  ================================

  Overview
  --------

 This second milestone of Apache ServiceMix NMR contains a bunch of new features and bug fixes.
 The most important one is SMX4NMR-28, which allows JBI components to be deployed as pure OSGi
 bundles, thus bypassing the JBI packaging.  This feature is really important in that it allows
 JBI components to leverage the OSGi platform.
 See the change log below for more informations.

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

 ** Bug
     * [SMX4NMR-27] - x.x-SNAPSHOT versions startup problem
     * [SMX4NMR-34] - classloader incorrect used in ComponentImpl
     * [SMX4NMR-35] - NMR throws a null pointer exception when I attempt to deploy the ode bpel engine.
     * [SMX4NMR-41] - The JBI layer does not unregister the endpoint associated to the component when the component is unregistered
     * [SMX4NMR-42] - Start, Stop and Shutdown methods on the JBI component lifecycle are not called in the right thread context classloader
     * [SMX4NMR-43] - When the OSGi bundle containing the JBI component is stopped, the component should be stopped / shutdown correctly
     * [SMX4NMR-44] - NPE when unregistering endpoints
     * [SMX4NMR-45] - The SMX4 NMR can not correctly handle the "http://www.w3.org/2004/08/wsdl/in-opt-out" MEP
     * [SMX4NMR-46] - NMR endpoints statistics are not updated
     * [SMX4NMR-48] - When stopping a JBI component, the framework tries to stop SAs, even if they are already stopped, thus leading to an exception

 ** Improvement
     * [SMX4NMR-36] - add javax.xml.bind as hidden for MultiParentClassLoader in Deployer
     * [SMX4NMR-40] - Optimize message dispatch

 ** New Feature
     * [SMX4NMR-28] - Ability for a JBI component to register itself in the registry, thus bypassing the JBI packaging and allowing pure bundles to register JBI components
     * [SMX4NMR-29] - Security in NMR (provides an authentication and an authorization mechanism)
     * [SMX4NMR-30] - Split the document repository and url handler in its own bundle
     * [SMX4NMR-37] - Provide a way to retrieve a ComponentContext for client side

 ** Task
     * [SMX4NMR-32] - Extract bundles from the svn tree


  Known Issues
  ------------

 * no support for JMX deployment and Ant tasks
 * no support for Service Assemblies Connections
 

                  Apache ServiceMix NMR 1.0-m1
                  ================================

See the README.txt file for more general informations about ServiceMix NMR.

This is the first milestone of ServiceMix NMR.  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).

The current feature set includes a JBI container with a few missing things:
  * no support for JMX deployment and Ant tasks
  * no support for Service Assemblies Connections
  * no support for transactions (a transaction manager and a naming context
     can be injected into components if they are available as OSGi services,
     but not transaction processing  - suspend / resume - will be performed,
     as it would be requested for real support)


Thanks you for downloading ServiceMix NMR.  Enjoy !

The ServiceMix Team
http://servicemix.apache.org/team.html

