CURATOR-666: Fix twice unfixForNamespace in background create (#454)

Previously, `unfixForNamespace` was called twice in background create.
This will accidentally unfix node path if it happens to contain
namespace in its prefix. Say, creating "/zoo/a" in namespace "/zoo" will
get path "/a".
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
index 6b52e66..ea31ef5 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
@@ -797,8 +797,7 @@
                 {
                     if ( !client.getZookeeperClient().getRetryPolicy().allowRetry(e) )
                     {
-                        final CuratorEvent event = makeCuratorEvent(client, e.code().intValue(), e.getPath(), null, e.getPath(), null);
-                        client.processBackgroundOperation(mainOperationAndData, event);
+                        sendBackgroundResponse(client, e.code().intValue(), e.getPath(), null, null, null, mainOperationAndData);
                         throw e;
                     }
                     // otherwise safe to ignore as it will get retried
@@ -895,14 +894,13 @@
 
     private void sendBackgroundResponse(int rc, String path, Object ctx, String name, Stat stat, OperationAndData<PathAndBytes> operationAndData)
     {
-        client.processBackgroundOperation(operationAndData, makeCuratorEvent(client, rc, path, ctx, name, stat));
+        sendBackgroundResponse(client, rc, path, ctx, name, stat, operationAndData);
     }
 
-    private static CuratorEvent makeCuratorEvent(CuratorFrameworkImpl client, int rc, String path, Object ctx, String name, Stat stat)
+    private static <T> void sendBackgroundResponse(CuratorFrameworkImpl client, int rc, String path, Object ctx, String name, Stat stat, OperationAndData<T> operationAndData)
     {
-        path = client.unfixForNamespace(path);
-        name = client.unfixForNamespace(name);
-        return new CuratorEventImpl(client, CuratorEventType.CREATE, rc, path, name, ctx, stat, null, null, null, null, null);
+        CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.CREATE, rc, path, name, ctx, stat, null, null, null, null, null);
+        client.processBackgroundOperation(operationAndData, event);
     }
 
     private ACLCreateModePathAndBytesable<String> asACLCreateModePathAndBytesable()
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorEventImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorEventImpl.java
index e562351..4e316cd 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorEventImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorEventImpl.java
@@ -133,7 +133,7 @@
         this.resultCode = resultCode;
         this.opResults = (opResults != null) ? ImmutableList.copyOf(opResults) : null;
         this.path = client.unfixForNamespace(path);
-        this.name = name;
+        this.name = client.unfixForNamespace(name);
         this.context = context;
         this.stat = stat;
         this.data = data;
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java
index 5c285fb..5eb632f 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java
@@ -1032,6 +1032,33 @@
     }
 
     @Test
+    public void testBackgroundPathWithNamespace() throws Exception {
+        CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder();
+        try (CuratorFramework client = builder
+                .connectString(server.getConnectString())
+                .retryPolicy(new RetryOneTime(1))
+                .build()) {
+            client.start();
+            CuratorFramework namespaceZoo = client.usingNamespace("zoo");
+            BlockingQueue<CuratorEvent> events = new LinkedBlockingQueue<>();
+            BackgroundCallback callback = (CuratorFramework ignored, CuratorEvent event) -> {
+                events.add(event);
+            };
+
+            namespaceZoo.create().creatingParentsIfNeeded().inBackground(callback).forPath("/zoo/a");
+            CuratorEvent event = events.poll(10, TimeUnit.SECONDS);
+            assertNotNull(event);
+            assertEquals("/zoo/a", event.getPath());
+            assertEquals("/zoo/a", event.getName());
+
+            client.checkExists().inBackground(callback).forPath("/zoo/zoo/a");
+            event = events.poll(10, TimeUnit.SECONDS);
+            assertNotNull(event);
+            assertEquals("/zoo/zoo/a", event.getPath());
+        }
+    }
+
+    @Test
     public void testCreateModes() throws Exception
     {
         CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1));