/*
 * 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 Karaf Cellar 2.3.3
                    =========================

  Overview
  --------

 This release of Apache Karaf Cellar is a major update on the 2.3.x series branch.
 It includes several bug fixes, including critical ones.

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

** Bug
    * [KARAF-1309] - Cellar causes Karaf container to freeze if system got network interface changes between container restarts
    * [KARAF-1474] - Fix Cellar itests
    * [KARAF-2550] - At first sync, cellar-config raises NPE
    * [KARAF-2591] - cluster group is not persistent anymore
    * [KARAF-3014] - Hazelcast tests fail on networks where multicast is disabled

** Dependency upgrade
    * [KARAF-3296] - Upgrade to joda-time 2.5
    * [KARAF-3297] - Upgrade to Felix BundleRepository 2.0.2
    * [KARAF-3356] - Upgrade to Karaf 2.3.9
    * [KARAF-3357] - Upgrade to Hazelcast 2.6.9

** Improvement
    * [KARAF-2205] - Cellar cluster event handler should check the local status before performing an operation
    * [KARAF-3341] - Blacklist "XML bundles" by default


                    Apache Karaf Cellar 2.3.2
                    =========================

  Overview
  --------

 This release of Apache Karaf Cellar is a major update on the 2.3.x series branch.
 It includes several bug fixes, including critical ones.

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

** Bug
    * [KARAF-2432] - Unable to install cellar when features' OBR support is enabled
    * [KARAF-2478] - Producer status is ignored when config is updated on cluster
    * [KARAF-2480] - cellar-event throws a HazelcastSerializationException caused by a 
		     ClassNotFoundException when an event has an instance of a class 
	             stored in the event properties
    * [KARAF-2514] - Config sync issue in some cases

** Improvement
    * [KARAF-2498] - Change log level to DEBUG for Cellar blacklist/whitelist message


                    Apache Karaf Cellar 2.3.1
                    =========================

  Overview
  --------

 This release of Apache Karaf Cellar is a major update on the 2.3.x series branch.
 It includes several bug fixes, including critical ones.

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

** Bug
    * [KARAF-1461] - Fail to install cellar feature using equinox if cxf-sts feature is installed before
    * [KARAF-2252] - synchornized features do not care about bundle status
    * [KARAF-2253] - karaf becomes out of memory when executing cluster:feature-install war with group.bundle.sync=true.
    * [KARAF-2317] - cluster:group-list still display a node which is down
    * [KARAF-2340] - Huge CPU consumption with Felix framework
    * [KARAF-2343] - Installing Cellar 2.3.0 cellar-event crashes Karaf 2.3.1 after a few seconds...
    * [KARAF-2345] - Can't start second instance of Karaf 2.3.1 with Cellar 2.3.0

** Dependency upgrade
    * [KARAF-2337] - Upgrade to Apache POM 13
    * [KARAF-2353] - Upgrade to Hazelcast 2.6

** Improvement
    * [KARAF-2204] - Cellar features repository should support install/uninstall all
    * [KARAF-2347] - Performance improvements for ConfigurationSupport class
    * [KARAF-2354] - Rename cellar-event feature to cellar-eventadmin

** Test
    * [KARAF-2349] - Patch to add debugging capability for the main test karaf container when building itests

                    Apache Karaf Cellar 2.3.0
                    =========================

  Overview
  --------

 This release of Apache Karaf Cellar is the first one of the 2.3.x series branch.
 It's fully compatible with Karaf 2.3.x version, and contains major new features,
 improvements and bug fixes.

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

** Bug
    * [KARAF-1349] - Can not share new configuration between user defined groups which have common node
    * [KARAF-1466] - Empty group doesn't appeared in group-list after restart of node.
    * [KARAF-1484] - config:propdel is not propagated to other group members
    * [KARAF-1486] - When a new member enters a custom group, it does not install the features that should be installed in that group
    * [KARAF-1492] - Cellar should use listConfiguration instead of getConfiguration
    * [KARAF-1503] - Default group remove node showing Ajax error
    * [KARAF-1504] - Cellar command do not install bundle
    * [KARAF-1625] - Pax Web uses port 8080 rather than the configured value
    * [KARAF-1860] - Features sync raises NPE or corrupt the node features set
    * [KARAF-1880] - Node fails to start after fresh karaf (with cellar) install
    * [KARAF-1971] - Bundle whitelist/blacklist are not correct by default
    * [KARAF-1974] - Bundle states are not correct
    * [KARAF-1975] - CellarBundleMBean is not able to display the list of bundles
    * [KARAF-1999] - Cellar LocalBundleListener raises ClassNotFoundException about BundleState
    * [KARAF-2032] - Some Cellar bundles doesn't start after a Karaf restart
    * [KARAF-2033] - Cellar local listeners have to check if sync is enabled
    * [KARAF-2038] - Node rejoin default group after a restart
    * [KARAF-2057] - NOTICE and LICENSE files are not correct
    * [KARAF-2096] - Upgrade to Pax Exam 2.6.0
    * [KARAF-2113] - Cellar doesn't install correctly
    * [KARAF-2133] - Generated title contain unresolved placeholder
    * [KARAF-2141] - cluster:producer/handler/consumer should display the local node
    * [KARAF-2142] - cluster:producer-start/stop (and handler/consumer) change the status on all nodes
    * [KARAF-2202] - Cellar WebConsole import version range should be extended
    * [KARAF-2218] - Fix manual links on website
    * [KARAF-2251] - Cellar: features:install ignores incoming and outgoing blacklist
    * [KARAF-2262] - cellar-cloud: The IP is not enough, sometimes the IP is hidden but a valid dns name is available
    * [KARAF-2263] - Cellar-Cloud: discover member removes member information which isn't re-generated
    * [KARAF-2268] - cellar-cloud: If other "Objects" are available at the bucket they sometimes are not "readable"
    * [KARAF-2271] - CellarFeaturesSynchronizer "pollutes" the Cellar startup
    * [KARAF-2272] - Bundle name is not populated in the Cellar bundles map
    * [KARAF-2274] - Cellar doesn't work with Felix framework
    * [KARAF-2277] - Cellar WebConsole doesn't install
    * [KARAF-2280] - cellar-config: The default group config should include org.ops4j.pax.web as blacklist for configuration
    * [KARAF-2281] - Cellar-Cloud: Exclude cloud configurations when installed
    * [KARAF-2286] - Cellar-Cloud: If the configured store contains unknown Blob this causes unpleasant exceptions
    * [KARAF-2287] - CellarFeaturesSynchronizer should check the local states before adding a repository
    * [KARAF-2318] - Exclude service.factoryPid from Cellar sync

** Dependency upgrade
    * [KARAF-1184] - Upgrade to JUnit 4.10
    * [KARAF-1745] - Upgrade to Felix WebConsole 4.0.0
    * [KARAF-1918] - Upgrade to OSGi Compendium 4.3.0
    * [KARAF-1948] - Upgrade to Apache POM 11
    * [KARAF-1977] - Upgrade to OSGi 4.3.1
    * [KARAF-1981] - Upgrade to Felix ConfigAdmin 1.6.0
    * [KARAF-2039] - Upgrade to hazelcast 2.4
    * [KARAF-2055] - Upgrade to Apache POM 12
    * [KARAF-2107] - Upgrade to slf4j 1.7.2
    * [KARAF-2210] - Upgrade to Hazelcast 2.5
    * [KARAF-2294] - Upgrade to jclouds 1.4.0

** Improvement
    * [KARAF-1082] - Cellar group configuration is not properly distributed to the cluster
    * [KARAF-1249] - Provide more fine grained Cellar features
    * [KARAF-1982] - Cellar features should populate the bundles distributed map
    * [KARAF-1998] - Remove cellar sync property and check config dictionary
    * [KARAF-2001] - cluster:config-list could "filter" for one given PID
    * [KARAF-2004] - Add Cellar bundle selector support
    * [KARAF-2021] - Log message should not be warn
    * [KARAF-2031] - Cellar bundle should handle Bundle-Name and fallback to Bundle-SymbolicName
    * [KARAF-2041] - Cellar LocalBundleListener should ignore framework stop event
    * [KARAF-2042] - Cellar should blacklist org.apache.felix.fileinstall* PID by default
    * [KARAF-2203] - hazelcast.xml file should be installed by the hazelcast feature
    * [KARAF-2242] - Easy listing of distributable features

** New Feature
    * [KARAF-1414] - Add persistence for handler/producer/consumer status
    * [KARAF-2023] - Provide cluster:sync commands and MBeans

** Test
    * [KARAF-2111] - Cellar should use karaf-pax-exam

                    Apache Karaf Cellar 2.2.4
                    =========================

  Overview
  --------

 This release of Apache Karaf Cellar is based off of the 2.2.x series branch,
 representing a major update to Apache Karaf Cellar 2.2.3. It contains bug fixes
 identified in the prior release, and introduces new features.
 group support.

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

** Bug
    * [KARAF-1190] - Cellar does not replicate Managed Service Factory configurations correctly
    * [KARAF-1236] - The distributed node/group map is not currently updated when uninstalling Cellar
    * [KARAF-1237] - cluster:bundle-install command doesn't exist using Equinox framework
    * [KARAF-1239] - Cellar stopped producer still generates event
    * [KARAF-1297] - Switching off multicast discovery in Cellar does not work properly
    * [KARAF-1301] - Cellar ignores features sync flag
    * [KARAF-1306] - Cellar Group related changes are not persisted in config files
    * [KARAF-1308] - Cannot move a node which belongs to more than one group to another group using 'cluster:group-pick'
    * [KARAF-1310] - CellarNodeMBean.getNodes() return only node on which it is executed instead all available nodes in cluster
    * [KARAF-1312] - log4j:ERROR Attempted to append to closed appender named [out]
    * [KARAF-1313] - cluster:group-create command has wrong message about absent parameter
    * [KARAF-1314] - cluster:feature-install command does not react on wrong feature name
    * [KARAF-1315] - Impossible to set or join group of remote cluster node
    * [KARAF-1316] - cluster:group-set and cluster:group-join commands are not rejecting incorrect node names
    * [KARAF-1317] - Unsuccessful remote cluster node ping
    * [KARAF-1319] - No warning or error is given when attempting to delete the "default" group
    * [KARAF-1320] - cluster:group-quit with no parameters leads to a timeout
    * [KARAF-1321] - Inconsistent behavior of cluster:group-quit
    * [KARAF-1322] - The Hazelcast group name is randomly set
    * [KARAF-1325] - Feature "cellar-obr", "cellar-cloud", "cellar-webconsole" cannot be synchronized from node1 to node2
    * [KARAF-1326] - Parameter count of "cluster:group-pick" is not working
    * [KARAF-1330] - "cluster:feature-uninstall" command only worked for current group but didn't work for other group
    * [KARAF-1332] - cluster:group-pick - <count> parameter is not handled correctly
    * [KARAF-1337] -  'cluster:config-list' command list  configuration PIDs two times whose name include "-"
    * [KARAF-1338] - cluster:config-proplist' command does not react on  group and PID parameter which are not existent
    * [KARAF-1339] - "cluster:feature-list" command didn't list any feature after karaf instance join a user defined group
    * [KARAF-1340] - The error info is not readable when cluster:feature-uninstall has incorrect argument.
    * [KARAF-1341] - The argument "node" of "cluster:group-set" command didn't work
    * [KARAF-1342] - Can not share new configuration in default group using standard karaf commands
    * [KARAF-1344] - 'cluster:config-list' command list the configution deleted by standard karaf 'config:delete' command
    * [KARAF-1345] - Feature still can be synchronized after stopping FeaturesEventHandler.
    * [KARAF-1348] - Can not disable config sync through stopping handler org.apache.karaf.cellar.config.ConfigurationEventHandler
    * [KARAF-1349] - Can not share new configuration between user defined groups which have common node
    * [KARAF-1352] - "Apache Karaf :: Cellar :: Hazelcast" remains in "RESOLVED" state
    * [KARAF-1353] - Exception is thrown after attempt to install cellar
    * [KARAF-1375] - The property "Version" in the output of cluster:feature-list default isn't flush left but flush right
    * [KARAF-1384] - Cellar manual doesn't build
    * [KARAF-1401] - Cellar handlers have to check the switch status and log a warn message when OFF
    * [KARAF-1404] - Cluster command 'cluster:config-proplist' only output edited properties
    * [KARAF-1405] - Can not update properties of configuraton  using cluster command 'cluster:config-propset'
    * [KARAF-1408] - These changes of the PID(org.apache.karaf.cellar.groups)  which in both blacklist inbound and blacklist outbound can be synchronized to other karaf instance
    * [KARAF-1409] - cluster:group-set fails with timeout
    * [KARAF-1412] - Output is not right when using cluster command 'cluster:handler-stop' without parameter
    * [KARAF-1413] - Parameters hander and node of 'cluster:handler-status' can not work
    * [KARAF-1419] - NPE in Cellar BundleEventHandler around start/stop/uninstall event
    * [KARAF-1426] - Cluster event handlers have to check if the target group is a local
    * [KARAF-1428] - Cellar should blacklist org.apache.karaf.shell PID by default
    * [KARAF-1429] - Cellar commands/MBeans should check if the event is allowed outbound
    * [KARAF-1433] - CellarConfigMBean listConfig operation returns nothing
    * [KARAF-1434] - Cellar ConfigLocalListener should broadcast cluster event
    * [KARAF-1435] - Cellar bundle has to tweak the TCCL
    * [KARAF-1436] - CellarFeaturesMBean doesn't update the distributed map
    * [KARAF-1437] - cluster:group-create on an existing group raise a CNFE
    * [KARAF-1453] - The command "cluster:handler-stop" don't work
    * [KARAF-1463] - Reintroduce config properties filtering
    * [KARAF-1464] - Some bundles of cellar failed to startup from time to time
    * [KARAF-1465] - "cluster:group-set" command same to "cluster:group-join" command
    * [KARAF-1477] - The "node(s)" parameter of command "cluster:group-join" doesn't work well
    * [KARAF-1480] - Cellar config should persist to cfg file

** Dependency upgrade
    * [KARAF-1205] - Upgrade to maven-bundle-plugin 2.3.7
    * [KARAF-1358] - Upgrade to Hazelcast 1.9.4.8
    * [KARAF-1364] - Upgrade to slf4j 1.6.4
    * [KARAF-1372] - Upgrade to jclouds 1.3.2

** Improvement
    * [KARAF-838] - Simplify the way classloading works in Cellar
    * [KARAF-1194] - ping timeout is not correctly handled
    * [KARAF-1248] - Avoid to duplicate configuration between hazelcast.xml and cellar instance cfg
    * [KARAF-1294] - Cellar should provide cluster features repository commands
    * [KARAF-1383] - Fix warning messages during bundle build
    * [KARAF-1397] - Cellar command should check at least the cluster group existence
    * [KARAF-1399] - Use Cellar consistent behavior
    * [KARAF-1417] - cluster:feature-list should mimic the feature:list
    * [KARAF-1420] - cluster:bundle-* commands should look like bundle:* commands
    * [KARAF-1460] - CellarFeatureMBean should provide repository operations

** New Feature
    * [KARAF-641] - Create shell commands for editing Cellar's instance configuration.
    * [KARAF-1176] - Support for OSGi event distribution in Karaf Cellar
    * [KARAF-1403] - Add cluster:config-propappend command
    * [KARAF-1424] - Add CellarOBRMBean

                    Apache Karaf Cellar 2.2.3
                    =========================

  Overview
  --------

 This release of Apache Karaf Cellar is based off of the 2.2.x series branch,
 representing an update to Apache Karaf Cellar 2.2.2. It contains bug fixes
 identified in the prior release, and introduces new features like bundle cluster 
 group support.

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

** Bug
    * [KARAF-669] - Dependency artifacts should be available on the Maven central repo
    * [KARAF-830] - Cellar features fails to install when obr feature is installed
    * [KARAF-839] - NPE when pinging Cellar nodes which does not exist.
    * [KARAF-841] - Cellar shell commands are not available on Equinox
    * [KARAF-842] - Cellar's hazelcast instance cannot be reused outside cellar
    * [KARAF-856] - Cellar discovery task can erase preconfigured node IPs
    * [KARAF-859] - URLs deleted via features:removeurl are coming back on a karaf instance restart (when cellar is also being used)
    * [KARAF-865] - Fixes For Cellar 2.2.3 Trunk
    * [KARAF-943] - cluster:features-uninstall raise a NPE
    * [KARAF-1034] - Cellar feature does not always cleanly uninstall
    * [KARAF-1076] - Cellar group configuration is not properly read when it contains whitespaces
    * [KARAF-1083] - Cellar should blacklist pax logging from syncing
    * [KARAF-1147] - ClassCastException using cellar when update configuration fields.

** Dependency upgrade
    * [KARAF-862] - Upgrade to Hazelcast 1.9.4
    * [KARAF-1155] - Upgrade to Apache POM 10
    * [KARAF-1156] - Upgrade to Hazelcast 1.9.4.6
    * [KARAF-1170] - Upgrade to jclouds 1.3.1


** Improvement
    * [KARAF-777] - Extend Cellar support range for Karaf version
    * [KARAF-821] - Error in console when uninstalling cellar feature
    * [KARAF-825] - Cellar event handler registry should leverage blueprint reference listeners
    * [KARAF-843] - Cellar's event transport factory should not cache producers and consumers
    * [KARAF-844] - Fix dynamic imports from Cellar Hazelcast bundle
    * [KARAF-851] - Upgrade Maven plugins in use
    * [KARAF-861] - Cellar should support cluster group for bundles
    * [KARAF-863] - Cellar commands naming consistency
    * [KARAF-877] - improvements to Cellar OBR support docs
    * [KARAF-949] - Upgrade Cellar to use Jclouds 1.1.1
    * [KARAF-1011] - Cellar Hazlecast should not use SpringDM
    * [KARAF-1012] - Upgrade cellar to use jclouds 1.2.1
    * [KARAF-1171] - Consolidate Cellar shell commands naming

** New Feature
    * [KARAF-823] - Add DOSGi support for Cellar
    * [KARAF-831] - Add a shell command that will batch move nodes from one cellar group to an other
    * [KARAF-837] - Add Samples for Cellar project
    * [KARAF-850] - Cellar should provide full access to hazelcast configuration
    * [KARAF-857] - Add OBR broadcast in Cellar
    * [KARAF-1026] - Cellar needs integration tests with pax-exam-karaf
    * [KARAF-1081] - Cellar should provide a Hazelcast merge policy.
    * [KARAF-1084] - Provide a cellar sample that demostrates combining cellar with camel hazelcast

** Task
    * [KARAF-887] - Refer PrinceXML website in the manual


                    Apache Karaf Cellar 2.2.2
                    =========================

  Overview
  --------

 This release of Apache Karaf Cellar is based off of the 2.2.x series branch,
 representing an update to Apache Karaf Cellar 2.2.2. It contains bug fixes
 identified in the prior release, and introduces new features like bundle
 replication, JMX MBeans, and clouding support.

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

** Bug
    * [KARAF-724] - cluster:config-propset help is not correct
    * [KARAF-759] - Equinox cannot resolve Cellar Hazelcast bundle
    * [KARAF-804] - Bad link in http://karaf.apache.org/manual/cellar/2.2.1/user-guide/index.html

** Dependency upgrade
    * [KARAF-774] - Upgrade to Karaf 2.2.2 in Cellar

** Improvement
    * [KARAF-721] - Add logging statements to Cellar where it makes sense.
    * [KARAF-723] - Create JMX Mbeans to report all Cellar events and provide details.
    * [KARAF-732] - Fixes to Cellar Arch Guide and Cellar User's Manual
    * [KARAF-763] - Editorial fixes to Cellar documentation

** New Feature
    * [KARAF-628] - Bundle replication
    * [KARAF-641] - Create shell commands for editing Cellar's instance configuration.
    * [KARAF-642] - Leverage Cellar instance configuration to allow Cloud discovery

** Task
    * [KARAF-801] - Update Cellar NOTICE file to mention jclouds

                    Apache Karaf Cellar 2.2.1
                    =========================

  Overview
  --------

 The Apache Karaf Cellar 2.2.1 is the first Cellar release.

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

** Bug
    * [KARAF-652] - Deadlock inside HazelcastServiceFactory unit test.
    * [KARAF-674] - Incorrect Karaf version used in Cellar
    * [KARAF-692] - Cellar HazelcastServiceFactoryTest failure
    * [KARAF-701] - Add Cellar source distribution
    * [KARAF-702] - Cellar webconsole groupId is not correct
    * [KARAF-703] - Check and ship the legal files in Cellar artifacts
    * [KARAF-714] - Cellar features descriptor is not correct
    * [KARAF-715] - Cellar manual doesn't include the Karaf logo
    * [KARAF-716] - Cellar manual with broken links

** Task
    * [KARAF-649] - Use maven-enforcer-plugin in cellar
    * [KARAF-691] - Release Apache Karaf Cellar 2.2.1
