Repository: curator
Updated Branches:
  refs/heads/CURATOR-397 4efc38f3d -> 019caeea6


added tree cache wrapper


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/019caeea
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/019caeea
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/019caeea

Branch: refs/heads/CURATOR-397
Commit: 019caeea6aba36e77c64073003e66d62aa60b761
Parents: 4efc38f
Author: randgalt <[email protected]>
Authored: Sat Apr 8 22:14:06 2017 -0500
Committer: randgalt <[email protected]>
Committed: Sat Apr 8 22:14:06 2017 -0500

----------------------------------------------------------------------
 .../details/recipes/ModeledNodeCacheImpl.java   |  12 +-
 .../recipes/ModeledPathChildrenCacheImpl.java   | 131 ++++++++-------
 .../details/recipes/ModeledTreeCacheImpl.java   | 164 +++++++++++++++++++
 .../modeled/recipes/ModeledCacheEvent.java      |  28 ++++
 .../modeled/recipes/ModeledCacheEventType.java  |  57 +++++++
 .../modeled/recipes/ModeledCacheListener.java   |  24 +++
 .../async/modeled/recipes/ModeledNodeCache.java |   8 +-
 .../recipes/ModeledPathChildrenCache.java       |  40 ++---
 .../recipes/ModeledPathChildrenCacheEvent.java  |  28 ----
 .../ModeledPathChildrenCacheListener.java       |  24 ---
 .../async/modeled/recipes/ModeledTreeCache.java |  46 ++++++
 11 files changed, 416 insertions(+), 146 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/019caeea/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledNodeCacheImpl.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledNodeCacheImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledNodeCacheImpl.java
index f704f77..991119f 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledNodeCacheImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledNodeCacheImpl.java
@@ -18,13 +18,11 @@
  */
 package org.apache.curator.x.async.modeled.details.recipes;
 
-import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.listen.Listenable;
 import org.apache.curator.framework.recipes.cache.ChildData;
 import org.apache.curator.framework.recipes.cache.NodeCache;
 import org.apache.curator.framework.recipes.cache.NodeCacheListener;
 import org.apache.curator.utils.CloseableUtils;
-import org.apache.curator.x.async.api.CreateOption;
 import org.apache.curator.x.async.modeled.ModeledDetails;
 import org.apache.curator.x.async.modeled.recipes.ModeledCachedNode;
 import org.apache.curator.x.async.modeled.recipes.ModeledNodeCache;
@@ -37,10 +35,16 @@ public class ModeledNodeCacheImpl<T> implements 
ModeledNodeCache<T>
     private final NodeCache cache;
     private final ModeledDetails<T> modeled;
 
-    public ModeledNodeCacheImpl(CuratorFramework client, ModeledDetails<T> 
modeled)
+    public ModeledNodeCacheImpl(ModeledDetails<T> modeled, NodeCache cache)
     {
         this.modeled = Objects.requireNonNull(modeled, "modeled cannot be 
null");
-        cache = new NodeCache(client, modeled.getPath().fullPath(), 
modeled.getCreateOptions().contains(CreateOption.compress));
+        this.cache = Objects.requireNonNull(cache, "cache cannot be null");
+    }
+
+    @Override
+    public NodeCache upwrap()
+    {
+        return cache;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/curator/blob/019caeea/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java
index 5a5bdda..d0ee681 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java
@@ -18,57 +18,45 @@
  */
 package org.apache.curator.x.async.modeled.details.recipes;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.util.concurrent.MoreExecutors;
-import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.listen.Listenable;
 import org.apache.curator.framework.recipes.cache.ChildData;
 import org.apache.curator.framework.recipes.cache.PathChildrenCache;
 import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
 import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
-import org.apache.curator.utils.CloseableExecutorService;
 import org.apache.curator.utils.CloseableUtils;
-import org.apache.curator.x.async.api.CreateOption;
 import org.apache.curator.x.async.modeled.ModeledDetails;
 import org.apache.curator.x.async.modeled.ZPath;
+import org.apache.curator.x.async.modeled.recipes.ModeledCacheEventType;
 import org.apache.curator.x.async.modeled.recipes.ModeledCachedNode;
 import org.apache.curator.x.async.modeled.recipes.ModeledPathChildrenCache;
-import 
org.apache.curator.x.async.modeled.recipes.ModeledPathChildrenCacheEvent;
-import 
org.apache.curator.x.async.modeled.recipes.ModeledPathChildrenCacheListener;
+import org.apache.curator.x.async.modeled.recipes.ModeledCacheEvent;
+import org.apache.curator.x.async.modeled.recipes.ModeledCacheListener;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.ThreadFactory;
 import java.util.stream.Collectors;
 
 public class ModeledPathChildrenCacheImpl<T> implements 
ModeledPathChildrenCache<T>
 {
     private final ModeledDetails<T> modeled;
     private final PathChildrenCache cache;
-    private final Map<ModeledPathChildrenCacheListener, 
PathChildrenCacheListener> listenerMap = new ConcurrentHashMap<>();
+    private final Map<ModeledCacheListener, PathChildrenCacheListener> 
listenerMap = new ConcurrentHashMap<>();
 
-    public ModeledPathChildrenCacheImpl(CuratorFramework client, 
ModeledDetails<T> modeled, boolean cacheData, ThreadFactory threadFactory, 
ExecutorService executorService, CloseableExecutorService 
closeableExecutorService)
+    public ModeledPathChildrenCacheImpl(PathChildrenCache cache, 
ModeledDetails<T> modeled)
     {
-        this.modeled = modeled;
-        PathChildrenCache localCache;
-        if ( threadFactory != null )
-        {
-            localCache = new PathChildrenCache(client, 
modeled.getPath().fullPath(), cacheData, 
modeled.getCreateOptions().contains(CreateOption.compress), threadFactory);
-        }
-        else if ( executorService != null )
-        {
-            localCache = new PathChildrenCache(client, 
modeled.getPath().fullPath(), cacheData, 
modeled.getCreateOptions().contains(CreateOption.compress), executorService);
-        }
-        else if ( closeableExecutorService != null )
-        {
-            localCache = new PathChildrenCache(client, 
modeled.getPath().fullPath(), cacheData, 
modeled.getCreateOptions().contains(CreateOption.compress), 
closeableExecutorService);
-        }
-        else
-        {
-            localCache = new PathChildrenCache(client, 
modeled.getPath().fullPath(), cacheData, 
modeled.getCreateOptions().contains(CreateOption.compress), 
PathChildrenCache.defaultThreadFactory);
-        }
-        cache = localCache;
+        this.modeled = Objects.requireNonNull(modeled, "modeled cannot be 
null");
+        this.cache = Objects.requireNonNull(cache, "cache cannot be null");
+    }
+
+    @Override
+    public PathChildrenCache unwrap()
+    {
+        return cache;
     }
 
     @Override
@@ -111,11 +99,11 @@ public class ModeledPathChildrenCacheImpl<T> implements 
ModeledPathChildrenCache
     }
 
     @Override
-    public void rebuildNode(String fullPath)
+    public void rebuildNode(ZPath fullPath)
     {
         try
         {
-            cache.rebuildNode(fullPath);
+            cache.rebuildNode(fullPath.fullPath());
         }
         catch ( Exception e )
         {
@@ -124,32 +112,32 @@ public class ModeledPathChildrenCacheImpl<T> implements 
ModeledPathChildrenCache
     }
 
     @Override
-    public Listenable<ModeledPathChildrenCacheListener> getListenable()
+    public Listenable<ModeledCacheListener<T>> getListenable()
     {
-        return new Listenable<ModeledPathChildrenCacheListener>()
+        return new Listenable<ModeledCacheListener<T>>()
         {
             @Override
-            public void addListener(ModeledPathChildrenCacheListener listener)
+            public void addListener(ModeledCacheListener<T> listener)
             {
                 addListener(listener, MoreExecutors.sameThreadExecutor());
             }
 
             @Override
-            public void addListener(ModeledPathChildrenCacheListener listener, 
Executor executor)
+            public void addListener(ModeledCacheListener<T> listener, Executor 
executor)
             {
                 PathChildrenCacheListener pathChildrenCacheListener = (client, 
event) -> {
-                    ModeledPathChildrenCacheEvent modeledEvent = new 
ModeledPathChildrenCacheEvent()
+                    ModeledCacheEvent<T> modeledEvent = new 
ModeledCacheEvent<T>()
                     {
                         @Override
-                        public PathChildrenCacheEvent.Type getType()
+                        public ModeledCacheEventType getType()
                         {
-                            return event.getType();
+                            return toType(event.getType());
                         }
 
                         @Override
-                        public ModeledCachedNode getNode()
+                        public Optional<ModeledCachedNode<T>> getNode()
                         {
-                            return from(event.getData());
+                            return Optional.ofNullable(from(modeled, 
event.getData()));
                         }
                     };
                     listener.event(modeledEvent);
@@ -159,7 +147,7 @@ public class ModeledPathChildrenCacheImpl<T> implements 
ModeledPathChildrenCache
             }
 
             @Override
-            public void removeListener(ModeledPathChildrenCacheListener 
listener)
+            public void removeListener(ModeledCacheListener listener)
             {
                 PathChildrenCacheListener pathChildrenCacheListener = 
listenerMap.remove(listener);
                 if ( pathChildrenCacheListener != null )
@@ -174,36 +162,26 @@ public class ModeledPathChildrenCacheImpl<T> implements 
ModeledPathChildrenCache
     public List<ModeledCachedNode> getCurrentData()
     {
         return cache.getCurrentData().stream()
-            .map(this::from)
+            .map(data -> from(modeled, data))
             .collect(Collectors.toList());
     }
 
-    private ModeledCachedNode<T> from(ChildData data)
-    {
-        if ( data == null )
-        {
-            return null;
-        }
-        T model = (data.getData() != null) ? 
modeled.getSerializer().deserialize(data.getData()) : null;
-        return new ModeledCachedNode<>(ZPath.parse(data.getPath()), model, 
data.getStat());
-    }
-
     @Override
-    public ModeledCachedNode getCurrentData(String fullPath)
+    public Optional<ModeledCachedNode> getCurrentData(String fullPath)
     {
-        return from(cache.getCurrentData(fullPath));
+        return Optional.ofNullable(from(modeled, 
cache.getCurrentData(fullPath)));
     }
 
     @Override
-    public void clearDataBytes(String fullPath)
+    public void clearDataBytes(ZPath fullPath)
     {
-        cache.clearDataBytes(fullPath);
+        cache.clearDataBytes(fullPath.fullPath());
     }
 
     @Override
-    public boolean clearDataBytes(String fullPath, int ifVersion)
+    public boolean clearDataBytes(ZPath fullPath, int ifVersion)
     {
-        return cache.clearDataBytes(fullPath, ifVersion);
+        return cache.clearDataBytes(fullPath.fullPath(), ifVersion);
     }
 
     @Override
@@ -230,4 +208,43 @@ public class ModeledPathChildrenCacheImpl<T> implements 
ModeledPathChildrenCache
     {
         CloseableUtils.closeQuietly(cache);
     }
+
+    static <T> ModeledCachedNode<T> from(ModeledDetails<T> modeled, ChildData 
data)
+    {
+        if ( data == null )
+        {
+            return null;
+        }
+        T model = (data.getData() != null) ? 
modeled.getSerializer().deserialize(data.getData()) : null;
+        return new ModeledCachedNode<>(ZPath.parse(data.getPath()), model, 
data.getStat());
+    }
+
+    @VisibleForTesting
+    static ModeledCacheEventType toType(PathChildrenCacheEvent.Type type)
+    {
+        switch ( type )
+        {
+            case CHILD_ADDED:
+                return ModeledCacheEventType.NODE_ADDED;
+
+            case CHILD_UPDATED:
+                return ModeledCacheEventType.NODE_UPDATED;
+
+            case CHILD_REMOVED:
+                return ModeledCacheEventType.NODE_REMOVED;
+
+            case CONNECTION_SUSPENDED:
+                return ModeledCacheEventType.CONNECTION_SUSPENDED;
+
+            case CONNECTION_RECONNECTED:
+                return ModeledCacheEventType.CONNECTION_RECONNECTED;
+
+            case CONNECTION_LOST:
+                return ModeledCacheEventType.CONNECTION_LOST;
+
+            case INITIALIZED:
+                return ModeledCacheEventType.INITIALIZED;
+        }
+        throw new UnsupportedOperationException("Unknown type: " + type);
+    }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/019caeea/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledTreeCacheImpl.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledTreeCacheImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledTreeCacheImpl.java
new file mode 100644
index 0000000..542ad23
--- /dev/null
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledTreeCacheImpl.java
@@ -0,0 +1,164 @@
+/**
+ * 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.curator.x.async.modeled.details.recipes;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.util.concurrent.MoreExecutors;
+import org.apache.curator.framework.listen.Listenable;
+import org.apache.curator.framework.recipes.cache.TreeCache;
+import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
+import org.apache.curator.framework.recipes.cache.TreeCacheListener;
+import org.apache.curator.utils.CloseableUtils;
+import org.apache.curator.x.async.modeled.ModeledDetails;
+import org.apache.curator.x.async.modeled.ZPath;
+import org.apache.curator.x.async.modeled.recipes.ModeledCacheEvent;
+import org.apache.curator.x.async.modeled.recipes.ModeledCacheEventType;
+import org.apache.curator.x.async.modeled.recipes.ModeledCacheListener;
+import org.apache.curator.x.async.modeled.recipes.ModeledCachedNode;
+import org.apache.curator.x.async.modeled.recipes.ModeledTreeCache;
+import java.util.AbstractMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executor;
+import java.util.stream.Collectors;
+
+import static 
org.apache.curator.x.async.modeled.details.recipes.ModeledPathChildrenCacheImpl.from;
+
+public class ModeledTreeCacheImpl<T> implements ModeledTreeCache<T>
+{
+    private final ModeledDetails<T> modeled;
+    private final TreeCache cache;
+    private final Map<ModeledCacheListener, TreeCacheListener> listenerMap = 
new ConcurrentHashMap<>();
+
+    public ModeledTreeCacheImpl(ModeledDetails<T> modeled, TreeCache cache)
+    {
+        this.modeled = Objects.requireNonNull(modeled, "modeled cannot be 
null");
+        this.cache = Objects.requireNonNull(cache, "cache cannot be null");
+    }
+
+    @Override
+    public void start()
+    {
+        try
+        {
+            cache.start();
+        }
+        catch ( Exception e )
+        {
+            throw new RuntimeException("Could not start", e);
+        }
+    }
+
+    @Override
+    public void close()
+    {
+        CloseableUtils.closeQuietly(cache);
+    }
+
+    @Override
+    public Listenable<ModeledCacheListener<T>> getListenable()
+    {
+        return new Listenable<ModeledCacheListener<T>>()
+        {
+            @Override
+            public void addListener(ModeledCacheListener<T> listener)
+            {
+                addListener(listener, MoreExecutors.sameThreadExecutor());
+            }
+
+            @Override
+            public void addListener(ModeledCacheListener<T> listener, Executor 
executor)
+            {
+                TreeCacheListener treeCacheListener = (client, event) -> {
+                    ModeledCacheEvent<T> wrappedEvent = new 
ModeledCacheEvent<T>()
+                    {
+                        @Override
+                        public ModeledCacheEventType getType()
+                        {
+                            return toType(event.getType());
+                        }
+
+                        @Override
+                        public Optional<ModeledCachedNode<T>> getNode()
+                        {
+                            return Optional.ofNullable(from(modeled, 
event.getData()));
+                        }
+                    };
+                };
+                listenerMap.put(listener, treeCacheListener);
+                cache.getListenable().addListener(treeCacheListener, executor);
+            }
+
+            @Override
+            public void removeListener(ModeledCacheListener<T> listener)
+            {
+                TreeCacheListener treeCacheListener = 
listenerMap.remove(listener);
+                if ( treeCacheListener != null )
+                {
+                    cache.getListenable().removeListener(treeCacheListener);
+                }
+            }
+        };
+    }
+
+    @Override
+    public Map<ZPath, ModeledCachedNode<T>> getCurrentChildren(ZPath fullPath)
+    {
+        return 
cache.getCurrentChildren(fullPath.fullPath()).entrySet().stream()
+            .map(entry -> new 
AbstractMap.SimpleEntry<>(ZPath.parse(entry.getKey()), from(modeled, 
entry.getValue())))
+            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+    }
+
+    @Override
+    public Optional<ModeledCachedNode<T>> getCurrentData(ZPath fullPath)
+    {
+        return Optional.ofNullable(from(modeled, 
cache.getCurrentData(fullPath.fullPath())));
+    }
+
+    @VisibleForTesting
+    static ModeledCacheEventType toType(TreeCacheEvent.Type type)
+    {
+        switch ( type )
+        {
+            case NODE_ADDED:
+                return ModeledCacheEventType.NODE_ADDED;
+
+            case NODE_UPDATED:
+                return ModeledCacheEventType.NODE_UPDATED;
+
+            case NODE_REMOVED:
+                return ModeledCacheEventType.NODE_REMOVED;
+
+            case CONNECTION_SUSPENDED:
+                return ModeledCacheEventType.CONNECTION_SUSPENDED;
+
+            case CONNECTION_RECONNECTED:
+                return ModeledCacheEventType.CONNECTION_RECONNECTED;
+
+            case CONNECTION_LOST:
+                return ModeledCacheEventType.CONNECTION_LOST;
+
+            case INITIALIZED:
+                return ModeledCacheEventType.INITIALIZED;
+        }
+        throw new UnsupportedOperationException("Unknown type: " + type);
+    }
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/019caeea/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheEvent.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheEvent.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheEvent.java
new file mode 100644
index 0000000..442e31c
--- /dev/null
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheEvent.java
@@ -0,0 +1,28 @@
+/**
+ * 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.curator.x.async.modeled.recipes;
+
+import java.util.Optional;
+
+public interface ModeledCacheEvent<T>
+{
+    ModeledCacheEventType getType();
+
+    Optional<ModeledCachedNode<T>> getNode();
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/019caeea/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheEventType.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheEventType.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheEventType.java
new file mode 100644
index 0000000..bfdf57d
--- /dev/null
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheEventType.java
@@ -0,0 +1,57 @@
+/**
+ * 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.curator.x.async.modeled.recipes;
+
+public enum ModeledCacheEventType
+{
+    /**
+     * A child was added to the path
+     */
+    NODE_ADDED,
+
+    /**
+     * A child's data was changed
+     */
+    NODE_UPDATED,
+
+    /**
+     * A child was removed from the path
+     */
+    NODE_REMOVED,
+
+    /**
+     * Called when the connection has changed to {@link 
org.apache.curator.framework.state.ConnectionState#SUSPENDED}
+     */
+    CONNECTION_SUSPENDED,
+
+    /**
+     * Called when the connection has changed to {@link 
org.apache.curator.framework.state.ConnectionState#RECONNECTED}
+     */
+    CONNECTION_RECONNECTED,
+
+    /**
+     * Called when the connection has changed to {@link 
org.apache.curator.framework.state.ConnectionState#LOST}
+     */
+    CONNECTION_LOST,
+
+    /**
+     * Signals that the initial cache has been populated.
+     */
+    INITIALIZED
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/019caeea/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheListener.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheListener.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheListener.java
new file mode 100644
index 0000000..88c7de0
--- /dev/null
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheListener.java
@@ -0,0 +1,24 @@
+/**
+ * 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.curator.x.async.modeled.recipes;
+
+public interface ModeledCacheListener<T>
+{
+    void event(ModeledCacheEvent<T> event);
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/019caeea/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java
index 6da08c7..d5650b3 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java
@@ -18,8 +18,8 @@
  */
 package org.apache.curator.x.async.modeled.recipes;
 
-import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.listen.Listenable;
+import org.apache.curator.framework.recipes.cache.NodeCache;
 import org.apache.curator.framework.recipes.cache.NodeCacheListener;
 import org.apache.curator.x.async.modeled.ModeledDetails;
 import org.apache.curator.x.async.modeled.details.recipes.ModeledNodeCacheImpl;
@@ -28,11 +28,13 @@ import java.util.Optional;
 
 public interface ModeledNodeCache<T> extends Closeable
 {
-    static <T> ModeledNodeCache build(CuratorFramework client, 
ModeledDetails<T> modeled)
+    static <T> ModeledNodeCache wrap(ModeledDetails<T> modeled, NodeCache 
cache)
     {
-        return new ModeledNodeCacheImpl<>(client, modeled);
+        return new ModeledNodeCacheImpl<>(modeled, cache);
     }
 
+    NodeCache upwrap();
+
     void start();
 
     void start(boolean buildInitial);

http://git-wip-us.apache.org/repos/asf/curator/blob/019caeea/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCache.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCache.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCache.java
index 06fa345..fd27c12 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCache.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCache.java
@@ -18,43 +18,23 @@
  */
 package org.apache.curator.x.async.modeled.recipes;
 
-import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.listen.Listenable;
 import org.apache.curator.framework.recipes.cache.PathChildrenCache;
-import org.apache.curator.utils.CloseableExecutorService;
 import org.apache.curator.x.async.modeled.ModeledDetails;
+import org.apache.curator.x.async.modeled.ZPath;
 import 
org.apache.curator.x.async.modeled.details.recipes.ModeledPathChildrenCacheImpl;
 import java.io.Closeable;
 import java.util.List;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.ThreadFactory;
+import java.util.Optional;
 
 public interface ModeledPathChildrenCache<T> extends Closeable
 {
-    static <T> ModeledPathChildrenCache<T> build(CuratorFramework client, 
ModeledDetails<T> modeled)
+    static <T> ModeledPathChildrenCache<T> wrap(PathChildrenCache cache, 
ModeledDetails<T> modeled)
     {
-        return new ModeledPathChildrenCacheImpl<>(client, modeled, true, null, 
null, null);
+        return new ModeledPathChildrenCacheImpl<>(cache, modeled);
     }
 
-    static <T> ModeledPathChildrenCache<T> build(CuratorFramework client, 
ModeledDetails<T> modeled, boolean cacheData)
-    {
-        return new ModeledPathChildrenCacheImpl<>(client, modeled, cacheData, 
null, null, null);
-    }
-
-    static <T> ModeledPathChildrenCache<T> build(CuratorFramework client, 
ModeledDetails<T> modeled, boolean cacheData, ThreadFactory threadFactory)
-    {
-        return new ModeledPathChildrenCacheImpl<>(client, modeled, cacheData, 
threadFactory, null, null);
-    }
-
-    static <T> ModeledPathChildrenCache<T> build(CuratorFramework client, 
ModeledDetails<T> modeled, boolean cacheData, ExecutorService executorService)
-    {
-        return new ModeledPathChildrenCacheImpl<>(client, modeled, cacheData, 
null, executorService, null);
-    }
-
-    static <T> ModeledPathChildrenCache<T> build(CuratorFramework client, 
ModeledDetails<T> modeled, boolean cacheData, CloseableExecutorService 
executorService)
-    {
-        return new ModeledPathChildrenCacheImpl<>(client, modeled, cacheData, 
null, null, executorService);
-    }
+    PathChildrenCache unwrap();
 
     void start();
 
@@ -62,17 +42,17 @@ public interface ModeledPathChildrenCache<T> extends 
Closeable
 
     void rebuild();
 
-    void rebuildNode(String fullPath);
+    void rebuildNode(ZPath fullPath);
 
-    Listenable<ModeledPathChildrenCacheListener> getListenable();
+    Listenable<ModeledCacheListener<T>> getListenable();
 
     List<ModeledCachedNode> getCurrentData();
 
-    ModeledCachedNode getCurrentData(String fullPath);
+    Optional<ModeledCachedNode> getCurrentData(String fullPath);
 
-    void clearDataBytes(String fullPath);
+    void clearDataBytes(ZPath fullPath);
 
-    boolean clearDataBytes(String fullPath, int ifVersion);
+    boolean clearDataBytes(ZPath fullPath, int ifVersion);
 
     void clearAndRefresh();
 

http://git-wip-us.apache.org/repos/asf/curator/blob/019caeea/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCacheEvent.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCacheEvent.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCacheEvent.java
deleted file mode 100644
index d2a9d71..0000000
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCacheEvent.java
+++ /dev/null
@@ -1,28 +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.curator.x.async.modeled.recipes;
-
-import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
-
-public interface ModeledPathChildrenCacheEvent<T>
-{
-    PathChildrenCacheEvent.Type getType();
-
-    ModeledCachedNode<T> getNode();
-}

http://git-wip-us.apache.org/repos/asf/curator/blob/019caeea/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCacheListener.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCacheListener.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCacheListener.java
deleted file mode 100644
index 9379961..0000000
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCacheListener.java
+++ /dev/null
@@ -1,24 +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.curator.x.async.modeled.recipes;
-
-public interface ModeledPathChildrenCacheListener
-{
-    void event(ModeledPathChildrenCacheEvent event);
-}

http://git-wip-us.apache.org/repos/asf/curator/blob/019caeea/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledTreeCache.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledTreeCache.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledTreeCache.java
new file mode 100644
index 0000000..ec49b8b
--- /dev/null
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledTreeCache.java
@@ -0,0 +1,46 @@
+/**
+ * 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.curator.x.async.modeled.recipes;
+
+import org.apache.curator.framework.listen.Listenable;
+import org.apache.curator.framework.recipes.cache.TreeCache;
+import org.apache.curator.x.async.modeled.ModeledDetails;
+import org.apache.curator.x.async.modeled.ZPath;
+import org.apache.curator.x.async.modeled.details.recipes.ModeledTreeCacheImpl;
+import java.io.Closeable;
+import java.util.Map;
+import java.util.Optional;
+
+public interface ModeledTreeCache<T> extends Closeable
+{
+    static <T> ModeledTreeCache<T> wrap(ModeledDetails<T> modeled, TreeCache 
cache)
+    {
+        return new ModeledTreeCacheImpl<>(modeled, cache);
+    }
+
+    void start();
+
+    void close();
+
+    Listenable<ModeledCacheListener<T>> getListenable();
+
+    Map<ZPath, ModeledCachedNode<T>> getCurrentChildren(ZPath fullPath);
+
+    Optional<ModeledCachedNode<T>> getCurrentData(ZPath fullPath);
+}

Reply via email to