/*
 * 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
                  ===========================

  Overview
  --------

 ServiceMix NMR 1.0.0 is a brand new JBI container based on OSGi.  A lot of work has been done to follow more closely
 the rules from the JBI 1.0 specification and to have a much better lifecycle processing for various JBI artifacts.
 A new clustering engine has been developped which allows endpoints to be individually clustered, leveraging the
 transparent remoting (communications between two endpoints on different JBI containers) but also load-balancing and
 fail-over.  Other features include the backporting of the auditor package from ServiceMix 3, the integration of the
 transaction manager and a JNDI/OSGi integration.

 See the change log below for more informations.

  Migrating from ServiceMix 3
  ---------------------------

 Most of the applications developped for ServiceMix 3 can be deployed onto this container, however, due to the OSGi
 layer underneath, some classloading related issues may arise when migrating an application from ServiceMix 3 because
 both containers do not behave the same way.  Another major change compared to ServiceMix 3 is the changed transactional
 model which allows the use of transactions for asynchronous exchanges: this change will affect your application if you
 were leveraging the JCA flow in ServiceMix 3.

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

 ** Bug
     * [SMX4NMR-47] - A full stack trace is displayed when NPE occurs in the ManagementEndpointRegistry when endpoints are not registered
     * [SMX4NMR-53] - Upgrade to kernel 1.1.0
     * [SMX4NMR-54] - osgi update command does not stop an endpoint before restarting it
     * [SMX4NMR-57] - Exchange.toString() does not include the error
     * [SMX4NMR-58] - update spring and spring osgi version used in NMR
     * [SMX4NMR-59] - java.lang.IllegalStateException: Alias meta-file does not contain 'ALIAS' attribute: meta:/jbi when try to use jbi shell
     * [SMX4NMR-60] - EndpointRegistryImpl is not thread safe
     * [SMX4NMR-61] - jbi/list output isn't correct after stop and start jbi deployer bundle
     * [SMX4NMR-70] - If an error occurs while dispatching a message, stopping the assembly will wait forever
     * [SMX4NMR-76] - When a JBI component is uninstalled, it's running state is not remove, which leads to a bad state when re-installing the component
     * [SMX4NMR-77] - Uninstalling a bundle for a JBI packaged component does not update the org.apache.servicemix.jbi.management.InstallationService installers
     * [SMX4NMR-78] - Uninstalling a bundle for a JBI packaged component does not update the org.apache.servicemix.jbi.management.InstallationService installers
     * [SMX4NMR-79] - If the JBI artifact deployed has a MANIFEST.MF which is not the first entry in the jar, it leads to an exception when writing the transformed jar
     * [SMX4NMR-80] - Listing of JBI artifacts through ant tasks are not always valid
     * [SMX4NMR-81] - Can not deploy a shared library with a class path item equals to "."
     * [SMX4NMR-82] - Once a component has been shut down, restarting it should call Lifecycle#init()
     * [SMX4NMR-83] - org.apache.servicemix.specs.jbi-api-1.0 version in the features.xml is not correct
     * [SMX4NMR-84] - JBI deployer puts component in start state when installed via install-component ant task. (It should be in Shutdown state till start-component is called.)
     * [SMX4NMR-88] - JBI deployer puts service assembly in start state when installed via  deploy-service-assembly ant task. (It should be in Shutdown state) Same holds true for the SU that is deployed as part of the SA.
     * [SMX4NMR-90] - When shared libraries reference classes inside the zip of the SL, those are not loaded
     * [SMX4NMR-97] - The JBI components classloader sometime fails to load classes or resources
     * [SMX4NMR-99] - org.apache.servicemix.jbi.deployer.artifacts.ServiceAssemblyImpl.init() needs to do transition from start state to stop first before shutdown.
     * [SMX4NMR-100] - org.apache.servicemix.jbi.deployer.impl.ComponentInstaller.uninstall() doesn't call bootstrap.init() and cleanup() which is required as per JBI specs.
     * [SMX4NMR-101] - The message exchange pattern's URI does not comply with the spec
     * [SMX4NMR-104] - Each time the OSGi bundle is started / stopped, the JBI artifact is installed / uninstalled
     * [SMX4NMR-105] - When installing a JBI artifact, the JBI->OSGi deployer sometimes throw a ZipException
     * [SMX4NMR-108] - Stopping / Starting the OSGi bundle for a service assembly does not restart the SA (the previous running state is lost)
     * [SMX4NMR-109] - When a component is stopped and restarted, service assemblies are stopped, but not restarted
     * [SMX4NMR-110] - Starting a service assembly which has a non started component should fail
     * [SMX4NMR-115] - Do not use spring proxies for tracking endpoints and other NMR lists
     * [SMX4NMR-116] - Avoid deadlock when shutting down a SA while receiving a sync exchange for it
     * [SMX4NMR-117] - Refactor the InternalReference to allow references to be serializable
     * [SMX4NMR-118] - Allow configurable shutdown timeout that ensures that a SA can be stopped by canceling sync requests
     * [SMX4NMR-120] - Add missing dependencies to assembly pom
     * [SMX4NMR-121] - JBI components are not able to target NMR endpoints anymore
     * [SMX4NMR-122] - Wrong TCCL is used when operating service units
     * [SMX4NMR-123] - When going through the TransactionManager, the TCCL is changed to the transaction manager classloader
     * [SMX4NMR-130] - Lifecycle issues when using OSGi package service assemblies

 ** Improvement
     * [SMX4NMR-55] - Ensure a clean shutdown of service assemblies
     * [SMX4NMR-62] - Use a StringSource instead of a DOMSource when making an exchange rereadable or using copy to ensure it is serializable
     * [SMX4NMR-63] - Use a static TransformerFactory when converting sources for performance
     * [SMX4NMR-64] - Use a static converter for speed improvements
     * [SMX4NMR-65] - Switch the Endpoint.SERVICE_NAME property value to the string representation of the qname for ease of use
     * [SMX4NMR-66] - Refactor ServiceEndpoint implementations
     * [SMX4NMR-68] - Parse interfaces supported by endpoints using the wsdl description
     * [SMX4NMR-71] - When a component sends a new exchange, the DeliveryChannel should select the NMR channel corresponding to this endpoint instead of the one for the component's endpoint
     * [SMX4NMR-72] - The ExchangeCompletedListener should only catch done/error exchanges when they are delivered, not sent
     * [SMX4NMR-73] - Throw an exception when sending a message to a closed channel
     * [SMX4NMR-75] - Upgrade to xbean 3.5
     * [SMX4NMR-85] - Improve JBI->OSGi transformation speed
     * [SMX4NMR-86] - Thread pools created by the EndpointRegistryImpl for ChanneImpl can not be managed / configured
     * [SMX4NMR-87] - Queues created by ComponentContextImpl for DeliveryChannelImpl can not be managed / configured
     * [SMX4NMR-95] - Allow the customization of the OSGi manifest when transforming a JBI artifact to an OSGi bundle
     * [SMX4NMR-96] - The transaction manager given to JBI components should implement RecoverableTransactionManager
     * [SMX4NMR-119] - Add command completion for jbi lifefycles commands

 ** New Feature
     * [SMX4NMR-17] - Implement the needed JMX mbeans for deployment / installation / management of JBI artifacts
     * [SMX4NMR-18] - JBI ant tasks
     * [SMX4NMR-20] - Implement SA connections
     * [SMX4NMR-22] - Port the audit feature from ServiceMix 3
     * [SMX4NMR-25] - JMS clustering
     * [SMX4NMR-56] - Handle external endpoints
     * [SMX4NMR-89] - Implement the JBI bootstrap mechanism
     * [SMX4NMR-94] - JNDI integration
     * [SMX4NMR-131] - Create interceptor example using EndpointListener from NMR eventing api.

 ** Task
     * [SMX4NMR-16] - Full JBI 1.0 compatibility
     * [SMX4NMR-50] - Make sure that shutting down the jbi layer cleanly shuts down all the JBI artifacts deployed (using both JBI and OSGi packaging)
     * [SMX4NMR-69] - Use managed dependencies instead of specifying the versions in all poms
     * [SMX4NMR-74] - Change the distribution to include ant tasks and the kernel to have a fully operational minimal jbi container
     * [SMX4NMR-91] - Create an example showing how to access the NMR from an osgi bundle to send exchanges
     * [SMX4NMR-92] - Create an example showing how to write an NMR endpoint
     * [SMX4NMR-102] - Move transactions support from the features project to the NMR
     * [SMX4NMR-107] - Use EasyMock for mock testing
     * [SMX4NMR-111] - Make sure the JBI plugin can be used to deploy jbi artifacts onto the NMR

 ** Test
     * [SMX4NMR-126] - Cluster engine tests fails on Hudson -- forked test times out in 60 seconds
     * [SMX4NMR-127] - ChannelImplTest.testDispatchAsync failed on my box caused by time issue



  Known Issues
  ------------

  * [SMX4NMR-128] - JBI Cluster Engine unit tests stall intermittently


                  Apache ServiceMix NMR 1.0.0-m3
                  ================================

  Overview
  --------

 This this milestone contains only a single change, which is related to the lifecycle
 of JBI endpoints using the OSGi packaging.  A service assembly is now created for the
 deployed spring configuration and the JBI lifecycle can now be applied to such
 endpoints.
 See the change log below for more informations.

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

 ** Bug
     * [SMX4NMR-52] - Use version ranges to make sure the NMR can be deployed at least onto ServiceMix Kernel 1.0.0

 ** Improvement
     * [SMX4NMR-51] - Exchange should be logged at debug level as in smx3

 ** New Feature
     * [SMX4NMR-24] - Lifecycle / clean shutdown for service assemblies deployed with the OSGi packaging


  Known Issues
  ------------

 * no support for JMX deployment and Ant tasks
 * no support for Service Assemblies Connections


                  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

