/*
 * 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.2.0
                   ===========================

  Overview
  --------

  ServiceMix NMR 1.2.0 contains many bug fixes as well as feature enhancements.  ServiceMix Kernel has been moved to the
  Apache Felix project and renamed as Apache Felix Karaf.  This release of NMR uses Karaf 1.4.0.  This brings with it
  some changes to the command line syntax and a more standardized approach to the command line implementation by using
  the Apache Felix Gogo project.  This release also now includes full support for OSGi fragment bundles as provided by
  the Felix 2.0.4 release.

  This release also implements some of the Enterprise OSGi 4.2 specifications, with more to follow in subsequent
  releases.

  See the change log below for more informations.

  Changelog
  ---------

  The following list shows the bug fixes and enhancements included in this release:


Release Notes - ServiceMix NMR - Version 1.2.0


** Bug
    * [SMX4NMR-133] - Deadlock when starting the org.apache.servicemix.jbi.deployer bundle
    * [SMX4NMR-134] - Upgrade NMR to Spring DM 1.20-rc1
    * [SMX4NMR-135] - NMR core doesn't export the converter package
    * [SMX4NMR-136] - AssemblyReferencesListener throws NPE when SA is unknown for a given endpoint
    * [SMX4NMR-141] - NMR windows assembly incorrectly packaging the unix scripts
    * [SMX4NMR-142] - Component task result from ServiceUnitManager.deploy is ignored
    * [SMX4NMR-143] - Incorrect type in object name for component LifeCyle MBeans
    * [SMX4NMR-152] - refactor testing/support to make it work with karaf
    * [SMX4NMR-155] - When deploying JBI examples, error message 'A pseudo attribute name is expected' appears
    * [SMX4NMR-156] - ManagementTest fails when using localRepository from settings.xml
    * [SMX4NMR-157] - add null check to avoid NPE when shutdown SA
    * [SMX4NMR-159] - JBI ant tasks not using the right jmx service url
    * [SMX4NMR-160] - Management agent cannot be easily extended
    * [SMX4NMR-162] - ClassNotFoundException on Spring PlatformTransactionManager after restart
    * [SMX4NMR-163] - NMR assembly failing to build due to missing cglib dependency
    * [SMX4NMR-164] - JBI deployments can't use JNDI context class from embedded jar
    * [SMX4NMR-165] - NotCompliantMBeanException when ManagedEndpoint registered via ManagementStrategy
    * [SMX4NMR-166] - ManagementAgent.register method should catch UndeclaredThrowableException also
    * [SMX4NMR-167] - ensure stax-api bundle get loaded before servicemix-utils bundle
    * [SMX4NMR-168] - jbi-cluster endpoint name is '${servicemix.name}'
    * [SMX4NMR-169] - NMR cluster example is not working correctly
    * [SMX4NMR-170] - NMR distribution exports jaas with wrong version
    * [SMX4NMR-171] - when stop a bundle, the underlying counterpart JBI sa/component/sharedlib instance in the bundle should be removed from jmx server
    * [SMX4NMR-172] - Incorrect configuration for default clusterName in jbi.cluster.config bundle
    * [SMX4NMR-173] -  [clustering] Replicated messages not received by other cluster members
    * [SMX4NMR-174] - [clustering] Classloading failure on unmarshalling incoming replicated messages
    * [SMX4NMR-175] - [clustering] Replicated messages inadvertently consumed by other multicast-enabled brokers on the network
    * [SMX4NMR-177] - ChannelImplTest intermittently fails on AIX: NullPointerException
    * [SMX4NMR-182] - Spurious ServiceUnavailableException on shutdown of ManagementAgent
    * [SMX4NMR-183] - nmr:list command can't list all endpoint registered to the EndpointRegister.

** Improvement
    * [SMX4NMR-154] - Redo the branding for NMR
    * [SMX4NMR-161] - suppress the noisy warning message ement.ManagementEndpointRegistry   94 | No managed endpoint registered with id
    * [SMX4NMR-178] - Upgrade to ActiveMQ 5.3


** Task
    * [SMX4NMR-140] - Refactor management infrastructure to eliminate duplication and allow for easier pluggability
    * [SMX4NMR-144] - Switch from servicemix-kernel to karaf
    * [SMX4NMR-145] - porting example nmr with karaf
    * [SMX4NMR-149] - Switch-over to blueprint over-wrote some management refactoring changes to spring config
    * [SMX4NMR-158] - Updated the README.txt of the examples with latest kernel and servicemix feature
    * [SMX4NMR-180] - Upgrade to Camel 2.2.0

** Test
    * [SMX4NMR-146] - Enable MangementTest with karaf
    * [SMX4NMR-147] - Enable IntegrationTest with karaf
    * [SMX4NMR-151] - Assert registration of expected MBeans in management integration test
    * [SMX4NMR-153] - Dereferencing failure during Blueprint Service shutdown
    * [SMX4NMR-181] - JBI itests' ManagementTest intermittently fails on slower CI build machines


                  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

