http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/collections/src/test/java/org/apache/tamaya/collections/CollectionsTypedTests.java
----------------------------------------------------------------------
diff --git 
a/collections/src/test/java/org/apache/tamaya/collections/CollectionsTypedTests.java
 
b/collections/src/test/java/org/apache/tamaya/collections/CollectionsTypedTests.java
deleted file mode 100644
index 92c592e..0000000
--- 
a/collections/src/test/java/org/apache/tamaya/collections/CollectionsTypedTests.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * 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.
- */
-package org.apache.tamaya.collections;
-
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
-import org.junit.Test;
-
-import java.util.*;
-
-import static junit.framework.TestCase.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Basic tests for Tamaya collection support. Relevant configs for this tests:
- * <pre>base.items=1,2,3,4,5,6,7,8,9,0
- * base.map=1::a, 2::b, 3::c, [4:: ]
- * </pre>
- */
-public class CollectionsTypedTests {
-
-    @Test
-    public void testArrayListList_String(){
-        Configuration config = Configuration.current();
-        List<String> items = config.get("typed2.arraylist", new 
TypeLiteral<List<String>>(){});
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof ArrayList);
-        items = (List<String>) config.get("typed2.arraylist", List.class);
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof ArrayList);
-    }
-
-    @Test
-    public void testLinkedListList_String(){
-        Configuration config = Configuration.current();
-        List<String> items = config.get("typed2.linkedlist", new 
TypeLiteral<List<String>>(){});
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof LinkedList);
-        items = (List<String>) config.get("typed2.linkedlist", List.class);
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof LinkedList);
-    }
-
-
-    @Test
-    public void testHashSet_String(){
-        Configuration config = Configuration.current();
-        Set<String> items = config.get("typed2.hashset", new 
TypeLiteral<Set<String>>(){});
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof HashSet);
-        items = (Set<String>) config.get("typed2.hashset", Set.class);
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof HashSet);
-    }
-
-    @Test
-    public void testTreeSet_String(){
-        Configuration config = Configuration.current();
-        Set<String> items = config.get("typed2.treeset", new 
TypeLiteral<Set<String>>(){});
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof TreeSet);
-        items = (Set<String>) config.get("typed2.treeset", Set.class);
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof TreeSet);
-    }
-
-    @Test
-    public void testHashMap_String(){
-        Configuration config = Configuration.current();
-        Map<String,String> items = config.get("typed2.hashmap", new 
TypeLiteral<Map<String,String>>(){});
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(4, items.size());
-        assertEquals("a", items.get("1"));
-        assertEquals("b", items.get("2"));
-        assertEquals("c", items.get("3"));
-        assertEquals(" ", items.get("4"));
-        assertTrue(items instanceof HashMap);
-        items = (Map<String,String>) config.get("typed2.hashmap", Map.class);
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(4, items.size());
-        assertEquals("a", items.get("1"));
-        assertEquals("b", items.get("2"));
-        assertEquals("c", items.get("3"));
-        assertEquals(" ", items.get("4"));
-        assertTrue(items instanceof HashMap);
-    }
-
-    @Test
-    public void testTreeMap_String(){
-        Configuration config = Configuration.current();
-        Map<String,String> items = config.get("typed2.treemap", new 
TypeLiteral<Map<String,String>>(){});
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(4, items.size());
-        assertEquals("a", items.get("1"));
-        assertEquals("b", items.get("2"));
-        assertEquals("c", items.get("3"));
-        assertEquals(" ", items.get("4"));
-        assertTrue(items instanceof TreeMap);
-        items = (Map<String,String>) config.get("typed2.treemap", Map.class);
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(4, items.size());
-        assertEquals("a", items.get("1"));
-        assertEquals("b", items.get("2"));
-        assertEquals("c", items.get("3"));
-        assertEquals(" ", items.get("4"));
-        assertTrue(items instanceof TreeMap);
-    }
-
-    @Test
-    public void testCollection_HashSet(){
-        Configuration config = Configuration.current();
-        Collection<String> items = config.get("typed2.hashset", new 
TypeLiteral<Collection<String>>(){});
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof HashSet);
-        items = (Collection<String>) config.get("typed2.hashset", 
Collection.class);
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof HashSet);
-    }
-
-    @Test
-    public void testCollection_TreeSet(){
-        Configuration config = Configuration.current();
-        Collection<String> items = config.get("typed2.treeset", new 
TypeLiteral<Collection<String>>(){});
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof TreeSet);
-        items = (Collection<String>) config.get("typed2.treeset", 
Collection.class);
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof TreeSet);
-    }
-
-    @Test
-    public void testCollection_ArrayList(){
-        Configuration config = Configuration.current();
-        Collection<String> items = config.get("typed2.arraylist", new 
TypeLiteral<Collection<String>>(){});
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof ArrayList);
-        items = (Collection<String>) config.get("typed2.arraylist", 
Collection.class);
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof ArrayList);
-    }
-
-    @Test
-    public void testCollection_LinkedList(){
-        Configuration config = Configuration.current();
-        Collection<String> items = config.get("typed2.linkedlist", new 
TypeLiteral<Collection<String>>(){});
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof LinkedList);
-        items = (Collection<String>) config.get("typed2.linkedlist", 
Collection.class);
-        assertNotNull(items);
-        assertFalse(items.isEmpty());
-        assertEquals(10, items.size());
-        assertTrue(items instanceof LinkedList);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/collections/src/test/java/org/apache/tamaya/collections/MyUpperCaseConverter.java
----------------------------------------------------------------------
diff --git 
a/collections/src/test/java/org/apache/tamaya/collections/MyUpperCaseConverter.java
 
b/collections/src/test/java/org/apache/tamaya/collections/MyUpperCaseConverter.java
deleted file mode 100644
index 1c95261..0000000
--- 
a/collections/src/test/java/org/apache/tamaya/collections/MyUpperCaseConverter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.
- */
-package org.apache.tamaya.collections;
-
-import org.apache.tamaya.spi.ConversionContext;
-import org.apache.tamaya.spi.PropertyConverter;
-
-/**
- * Example converter that is used for testing the custom parsing 
functionality. It sorrounds values with () and
- * converts them to uppercase.
- */
-public class MyUpperCaseConverter implements PropertyConverter<String>{
-    @Override
-    public String convert(String value, ConversionContext context) {
-        return "("+value.toUpperCase()+")";
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/collections/src/test/resources/META-INF/javaconfiguration.properties
----------------------------------------------------------------------
diff --git 
a/collections/src/test/resources/META-INF/javaconfiguration.properties 
b/collections/src/test/resources/META-INF/javaconfiguration.properties
deleted file mode 100644
index 3764840..0000000
--- a/collections/src/test/resources/META-INF/javaconfiguration.properties
+++ /dev/null
@@ -1,69 +0,0 @@
-#
-# 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 current 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.
-#
-# Similar to etcd all keys starting with a _ are hidden by default (only 
directly accessible).
-
-# Config for base tests (no combination policy)
-base.items=1,2,3,4,5,6,7,8,9,0
-base.map=1=a, 2=b, 3=c, [4= ]
-
-# Config for tests with explcit implementation types
-typed2.arraylist=1,2,3,4,5,6,7,8,9,0
-[META]typed2.arraylist.collection-type=ArrayList
-typed2.linkedlist=1,2,3,4,5,6,7,8,9,0
-[META]typed2.linkedlist.collection-type=java.util.LinkedList
-typed2.hashset=1,2,3,4,5,6,7,8,9,0
-[META]typed2.hashset.collection-type=HashSet
-typed2.treeset=1,2,3,4,5,6,7,8,9,0
-[META]typed2.treeset.collection-type=TreeSet
-typed2.hashmap=1=a, 2=b, 3=c, [4= ]
-[META]typed2.hashmap.collection-type=java.util.HashMap
-typed2.treemap=1=a, 2=b, 3=c, [4= ]
-[META]typed2.treemap.collection-type=TreeMap
-
-# Config for tests with combination policy, writable
-typed.arraylist=1,2,3,4,5,6,7,8,9,0
-[META]typed.arraylist.collection-type=ArrayList
-[META]typed.arraylist.read-only=true
-typed.linkedlist=1,2,3,4,5,6,7,8,9,0
-[META]typed.linkedlist.collection-type=java.util.LinkedList
-typed.hashset=1,2,3,4,5,6,7,8,9,0
-[META]typed.hashset.collection-type=HashSet
-typed.treeset=1,2,3,4,5,6,7,8,9,0
-[META]typed.treeset.collection-type=TreeSet
-typed.hashmap=1=a, 2=b, 3=c, [4= ]
-[META]typed.hashmap.collection-type=java.util.HashMap
-[META]typed.hashmap.read-only=true
-typed.treemap=1=a, 2=b, 3=c, [4= ]
-[META]typed.treemap.collection-type=TreeMap
-
-# Config for advanced tests
-sep-list=a,b,c|d,e,f|g,h,i
-[META]sep-list.collection-type=List
-[META]sep-list.item-separator=|
-currency-list=CHF,USD,USS
-[META]currency-list.collection-type=List
-
-parser-list=a,b,c
-[META]parser-list.collection-type=List
-[META]parser-list.item-converter=org.apache.tamaya.collections.MyUpperCaseConverter
-
-redefined-map=0==none | 1==single | 2==any
-[META]redefined-map.map-entry-separator===
-[META]redefined-map.item-separator=|
-

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/consul/bnd.bnd
----------------------------------------------------------------------
diff --git a/consul/bnd.bnd b/consul/bnd.bnd
deleted file mode 100644
index 9928592..0000000
--- a/consul/bnd.bnd
+++ /dev/null
@@ -1,32 +0,0 @@
--buildpath: \
-       osgi.annotation; version=6.0.0,\
-       osgi.core; version=6.0,\
-       osgi.cmpn; version=6.0
-
--testpath: \
-       ${junit}
-
-javac.source: 1.8
-javac.target: 1.8
-
-Automatic-Module-Name: org.apache.tamaya.consul
-Bundle-Version: ${version}.${tstamp}
-Bundle-Name: Apache Tamaya - Consul
-Bundle-SymbolicName: org.apache.tamaya.consul
-Bundle-Description: Apacha Tamaya Config - Consul PropertySource
-Bundle-Category: Implementation
-Bundle-Copyright: (C) Apache Foundation
-Bundle-License: Apache Licence version 2
-Bundle-Vendor: Apache Software Foundation
-Bundle-ContactAddress: [email protected]
-Bundle-DocURL: http://tamaya.apache.org
-Export-Package: \
-       org.apache.tamaya.consul
-Import-Package: \
-    org.apache.tamaya,\
-    org.apache.tamaya.spi,\
-    org.apache.tamaya.mutableconfig,\
-    org.apache.tamaya.mutableconfig.spi
-Export-Service: \
-    org.apache.tamaya.spi.PropertySource
-    

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/consul/pom.xml
----------------------------------------------------------------------
diff --git a/consul/pom.xml b/consul/pom.xml
deleted file mode 100644
index c48c7ae..0000000
--- a/consul/pom.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<!-- 
-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 current 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";>
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.tamaya.ext</groupId>
-        <artifactId>tamaya-sandbox</artifactId>
-        <version>0.4-incubating-SNAPSHOT</version>
-        <relativePath>..</relativePath>
-    </parent>
-
-    <artifactId>tamaya-consul_beta</artifactId>
-    <name>Apache Tamaya Modules - Consul</name>
-    <packaging>jar</packaging>
-
-    <dependencies>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.hamcrest</groupId>
-            <artifactId>java-hamcrest</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.tamaya</groupId>
-            <artifactId>tamaya-core</artifactId>
-            <version>${project.parent.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tamaya</groupId>
-            <artifactId>tamaya-api</artifactId>
-            <version>${project.parent.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tamaya.ext</groupId>
-            <artifactId>tamaya-functions</artifactId>
-            <version>${project.parent.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tamaya.ext</groupId>
-            <artifactId>tamaya-mutable-config</artifactId>
-            <version>${project.parent.version}</version>
-            <scope>provided</scope>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>com.orbitz.consul</groupId>
-            <artifactId>consul-client</artifactId>
-            <version>0.17.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-rt-rs-client</artifactId>
-            <version>3.2.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-rt-transports-http-hc</artifactId>
-            <version>3.2.1</version>
-        </dependency>
-    </dependencies>
-
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/consul/src/main/java/org/apache/tamaya/consul/ConsulBackendConfig.java
----------------------------------------------------------------------
diff --git 
a/consul/src/main/java/org/apache/tamaya/consul/ConsulBackendConfig.java 
b/consul/src/main/java/org/apache/tamaya/consul/ConsulBackendConfig.java
deleted file mode 100644
index 61be0ba..0000000
--- a/consul/src/main/java/org/apache/tamaya/consul/ConsulBackendConfig.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.
- */
-package org.apache.tamaya.consul;
-
-import com.google.common.net.HostAndPort;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Singleton that reads and stores the current consul setup, especially the 
possible host:ports to be used.
- */
-public final class ConsulBackendConfig {
-
-    private static final String TAMAYA_CONSUL_DISABLE = 
"tamaya.consul.disable";
-       private static final String TAMAYA_CONSUL_URLS = "tamaya.consul.urls";
-       private static final Logger LOG = 
Logger.getLogger(ConsulBackendConfig.class.getName());
-    private static List<HostAndPort> consulBackends = new ArrayList<>();
-
-    static{
-        String serverURLs = System.getProperty(TAMAYA_CONSUL_URLS);
-        if(serverURLs==null){
-            serverURLs = System.getenv(TAMAYA_CONSUL_URLS);
-        }
-        if(serverURLs==null){
-            serverURLs = "127.0.0.1:8300";
-        }
-        for(String url:serverURLs.split("\\,")) {
-            try{
-                consulBackends.add(HostAndPort.fromString(url.trim()));
-                LOG.info("Using consul endoint: " + url);
-            } catch(Exception e){
-                LOG.log(Level.SEVERE, "Error initializing consul accessor for 
URL: " + url, e);
-            }
-        }
-    }
-
-    private ConsulBackendConfig(){}
-
-    private static boolean isConsulDisabled() {
-        String value = System.getProperty(TAMAYA_CONSUL_DISABLE);
-        if(value==null){
-            value = System.getenv(TAMAYA_CONSUL_DISABLE);
-        }
-        if(value==null){
-            return false;
-        }
-        return value.isEmpty() || Boolean.parseBoolean(value);
-    }
-
-    public static List<HostAndPort> getConsulBackends(){
-        if(isConsulDisabled()){
-            return Collections.emptyList();
-        }
-        return consulBackends;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/consul/src/main/java/org/apache/tamaya/consul/ConsulPropertySource.java
----------------------------------------------------------------------
diff --git 
a/consul/src/main/java/org/apache/tamaya/consul/ConsulPropertySource.java 
b/consul/src/main/java/org/apache/tamaya/consul/ConsulPropertySource.java
deleted file mode 100644
index a456708..0000000
--- a/consul/src/main/java/org/apache/tamaya/consul/ConsulPropertySource.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * 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.
- */
-package org.apache.tamaya.consul;
-
-import com.google.common.base.Optional;
-import com.google.common.net.HostAndPort;
-import com.orbitz.consul.Consul;
-import com.orbitz.consul.KeyValueClient;
-import com.orbitz.consul.model.kv.Value;
-import org.apache.tamaya.mutableconfig.ConfigChangeRequest;
-import org.apache.tamaya.mutableconfig.spi.MutablePropertySource;
-import org.apache.tamaya.spi.PropertyValue;
-import org.apache.tamaya.spisupport.propertysource.BasePropertySource;
-
-import java.util.*;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Propertysource that is reading configuration from a configured consul 
endpoint. Setting
- * {@code consul.prefix} as system property maps the consul based configuration
- * to this prefix namespace. Consul servers are configured as {@code 
consul.urls} system or environment property.
- */
-public class ConsulPropertySource extends BasePropertySource
-implements MutablePropertySource{
-    private static final Logger LOG = 
Logger.getLogger(ConsulPropertySource.class.getName());
-
-    private String prefix = "";
-
-    private List<HostAndPort> consulBackends;
-
-
-    public ConsulPropertySource(String prefix, Collection<String> backends){
-        this.prefix = prefix==null?"":prefix;
-        consulBackends = new ArrayList<>();
-        for(String s:backends){
-            consulBackends.add(HostAndPort.fromString(s));
-        }
-    }
-
-    public ConsulPropertySource(Collection<String> backends){
-        consulBackends = new ArrayList<>();
-        for(String s:backends){
-            consulBackends.add(HostAndPort.fromString(s));
-        }
-    }
-
-    public ConsulPropertySource(){
-        prefix = System.getProperty("tamaya.consul.prefix", "");
-    }
-
-    public ConsulPropertySource(String... backends){
-        consulBackends = new ArrayList<>();
-        for (String s : backends) {
-            consulBackends.add(HostAndPort.fromString(s));
-        }
-    }
-
-    public String getPrefix() {
-        return prefix;
-    }
-
-    public ConsulPropertySource setPrefix(String prefix) {
-        this.prefix = prefix;
-        return this;
-    }
-
-    public int getOrdinal() {
-        PropertyValue configuredOrdinal = get(TAMAYA_ORDINAL);
-        if(configuredOrdinal!=null){
-            try{
-                return Integer.parseInt(configuredOrdinal.getValue());
-            } catch(Exception e){
-                Logger.getLogger(getClass().getName()).log(Level.WARNING,
-                        "Configured Ordinal is not an int number: " + 
configuredOrdinal, e);
-            }
-        }
-        return getDefaultOrdinal();
-    }
-
-    /**
-     * Returns the  default ordinal used, when no ordinal is setCurrent, or 
the ordinal was not parseable to an int createValue.
-     * @return the  default ordinal used, by default 1000.
-     */
-    public int getDefaultOrdinal(){
-        return 1000;
-    }
-
-    @Override
-    public String getName() {
-        return "consul";
-    }
-
-    @Override
-    public PropertyValue get(String key) {
-        // check prefix, if key does not start with it, it is not part of our 
name space
-        // if so, the prefix part must be removedProperties, so etcd can 
resolve without it
-        if(!key.startsWith(prefix)){
-            return null;
-        } else{
-            key = key.substring(prefix.length());
-        }
-        String reqKey = key;
-        if(key.startsWith("_")){
-            reqKey = key.substring(1);
-            if(reqKey.endsWith(".createdIndex")){
-                reqKey = 
reqKey.substring(0,reqKey.length()-".createdIndex".length());
-            } else if(reqKey.endsWith(".modifiedIndex")){
-                reqKey = 
reqKey.substring(0,reqKey.length()-".modifiedIndex".length());
-            } else if(reqKey.endsWith(".ttl")){
-                reqKey = reqKey.substring(0,reqKey.length()-".ttl".length());
-            } else if(reqKey.endsWith(".expiration")){
-                reqKey = 
reqKey.substring(0,reqKey.length()-".expiration".length());
-            } else if(reqKey.endsWith(".source")){
-                reqKey = 
reqKey.substring(0,reqKey.length()-".source".length());
-            }
-        }
-        for(HostAndPort hostAndPort: getConsulBackends()){
-            try{
-                Consul consul = 
Consul.builder().withHostAndPort(hostAndPort).build();
-                KeyValueClient kvClient = consul.keyValueClient();
-                Optional<Value> valueOpt = kvClient.getValue(reqKey);
-                if(!valueOpt.isPresent()) {
-                    LOG.log(Level.FINE, "key not found in consul: " + reqKey);
-                }else{
-                    // No prefix mapping necessary here, since we only 
access/return the createValue...
-                    Value value = valueOpt.get();
-                    Map<String,String> props = new HashMap<>();
-                    props.put(reqKey+".createIndex", 
String.valueOf(value.getCreateIndex()));
-                    props.put(reqKey+".modifyIndex", 
String.valueOf(value.getModifyIndex()));
-                    props.put(reqKey+".lockIndex", 
String.valueOf(value.getLockIndex()));
-                    props.put(reqKey+".flags", 
String.valueOf(value.getFlags()));
-                    return PropertyValue.of(key, value.getValue().get(), 
getName()).setMeta(props);
-                }
-            } catch(Exception e){
-                LOG.log(Level.FINE, "etcd access failed on " + hostAndPort + 
", trying next...", e);
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public Map<String, PropertyValue> getProperties() {
-//        for(HostAndPort hostAndPort: getConsulBackends()){
-//            try{
-//                Consul consul = 
Consul.builder().withHostAndPort(hostAndPort).build();
-//                KeyValueClient kvClient = consul.keyValueClient();
-//                Optional<Value> valueOpt = kvClient.getProperty(reqKey);
-//                try{
-//                    Map<String, String> props = kvClient.getProperties("");
-//                    if(!props.containsKey("_ERROR")) {
-//                        return mapPrefix(props);
-//                    } else{
-//                        LOG.log(Level.FINE, "consul error on " + hostAndPort 
+ ": " + props.current("_ERROR"));
-//                    }
-//                } catch(Exception e){
-//                    LOG.log(Level.FINE, "consul access failed on " + 
hostAndPort + ", trying next...", e);
-//                }
-//            } catch(Exception e){
-//                LOG.log(Level.FINE, "consul access failed on " + hostAndPort 
+ ", trying next...", e);
-//            }
-//        }
-        return Collections.emptyMap();
-    }
-
-    private Map<String, String> mapPrefix(Map<String, String> props) {
-        if(prefix.isEmpty()){
-            return props;
-        }
-        Map<String,String> map = new HashMap<>();
-        for(Map.Entry<String,String> entry:props.entrySet()){
-            if(entry.getKey().startsWith("_")){
-                map.put("_" + prefix + entry.getKey().substring(1), 
entry.getValue());
-            } else{
-                map.put(prefix+ entry.getKey(), entry.getValue());
-            }
-        }
-        return map;
-    }
-
-    @Override
-    public boolean isScannable() {
-        return false;
-    }
-
-    @Override
-    public void applyChange(ConfigChangeRequest configChange) {
-        for(HostAndPort hostAndPort: ConsulBackendConfig.getConsulBackends()){
-            try{
-                Consul consul = 
Consul.builder().withHostAndPort(hostAndPort).build();
-                KeyValueClient kvClient = consul.keyValueClient();
-
-                for(String k: configChange.getRemovedProperties()){
-                    try{
-                        kvClient.deleteKey(k);
-                    } catch(Exception e){
-                        LOG.info("Failed to remove key from consul: " + k);
-                    }
-                }
-                for(Map.Entry<String,String> 
en:configChange.getAddedProperties().entrySet()){
-                    String key = en.getKey();
-                    try{
-                        kvClient.putValue(key,en.getValue());
-                    }catch(Exception e) {
-                        LOG.info("Failed to add key to consul: " + en.getKey() 
+ "=" + en.getValue());
-                    }
-                }
-                // success: stop here
-                break;
-            } catch(Exception e){
-                LOG.log(Level.FINE, "consul access failed on " + hostAndPort + 
", trying next...", e);
-            }
-        }
-    }
-
-    private List<HostAndPort> getConsulBackends(){
-        if(consulBackends==null){
-            consulBackends = ConsulBackendConfig.getConsulBackends();
-            LOG.info("Using consul backends: " + consulBackends);
-        }
-        return consulBackends;
-    }
-
-    @Override
-    protected String toStringValues() {
-        return  super.toStringValues() +
-                "  prefix=" + prefix + '\n' +
-                "  backends=" + this.consulBackends + '\n';
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/consul/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertySource
----------------------------------------------------------------------
diff --git 
a/consul/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertySource
 
b/consul/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertySource
deleted file mode 100644
index 4996059..0000000
--- 
a/consul/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertySource
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# 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 current 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.
-#
-org.apache.tamaya.consul.ConsulPropertySource
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/consul/src/test/java/org/apache/tamaya/consul/ConsulPropertySourceTest.java
----------------------------------------------------------------------
diff --git 
a/consul/src/test/java/org/apache/tamaya/consul/ConsulPropertySourceTest.java 
b/consul/src/test/java/org/apache/tamaya/consul/ConsulPropertySourceTest.java
deleted file mode 100644
index 0366b2b..0000000
--- 
a/consul/src/test/java/org/apache/tamaya/consul/ConsulPropertySourceTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.
- */
-package org.apache.tamaya.consul;
-
-import org.apache.tamaya.consul.ConsulPropertySource;
-import org.apache.tamaya.spi.PropertyValue;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import java.util.Map;
-
-import static org.junit.Assert.*;
-import static org.junit.Assert.assertEquals;
-
-/**
- * Created by atsticks on 07.01.16.
- */
-public class ConsulPropertySourceTest {
-
-    private final ConsulPropertySource propertySource = new 
ConsulPropertySource();
-
-    @BeforeClass
-    public static void setup(){
-        System.setProperty("consul.urls", "http://127.0.0.1:8300";);
-    }
-
-    @Test
-    public void testGetOrdinal() throws Exception {
-        assertEquals(1000, propertySource.getOrdinal());
-    }
-
-    @Test
-    public void testGetDefaultOrdinal() throws Exception {
-        assertEquals(1000, propertySource.getDefaultOrdinal());
-    }
-
-    @Test
-    public void testGetName() throws Exception {
-        assertEquals("consul", propertySource.getName());
-    }
-
-    @Test
-    public void testGet() throws Exception {
-        Map<String,PropertyValue> props = propertySource.getProperties();
-        for(Map.Entry<String,PropertyValue> en:props.entrySet()){
-            assertNotNull("Key not found: " + en.getKey(), 
propertySource.get(en.getKey()));
-        }
-    }
-
-    @Test
-    public void testGetProperties() throws Exception {
-        Map<String,PropertyValue> props = propertySource.getProperties();
-        assertNotNull(props);
-    }
-
-    @Test
-    public void testIsScannable() throws Exception {
-        assertFalse(propertySource.isScannable());
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/consul/src/test/java/org/apache/tamaya/consul/ConsulWriteTest.java
----------------------------------------------------------------------
diff --git a/consul/src/test/java/org/apache/tamaya/consul/ConsulWriteTest.java 
b/consul/src/test/java/org/apache/tamaya/consul/ConsulWriteTest.java
deleted file mode 100644
index 1746030..0000000
--- a/consul/src/test/java/org/apache/tamaya/consul/ConsulWriteTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * 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.
- */
-package org.apache.tamaya.consul;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.net.MalformedURLException;
-import java.net.URISyntaxException;
-import java.util.Map;
-import java.util.UUID;
-
-import org.apache.tamaya.mutableconfig.ConfigChangeRequest;
-import org.apache.tamaya.spi.PropertyValue;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-/**
- * Tests for the consul backend integration for writing to the consul backend.
- */
-public class ConsulWriteTest {
-
-       /**
-        * Needs to be enabled manually in case you want to do integration 
tests.
-        */
-    static boolean execute = false;
-    private static ConsulPropertySource propertySource;
-
-    @BeforeClass
-    public static void setup() throws MalformedURLException, 
URISyntaxException {
-        System.setProperty("consul.urls", "http://127.0.0.1:8300";);
-        propertySource = new ConsulPropertySource();
-        
-        System.out.println("At the moment no write-tests can be executed to 
verify the Consul integration. You can manually edit this test class.");
-    }
-
-    @Test
-    public void testSetNormal() throws Exception {
-        if (!execute) return;
-        String taID = UUID.randomUUID().toString();
-        ConfigChangeRequest request = new ConfigChangeRequest("testSetNormal");
-        request.put(taID, "testSetNormal");
-        propertySource.applyChange(request);
-    }
-
-
-    @Test
-    public void testDelete() throws Exception {
-        if(!execute)return;
-        String taID = UUID.randomUUID().toString();
-        ConfigChangeRequest request = new ConfigChangeRequest("testDelete");
-        request.put(taID, "testDelete");
-        propertySource.applyChange(request);
-        assertEquals(taID.toString(), 
propertySource.get("testDelete").getValue());
-        assertNotNull(propertySource.get("_testDelete.createdIndex"));
-        request = new ConfigChangeRequest("testDelete2");
-        request.remove("testDelete");
-        propertySource.applyChange(request);
-        assertNull(propertySource.get("testDelete"));
-    }
-
-    @Test
-    public void testGetProperties() throws Exception {
-        if(!execute)return;
-        Map<String,PropertyValue> result = propertySource.getProperties();
-        assertTrue(result.isEmpty());
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/etcd/bnd.bnd
----------------------------------------------------------------------
diff --git a/etcd/bnd.bnd b/etcd/bnd.bnd
deleted file mode 100644
index 129f3ec..0000000
--- a/etcd/bnd.bnd
+++ /dev/null
@@ -1,32 +0,0 @@
--buildpath: \
-       osgi.annotation; version=6.0.0,\
-       osgi.core; version=6.0,\
-       osgi.cmpn; version=6.0
-
--testpath: \
-       ${junit}
-
-javac.source: 1.8
-javac.target: 1.8
-
-Automatic-Module-Name: org.apache.tamaya.etcd
-Bundle-Version: ${version}.${tstamp}
-Bundle-Name: Apache Tamaya - Etcd Config
-Bundle-SymbolicName: org.apache.tamaya.etcd
-Bundle-Description: Apacha Tamaya Config - Etcd PropertySource
-Bundle-Category: Implementation
-Bundle-Copyright: (C) Apache Foundation
-Bundle-License: Apache Licence version 2
-Bundle-Vendor: Apache Software Foundation
-Bundle-ContactAddress: [email protected]
-Bundle-DocURL: http://tamaya.apache.org
-Export-Package: \
-       org.apache.tamaya.etcd
-Import-Package: \
-    org.apache.tamaya,\
-    org.apache.tamaya.spi,\
-    org.apache.tamaya.mutableconfig\
-    org.apache.tamaya.mutableconfig.spi
-Export-Service: \
-    org.apache.tamaya.spi.PropertySource
-    

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/etcd/pom.xml
----------------------------------------------------------------------
diff --git a/etcd/pom.xml b/etcd/pom.xml
deleted file mode 100644
index ef818a1..0000000
--- a/etcd/pom.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<!-- 
-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 current 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";>
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.tamaya.ext</groupId>
-        <artifactId>tamaya-sandbox</artifactId>
-        <version>0.4-incubating-SNAPSHOT</version>
-        <relativePath>..</relativePath>
-    </parent>
-
-    <artifactId>tamaya-etcd_beta</artifactId>
-    <name>Apache Tamaya Modules - etcd PropertySource</name>
-    <packaging>jar</packaging>
-
-    <dependencies>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.hamcrest</groupId>
-            <artifactId>java-hamcrest</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tamaya</groupId>
-            <artifactId>tamaya-core</artifactId>
-            <version>${project.parent.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tamaya</groupId>
-            <artifactId>tamaya-api</artifactId>
-            <version>${project.parent.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tamaya.ext</groupId>
-            <artifactId>tamaya-functions</artifactId>
-            <version>${project.parent.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient-osgi</artifactId>
-            <version>4.5.3</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-json_1.1_spec</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.johnzon</groupId>
-            <artifactId>johnzon-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tamaya.ext</groupId>
-            <artifactId>tamaya-mutable-config</artifactId>
-            <version>${project.parent.version}</version>
-            <scope>provided</scope>
-            <optional>true</optional>
-        </dependency>
-    </dependencies>
-
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/etcd/src/main/java/org/apache/tamaya/etcd/EtcdAccessor.java
----------------------------------------------------------------------
diff --git a/etcd/src/main/java/org/apache/tamaya/etcd/EtcdAccessor.java 
b/etcd/src/main/java/org/apache/tamaya/etcd/EtcdAccessor.java
deleted file mode 100644
index 4ceb7b2..0000000
--- a/etcd/src/main/java/org/apache/tamaya/etcd/EtcdAccessor.java
+++ /dev/null
@@ -1,519 +0,0 @@
-/*
- * 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.
- */
-package org.apache.tamaya.etcd;
-
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.json.Json;
-import javax.json.JsonArray;
-import javax.json.JsonObject;
-import javax.json.JsonReader;
-import javax.json.JsonReaderFactory;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpStatus;
-import org.apache.http.NameValuePair;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpDelete;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.util.EntityUtils;
-
-/**
- * Accessor for reading to or writing from an etcd endpoint.
- */
-public class EtcdAccessor {
-
-    private static final Logger LOG = 
Logger.getLogger(EtcdAccessor.class.getName());
-
-    /**
-     * Timeout in seconds.
-     */
-    private int timeout = 2;
-    /**
-     * Timeout in seconds.
-     */
-    private final int socketTimeout = 1000;
-    /**
-     * Timeout in seconds.
-     */
-    private final int connectTimeout = 1000;
-
-    /**
-     * Property that makes Johnzon accept comments.
-     */
-    public static final String JOHNZON_SUPPORTS_COMMENTS_PROP = 
"org.apache.johnzon.supports-comments";
-    /**
-     * The JSON reader factory used.
-     */
-    private final JsonReaderFactory readerFactory = initReaderFactory();
-
-    /**
-     * Initializes the factory to be used for creating readers.
-     */
-    private JsonReaderFactory initReaderFactory() {
-        final Map<String, Object> config = new HashMap<>();
-        config.put(JOHNZON_SUPPORTS_COMMENTS_PROP, true);
-        return Json.createReaderFactory(config);
-    }
-
-    /**
-     * The base server url.
-     */
-    private final String serverURL;
-    /**
-     * The http client.
-     */
-    private final CloseableHttpClient httpclient = HttpClients.createDefault();
-
-    /**
-     * Creates a new instance with the basic access url.
-     *
-     * @param server server url, e.g. {@code http://127.0.0.1:4001}, not null.
-     */
-    public EtcdAccessor(String server) {
-        this(server, 2);
-    }
-
-    public EtcdAccessor(String server, int timeout) {
-        this.timeout = timeout;
-        if (server.endsWith("/")) {
-            serverURL = server.substring(0, server.length() - 1);
-        } else {
-            serverURL = server;
-        }
-    }
-
-    /**
-     * Get the etcd server version.
-     *
-     * @return the etcd server version, never null.
-     */
-    public String getVersion() {
-        String version = "<ERROR>";
-        try {
-            final CloseableHttpClient httpclient = HttpClients.createDefault();
-            final HttpGet httpGet = new HttpGet(serverURL + "/version");
-            
httpGet.setConfig(RequestConfig.copy(RequestConfig.DEFAULT).setSocketTimeout(socketTimeout)
-                    .setConnectTimeout(timeout).build());
-            try (CloseableHttpResponse response = httpclient.execute(httpGet)) 
{
-                if (response.getStatusLine().getStatusCode() == 
HttpStatus.SC_OK) {
-                    final HttpEntity entity = response.getEntity();
-                    // and ensure it is fully consumed
-                    version = EntityUtils.toString(entity);
-                    EntityUtils.consume(entity);
-                }
-            }
-            return version;
-        } catch (final Exception e) {
-            LOG.log(Level.INFO, "Error getting etcd version from: " + 
serverURL, e);
-        }
-        return version;
-    }
-
-    /**
-     * Ask etcd for a single key, createValue pair. Hereby the response 
returned from
-     * etcd:
-     * 
-     * <pre>
-     * {
-     * "action": "current",
-     * "getField": {
-     * "createdIndex": 2,
-     * "key": "/message",
-     * "modifiedIndex": 2,
-     * "createValue": "Hello world"
-     * }
-     * }
-     * </pre>
-     * 
-     * is mapped to:
-     * 
-     * <pre>
-     *     key=createValue
-     *     _key.source=[etcd]http://127.0.0.1:4001
-     *     _key.createdIndex=12
-     *     _key.modifiedIndex=34
-     *     _key.ttl=300
-     *     _key.expiration=...
-     * </pre>
-     *
-     * @param key the requested key
-     * @return the mapped result, including getMeta-entries.
-     */
-    public Map<String, String> get(String key) {
-        final Map<String, String> result = new HashMap<>();
-        try {
-            final HttpGet httpGet = new HttpGet(serverURL + "/v2/keys/" + key);
-            
httpGet.setConfig(RequestConfig.copy(RequestConfig.DEFAULT).setSocketTimeout(socketTimeout)
-                    
.setConnectionRequestTimeout(timeout).setConnectTimeout(connectTimeout).build());
-            try (CloseableHttpResponse response = httpclient.execute(httpGet)) 
{
-                if (response.getStatusLine().getStatusCode() == 
HttpStatus.SC_OK) {
-                    final HttpEntity entity = response.getEntity();
-                    final JsonReader reader = readerFactory
-                            .createReader(new 
StringReader(EntityUtils.toString(entity)));
-                    final JsonObject o = reader.readObject();
-                    final JsonObject node = o.getJsonObject("getField");
-                    if (node.containsKey("createValue")) {
-                        result.put(key, node.getString("createValue"));
-                        result.put("_" + key + ".source", "[etcd]" + 
serverURL);
-                    }
-                    if (node.containsKey("createdIndex")) {
-                        result.put("_" + key + ".createdIndex", 
String.valueOf(node.getInt("createdIndex")));
-                    }
-                    if (node.containsKey("modifiedIndex")) {
-                        result.put("_" + key + ".modifiedIndex", 
String.valueOf(node.getInt("modifiedIndex")));
-                    }
-                    if (node.containsKey("expiration")) {
-                        result.put("_" + key + ".expiration", 
String.valueOf(node.getString("expiration")));
-                    }
-                    if (node.containsKey("ttl")) {
-                        result.put("_" + key + ".ttl", 
String.valueOf(node.getInt("ttl")));
-                    }
-                    EntityUtils.consume(entity);
-                } else {
-                    result.put("_" + key + ".NOT_FOUND.target", "[etcd]" + 
serverURL);
-                }
-            }
-        } catch (final Exception e) {
-            LOG.log(Level.INFO, "Error reading key '" + key + "' from etcd: " 
+ serverURL, e);
-            result.put("_ERROR", "Error reading key '" + key + "' from etcd: " 
+ serverURL + ": " + e.toString());
-        }
-        return result;
-    }
-
-    /**
-     * Creates/updates an entry in etcd without any ttl setCurrent.
-     *
-     * @param key   the property key, not null
-     * @param value the createValue to be setCurrent
-     * @return the result map as described above.
-     * @see #set(String, String, Integer)
-     */
-    public Map<String, String> set(String key, String value) {
-        return set(key, value, null);
-    }
-
-    /**
-     * Creates/updates an entry in etcd. The response as follows:
-     * 
-     * <pre>
-     *     {
-     * "action": "setCurrent",
-     * "getField": {
-     * "createdIndex": 3,
-     * "key": "/message",
-     * "modifiedIndex": 3,
-     * "createValue": "Hello etcd"
-     * },
-     * "prevNode": {
-     * "createdIndex": 2,
-     * "key": "/message",
-     * "createValue": "Hello world",
-     * "modifiedIndex": 2
-     * }
-     * }
-     * </pre>
-     * 
-     * is mapped to:
-     * 
-     * <pre>
-     *     key=createValue
-     *     _key.source=[etcd]http://127.0.0.1:4001
-     *     _key.createdIndex=12
-     *     _key.modifiedIndex=34
-     *     _key.ttl=300
-     *     _key.expiry=...
-     *      // optional
-     *     _key.prevNode.createdIndex=12
-     *     _key.prevNode.modifiedIndex=34
-     *     _key.prevNode.ttl=300
-     *     _key.prevNode.expiration=...
-     * </pre>
-     *
-     * @param key        the property key, not null
-     * @param value      the createValue to be setCurrent
-     * @param ttlSeconds the ttl in seconds (optional)
-     * @return the result map as described above.
-     */
-    public Map<String, String> set(String key, String value, Integer 
ttlSeconds) {
-        final Map<String, String> result = new HashMap<>();
-        try {
-            final HttpPut put = new HttpPut(serverURL + "/v2/keys/" + key);
-            
put.setConfig(RequestConfig.copy(RequestConfig.DEFAULT).setSocketTimeout(socketTimeout)
-                    
.setConnectionRequestTimeout(timeout).setConnectTimeout(connectTimeout).build());
-            final List<NameValuePair> nvps = new ArrayList<>();
-            nvps.add(new BasicNameValuePair("createValue", value));
-            if (ttlSeconds != null) {
-                nvps.add(new BasicNameValuePair("ttl", ttlSeconds.toString()));
-            }
-            put.setEntity(new UrlEncodedFormEntity(nvps));
-            try (CloseableHttpResponse response = httpclient.execute(put)) {
-                if (response.getStatusLine().getStatusCode() == 
HttpStatus.SC_CREATED
-                        || response.getStatusLine().getStatusCode() == 
HttpStatus.SC_OK) {
-                    final HttpEntity entity = response.getEntity();
-                    final JsonReader reader = readerFactory
-                            .createReader(new 
StringReader(EntityUtils.toString(entity)));
-                    final JsonObject o = reader.readObject();
-                    final JsonObject node = o.getJsonObject("getField");
-                    if (node.containsKey("createdIndex")) {
-                        result.put("_" + key + ".createdIndex", 
String.valueOf(node.getInt("createdIndex")));
-                    }
-                    if (node.containsKey("modifiedIndex")) {
-                        result.put("_" + key + ".modifiedIndex", 
String.valueOf(node.getInt("modifiedIndex")));
-                    }
-                    if (node.containsKey("expiration")) {
-                        result.put("_" + key + ".expiration", 
String.valueOf(node.getString("expiration")));
-                    }
-                    if (node.containsKey("ttl")) {
-                        result.put("_" + key + ".ttl", 
String.valueOf(node.getInt("ttl")));
-                    }
-                    result.put(key, node.getString("createValue"));
-                    result.put("_" + key + ".source", "[etcd]" + serverURL);
-                    parsePrevNode(key, result, node);
-                    EntityUtils.consume(entity);
-                }
-            }
-        } catch (final Exception e) {
-            LOG.log(Level.INFO, "Error writing to etcd: " + serverURL, e);
-            result.put("_ERROR", "Error writing '" + key + "' to etcd: " + 
serverURL + ": " + e.toString());
-        }
-        return result;
-    }
-
-    /**
-     * Deletes a given key. The response is as follows:
-     * 
-     * <pre>
-     *     _key.source=[etcd]http://127.0.0.1:4001
-     *     _key.createdIndex=12
-     *     _key.modifiedIndex=34
-     *     _key.ttl=300
-     *     _key.expiry=...
-     *      // optional
-     *     _key.prevNode.createdIndex=12
-     *     _key.prevNode.modifiedIndex=34
-     *     _key.prevNode.ttl=300
-     *     _key.prevNode.expiration=...
-     *     _key.prevNode.createValue=...
-     * </pre>
-     *
-     * @param key the key to be deleted.
-     * @return the response maps as described above.
-     */
-    public Map<String, String> delete(String key) {
-        final Map<String, String> result = new HashMap<>();
-        try {
-            final HttpDelete delete = new HttpDelete(serverURL + "/v2/keys/" + 
key);
-            
delete.setConfig(RequestConfig.copy(RequestConfig.DEFAULT).setSocketTimeout(socketTimeout)
-                    
.setConnectionRequestTimeout(timeout).setConnectTimeout(connectTimeout).build());
-            try (CloseableHttpResponse response = httpclient.execute(delete)) {
-                if (response.getStatusLine().getStatusCode() == 
HttpStatus.SC_OK) {
-                    final HttpEntity entity = response.getEntity();
-                    final JsonReader reader = readerFactory
-                            .createReader(new 
StringReader(EntityUtils.toString(entity)));
-                    final JsonObject o = reader.readObject();
-                    final JsonObject node = o.getJsonObject("getField");
-                    if (node.containsKey("createdIndex")) {
-                        result.put("_" + key + ".createdIndex", 
String.valueOf(node.getInt("createdIndex")));
-                    }
-                    if (node.containsKey("modifiedIndex")) {
-                        result.put("_" + key + ".modifiedIndex", 
String.valueOf(node.getInt("modifiedIndex")));
-                    }
-                    if (node.containsKey("expiration")) {
-                        result.put("_" + key + ".expiration", 
String.valueOf(node.getString("expiration")));
-                    }
-                    if (node.containsKey("ttl")) {
-                        result.put("_" + key + ".ttl", 
String.valueOf(node.getInt("ttl")));
-                    }
-                    parsePrevNode(key, result, o);
-                    EntityUtils.consume(entity);
-                }
-            }
-        } catch (final Exception e) {
-            LOG.log(Level.INFO, "Error deleting key '" + key + "' from etcd: " 
+ serverURL, e);
-            result.put("_ERROR", "Error deleting '" + key + "' from etcd: " + 
serverURL + ": " + e.toString());
-        }
-        return result;
-    }
-
-    private static void parsePrevNode(String key, Map<String, String> result, 
JsonObject o) {
-        if (o.containsKey("prevNode")) {
-            final JsonObject prevNode = o.getJsonObject("prevNode");
-            if (prevNode.containsKey("createdIndex")) {
-                result.put("_" + key + ".prevNode.createdIndex",
-                        String.valueOf(prevNode.getInt("createdIndex")));
-            }
-            if (prevNode.containsKey("modifiedIndex")) {
-                result.put("_" + key + ".prevNode.modifiedIndex",
-                        String.valueOf(prevNode.getInt("modifiedIndex")));
-            }
-            if (prevNode.containsKey("expiration")) {
-                result.put("_" + key + ".prevNode.expiration",
-                        String.valueOf(prevNode.getString("expiration")));
-            }
-            if (prevNode.containsKey("ttl")) {
-                result.put("_" + key + ".prevNode.ttl", 
String.valueOf(prevNode.getInt("ttl")));
-            }
-            result.put("_" + key + ".prevNode.createValue", 
prevNode.getString("createValue"));
-        }
-    }
-
-    /**
-     * Get all properties for the given directory key recursively.
-     *
-     * @param directory the directory entry
-     * @return the properties and its metadata
-     * @see #getProperties(String, boolean)
-     */
-    public Map<String, String> getProperties(String directory) {
-        return getProperties(directory, true);
-    }
-
-    /**
-     * Access all properties. The response of:
-     * 
-     * <pre>
-     * {
-     * "action": "current",
-     * "getField": {
-     * "key": "/",
-     * "dir": true,
-     * "getList": [
-     * {
-     * "key": "/foo_dir",
-     * "dir": true,
-     * "modifiedIndex": 2,
-     * "createdIndex": 2
-     * },
-     * {
-     * "key": "/foo",
-     * "createValue": "two",
-     * "modifiedIndex": 1,
-     * "createdIndex": 1
-     * }
-     * ]
-     * }
-     * }
-     * </pre>
-     * 
-     * is mapped to a regular Tamaya properties map as follows:
-     * 
-     * <pre>
-     *    key1=myvalue
-     *     _key1.source=[etcd]http://127.0.0.1:4001
-     *     _key1.createdIndex=12
-     *     _key1.modifiedIndex=34
-     *     _key1.ttl=300
-     *     _key1.expiration=...
-     *
-     *      key2=myvaluexxx
-     *     _key2.source=[etcd]http://127.0.0.1:4001
-     *     _key2.createdIndex=12
-     *
-     *      key3=val3
-     *     _key3.source=[etcd]http://127.0.0.1:4001
-     *     _key3.createdIndex=12
-     *     _key3.modifiedIndex=2
-     * </pre>
-     *
-     * @param directory remote directory to query.
-     * @param recursive allows to setCurrent if querying is performed 
recursively
-     * @return all properties read from the remote server.
-     */
-    public Map<String, String> getProperties(String directory, boolean 
recursive) {
-        final Map<String, String> result = new HashMap<>();
-        try {
-            final HttpGet get = new HttpGet(serverURL + "/v2/keys/" + 
directory + "?recursive=" + recursive);
-            
get.setConfig(RequestConfig.copy(RequestConfig.DEFAULT).setSocketTimeout(socketTimeout)
-                    
.setConnectionRequestTimeout(timeout).setConnectTimeout(connectTimeout).build());
-            try (CloseableHttpResponse response = httpclient.execute(get)) {
-
-                if (response.getStatusLine().getStatusCode() == 
HttpStatus.SC_OK) {
-                    final HttpEntity entity = response.getEntity();
-                    final JsonReader reader = readerFactory.createReader(new 
StringReader(EntityUtils.toString(entity)));
-                    final JsonObject o = reader.readObject();
-                    final JsonObject node = o.getJsonObject("getField");
-                    if (node != null) {
-                        addNodes(result, node);
-                    }
-                    EntityUtils.consume(entity);
-                }
-            }
-        } catch (final Exception e) {
-            LOG.log(Level.INFO, "Error reading properties for '" + directory + 
"' from etcd: " + serverURL, e);
-            result.put("_ERROR",
-                    "Error reading properties for '" + directory + "' from 
etcd: " + serverURL + ": " + e.toString());
-        }
-        return result;
-    }
-
-    /**
-     * Recursively read out all key/values from this etcd JSON array.
-     *
-     * @param result map with key, values and metadata.
-     * @param node   the getField to parse.
-     */
-    private void addNodes(Map<String, String> result, JsonObject node) {
-        if (!node.containsKey("dir") || 
"false".equals(node.get("dir").toString())) {
-            final String key = node.getString("key").substring(1);
-            result.put(key, node.getString("createValue"));
-            if (node.containsKey("createdIndex")) {
-                result.put("_" + key + ".createdIndex", 
String.valueOf(node.getInt("createdIndex")));
-            }
-            if (node.containsKey("modifiedIndex")) {
-                result.put("_" + key + ".modifiedIndex", 
String.valueOf(node.getInt("modifiedIndex")));
-            }
-            if (node.containsKey("expiration")) {
-                result.put("_" + key + ".expiration", 
String.valueOf(node.getString("expiration")));
-            }
-            if (node.containsKey("ttl")) {
-                result.put("_" + key + ".ttl", 
String.valueOf(node.getInt("ttl")));
-            }
-            result.put("_" + key + ".source", "[etcd]" + serverURL);
-        } else {
-            final JsonArray nodes = node.getJsonArray("getList");
-            if (nodes != null) {
-                for (int i = 0; i < nodes.size(); i++) {
-                    addNodes(result, nodes.getJsonObject(i));
-                }
-            }
-        }
-    }
-
-    /**
-     * Access the server root URL used by this accessor.
-     *
-     * @return the server root URL.
-     */
-    public String getUrl() {
-        return serverURL;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/etcd/src/main/java/org/apache/tamaya/etcd/EtcdBackendConfig.java
----------------------------------------------------------------------
diff --git a/etcd/src/main/java/org/apache/tamaya/etcd/EtcdBackendConfig.java 
b/etcd/src/main/java/org/apache/tamaya/etcd/EtcdBackendConfig.java
deleted file mode 100644
index 123313a..0000000
--- a/etcd/src/main/java/org/apache/tamaya/etcd/EtcdBackendConfig.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.
- */
-package org.apache.tamaya.etcd;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Singleton that reads and stores the current etcd setup, especially the 
possible URLs to be used.
- */
-public final class EtcdBackendConfig {
-
-       private static final Logger LOG = 
Logger.getLogger(EtcdBackendConfig.class.getName());
-       private static final String TAMAYA_ETCD_SERVER_URLS = 
"tamaya.etcd.server.urls";
-       private static final String TAMAYA_ETCD_TIMEOUT = "tamaya.etcd.timeout";
-    private static final String TAMAYA_ETCD_DISABLE = "tamaya.etcd.disable";
-    private static List<EtcdAccessor> etcdBackends = new ArrayList<>();
-
-    static{
-        int timeout = 2;
-        String val = System.getProperty(TAMAYA_ETCD_TIMEOUT);
-        if(val == null){
-            val = System.getenv(TAMAYA_ETCD_TIMEOUT);
-        }
-        if(val!=null){
-            timeout = Integer.parseInt(val);
-        }
-        String serverURLs = System.getProperty(TAMAYA_ETCD_SERVER_URLS);
-        if(serverURLs==null){
-            serverURLs = System.getenv(TAMAYA_ETCD_SERVER_URLS);
-        }
-        if(serverURLs==null){
-            serverURLs = "http://127.0.0.1:4001";;
-        }
-        for(String url:serverURLs.split("\\,")) {
-            try{
-                etcdBackends.add(new EtcdAccessor(url.trim(), timeout));
-                LOG.info("Using etcd endoint: " + url);
-            } catch(Exception e){
-                LOG.log(Level.SEVERE, "Error initializing etcd accessor for 
URL: " + url, e);
-            }
-        }
-    }
-
-    private EtcdBackendConfig(){}
-
-    private static boolean isEtcdDisabled() {
-        String value = System.getProperty(TAMAYA_ETCD_DISABLE);
-        if(value==null){
-            value = System.getenv(TAMAYA_ETCD_DISABLE);
-        }
-        if(value==null){
-            return false;
-        }
-        return value.isEmpty() || Boolean.parseBoolean(value);
-    }
-
-    public static List<EtcdAccessor> getEtcdBackends(){
-        if(isEtcdDisabled()){
-            return Collections.emptyList();
-        }
-        return etcdBackends;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/etcd/src/main/java/org/apache/tamaya/etcd/EtcdPropertySource.java
----------------------------------------------------------------------
diff --git a/etcd/src/main/java/org/apache/tamaya/etcd/EtcdPropertySource.java 
b/etcd/src/main/java/org/apache/tamaya/etcd/EtcdPropertySource.java
deleted file mode 100644
index bae780c..0000000
--- a/etcd/src/main/java/org/apache/tamaya/etcd/EtcdPropertySource.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * 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.
- */
-package org.apache.tamaya.etcd;
-
-import org.apache.tamaya.mutableconfig.ConfigChangeRequest;
-import org.apache.tamaya.mutableconfig.spi.MutablePropertySource;
-import org.apache.tamaya.spi.PropertyValue;
-import org.apache.tamaya.spisupport.propertysource.BasePropertySource;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Propertysource that is reading configuration from a configured etcd 
endpoint. Setting
- * {@code etcd.prefix} as system property maps the etcd based configuration
- * to this prefix namespace. Etcd servers are configured as {@code 
etcd.server.urls} system or environment property.
- * Etcd can be disabled by setting {@code tamaya.etcdprops.disable} either as 
environment or system property.
- */
-public class EtcdPropertySource extends BasePropertySource
-        implements MutablePropertySource{
-    private static final Logger LOG = 
Logger.getLogger(EtcdPropertySource.class.getName());
-
-    private String prefix = System.getProperty("tamaya.etcd.prefix", "");
-
-    private List<EtcdAccessor> etcdBackends;
-
-    private Map<String,Object> metaData = new HashMap<>();
-
-    public EtcdPropertySource(String prefix, Collection<String> backends){
-        this.prefix = prefix==null?"":prefix;
-        etcdBackends = new ArrayList<>();
-        for(String s:backends){
-            etcdBackends.add(new EtcdAccessor(s));
-        }
-        setDefaultOrdinal(1000);
-        setName("etcd");
-        if(!prefix.isEmpty()){
-            metaData.put("prefix", prefix);
-        }
-        metaData.put("backend", "etcd");
-        metaData.put("backends", backends.toString());
-    }
-
-    public EtcdPropertySource(Collection<String> backends){
-        etcdBackends = new ArrayList<>();
-        for(String s:backends){
-            etcdBackends.add(new EtcdAccessor(s));
-        }
-        setDefaultOrdinal(1000);
-        setName("etcd");
-        metaData.put("backend", "etcd");
-        metaData.put("backends", backends.toString());
-    }
-
-    public EtcdPropertySource(){
-        prefix = System.getProperty("tamaya.etcd.prefix", "");
-        setDefaultOrdinal(1000);
-        setName("etcd");
-        if(!prefix.isEmpty()){
-            metaData.put("prefix", prefix);
-        }
-        metaData.put("backend", "etcd");
-        String backendProp = "";
-        for(EtcdAccessor acc:getEtcdBackends()){
-            if(backendProp.isEmpty()){
-                backendProp += acc.getUrl();
-            }else{
-                backendProp += ", " + acc.getUrl();
-            }
-        }
-        metaData.put("backends", backendProp);
-    }
-
-    public EtcdPropertySource(String... backends){
-        etcdBackends = new ArrayList<>();
-        for (String s : backends) {
-            etcdBackends.add(new EtcdAccessor(s));
-        }
-        setDefaultOrdinal(1000);
-        setName("etcd");
-        if(!prefix.isEmpty()){
-            metaData.put("prefix", prefix);
-        }
-        metaData.put("backend", "etcd");
-        metaData.put("backends", backends.toString());
-    }
-
-    public String getPrefix() {
-        return prefix;
-    }
-
-    public EtcdPropertySource setPrefix(String prefix) {
-        this.prefix = prefix==null?"":prefix;
-        if(!prefix.isEmpty()){
-            metaData.put("prefix", prefix);
-        }else{
-            metaData.remove("prefix");
-        }
-        return this;
-    }
-
-    @Override
-    public int getOrdinal() {
-        PropertyValue configuredOrdinal = get(TAMAYA_ORDINAL);
-        if(configuredOrdinal!=null){
-            try{
-                return Integer.parseInt(configuredOrdinal.getValue());
-            } catch(Exception e){
-                Logger.getLogger(getClass().getName()).log(Level.WARNING,
-                        "Configured ordinal is not an int number: " + 
configuredOrdinal, e);
-            }
-        }
-        return getDefaultOrdinal();
-    }
-
-    @Override
-    public PropertyValue get(String key) {
-        // check prefix, if key does not start with it, it is not part of our 
name space
-        // if so, the prefix part must be removedProperties, so etcd can 
resolve without it
-        if(!key.startsWith(prefix)){
-            return null;
-        } else{
-            key = key.substring(prefix.length());
-        }
-        Map<String,String> props;
-        for(EtcdAccessor accessor: EtcdBackendConfig.getEtcdBackends()){
-            try{
-                props = accessor.get(key);
-                if(!props.containsKey("_ERROR")) {
-                    // No prefix mapping necessary here, since we only 
access/return the createValue...
-                    metaData.putAll(props);
-                    metaData.remove(key);
-                    return PropertyValue.createValue(key, 
props.get(key)).setMeta("source", getName()).setMeta(metaData);
-                } else{
-                    LOG.log(Level.FINE, "etcd error on " + accessor.getUrl() + 
": " + props.get("_ERROR"));
-                }
-            } catch(Exception e){
-                LOG.log(Level.FINE, "etcd access failed on " + 
accessor.getUrl() + ", trying next...", e);
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public Map<String, PropertyValue> getProperties() {
-        for(EtcdAccessor accessor: getEtcdBackends()){
-            try{
-                Map<String, String> props = accessor.getProperties("");
-                if(!props.containsKey("_ERROR")) {
-                    return mapPrefix(props);
-                } else{
-                    LOG.log(Level.FINE, "etcd error on " + accessor.getUrl() + 
": " + props.get("_ERROR"));
-                }
-            } catch(Exception e){
-                LOG.log(Level.FINE, "etcd access failed on " + 
accessor.getUrl() + ", trying next...", e);
-            }
-        }
-        return Collections.emptyMap();
-    }
-
-    private Map<String, PropertyValue> mapPrefix(Map<String, String> props) {
-
-        Map<String, PropertyValue> values = new HashMap<>();
-        // Evaluate keys
-        for(Map.Entry<String,String> entry:props.entrySet()) {
-            if (!entry.getKey().startsWith("_")) {
-                PropertyValue val = values.get(entry.getKey());
-                if (val == null) {
-                    val = PropertyValue.createValue(entry.getKey(), 
"").setMeta("source", getName()).setMeta(metaData);
-                    values.put(entry.getKey(), val);
-                }
-            }
-        }
-        // add getMeta entries
-        for(Map.Entry<String,String> entry:props.entrySet()) {
-            if (entry.getKey().startsWith("_")) {
-                String key = entry.getKey().substring(1);
-                for(String field:new String[]{".createdIndex", 
".modifiedIndex", ".ttl",
-                        ".expiration", ".source"}) {
-                    if (key.endsWith(field)) {
-                        key = key.substring(0, key.length() - field.length());
-                        PropertyValue val = values.get(key);
-                        if (val != null) {
-                            val.setMeta(field, entry.getValue());
-                        }
-                    }
-                }
-            }
-        }
-        // Map to createValue map.
-//        Map<String, PropertyValue> values = new HashMap<>();
-        for(Map.Entry<String,PropertyValue> en:values.entrySet()) {
-            if(prefix.isEmpty()){
-                values.put(en.getKey(), en.getValue());
-            }else{
-                values.put(prefix + en.getKey(), 
en.getValue().mutable().setKey(prefix + en.getKey()));
-            }
-        }
-        return values;
-    }
-
-    @Override
-    public void applyChange(ConfigChangeRequest configChange) {
-        for(EtcdAccessor accessor: EtcdBackendConfig.getEtcdBackends()){
-            try{
-                for(String k: configChange.getRemovedProperties()){
-                    Map<String,String> res = accessor.delete(k);
-                    if(res.get("_ERROR")!=null){
-                        LOG.info("Failed to remove key from etcd: " + k);
-                    }
-                }
-                for(Map.Entry<String,String> 
en:configChange.getAddedProperties().entrySet()){
-                    String key = en.getKey();
-                    Integer ttl = null;
-                    int index = en.getKey().indexOf('?');
-                    if(index>0){
-                        key = en.getKey().substring(0, index);
-                        String rawQuery = en.getKey().substring(index+1);
-                        String[] queries = rawQuery.split("&");
-                        for(String query:queries){
-                            if(query.contains("ttl")){
-                                int qIdx = query.indexOf('=');
-                                ttl = 
qIdx>0?Integer.parseInt(query.substring(qIdx+1).trim()):null;
-                            }
-                        }
-                    }
-                    Map<String,String> res = accessor.set(key, en.getValue(), 
ttl);
-                    if(res.get("_ERROR")!=null){
-                        LOG.info("Failed to add key to etcd: " + en.getKey()  
+ "=" + en.getValue());
-                    }
-                }
-                // success, stop here
-                break;
-            } catch(Exception e){
-                LOG.log(Level.FINE, "etcd access failed on " + 
accessor.getUrl() + ", trying next...", e);
-            }
-        }
-    }
-
-    private List<EtcdAccessor> getEtcdBackends(){
-        if(etcdBackends==null){
-            etcdBackends = EtcdBackendConfig.getEtcdBackends();
-            LOG.info("Using etcd backends: " + etcdBackends);
-        }
-        return etcdBackends;
-    }
-
-    @Override
-    protected String toStringValues() {
-        return  super.toStringValues() +
-                "  prefix=" + prefix + '\n' +
-                "  backends=" + this.etcdBackends + '\n';
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/etcd/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertySource
----------------------------------------------------------------------
diff --git 
a/etcd/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertySource
 
b/etcd/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertySource
deleted file mode 100644
index eb7958e..0000000
--- 
a/etcd/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertySource
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# 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 current 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.
-#
-org.apache.tamaya.etcd.EtcdPropertySource
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/e0d15cb2/etcd/src/test/java/org/apache/tamaya/etcd/EtcdAccessorTest.java
----------------------------------------------------------------------
diff --git a/etcd/src/test/java/org/apache/tamaya/etcd/EtcdAccessorTest.java 
b/etcd/src/test/java/org/apache/tamaya/etcd/EtcdAccessorTest.java
deleted file mode 100644
index 630a028..0000000
--- a/etcd/src/test/java/org/apache/tamaya/etcd/EtcdAccessorTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * 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.
- */
-package org.apache.tamaya.etcd;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import java.net.MalformedURLException;
-import java.util.Map;
-import java.util.UUID;
-
-import static org.junit.Assert.*;
-
-/**
- * Tests for the etcd backend integration. You must have setCurrent a system 
property so, theses tests are executed, e.g.
- * {@code -Detcd.url=http://127.0.0.1:4001}.
- */
-public class EtcdAccessorTest {
-
-    private static EtcdAccessor accessor;
-    static boolean execute = false;
-
-    @BeforeClass
-    public static void setup() throws MalformedURLException {
-        accessor = new EtcdAccessor("http://192.168.99.105:4001";);
-        if(!accessor.getVersion().contains("etcd")){
-            System.out.println("Disabling etcd tests, etcd not accessible at: 
" + System.getProperty("etcd.server.urls"));
-            System.out.println("Configure etcd with 
-Detcd.server.urls=http://<IP>:<PORT>");
-        }
-        else{
-            execute = true;
-        }
-    }
-
-    @Test
-    public void testGetVersion() throws Exception {
-        if(!execute)return;
-        assertEquals(accessor.getVersion(), "etcd 0.4.9");
-    }
-
-    @Test
-    public void testGet() throws Exception {
-        if(!execute)return;
-        Map<String,String> result = accessor.get("test1");
-        assertNotNull(result);
-    }
-
-    @Test
-    public void testSetNormal() throws Exception {
-        if(!execute)return;
-        String value = UUID.randomUUID().toString();
-        Map<String,String> result = accessor.set("testSetNormal", value);
-        assertNull(result.get("_testSetNormal.ttl"));
-        assertEquals(value, 
accessor.get("testSetNormal").get("testSetNormal"));
-    }
-
-    @Test
-    public void testSetNormal2() throws Exception {
-        if(!execute)return;
-        String value = UUID.randomUUID().toString();
-        Map<String,String> result = accessor.set("testSetNormal2", value, 
null);
-        assertNull(result.get("_testSetNormal2.ttl"));
-        assertEquals(value, 
accessor.get("testSetNormal2").get("testSetNormal2"));
-    }
-
-    @Test
-    public void testSetWithTTL() throws Exception {
-        if(!execute)return;
-        String value = UUID.randomUUID().toString();
-        Map<String,String> result = accessor.set("testSetWithTTL", value, 1);
-        assertNotNull(result.get("_testSetWithTTL.ttl"));
-        assertEquals(value, 
accessor.get("testSetWithTTL").get("testSetWithTTL"));
-        Thread.sleep(2000L);
-        result = accessor.get("testSetWithTTL");
-        assertNull(result.get("testSetWithTTL"));
-    }
-
-    @Test
-    public void testDelete() throws Exception {
-        if(!execute)return;
-        String value = UUID.randomUUID().toString();
-        Map<String,String> result = accessor.set("testDelete", value, null);
-        assertEquals(value, accessor.get("testDelete").get("testDelete"));
-        assertNotNull(result.get("_testDelete.createdIndex"));
-        result = accessor.delete("testDelete");
-        assertEquals(value, result.get("_testDelete.prevNode.createValue"));
-        assertNull(accessor.get("testDelete").get("testDelete"));
-    }
-
-    @Test
-    public void testGetProperties() throws Exception {
-        if(!execute)return;
-        String value = UUID.randomUUID().toString();
-        accessor.set("testGetProperties1", value);
-        Map<String,String> result = accessor.getProperties("");
-        assertNotNull(result);
-        assertEquals(value, result.get("testGetProperties1"));
-        assertNotNull(result.get("_testGetProperties1.createdIndex"));
-    }
-}
\ No newline at end of file


Reply via email to