Till Westmann has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/1530

Change subject: Add links to node details to node summaries
......................................................................

Add links to node details to node summaries

Change-Id: I012acbf10eb6f11a625a2a5e51eed1421d8fd046
---
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/JobsRESTAPIFunction.java
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/NodesRESTAPIFunction.java
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/StateDumpRESTAPIFunction.java
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/IJSONOutputFunction.java
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestHandler.java
A 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestUtil.java
M 
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/NodesAPIIntegrationTest.java
M 
hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/AbstractServlet.java
8 files changed, 81 insertions(+), 13 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/30/1530/1

diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/JobsRESTAPIFunction.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/JobsRESTAPIFunction.java
index ebd055d..4475aa1 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/JobsRESTAPIFunction.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/JobsRESTAPIFunction.java
@@ -36,7 +36,7 @@
     }
 
     @Override
-    public ObjectNode invoke(String[] arguments) throws Exception {
+    public ObjectNode invoke(String host, String prefix, String[] arguments) 
throws Exception {
         ObjectMapper om = new ObjectMapper();
         ObjectNode result = om.createObjectNode();
         switch (arguments.length) {
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/NodesRESTAPIFunction.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/NodesRESTAPIFunction.java
index 3b4918c..4154d95 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/NodesRESTAPIFunction.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/NodesRESTAPIFunction.java
@@ -18,12 +18,17 @@
  */
 package org.apache.hyracks.control.cc.web;
 
+import java.net.URI;
+import java.net.URISyntaxException;
+
 import org.apache.hyracks.control.cc.ClusterControllerService;
 import org.apache.hyracks.control.cc.web.util.IJSONOutputFunction;
+import org.apache.hyracks.control.cc.web.util.JSONOutputRequestUtil;
 import org.apache.hyracks.control.cc.work.GetNodeDetailsJSONWork;
 import org.apache.hyracks.control.cc.work.GetNodeSummariesJSONWork;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public class NodesRESTAPIFunction implements IJSONOutputFunction {
@@ -34,7 +39,7 @@
     }
 
     @Override
-    public ObjectNode invoke(String[] arguments) throws Exception {
+    public ObjectNode invoke(String host, String prefix, String[] arguments) 
throws Exception {
         ObjectMapper om = new ObjectMapper();
         ObjectNode result = om.createObjectNode();
         switch (arguments.length) {
@@ -42,11 +47,11 @@
                 if ("".equals(arguments[0])) {
                     GetNodeSummariesJSONWork gnse = new 
GetNodeSummariesJSONWork(ccs.getNodeManager());
                     ccs.getWorkQueue().scheduleAndSync(gnse);
-                    result.set("result", gnse.getSummaries());
+                    result.set("result", enhanceSummaries(gnse.getSummaries(), 
host, prefix));
                 } else {
                     String nodeId = arguments[0];
-                    GetNodeDetailsJSONWork gnde = new 
GetNodeDetailsJSONWork(ccs.getNodeManager(), ccs.getCCConfig(),
-                            nodeId, true, true);
+                    GetNodeDetailsJSONWork gnde =
+                            new GetNodeDetailsJSONWork(ccs.getNodeManager(), 
ccs.getCCConfig(), nodeId, true, true);
                     ccs.getWorkQueue().scheduleAndSync(gnde);
                     result.set("result", gnde.getDetail());
                 }
@@ -54,4 +59,14 @@
         }
         return result;
     }
+
+    private static ArrayNode enhanceSummaries(final ArrayNode summaries, 
String host, String prefix) throws
+            URISyntaxException {
+        for (int i = 0; i < summaries.size(); ++i) {
+            ObjectNode node = (ObjectNode) summaries.get(i);
+            URI detailsUri = JSONOutputRequestUtil.uri(host, prefix, 
node.get("node-id").asText());
+            node.put("details", detailsUri.toString());
+        }
+        return summaries;
+    }
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/StateDumpRESTAPIFunction.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/StateDumpRESTAPIFunction.java
index 0657f59..c05c4f0 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/StateDumpRESTAPIFunction.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/StateDumpRESTAPIFunction.java
@@ -36,7 +36,7 @@
     }
 
     @Override
-    public ObjectNode invoke(String[] arguments) throws Exception {
+    public ObjectNode invoke(String host, String prefix, String[] arguments) 
throws Exception {
         GatherStateDumpsWork gsdw = new GatherStateDumpsWork(ccs);
         ccs.getWorkQueue().scheduleAndSync(gsdw);
         StateDumpRun sdr = gsdw.getStateDumpRun();
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/IJSONOutputFunction.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/IJSONOutputFunction.java
index ab0a581..1509f67 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/IJSONOutputFunction.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/IJSONOutputFunction.java
@@ -21,5 +21,5 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public interface IJSONOutputFunction {
-    public ObjectNode invoke(String[] arguments) throws Exception;
+    public ObjectNode invoke(String host, String prefix, String[] arguments) 
throws Exception;
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestHandler.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestHandler.java
index c6c76dd..9785dff 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestHandler.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestHandler.java
@@ -51,19 +51,22 @@
             return;
         }
         String path = path(request);
+        String prefix = pathPrefix(request);
+        String host = host(request);
         while (path.startsWith("/")) {
             path = path.substring(1);
         }
         String[] parts = path.split("/");
-        ObjectNode result = invoke(response, parts);
+
+        ObjectNode result = invoke(response, host, prefix, parts);
         if (result != null) {
             deliver(response, result);
         }
     }
 
-    protected ObjectNode invoke(IServletResponse response, String[] parts) {
+    protected ObjectNode invoke(IServletResponse response, String host, String 
prefix, String[] parts) {
         try {
-            return fn.invoke(parts);
+            return fn.invoke(host, prefix, parts);
         } catch (Exception e) {
             LOGGER.log(Level.WARNING, "Exception invoking " + 
fn.getClass().getName(), e);
             response.setStatus(HttpResponseStatus.BAD_REQUEST);
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestUtil.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestUtil.java
new file mode 100644
index 0000000..cbe207c
--- /dev/null
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestUtil.java
@@ -0,0 +1,36 @@
+/*
+ * 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.hyracks.control.cc.web.util;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+public class JSONOutputRequestUtil {
+    public static URI uri(String host, String prefix, String path) throws 
URISyntaxException {
+        String name = host;
+        int port = 80;
+        int index = host.indexOf(':');
+        if (index > 0) {
+            String[] split = host.split(":");
+            name = split[0];
+            port = Integer.valueOf(split[1]);
+        }
+        return new URI("http", null, name, port, prefix + "/" + path, null, 
null);
+    }
+}
diff --git 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/NodesAPIIntegrationTest.java
 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/NodesAPIIntegrationTest.java
index ead70b1..830c6af 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/NodesAPIIntegrationTest.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/NodesAPIIntegrationTest.java
@@ -34,7 +34,7 @@
 
 public class NodesAPIIntegrationTest extends AbstractIntegrationTest {
 
-    static final String[] NODE_SUMMARY_FIELDS = { "node-id", "heap-used", 
"system-load-average" };
+    static final String[] NODE_SUMMARY_FIELDS = { "node-id", "heap-used", 
"system-load-average", "details" };
 
     static final String[] NODE_DETAILS_FIELDS = { "node-id", "os-name", 
"arch", "os-version", "num-processors",
             "vm-name", "vm-version", "vm-vendor", "classpath", "library-path", 
"boot-classpath", "input-arguments",
diff --git 
a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/AbstractServlet.java
 
b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/AbstractServlet.java
index 37ef3bb..4fabfbc 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/AbstractServlet.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/AbstractServlet.java
@@ -124,12 +124,26 @@
         response.setStatus(HttpResponseStatus.METHOD_NOT_ALLOWED);
     }
 
+    public String host(IServletRequest request) {
+        return request.getHttpRequest().headers().get("Host");
+    }
+
     public String path(IServletRequest request) {
+        final String uri = request.getHttpRequest().uri();
+        return uri.substring(trim(uri));
+    }
+
+    public String pathPrefix(IServletRequest request) {
+        final String uri = request.getHttpRequest().uri();
+        return uri.substring(0, trim(uri));
+    }
+
+    protected int trim(final String uri) {
         int trim = -1;
         if (paths.length > 1) {
             for (int i = 0; i < paths.length; i++) {
                 String path = paths[i].indexOf('*') >= 0 ? 
paths[i].substring(0, paths[i].indexOf('*')) : paths[0];
-                if (request.getHttpRequest().uri().indexOf(path) == 0) {
+                if (uri.indexOf(path) == 0) {
                     trim = trims[i];
                     break;
                 }
@@ -137,7 +151,7 @@
         } else {
             trim = trims[0];
         }
-        return request.getHttpRequest().uri().substring(trim);
+        return trim;
     }
 
     @Override

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/1530
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I012acbf10eb6f11a625a2a5e51eed1421d8fd046
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Till Westmann <[email protected]>

Reply via email to