karaf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ioca...@apache.org
Subject svn commit: r1100302 [1/5] - in /karaf/cellar: ./ branches/ tags/ trunk/ trunk/config/ trunk/config/src/ trunk/config/src/main/ trunk/config/src/main/java/ trunk/config/src/main/java/org/ trunk/config/src/main/java/org/apache/ trunk/config/src/main/jav...
Date Fri, 06 May 2011 17:55:42 GMT
Author: iocanel
Date: Fri May  6 17:55:35 2011
New Revision: 1100302

URL: http://svn.apache.org/viewvc?rev=1100302&view=rev
Log:
[KARAF-615] Create Cellar subproject

Added:
    karaf/cellar/
    karaf/cellar/branches/
    karaf/cellar/tags/
    karaf/cellar/trunk/
    karaf/cellar/trunk/config/
    karaf/cellar/trunk/config/pom.xml
    karaf/cellar/trunk/config/src/
    karaf/cellar/trunk/config/src/main/
    karaf/cellar/trunk/config/src/main/java/
    karaf/cellar/trunk/config/src/main/java/org/
    karaf/cellar/trunk/config/src/main/java/org/apache/
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSupport.java
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/Constants.java
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/RemoteConfigurationEvent.java
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ConfigCommandSupport.java
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ListCommand.java
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropListCommand.java
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropSetCommand.java
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/completers/
    karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/completers/ClusterConfigCompleter.java
    karaf/cellar/trunk/config/src/main/resources/
    karaf/cellar/trunk/config/src/main/resources/OSGI-INF/
    karaf/cellar/trunk/config/src/main/resources/OSGI-INF/blueprint/
    karaf/cellar/trunk/config/src/main/resources/OSGI-INF/blueprint/blueprint.xml
    karaf/cellar/trunk/config/src/main/resources/OSGI-INF/blueprint/shell-config.xml
    karaf/cellar/trunk/config/src/test/
    karaf/cellar/trunk/config/src/test/java/
    karaf/cellar/trunk/config/src/test/java/org/
    karaf/cellar/trunk/config/src/test/java/org/apache/
    karaf/cellar/trunk/config/src/test/java/org/apache/karaf/
    karaf/cellar/trunk/config/src/test/java/org/apache/karaf/cellar/
    karaf/cellar/trunk/config/src/test/java/org/apache/karaf/cellar/config/
    karaf/cellar/trunk/config/src/test/java/org/apache/karaf/cellar/config/ConfigurationSupportTest.java
    karaf/cellar/trunk/core/
    karaf/cellar/trunk/core/pom.xml
    karaf/cellar/trunk/core/src/
    karaf/cellar/trunk/core/src/main/
    karaf/cellar/trunk/core/src/main/java/
    karaf/cellar/trunk/core/src/main/java/org/
    karaf/cellar/trunk/core/src/main/java/org/apache/
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/CellarSupport.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/ClusterManager.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/Configurations.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/Consumer.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/Dispatcher.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/Group.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/GroupManager.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/Handler.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/HandlerRegistry.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/Node.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/Producer.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/Synchronizer.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/command/
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/command/BasicCommandStore.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/command/ClusteredExecutionContext.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/command/Command.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/command/CommandHandler.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/command/CommandStore.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/command/ExecutionContext.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/command/Result.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/command/ResultHandler.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/command/TimeoutResult.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/command/TimeoutTask.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/completers/
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/completers/AllNodeCompleter.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/completers/NodeCompleterSupport.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/BasicSwitch.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ConsumerSwitchCommand.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ConsumerSwitchCommandHandler.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ConsumerSwitchResult.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ConsumerSwitchResultHandler.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ManageGroupAction.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ManageGroupCommand.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ManageGroupCommandHandler.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ManageGroupResult.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ManageGroupResultHandler.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ManageHandlersCommand.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ManageHandlersCommandHandler.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ManageHandlersResult.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ManageHandlersResultHandler.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ProducerSwitchCommand.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ProducerSwitchCommandHandler.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ProducerSwitchResult.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/ProducerSwitchResultHandler.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/Switch.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/control/SwitchStatus.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/event/
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/event/Event.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/event/EventConsumer.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/event/EventDispatchTask.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/event/EventDispatcher.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/event/EventHandler.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/event/EventHandlerRegistry.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/event/EventHandlerServiceRegistry.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/event/EventHandlerServiceRegistryDispatcher.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/event/EventProducer.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/event/EventTracker.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/event/EventType.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/shell/
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/shell/CellarCommandSupport.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/shell/completers/
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/shell/completers/AllGroupsCompleter.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/shell/completers/GroupCompleterSupport.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/shell/completers/LocalGroupsCompleter.java
    karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/shell/completers/OtherGroupsCompleter.java
    karaf/cellar/trunk/core/src/main/test/
    karaf/cellar/trunk/features/
    karaf/cellar/trunk/features/pom.xml
    karaf/cellar/trunk/features/src/
    karaf/cellar/trunk/features/src/main/
    karaf/cellar/trunk/features/src/main/java/
    karaf/cellar/trunk/features/src/main/java/org/
    karaf/cellar/trunk/features/src/main/java/org/apache/
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/Constants.java
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/FeatureInfo.java
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/FeaturesEventHandler.java
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/FeaturesSupport.java
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/FeaturesSynchronizer.java
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/LocalFeaturesListener.java
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/RemoteFeaturesEvent.java
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/RemoteRepositoryEvent.java
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/RepositoryEventHandler.java
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/shell/
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/shell/FeatureCommandSupport.java
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/shell/InstallFeatureCommand.java
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/shell/ListGroupFeatures.java
    karaf/cellar/trunk/features/src/main/java/org/apache/karaf/cellar/features/shell/UninstallFeatureCommand.java
    karaf/cellar/trunk/features/src/main/resources/
    karaf/cellar/trunk/features/src/main/resources/OSGI-INF/
    karaf/cellar/trunk/features/src/main/resources/OSGI-INF/blueprint/
    karaf/cellar/trunk/features/src/main/resources/OSGI-INF/blueprint/blueprint.xml
    karaf/cellar/trunk/features/src/main/resources/OSGI-INF/blueprint/shell-features.xml
    karaf/cellar/trunk/features/src/test/
    karaf/cellar/trunk/features/src/test/java/
    karaf/cellar/trunk/hazelcast/
    karaf/cellar/trunk/hazelcast/pom.xml
    karaf/cellar/trunk/hazelcast/src/
    karaf/cellar/trunk/hazelcast/src/main/
    karaf/cellar/trunk/hazelcast/src/main/java/
    karaf/cellar/trunk/hazelcast/src/main/java/org/
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/CellarMembershipListener.java
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/Constants.java
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastClusterManager.java
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastNode.java
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/TopicConsumer.java
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/TopicProducer.java
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/
    karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastConfigurationFactory.java
    karaf/cellar/trunk/hazelcast/src/main/resources/
    karaf/cellar/trunk/hazelcast/src/main/resources/META-INF/
    karaf/cellar/trunk/hazelcast/src/main/resources/META-INF/spring/
    karaf/cellar/trunk/hazelcast/src/main/resources/META-INF/spring/beans.xml
    karaf/cellar/trunk/hazelcast/src/test/
    karaf/cellar/trunk/hazelcast/src/test/java/
    karaf/cellar/trunk/pom.xml
    karaf/cellar/trunk/shell/
    karaf/cellar/trunk/shell/pom.xml
    karaf/cellar/trunk/shell/src/
    karaf/cellar/trunk/shell/src/main/
    karaf/cellar/trunk/shell/src/main/java/
    karaf/cellar/trunk/shell/src/main/java/org/
    karaf/cellar/trunk/shell/src/main/java/org/apache/
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/ClusterCommandSuppot.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/ListNodesCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/PingCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/consumer/
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/consumer/ConsumerStartCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/consumer/ConsumerStatusCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/consumer/ConsumerStopCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/consumer/ConsumerSupport.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/group/
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/group/GroupCreateCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/group/GroupDeleteCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/group/GroupJoinCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/group/GroupListCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/group/GroupQuitCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/group/GroupSetCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/group/GroupSupport.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/handler/
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/handler/HandlersStartCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/handler/HandlersStatusCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/handler/HandlersStopCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/handler/HandlersSupport.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/producer/
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/producer/ProducerStartCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/producer/ProducerStatusCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/producer/ProducerStopCommand.java
    karaf/cellar/trunk/shell/src/main/java/org/apache/karaf/cellar/shell/producer/ProducerSupport.java
    karaf/cellar/trunk/shell/src/main/resources/
    karaf/cellar/trunk/shell/src/main/resources/OSGI-INF/
    karaf/cellar/trunk/shell/src/main/resources/OSGI-INF/blueprint/
    karaf/cellar/trunk/shell/src/main/resources/OSGI-INF/blueprint/shell-cluster.xml
    karaf/cellar/trunk/shell/src/test/
    karaf/cellar/trunk/shell/src/test/java/
    karaf/cellar/trunk/src/
    karaf/cellar/trunk/src/main/
    karaf/cellar/trunk/src/main/resources/
    karaf/cellar/trunk/src/main/resources/feature.xml
    karaf/cellar/trunk/src/main/resources/groups.cfg
    karaf/cellar/trunk/src/main/resources/node.cfg
    karaf/cellar/trunk/utils/
    karaf/cellar/trunk/utils/pom.xml
    karaf/cellar/trunk/utils/src/
    karaf/cellar/trunk/utils/src/main/
    karaf/cellar/trunk/utils/src/main/java/
    karaf/cellar/trunk/utils/src/main/java/org/
    karaf/cellar/trunk/utils/src/main/java/org/apache/
    karaf/cellar/trunk/utils/src/main/java/org/apache/karaf/
    karaf/cellar/trunk/utils/src/main/java/org/apache/karaf/cellar/
    karaf/cellar/trunk/utils/src/main/java/org/apache/karaf/cellar/utils/
    karaf/cellar/trunk/utils/src/main/java/org/apache/karaf/cellar/utils/ping/
    karaf/cellar/trunk/utils/src/main/java/org/apache/karaf/cellar/utils/ping/Ping.java
    karaf/cellar/trunk/utils/src/main/java/org/apache/karaf/cellar/utils/ping/PingHandler.java
    karaf/cellar/trunk/utils/src/main/java/org/apache/karaf/cellar/utils/ping/Pong.java
    karaf/cellar/trunk/utils/src/main/java/org/apache/karaf/cellar/utils/ping/PongHandler.java
    karaf/cellar/trunk/utils/src/main/resources/
    karaf/cellar/trunk/utils/src/main/resources/OSGI-INF/
    karaf/cellar/trunk/utils/src/main/resources/OSGI-INF/blueprint/
    karaf/cellar/trunk/utils/src/main/resources/OSGI-INF/blueprint/blueprint.xml
    karaf/cellar/trunk/utils/src/test/
    karaf/cellar/trunk/utils/src/test/java/

Added: karaf/cellar/trunk/config/pom.xml
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/pom.xml?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/pom.xml (added)
+++ karaf/cellar/trunk/config/pom.xml Fri May  6 17:55:35 2011
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.apache.karaf.cellar</groupId>
+        <artifactId>karaf-cellar</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>config</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Cellar :: Config</name>
+
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <osgi.import>
+            !org.apache.karaf.cellar.config*;version=${project.version},
+            org.apache.karaf.cellar.core*;version=${project.version},
+            *
+        </osgi.import>
+        <osgi.dynamic.import>javax.*,org.w3c.*,org.xml.*</osgi.dynamic.import>
+        <osgi.export>
+            org.apache.karaf.cellar.config*;version=${project.version}
+        </osgi.export>
+    </properties>
+
+    <dependencies>
+        <!-- Internal Dependencies -->
+        <dependency>
+            <groupId>org.apache.karaf.cellar</groupId>
+            <artifactId>core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <!-- Configuration Admin -->
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.configadmin</artifactId>
+        </dependency>
+        <!-- Logging Dependencies -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file

Added: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java (added)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java Fri May  6 17:55:35 2011
@@ -0,0 +1,109 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.config;
+
+
+import org.apache.karaf.cellar.core.Configurations;
+import org.apache.karaf.cellar.core.Group;
+import org.apache.karaf.cellar.core.Node;
+import org.apache.karaf.cellar.core.control.BasicSwitch;
+import org.apache.karaf.cellar.core.control.Switch;
+import org.apache.karaf.cellar.core.control.SwitchStatus;
+import org.apache.karaf.cellar.core.event.EventHandler;
+import org.apache.karaf.cellar.core.event.EventType;
+import org.osgi.service.cm.Configuration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * @author iocanel
+ */
+public class ConfigurationEventHandler extends ConfigurationSupport implements EventHandler<RemoteConfigurationEvent> {
+
+    private static Logger logger = LoggerFactory.getLogger(ConfigurationEventHandler.class);
+    public static final String SWITCH_ID = "org.apache.karaf.cellar.configuration.handler";
+
+    private final Switch eventSwitch = new BasicSwitch(SWITCH_ID);
+
+    private Node node;
+
+    /**
+     * Handles a
+     *
+     * @param event
+     */
+    public void handle(RemoteConfigurationEvent event) {
+
+        if (event == null || event.getSourceGroup() == null || node == null || node.equals(event.getSourceNode()))
+            return;
+
+        Group group = event.getSourceGroup();
+        String groupName = group.getName();
+
+        Map<String, Properties> configurationTable = clusterManager.getMap(Constants.CONFIGURATION_MAP + Configurations.SEPARATOR + groupName);
+
+        if (eventSwitch.getStatus().equals(SwitchStatus.ON)) {
+            String pid = event.getId();
+            //Check if the pid is marked as local.
+            if (isAllowed(event.getSourceGroup(), Constants.CATEGORY, pid, EventType.INBOUND)) {
+                Properties dictionary = configurationTable.get(pid);
+                Configuration conf;
+                try {
+                    conf = configurationAdmin.getConfiguration(pid);
+                    //Update the configurationTable.
+                    if (conf != null && dictionary != null) {
+                        Dictionary existingConfiguration = filterDictionary(conf.getProperties());
+                        if (!dictionariesEqual(dictionary, existingConfiguration)) {
+                            conf.update(preparePull(dictionary));
+                        }
+                    }
+                } catch (IOException ex) {
+                    logger.error("Failed to read remote configurationTable", ex);
+                }
+            } else logger.debug("Configuration with pid {} is marked as local.", pid);
+        }
+    }
+
+
+    /**
+     * Initialization Method.
+     */
+    public void init() {
+        if (clusterManager != null) {
+            node = clusterManager.getNode();
+        }
+    }
+
+    /**
+     * Destruction Method.
+     */
+    public void destroy() {
+
+    }
+
+
+    public Switch getSwitch() {
+        return eventSwitch;
+    }
+
+    public Class<RemoteConfigurationEvent> getType() {
+        return RemoteConfigurationEvent.class;
+    }
+}

Added: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSupport.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSupport.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSupport.java (added)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSupport.java Fri May  6 17:55:35 2011
@@ -0,0 +1,192 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.config;
+
+import org.apache.karaf.cellar.core.CellarSupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Properties;
+
+/**
+ * @author iocanel
+ */
+public class ConfigurationSupport extends CellarSupport {
+
+    private static Logger logger = LoggerFactory.getLogger(ConfigurationSupport.class);
+
+    private static String HOME_PLACEHOLDER = "karaf.home";
+    private static String RELATIVE_HOME = "${" + HOME_PLACEHOLDER + "}";
+    private static String HOME = System.getProperty("karaf.home");
+
+    private static String[] FILTERED_PROPERTIES = {"service.pid", "service.factoryPid", "felix.fileinstall.filename"};
+
+    /**
+     * Reads a {@code Dictionary} object and creates a property object out of it.
+     *
+     * @param dictionary
+     * @return
+     */
+    public Properties dictionaryToProperties(Dictionary dictionary) {
+        Properties properties = new Properties();
+        if (dictionary != null && dictionary.keys() != null) {
+
+            Enumeration keys = dictionary.keys();
+            while (keys.hasMoreElements()) {
+                String key = (String) keys.nextElement();
+                if (key != null && dictionary.get(key) != null) {
+                    String value = (String) dictionary.get(key);
+                    properties.put(key, dictionary.get(key));
+                }
+            }
+        }
+        return properties;
+    }
+
+
+    /**
+     * Prepares a dictionary for push
+     *
+     * @param dictionary
+     * @return
+     */
+    public Dictionary preparePush(Dictionary dictionary) {
+        Dictionary properties = new Properties();
+        Enumeration keys = dictionary.keys();
+        while (keys.hasMoreElements()) {
+            String key = (String) keys.nextElement();
+            if (key != null && dictionary.get(key) != null) {
+                String value = (String) dictionary.get(key);
+                value = convertStrings(value, HOME, RELATIVE_HOME);
+                properties.put(key, dictionary.get(key));
+            }
+        }
+        return properties;
+    }
+
+
+    /**
+     * Prepares a dictionary for Pull
+     *
+     * @param dictionary
+     * @return
+     */
+    public Dictionary preparePull(Dictionary dictionary) {
+        Dictionary properties = new Properties();
+        Enumeration keys = dictionary.keys();
+        while (keys.hasMoreElements()) {
+            String key = (String) keys.nextElement();
+            if (key != null && dictionary.get(key) != null) {
+                String value = (String) dictionary.get(key);
+                value = convertStrings(value, RELATIVE_HOME, HOME);
+                properties.put(key, dictionary.get(key));
+            }
+        }
+        return properties;
+    }
+
+    /**
+     * Performs a string replacement on value.
+     *
+     * @param value
+     * @return
+     */
+    public String convertStrings(String value, String absolute, String relative) {
+        String result = value;
+        if (absolute != null && !absolute.isEmpty() && value.contains(absolute)) {
+            result = value.replace(absolute, relative);
+        }
+        return result;
+    }
+
+
+    public Dictionary filterDictionary(Dictionary dictionary) {
+        Dictionary result = new Properties();
+        if (dictionary != null) {
+            Enumeration enumaration = dictionary.keys();
+            while (enumaration.hasMoreElements()) {
+                String key = (String) enumaration.nextElement();
+                if (!isPropertyFiltered(key)) {
+                    String value = (String) dictionary.get(key);
+                    result.put(key, value);
+                }
+            }
+        }
+        return result;
+    }
+
+
+    /**
+     * Returns true if dictionaries are equal.
+     *
+     * @param dict1
+     * @param dict2
+     * @return
+     */
+    protected boolean dictionariesEqual(Dictionary dict1, Dictionary dict2) {
+        return subDictionary(dict1, dict2) && subDictionary(dict2, dict1);
+    }
+
+
+    /**
+     * Returns true if target contains all source key/value pairs.
+     *
+     * @param source
+     * @param target
+     * @return
+     */
+    public boolean subDictionary(Dictionary source, Dictionary target) {
+        if (source == null && target == null) {
+            return true;
+        } else if (source == null || target == null) {
+            return false;
+        } else if (source.isEmpty() && target.isEmpty()) {
+            return true;
+        } else {
+            Enumeration keys = source.keys();
+            while (keys.hasMoreElements()) {
+                String key = (String) keys.nextElement();
+                String value1 = (String) source.get(key);
+                String value2 = (String) target.get(key);
+
+                if (value1 == null && value2 == null)
+                    continue;
+                else if (value1 == null)
+                    return false;
+                else if (value2 == null)
+                    return false;
+                else if (value1.equals(value2))
+                    continue;
+            }
+            return true;
+        }
+    }
+
+    /**
+     * Returns true if property is Filtered.
+     *
+     * @param propertyName
+     * @return
+     */
+    public boolean isPropertyFiltered(String propertyName) {
+        for (int i = 0; i < FILTERED_PROPERTIES.length; i++) {
+            if (FILTERED_PROPERTIES[i].equals(propertyName))
+                return true;
+        }
+        return false;
+    }
+}

Added: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java (added)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java Fri May  6 17:55:35 2011
@@ -0,0 +1,197 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.config;
+
+import org.apache.karaf.cellar.core.Configurations;
+import org.apache.karaf.cellar.core.Group;
+import org.apache.karaf.cellar.core.Synchronizer;
+import org.apache.karaf.cellar.core.event.EventProducer;
+import org.apache.karaf.cellar.core.event.EventType;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.cm.Configuration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * @author iocanel
+ */
+public class ConfigurationSynchronizer extends ConfigurationSupport implements Synchronizer {
+
+    private static Logger logger = LoggerFactory.getLogger(ConfigurationSynchronizer.class);
+
+    private List<EventProducer> producerList;
+
+    /**
+     * Constructor
+     */
+    public ConfigurationSynchronizer() {
+    }
+
+    /**
+     * Registration method
+     */
+    public void init() {
+        Set<Group> groups = groupManager.listLocalGroups();
+        if (groups != null && !groups.isEmpty()) {
+            for (Group group : groups) {
+                if (isSyncEnabled(group)) {
+                    pull(group);
+                    push(group);
+                }
+            }
+        }
+    }
+
+    /**
+     * Destruction method
+     */
+    public void destroy() {
+
+    }
+
+    /**
+     * Reads the configuration from the remote map.
+     */
+    public void pull(Group group) {
+        if (group != null) {
+            String groupName = group.getName();
+            Map<String, Properties> configurationTable = clusterManager.getMap(Constants.CONFIGURATION_MAP + Configurations.SEPARATOR + groupName);
+
+            ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+            try {
+                Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+
+                for (String pid : configurationTable.keySet()) {
+                    //Check if the pid is marked as local.
+                    if (isAllowed(group, Constants.CATEGORY, pid, EventType.INBOUND)) {
+                        Properties dictionary = configurationTable.get(pid);
+                        try {
+                            Configuration conf = configurationAdmin.getConfiguration(pid);
+                            //Update the configuration.
+                            if (conf != null) {
+                                //Mark the remote configuration event.
+                                RemoteConfigurationEvent event = new RemoteConfigurationEvent(conf.getPid());
+                                conf.update(preparePull(dictionary));
+                            }
+                        } catch (IOException ex) {
+                            logger.error("Failed to read remote configuration", ex);
+                        }
+                    }
+                }
+            } finally {
+                Thread.currentThread().setContextClassLoader(originalClassLoader);
+            }
+        }
+    }
+
+    /**
+     * Publishses local configuration to the cluster.
+     */
+    public void push(Group group) {
+        if (group != null) {
+            String groupName = group.getName();
+            Map<String, Properties> configurationTable = clusterManager.getMap(Constants.CONFIGURATION_MAP + Configurations.SEPARATOR + groupName);
+
+            ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+            try {
+                Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+                Configuration[] configs;
+                try {
+                    configs = configurationAdmin.listConfigurations(null);
+                    for (Configuration conf : configs) {
+                        String pid = conf.getPid();
+                        //Check if the pid is marked as local.
+                        if (isAllowed(group, Constants.CATEGORY, pid, EventType.OUTBOUND)) {
+                            Properties source = dictionaryToProperties(preparePush(filterDictionary(conf.getProperties())));
+                            Properties target = configurationTable.get(pid);
+                            if (target != null) {
+                                boolean requiresUpdate = false;
+                                if (source != null && source.keys() != null) {
+                                    Enumeration keys = source.keys();
+                                    while (keys.hasMoreElements()) {
+                                        String key = (String) keys.nextElement();
+                                        if (target.get(key) == null || target.get(key).equals(source.get(key))) {
+                                            requiresUpdate = true;
+                                            target.put(key, source.get(key));
+                                        }
+                                    }
+                                    configurationTable.put(pid, target);
+                                    if (requiresUpdate) {
+                                        RemoteConfigurationEvent event = new RemoteConfigurationEvent(conf.getPid());
+                                        if (producerList != null && !producerList.isEmpty()) {
+                                            for (EventProducer producer : producerList) {
+                                                producer.produce(event);
+                                            }
+                                        }
+
+                                    }
+                                    logger.info("Publishing PID:" + pid);
+                                }
+                            } else {
+                                RemoteConfigurationEvent event = new RemoteConfigurationEvent(conf.getPid());
+                                configurationTable.put(pid, source);
+                                if (producerList != null && !producerList.isEmpty()) {
+                                    for (EventProducer producer : producerList) {
+                                        producer.produce(event);
+                                    }
+                                }
+                                logger.info("Publishing PID:" + pid);
+                            }
+                        }
+                    }
+                } catch (IOException ex) {
+                    logger.error("Failed to read remote configuration, due to I/O error:", ex);
+                } catch (InvalidSyntaxException ex) {
+                    logger.error("Failed to read remote configuration, due to invalid filter syntax:", ex);
+                }
+            } finally {
+                Thread.currentThread().setContextClassLoader(originalClassLoader);
+            }
+        }
+    }
+
+    @Override
+    public Boolean isSyncEnabled(Group group) {
+        Boolean result = Boolean.FALSE;
+        String groupName = group.getName();
+
+        try {
+            Configuration configuration = configurationAdmin.getConfiguration(Configurations.GROUP);
+            Dictionary<String, String> properties = configuration.getProperties();
+            String propertyKey = groupName + Configurations.SEPARATOR + Constants.CATEGORY + Configurations.SEPARATOR + Configurations.SYNC;
+            String propertyValue = properties.get(propertyKey);
+            result = Boolean.parseBoolean(propertyValue);
+        } catch (IOException e) {
+            logger.error("Error while checking if sync is enabled.", e);
+        }
+        return result;
+    }
+
+    public List<EventProducer> getProducerList() {
+        return producerList;
+    }
+
+    public void setProducerList(List<EventProducer> producerList) {
+        this.producerList = producerList;
+    }
+}

Added: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/Constants.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/Constants.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/Constants.java (added)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/Constants.java Fri May  6 17:55:35 2011
@@ -0,0 +1,23 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.config;
+
+/**
+ * @author iocanel
+ */
+public class Constants {
+    public static final String CATEGORY = "config";
+    public static final String CONFIGURATION_MAP = "org.apache.karaf.cellar.configuration.map";
+}

Added: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java (added)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java Fri May  6 17:55:35 2011
@@ -0,0 +1,121 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.config;
+
+import org.apache.karaf.cellar.core.Configurations;
+import org.apache.karaf.cellar.core.Group;
+import org.apache.karaf.cellar.core.Node;
+import org.apache.karaf.cellar.core.event.EventProducer;
+import org.apache.karaf.cellar.core.event.EventType;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationEvent;
+import org.osgi.service.cm.ConfigurationListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * @author: iocanel
+ */
+public class LocalConfigurationListener extends ConfigurationSupport implements ConfigurationListener {
+
+    private static final Logger logger = LoggerFactory.getLogger(LocalConfigurationListener.class);
+
+    private List<EventProducer> producerList;
+
+    private Node node;
+
+    /**
+     * Handle local configuration events.
+     * If the event is a pending event stop it. Else broadcast it to the cluster.
+     *
+     * @param event
+     */
+    public void configurationEvent(ConfigurationEvent event) {
+        String pid = event.getPid();
+
+        Set<Group> groups = groupManager.listLocalGroups();
+
+        if (groups != null && !groups.isEmpty()) {
+            for (Group group : groups) {
+                //Check if the pid is allowed for outbound.
+                if (isAllowed(group, Constants.CATEGORY, pid, EventType.OUTBOUND)) {
+                    RemoteConfigurationEvent configurationEvent = new RemoteConfigurationEvent(pid);
+                    configurationEvent.setSourceGroup(group);
+                    configurationEvent.setSourceNode(node);
+                    push(pid, group);
+                    if (producerList != null && !producerList.isEmpty()) {
+                        for (EventProducer producer : producerList) {
+                            producer.produce(configurationEvent);
+                        }
+                    }
+                } else logger.debug("Configuration with pid {} is marked as local.", pid);
+            }
+        }
+    }
+
+    /**
+     * Push configuration with pid to the table.
+     *
+     * @param pid
+     */
+
+    protected void push(String pid, Group group) {
+        String groupName = group.getName();
+
+        Map<String, Properties> configurationTable = clusterManager.getMap(Constants.CONFIGURATION_MAP + Configurations.SEPARATOR + groupName);
+        try {
+            Configuration[] configurations = configurationAdmin.listConfigurations("(service.pid=" + pid + ")");
+            for (Configuration configuration : configurations) {
+                Properties properties = dictionaryToProperties(preparePush(filterDictionary(configuration.getProperties())));
+                configurationTable.put(configuration.getPid(), properties);
+            }
+        } catch (IOException e) {
+            logger.error("Failed to push configuration with pid:" + pid, e);
+        } catch (InvalidSyntaxException e) {
+            logger.error("Failed to retrieve configuration with pid:" + pid, e);
+        }
+    }
+
+    /**
+     * Initialization Method.
+     */
+    public void init() {
+        if (clusterManager != null) {
+            node = clusterManager.getNode();
+        }
+    }
+
+    /**
+     * Destruction Method.
+     */
+    public void destroy() {
+
+    }
+
+    public List<EventProducer> getProducerList() {
+        return producerList;
+    }
+
+    public void setProducerList(List<EventProducer> producerList) {
+        this.producerList = producerList;
+    }
+}

Added: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/RemoteConfigurationEvent.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/RemoteConfigurationEvent.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/RemoteConfigurationEvent.java (added)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/RemoteConfigurationEvent.java Fri May  6 17:55:35 2011
@@ -0,0 +1,28 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.config;
+
+
+import org.apache.karaf.cellar.core.event.Event;
+
+/**
+ * @author iocanel
+ */
+public class RemoteConfigurationEvent extends Event {
+
+    public RemoteConfigurationEvent(String id) {
+        super(id);
+    }
+}

Added: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ConfigCommandSupport.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ConfigCommandSupport.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ConfigCommandSupport.java (added)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ConfigCommandSupport.java Fri May  6 17:55:35 2011
@@ -0,0 +1,23 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.config.shell;
+
+import org.apache.karaf.cellar.core.shell.CellarCommandSupport;
+
+/**
+ * @author: iocanel
+ */
+public abstract class ConfigCommandSupport extends CellarCommandSupport {
+}

Added: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ListCommand.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ListCommand.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ListCommand.java (added)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/ListCommand.java Fri May  6 17:55:35 2011
@@ -0,0 +1,57 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.config.shell;
+
+import org.apache.karaf.cellar.config.Constants;
+import org.apache.karaf.cellar.core.Configurations;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * @author: iocanel
+ */
+@Command(scope = "cluster", name = "config-list", description = "List the config pids that are assigned to a group")
+public class ListCommand extends ConfigCommandSupport {
+
+    protected static final String OUTPUT_FORMAT = "%-40s";
+
+    @Argument(index = 0, name = "group", description = "The name of the group", required = true, multiValued = false)
+    String groupName;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+
+            Map<String, Properties> configurationTable = clusterManager.getMap(Constants.CONFIGURATION_MAP + Configurations.SEPARATOR + groupName);
+
+            if (configurationTable != null && !configurationTable.isEmpty()) {
+                System.out.println(String.format("PIDs for group:" + groupName));
+                System.out.println(String.format(OUTPUT_FORMAT, "PID"));
+                for (String pid : configurationTable.keySet()) {
+                    System.out.println(String.format(OUTPUT_FORMAT, pid));
+                }
+            } else System.err.println("No PIDs found for group:" + groupName);
+        } finally {
+            Thread.currentThread().setContextClassLoader(originalClassLoader);
+
+        }
+        return null;
+    }
+}

Added: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropListCommand.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropListCommand.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropListCommand.java (added)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropListCommand.java Fri May  6 17:55:35 2011
@@ -0,0 +1,64 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.config.shell;
+
+import org.apache.karaf.cellar.config.Constants;
+import org.apache.karaf.cellar.core.Configurations;
+import org.apache.karaf.cellar.core.shell.CellarCommandSupport;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * @author: iocanel
+ */
+@Command(scope = "cluster", name = "config-proplist", description = "List the config pids that are assigned to a group")
+public class PropListCommand extends CellarCommandSupport {
+
+    protected static final String OUTPUT_FORMAT = "%-40s %s";
+
+    @Argument(index = 0, name = "group", description = "The name of the group", required = true, multiValued = false)
+    String groupName;
+
+    @Argument(index = 1, name = "pid", description = "The pid of the configuration", required = true, multiValued = false)
+    String pid;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+
+            Map<String, Properties> configurationTable = clusterManager.getMap(Constants.CONFIGURATION_MAP + Configurations.SEPARATOR + groupName);
+
+            if (configurationTable != null && !configurationTable.isEmpty()) {
+                System.out.println(String.format("Property list for PID:" + pid + " for group:" + groupName));
+                System.out.println(String.format(OUTPUT_FORMAT, "Key", "Value"));
+                Properties properties = configurationTable.get(pid);
+                if (properties != null && !properties.isEmpty())
+                    for (Object key : properties.keySet()) {
+                        String value = properties.getProperty((String) key);
+                        System.out.println(String.format(OUTPUT_FORMAT, key, value));
+                    }
+            } else System.err.print("No PIDs found for group:" + groupName);
+        } finally {
+            Thread.currentThread().setContextClassLoader(originalClassLoader);
+
+        }
+        return null;
+    }
+}

Added: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropSetCommand.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropSetCommand.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropSetCommand.java (added)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/PropSetCommand.java Fri May  6 17:55:35 2011
@@ -0,0 +1,56 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.config.shell;
+
+import org.apache.karaf.cellar.config.Constants;
+import org.apache.karaf.cellar.core.Configurations;
+import org.apache.karaf.cellar.core.Group;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * @author: iocanel
+ */
+@Command(scope = "cluster", name = "config-propset", description = "Sets the a property value for a PID and group")
+public class PropSetCommand extends ConfigCommandSupport {
+
+    @Argument(index = 0, name = "group", description = "The name of the group", required = true, multiValued = false)
+    String groupName;
+
+    @Argument(index = 1, name = "pid", description = "The pid of the configuration", required = true, multiValued = false)
+    String pid;
+
+    @Argument(index = 2, name = "key", description = "The key of the property", required = true, multiValued = false)
+    String key;
+
+    @Argument(index = 3, name = "key", description = "The key of the property", required = true, multiValued = false)
+    String value;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        Group group = groupManager.findGroupByName(groupName);
+        Map<String, Properties> configurationTable = clusterManager.getMap(Constants.CONFIGURATION_MAP + Configurations.SEPARATOR + groupName);
+        Properties properties = configurationTable.get(pid);
+        if (properties == null) {
+            properties = new Properties();
+        }
+        properties.put(key, value);
+        configurationTable.put(pid, properties);
+        return null;
+    }
+}

Added: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/completers/ClusterConfigCompleter.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/completers/ClusterConfigCompleter.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/completers/ClusterConfigCompleter.java (added)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/shell/completers/ClusterConfigCompleter.java Fri May  6 17:55:35 2011
@@ -0,0 +1,75 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.config.shell.completers;
+
+import org.apache.karaf.cellar.config.Constants;
+import org.apache.karaf.cellar.core.ClusterManager;
+import org.apache.karaf.cellar.core.Configurations;
+import org.apache.karaf.cellar.core.Group;
+import org.apache.karaf.cellar.core.GroupManager;
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * @author: iocanel
+ */
+public class ClusterConfigCompleter implements Completer {
+
+    protected ClusterManager clusterManager;
+    protected GroupManager groupManager;
+
+    public int complete(String buffer, int cursor, List<String> candidates) {
+        StringsCompleter delegate = new StringsCompleter();
+        try {
+            Map<String, Group> groups = groupManager.listGroups();
+            if (groups != null && !groups.isEmpty()) {
+                for (String groupName : groups.keySet()) {
+                    Map<String, Properties> configurationTable = clusterManager.getMap(Constants.CONFIGURATION_MAP + Configurations.SEPARATOR + groupName);
+                    if (configurationTable != null && !configurationTable.isEmpty()) {
+                        for (String pid : configurationTable.keySet()) {
+                            if (delegate.getStrings() != null && !delegate.getStrings().contains(pid)) {
+                                delegate.getStrings().add(pid);
+                            }
+                        }
+                    }
+                }
+            }
+
+        } catch (Exception e) {
+            // Ignore
+        }
+        return delegate.complete(buffer, cursor, candidates);
+    }
+
+    public ClusterManager getClusterManager() {
+        return clusterManager;
+    }
+
+    public void setClusterManager(ClusterManager clusterManager) {
+        this.clusterManager = clusterManager;
+    }
+
+    public GroupManager getGroupManager() {
+        return groupManager;
+    }
+
+    public void setGroupManager(GroupManager groupManager) {
+        this.groupManager = groupManager;
+    }
+}

Added: karaf/cellar/trunk/config/src/main/resources/OSGI-INF/blueprint/blueprint.xml
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/resources/OSGI-INF/blueprint/blueprint.xml?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/src/main/resources/OSGI-INF/blueprint/blueprint.xml (added)
+++ karaf/cellar/trunk/config/src/main/resources/OSGI-INF/blueprint/blueprint.xml Fri May  6 17:55:35 2011
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   Licensed 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.
+  -->
+
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <!-- Cluster Configuration Listener -->
+    <bean id="configurationListener" class="org.apache.karaf.cellar.config.LocalConfigurationListener" init-method="init"
+          destroy-method="destroy">
+        <property name="producerList" ref="groupEventProducers"/>
+        <property name="clusterManager" ref="clusterManager"/>
+        <property name="groupManager" ref="groupManager"/>
+        <property name="configurationAdmin" ref="configurationAdmin"/>
+    </bean>
+
+    <!-- Configuration Synchronizer -->
+    <bean id="synchronizer" class="org.apache.karaf.cellar.config.ConfigurationSynchronizer"
+          init-method="init" destroy-method="destroy" depends-on="eventHandler">
+        <property name="configurationAdmin" ref="configurationAdmin"/>
+        <property name="groupManager" ref="groupManager"/>
+        <property name="clusterManager" ref="clusterManager"/>
+        <property name="producerList" ref="groupEventProducers"/>
+    </bean>
+
+    <bean id="eventHandler" class="org.apache.karaf.cellar.config.ConfigurationEventHandler"
+          init-method="init" destroy-method="destroy">
+        <property name="configurationAdmin" ref="configurationAdmin"/>
+        <property name="clusterManager" ref="clusterManager"/>
+    </bean>
+
+    <!-- OSGi Services  & References -->
+    <service ref="configurationListener" interface="org.osgi.service.cm.ConfigurationListener"/>
+    <service ref="synchronizer" interface="org.apache.karaf.cellar.core.Synchronizer"/>
+    <service ref="eventHandler" interface="org.apache.karaf.cellar.core.event.EventHandler">
+        <service-properties>
+            <entry key="managed" value="true"/>
+        </service-properties>
+    </service>
+
+    <reference id="clusterManager" interface="org.apache.karaf.cellar.core.ClusterManager"/>
+    <reference id="groupManager" interface="org.apache.karaf.cellar.core.GroupManager"/>
+    <reference id="configurationAdmin" interface="org.osgi.service.cm.ConfigurationAdmin"/>
+    <reference-list id="groupEventProducers" member-type="service-object"
+                    interface="org.apache.karaf.cellar.core.event.EventProducer" filter="(type=group)"/>
+
+</blueprint>

Added: karaf/cellar/trunk/config/src/main/resources/OSGI-INF/blueprint/shell-config.xml
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/resources/OSGI-INF/blueprint/shell-config.xml?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/src/main/resources/OSGI-INF/blueprint/shell-config.xml (added)
+++ karaf/cellar/trunk/config/src/main/resources/OSGI-INF/blueprint/shell-config.xml Fri May  6 17:55:35 2011
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   Licensed 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.
+  -->
+
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <!-- Command Bundle -->
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="cluster/config-list">
+            <action class="org.apache.karaf.cellar.config.shell.ListCommand">
+                <property name="clusterManager" ref="clusterManager"/>
+            </action>
+            <completers>
+                <ref component-id="allGroupCompleter"/>
+            </completers>
+        </command>
+        <command name="cluster/config-proplist">
+            <action class="org.apache.karaf.cellar.config.shell.PropListCommand">
+                <property name="clusterManager" ref="clusterManager"/>
+            </action>
+            <completers>
+                <ref component-id="allGroupCompleter"/>
+            </completers>
+        </command>
+        <command name="cluster/config-propset">
+            <action class="org.apache.karaf.cellar.config.shell.PropSetCommand">
+                <property name="clusterManager" ref="clusterManager"/>
+                <property name="groupManager" ref="groupManager"/>
+            </action>
+            <completers>
+                <ref component-id="allGroupCompleter"/>
+            </completers>
+        </command>
+
+    </command-bundle>
+
+    <bean id="allGroupCompleter" class="org.apache.karaf.cellar.core.shell.completers.AllGroupsCompleter">
+        <property name="groupManager" ref="groupManager"/>
+    </bean>
+
+    <bean id="allFeatureCompleter" class="org.apache.karaf.cellar.config.shell.completers.ClusterConfigCompleter">
+        <property name="groupManager" ref="groupManager"/>
+        <property name="clusterManager" ref="clusterManager"/>
+    </bean>
+
+</blueprint>

Added: karaf/cellar/trunk/config/src/test/java/org/apache/karaf/cellar/config/ConfigurationSupportTest.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/test/java/org/apache/karaf/cellar/config/ConfigurationSupportTest.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/config/src/test/java/org/apache/karaf/cellar/config/ConfigurationSupportTest.java (added)
+++ karaf/cellar/trunk/config/src/test/java/org/apache/karaf/cellar/config/ConfigurationSupportTest.java Fri May  6 17:55:35 2011
@@ -0,0 +1,60 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.config;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Dictionary;
+import java.util.Properties;
+
+/**
+ * @author iocanel
+ */
+public class ConfigurationSupportTest {
+
+    ConfigurationSupport support = new ConfigurationSupport();
+
+    @Test
+    public void testFilterDictionary() {
+        Dictionary result = null;
+        Dictionary source = new Properties();
+        Dictionary expectedResult = new Properties();
+
+        source.put("key1", "value1");
+        source.put("key2", "value2");
+
+        expectedResult.put("key1", "value1");
+        expectedResult.put("key2", "value2");
+        result = support.filterDictionary(source);
+
+        source.put("service.pid", "value3");
+        result = support.filterDictionary(source);
+
+        Assert.assertEquals(expectedResult, result);
+    }
+
+    @Test
+    public void testConvertStrings() throws Exception {
+        String absolutePath = "/somewehre/karaf/etc";
+        String home = "/somewehre/karaf";
+        String var = "${karaf.home}";
+
+        String expectedResult = "${karaf.home}/etc";
+
+        String result = support.convertStrings(absolutePath, home, var);
+        Assert.assertEquals(expectedResult, result);
+    }
+}

Added: karaf/cellar/trunk/core/pom.xml
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/core/pom.xml?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/core/pom.xml (added)
+++ karaf/cellar/trunk/core/pom.xml Fri May  6 17:55:35 2011
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.apache.karaf.cellar</groupId>
+        <artifactId>karaf-cellar</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>core</artifactId>
+    <name>Apache Karaf :: Cellar :: Core</name>
+    <packaging>bundle</packaging>
+
+    <properties>
+        <osgi.import>
+            !org.apache.karaf.cellar.core*;version=${project.version},
+            org.apache.karaf.shell.console*;version="[2,4)",
+            *
+        </osgi.import>
+        <osgi.dynamic.import>javax.*,org.w3c.*,org.xml.*</osgi.dynamic.import>
+        <osgi.export>
+            org.apache.karaf.cellar.core*;version=${project.version}
+        </osgi.export>
+    </properties>
+
+    <dependencies>
+        <!-- OSGi dependencies -->
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+
+        <!-- Configuration Admin -->
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.configadmin</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+
+        <!-- Logging Dependencies -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+        </dependency>
+
+        <!-- Testing Dependencies -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file

Added: karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/CellarSupport.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/CellarSupport.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/CellarSupport.java (added)
+++ karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/CellarSupport.java Fri May  6 17:55:35 2011
@@ -0,0 +1,210 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.core;
+
+import org.apache.karaf.cellar.core.event.EventType;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author iocanel
+ */
+public class CellarSupport {
+
+    protected static Logger logger = LoggerFactory.getLogger(CellarSupport.class);
+
+    protected ClusterManager clusterManager;
+    protected GroupManager groupManager;
+    protected ConfigurationAdmin configurationAdmin;
+
+
+    /**
+     * Lists the BlackList for the specified feature.
+     *
+     * @param category
+     * @param group
+     * @return
+     */
+    public Set<String> getListEntries(String listType, String group, String category, EventType type) {
+        Set<String> result = null;
+        if (group != null) {
+            try {
+                Configuration configuration = configurationAdmin.getConfiguration(Configurations.GROUP);
+                Dictionary<String, String> dictionary = configuration.getProperties();
+                if (dictionary != null) {
+                    String parent = dictionary.get(group + Configurations.SEPARATOR + Configurations.PARENT);
+                    if (parent != null) {
+                        result = getListEntries(listType, parent, category, type);
+                    }
+
+                    String propertyName = group + Configurations.SEPARATOR + category + Configurations.SEPARATOR + listType + Configurations.SEPARATOR + type.name().toLowerCase();
+                    String propertyValue = dictionary.get(propertyName);
+                    if (propertyValue != null) {
+                        String[] itemList = propertyValue.split(Configurations.DELIMETER);
+
+                        if (itemList != null && itemList.length > 0) {
+                            if (result == null) {
+                                result = new HashSet<String>();
+                            }
+                            for (String item : itemList)
+                                result.add(item);
+                        }
+                    }
+                }
+            } catch (IOException e) {
+                logger.error("Error looking up for clustering group configuration cfg");
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Lists the BlackList for the specified feature.
+     *
+     * @param category
+     * @param groups
+     * @param category
+     * @param type
+     * @return
+     */
+    public Set<String> getListEntries(String listType, Collection<String> groups, String category, EventType type) {
+        Set<String> result = null;
+        if (groups != null && !groups.isEmpty()) {
+            for (String group : groups) {
+                Set<String> items = getListEntries(listType, group, category, type);
+                if (items != null && !items.isEmpty()) {
+                    if (result == null)
+                        result = new HashSet<String>();
+                    result.addAll(items);
+                }
+            }
+        }
+        return result;
+    }
+
+
+    /**
+     * Lists the BlackList for the specified feature.
+     *
+     * @param category
+     * @param category
+     * @param type
+     * @return
+     */
+    public Set<String> getListEntries(String listType, Group group, String category, EventType type) {
+        Set<String> result = null;
+        if (group != null) {
+            String groupName = group.getName();
+            Set<String> items = getListEntries(listType, groupName, category, type);
+            if (items != null && !items.isEmpty()) {
+                if (result == null)
+                    result = new HashSet<String>();
+                result.addAll(items);
+            }
+        }
+        return result;
+    }
+
+
+    /**
+     * Returns true if the specified event is allowed.
+     *
+     * @param category
+     * @param event
+     * @param type
+     * @return
+     */
+    public Boolean isAllowed(Group group, String category, String event, EventType type) {
+        Boolean result = true;
+        Node node = clusterManager.getNode();
+        Set<String> whiteList = getListEntries(Configurations.WHITELIST, group, category, type);
+        Set<String> blackList = getListEntries(Configurations.BLACKLIST, group, category, type);
+
+        //If no white listed items we assume all are accepted.
+        if (whiteList != null && !whiteList.isEmpty()) {
+            result = false;
+            for (String whiteListItem : whiteList) {
+                if (wildCardMatch(event, whiteListItem))
+                    result = true;
+            }
+        }
+
+        //If any blackList item matcheds, then false is returned.
+        if (blackList != null && !blackList.isEmpty()) {
+            for (String blackListItem : blackList) {
+                if (wildCardMatch(event, blackListItem))
+                    result = false;
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * Matches text using a pattern containing wildcards.
+     *
+     * @param item
+     * @param pattern
+     * @return
+     */
+    protected boolean wildCardMatch(String item, String pattern) {
+        String[] cards = pattern.split("\\*");
+        // Iterate over the cards.
+        for (String card : cards) {
+            int idx = item.indexOf(card);
+            // Card not detected in the text.
+            if (idx == -1) {
+                return false;
+            }
+
+            // Move ahead, towards the right of the text.
+            item = item.substring(idx + card.length());
+        }
+        return true;
+    }
+
+
+    public ConfigurationAdmin getConfigurationAdmin() {
+        return configurationAdmin;
+    }
+
+    public void setConfigurationAdmin(ConfigurationAdmin configurationAdmin) {
+        this.configurationAdmin = configurationAdmin;
+    }
+
+    public ClusterManager getClusterManager() {
+        return clusterManager;
+    }
+
+    public void setClusterManager(ClusterManager clusterManager) {
+        this.clusterManager = clusterManager;
+    }
+
+    public GroupManager getGroupManager() {
+        return groupManager;
+    }
+
+    public void setGroupManager(GroupManager groupManager) {
+        this.groupManager = groupManager;
+    }
+}

Added: karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/ClusterManager.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/ClusterManager.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/ClusterManager.java (added)
+++ karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/ClusterManager.java Fri May  6 17:55:35 2011
@@ -0,0 +1,112 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.core;
+
+import org.apache.karaf.cellar.core.event.EventProducer;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author iocanel
+ */
+public interface ClusterManager {
+
+    /**
+     * Returns a named distributed map.
+     *
+     * @param mapName
+     * @return
+     */
+    public Map getMap(String mapName);
+
+    /**
+     * Returns a named distributed list.
+     *
+     * @param listName
+     * @return
+     */
+    public List getList(String listName);
+
+    /**
+     * Returns an Event Producer that produces {@link Event}s for a specific {@link Group}.
+     *
+     * @param groupName
+     * @return
+     */
+    public EventProducer getEventProducer(String groupName);
+
+
+    /**
+     * Returns a list of {@code Node}s.
+     *
+     * @return
+     */
+    public Set<Node> listNodes();
+
+    /**
+     * Returns the {@link Node} with specified id.
+     *
+     * @return
+     */
+    public Set<Node> listNodes(Collection<String> ids);
+
+    /**
+     * Returns the {@link Node} with specified {@link Group}.
+     *
+     * @return
+     */
+    public Set<Node> listNodesByGroup(Group group);
+
+
+    /**
+     * Returns the {@link Node} with specified id.
+     *
+     * @return
+     */
+    public Node findNodeById(String id);
+
+
+    /**
+     * Returns the {@link Node} on which the command was executed.
+     *
+     * @return
+     */
+    public Node getNode();
+
+    /**
+     * Generate an Id unique across the cluster.
+     *
+     * @return
+     */
+    public String generateId();
+
+    /**
+     * Start the clustering support on the {@link Node}.
+     */
+    public void start();
+
+    /**
+     * Stops the node.
+     */
+    public void stop();
+
+    /**
+     * Restarts the clustering support on the {@link Node}.
+     */
+    public void restart();
+}

Added: karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/Configurations.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/Configurations.java?rev=1100302&view=auto
==============================================================================
--- karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/Configurations.java (added)
+++ karaf/cellar/trunk/core/src/main/java/org/apache/karaf/cellar/core/Configurations.java Fri May  6 17:55:35 2011
@@ -0,0 +1,32 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.karaf.cellar.core;
+
+/**
+ * @author: iocanel
+ */
+public class Configurations {
+    public static final String DEFAULT_GROUP_NAME = "default";
+    public static final String GROUP = "org.apache.karaf.cellar.groups";
+    public static final String GROUPS_KEY = "groups";
+    public static final String NODE = "org.apache.karaf.cellar.node";
+
+    public static final String SEPARATOR = ".";
+    public static final String DELIMETER = ",";
+    public static final String SYNC = "sync";
+    public static final String PARENT = "parent";
+    public static final String WHITELIST = "whitelist";
+    public static final String BLACKLIST = "blacklist";
+}



Mime
View raw message