AMBARI-5708.  stacks api returning invalid href's after endpoint renaming

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

Branch: refs/heads/trunk
Commit: f8d06b4c7c6a810c2a4b58065895c6c78f4c2c3b
Parents: b23ebd4
Author: John Speidel <jspei...@hortonworks.com>
Authored: Wed May 7 20:38:42 2014 -0400
Committer: John Speidel <jspei...@hortonworks.com>
Committed: Wed May 7 20:55:10 2014 -0400

----------------------------------------------------------------------
 .../resources/BaseStacksResourceDefinition.java | 62 +++++++++++++++
 .../OperatingSystemResourceDefinition.java      |  2 +-
 .../StackConfigurationResourceDefinition.java   |  3 +-
 .../StackDependencyResourceDefinition.java      |  2 +-
 ...StackServiceComponentResourceDefinition.java |  3 +-
 .../StackServiceResourceDefinition.java         |  2 +-
 .../StackVersionResourceDefinition.java         |  2 +-
 .../BaseStacksResourceDefinitionTest.java       | 82 ++++++++++++++++++++
 8 files changed, 150 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/f8d06b4c/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinition.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinition.java
new file mode 100644
index 0000000..63b1ca7
--- /dev/null
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinition.java
@@ -0,0 +1,62 @@
+/**
+ * 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.ambari.server.api.resources;
+
+import org.apache.ambari.server.api.services.Request;
+import org.apache.ambari.server.api.util.TreeNode;
+import org.apache.ambari.server.controller.spi.Resource;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Abstract base class for all stacks related resource definitions.
+ * Because we cloned /stacks from /stacks2 and changed the endpoint names in 
stacks,
+ * this class is a temporary mechanism to deviate from the standard /stacks2 
endpoint names.
+ *
+ */
+public abstract class BaseStacksResourceDefinition extends 
BaseResourceDefinition {
+  protected BaseStacksResourceDefinition(Resource.Type resourceType) {
+    super(resourceType);
+  }
+
+  @Override
+  public List<PostProcessor> getPostProcessors() {
+    return Collections.<PostProcessor>singletonList(new StacksHrefProcessor());
+  }
+
+  private class StacksHrefProcessor extends BaseHrefPostProcessor {
+    @Override
+    /**
+     * If processing a /stacks endpoint, replace the endpoint names.
+     */
+    public void process(Request request, TreeNode<Resource> resultNode, String 
href) {
+      super.process(request, resultNode, href);
+
+      String nodeHref = resultNode.getProperty("href");
+      if (nodeHref != null && nodeHref.contains("/stacks/")) {
+        nodeHref = nodeHref.replace("stackServices", "services");
+        nodeHref = nodeHref.replace("serviceComponents", "components");
+        nodeHref = nodeHref.replace("operatingSystems", "operating_systems");
+      }
+
+      resultNode.setProperty("href", nodeHref);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/f8d06b4c/ambari-server/src/main/java/org/apache/ambari/server/api/resources/OperatingSystemResourceDefinition.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/OperatingSystemResourceDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/OperatingSystemResourceDefinition.java
index b9c85ec..6faf6fb 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/OperatingSystemResourceDefinition.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/OperatingSystemResourceDefinition.java
@@ -24,7 +24,7 @@ import java.util.Set;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource.Type;
 
-public class OperatingSystemResourceDefinition extends BaseResourceDefinition {
+public class OperatingSystemResourceDefinition extends 
BaseStacksResourceDefinition {
 
   public OperatingSystemResourceDefinition(Type resourceType) {
     super(resourceType);

http://git-wip-us.apache.org/repos/asf/ambari/blob/f8d06b4c/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackConfigurationResourceDefinition.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackConfigurationResourceDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackConfigurationResourceDefinition.java
index 222ff42..53903ba 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackConfigurationResourceDefinition.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackConfigurationResourceDefinition.java
@@ -22,8 +22,7 @@ package org.apache.ambari.server.api.resources;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource.Type;
 
-public class StackConfigurationResourceDefinition extends
-    BaseResourceDefinition {
+public class StackConfigurationResourceDefinition extends 
BaseStacksResourceDefinition {
 
   public StackConfigurationResourceDefinition(Type resourceType) {
     super(resourceType);

http://git-wip-us.apache.org/repos/asf/ambari/blob/f8d06b4c/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackDependencyResourceDefinition.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackDependencyResourceDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackDependencyResourceDefinition.java
index 19ac584..0743a7f 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackDependencyResourceDefinition.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackDependencyResourceDefinition.java
@@ -23,7 +23,7 @@ import org.apache.ambari.server.controller.spi.Resource;
 /**
  * Stack Service Dependency Resource Definition.
  */
-public class StackDependencyResourceDefinition extends BaseResourceDefinition {
+public class StackDependencyResourceDefinition extends 
BaseStacksResourceDefinition {
 
   /**
    * Constructor.

http://git-wip-us.apache.org/repos/asf/ambari/blob/f8d06b4c/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackServiceComponentResourceDefinition.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackServiceComponentResourceDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackServiceComponentResourceDefinition.java
index 00620e9..cad2a99 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackServiceComponentResourceDefinition.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackServiceComponentResourceDefinition.java
@@ -23,8 +23,7 @@ import org.apache.ambari.server.controller.spi.Resource;
 import java.util.Collections;
 import java.util.Set;
 
-public class StackServiceComponentResourceDefinition extends
-    BaseResourceDefinition {
+public class StackServiceComponentResourceDefinition extends 
BaseStacksResourceDefinition {
 
   public StackServiceComponentResourceDefinition() {
     super(Resource.Type.StackServiceComponent);

http://git-wip-us.apache.org/repos/asf/ambari/blob/f8d06b4c/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackServiceResourceDefinition.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackServiceResourceDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackServiceResourceDefinition.java
index 0c8f4f9..cb1dfb1 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackServiceResourceDefinition.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackServiceResourceDefinition.java
@@ -24,7 +24,7 @@ import java.util.Set;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource.Type;
 
-public class StackServiceResourceDefinition extends BaseResourceDefinition {
+public class StackServiceResourceDefinition extends 
BaseStacksResourceDefinition {
 
   public StackServiceResourceDefinition(Type resourceType) {
     super(resourceType);

http://git-wip-us.apache.org/repos/asf/ambari/blob/f8d06b4c/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
index 97f1908..d641e4c 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
@@ -24,7 +24,7 @@ import java.util.Set;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource.Type;
 
-public class StackVersionResourceDefinition extends BaseResourceDefinition {
+public class StackVersionResourceDefinition extends 
BaseStacksResourceDefinition {
 
   public StackVersionResourceDefinition(Type resourceType) {
     super(Resource.Type.StackVersion);

http://git-wip-us.apache.org/repos/asf/ambari/blob/f8d06b4c/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinitionTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinitionTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinitionTest.java
new file mode 100644
index 0000000..b235876
--- /dev/null
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinitionTest.java
@@ -0,0 +1,82 @@
+/**
+ * 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.ambari.server.api.resources;
+
+import org.apache.ambari.server.api.util.TreeNode;
+import org.apache.ambari.server.api.util.TreeNodeImpl;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.junit.Test;
+
+import static junit.framework.Assert.assertEquals;
+
+
+/**
+ * BaseStacksResourceDefinition unit tests
+ */
+public class BaseStacksResourceDefinitionTest {
+
+  @Test
+  public void testHrefCreation() {
+    TestResourceDefinition resourceDefinition = new TestResourceDefinition();
+    ResourceDefinition.PostProcessor processor = 
resourceDefinition.getPostProcessors().iterator().next();
+
+    TreeNode<Resource> node = new TreeNodeImpl<Resource>(new 
TreeNodeImpl<Resource>(null, null, null), null, "test");
+
+    String href = "/stacks/HDP/versions/1.3.2/stackServices/foo";
+    processor.process(null, node, href);
+    assertEquals("/stacks/HDP/versions/1.3.2/services/foo", 
node.getProperty("href"));
+
+    href = "/stacks2/HDP/versions/1.3.2/stackServices/foo";
+    processor.process(null, node, href);
+    assertEquals("/stacks2/HDP/versions/1.3.2/stackServices/foo", 
node.getProperty("href"));
+
+    href = "/stacks/HDP/versions/1.3.2/stackServices/foo/serviceComponents";
+    processor.process(null, node, href);
+    assertEquals("/stacks/HDP/versions/1.3.2/services/foo/components", 
node.getProperty("href"));
+
+    href = "/stacks2/HDP/versions/1.3.2/stackServices/foo/serviceComponents";
+    processor.process(null, node, href);
+    
assertEquals("/stacks2/HDP/versions/1.3.2/stackServices/foo/serviceComponents", 
node.getProperty("href"));
+
+    href = "/stacks/HDP/versions/1.3.2/operatingSystems";
+    processor.process(null, node, href);
+    assertEquals("/stacks/HDP/versions/1.3.2/operating_systems", 
node.getProperty("href"));
+
+    href = "/stacks2/HDP/versions/1.3.2/operatingSystems";
+    processor.process(null, node, href);
+    assertEquals("/stacks2/HDP/versions/1.3.2/operatingSystems", 
node.getProperty("href"));
+  }
+
+  private class TestResourceDefinition extends BaseStacksResourceDefinition {
+    private TestResourceDefinition() {
+      super(Resource.Type.StackServiceComponent);
+    }
+
+    @Override
+    public String getPluralName() {
+      return "tests";
+    }
+
+    @Override
+    public String getSingularName() {
+      return "test";
+    }
+  }
+}
+

Reply via email to