[metcat] r210 committed - added DataProduct support for Dashboard

0 views
Skip to first unread message

metcat.apach...@codespot.com

unread,
Aug 29, 2012, 2:54:42 PM8/29/12
to metca...@googlegroups.com
Revision: 210
Author: mail.ha...@gmail.com
Date: Wed Aug 29 11:54:03 2012
Log: added DataProduct support for Dashboard
http://code.google.com/a/apache-extras.org/p/metcat/source/detail?r=210

Added:

/trunk/metcat-dashboard/src/main/java/org/apache/airavata/metcat/dashboard/servlets/GetDataProductListServlet.java

/trunk/metcat-dashboard/src/main/java/org/apache/airavata/metcat/dashboard/servlets/GetDataProductServlet.java
/trunk/metcat-dashboard/src/main/webapp/dataproduct.jsp
/trunk/metcat-dashboard/src/main/webapp/searchdataproduct.jsp
Modified:

/trunk/metcat-dashboard/src/main/java/org/apache/airavata/metcat/dashboard/servlets/GetWorkflowDataServlet.java
/trunk/metcat-dashboard/src/main/webapp/WEB-INF/web.xml
/trunk/metcat-dashboard/src/main/webapp/index.jsp
/trunk/metcat-dashboard/src/main/webapp/searchworkflow.jsp

/trunk/metcatserver/src/main/java/org/apache/airavata/metcat/api/MetCatAPI.java

=======================================
--- /dev/null
+++
/trunk/metcat-dashboard/src/main/java/org/apache/airavata/metcat/dashboard/servlets/GetDataProductListServlet.java
Wed Aug 29 11:54:03 2012
@@ -0,0 +1,115 @@
+package org.apache.airavata.metcat.dashboard.servlets;
+
+import org.apache.airavata.metcat.dashboard.NonBlockingInvoker;
+import org.apache.airavata.metcat.dashboard.Utils;
+import org.apache.axiom.om.OMElement;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+public class GetDataProductListServlet extends HttpServlet {
+
+ // Services and payload
+ private final static String SERVICE_SEARCH_BY_TIME_SPAN
= "getConsumedDataProductWithinATimeRange";
+
+
+ //Service Prams
+ private final static String SERVICE_SEARCH_BY_TIME_SPAN_VAR1 = "t1";
+ private final static String SERVICE_SEARCH_BY_TIME_SPAN_VAR2 = "t2";
+
+
+ private final static String SEARCH_BY_TIME_SPAN = "queryByTime";
+
+ protected void doGet(HttpServletRequest request,
+ HttpServletResponse response) throws
ServletException, IOException {
+ dispatchQuery(request, response);
+ }
+
+ protected void doPost(HttpServletRequest request,
+ HttpServletResponse response) throws
ServletException, IOException {
+ dispatchQuery(request, response);
+ }
+
+ private void dispatchQuery(HttpServletRequest request,
HttpServletResponse response) throws IOException {
+
+ String query = request.getParameter(CommonData.REQUEST_QUERY);
+ try {
+ if (SEARCH_BY_TIME_SPAN.equalsIgnoreCase(query)) {
+ searchByTimeSpan(request, response);
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ private void searchByTimeSpan(HttpServletRequest request,
HttpServletResponse response) throws IOException, JSONException {
+
+ String t1 = request.getParameter(SERVICE_SEARCH_BY_TIME_SPAN_VAR1);
+ String t2 = request.getParameter(SERVICE_SEARCH_BY_TIME_SPAN_VAR2);
+
+ HttpSession session = request.getSession(true);
+ String metcatHost = (String)
session.getAttribute(CommonData.SESSION_METCAT_HOST_URL);
+ String serviceURL = metcatHost + "/" + SERVICE_SEARCH_BY_TIME_SPAN;
+
+ OMElement requestElement =
Utils.createPayLoad(SERVICE_SEARCH_BY_TIME_SPAN,
+ new String[]{"startTime", "endTime"},
+ new String[]{convertToUTC(t1), convertToUTC(t2)});
+
+ NonBlockingInvoker invoker = new NonBlockingInvoker(serviceURL,
requestElement);
+ invoker.invoke();
+ PrintWriter out = response.getWriter();
+ try {
+ JSONArray totalResultArray = new
JSONArray(Utils.getResults(invoker.getResponse()));
+ if (totalResultArray.length() > 0) {
+
+ JSONObject result = null;
+ out.println("<div
class=\"datagrid\"><table><thead><tr><th></th><th>Data Product
ID</th><th>More Info</th></tr></thead>" +
+ "<tfoot><tr><td colspan=\"2\">Showing Results: " +
(totalResultArray.length()) + " </td></tr></tfoot><tbody>");
+ for (int i = 0; i < totalResultArray.length(); i++) {
+ result = (JSONObject) totalResultArray.get(i);
+ out.println(generateWorkflowDiv(result, i + 1));
+ }
+ out.println("</tbody>\n" +
+ "</table></div>");
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ } finally {
+ out.println("");
+ }
+ }
+
+ private String generateWorkflowDiv(JSONObject data, int i) throws
UnsupportedEncodingException, JSONException {
+ String dataProduct = (String) data.get("DATAPRODUCTID");
+ String alt = "";
+ if (i % 2 == 0) {
+ alt = "class=\"alt\"";
+ }
+ return "<tr " + alt + " ><td>" + i + "</td><td>" + dataProduct
+ "</td><td class='modelWorkflow'><a href='dataproduct.jsp?id=" +
URLEncoder.encode(dataProduct, "UTF-8") + "' target='_blank' >Model Data
Product</a></td></tr>";
+ }
+
+ private String convertToUTC(String text) {
+ String[] array = text.trim().split(" ");
+ String[] date = array[0].split("/");
+ String[] time = array[1].split(":");
+ String year = date[2];
+ String month = date[0];
+ String day = date[1];
+ String hour = time[0];
+ String min = time[1];
+ int seconds = Integer.parseInt(time[2]) + 1;
+ return year + "-" + month + "-" + day + "T" + hour + ":" + min
+ ":" + seconds;
+ }
+}
+
=======================================
--- /dev/null
+++
/trunk/metcat-dashboard/src/main/java/org/apache/airavata/metcat/dashboard/servlets/GetDataProductServlet.java
Wed Aug 29 11:54:03 2012
@@ -0,0 +1,292 @@
+package org.apache.airavata.metcat.dashboard.servlets;
+
+import org.apache.airavata.metcat.dashboard.NonBlockingInvoker;
+import org.apache.airavata.metcat.dashboard.Utils;
+import org.apache.axiom.om.OMElement;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+
+public class GetDataProductServlet extends HttpServlet {
+
+ // Services and payload
+ private final static String SERVICE_GET_DATA_PRODUCT_INFO
= "getDataProductInfo";
+ private final static String SERVICE_GET_DATA_PRODUCT_ANCESTORS
= "getDataProductAncestors";
+ private final static String SERVICE_GET_DATA_PRODUCT_CONSUMER_WORKFLOW
= "getWorkflowsWhichConsumedGivenDataProduct";
+
+ //Service and request Prams
+ private final static String DATA_PRODUCT_ID = "dataProductID";
+
+ private static String metcatHost;
+
+ protected void doGet(HttpServletRequest request,
+ HttpServletResponse response) throws
ServletException, IOException {
+ modelDataProduct(request, response);
+ }
+
+ protected void doPost(HttpServletRequest request,
+ HttpServletResponse response) throws
ServletException, IOException {
+ modelDataProduct(request, response);
+ }
+
+ /**
+ * Model and generates HTML codes of the Data Product details
+ *
+ * @param request HttpServletRequest
+ * @param response HttpServletResponse
+ * @throws IOException
+ * @throws JSONException
+ */
+ private void modelDataProduct(HttpServletRequest request,
HttpServletResponse response) throws IOException {
+ String dataProductID = request.getParameter(DATA_PRODUCT_ID);
+ PrintWriter out = response.getWriter();
+ if (dataProductID != null && !"".equals(dataProductID)) {
+ HttpSession session = request.getSession(true);
+ metcatHost = (String)
session.getAttribute(CommonData.SESSION_METCAT_HOST_URL);
+ out.println("<ul>\n" +
+ "\t\t\t\t<li><a href=\"#info\">Information</a></li>\n"
+
+ "\t\t\t\t<li><a
href=\"#ancestors\">Ancestors</a></li>\n" +
+ "\t\t\t\t<li><a
href=\"#workflows\">Workflows</a></li>\n" +
+ "\t\t\t</ul>");
+ boolean datafound = getAndWriteDataProductInfo(dataProductID,
out);
+ if (datafound) { // To prevent unnecessary service call, if
there is no data for a given workflow ID.
+ getAndWriteDataProductAncestors(dataProductID, out);
+ getAndWriteWorkflowConsumers(dataProductID, out);
+ }
+ } else {
+ out.print("<div align=\"center\"><h2>Invalid Data Product
ID</h2></div>");
+ }
+ }
+
+ /**
+ * Generates DataProduct summary
+ *
+ * @param dataProductID String
+ * @param out PrintWriter
+ * @return boolean true, if only there exist data
+ * @throws IOException
+ * @throws JSONException
+ */
+ private boolean getAndWriteDataProductInfo(String dataProductID,
PrintWriter out) throws IOException {
+ boolean isDataFound = false;
+ String serviceURL = metcatHost + "/" +
SERVICE_GET_DATA_PRODUCT_INFO;
+
+ OMElement requestElement =
Utils.createPayLoad(SERVICE_GET_DATA_PRODUCT_INFO,
+ new String[]{DATA_PRODUCT_ID},
+ new String[]{dataProductID});
+
+ NonBlockingInvoker invoker = new NonBlockingInvoker(serviceURL,
requestElement);
+ invoker.invoke();
+ try {
+ JSONArray totalResultArray = new
JSONArray(Utils.getResults(invoker.getResponse()));
+ if (totalResultArray.length() > 0) {
+ isDataFound = true;
+
+ out.print("<div id=\"info\">");
+ out.println("<div
class=\"datagrid\"><table><thead><tr><th></th><th>Property</th><th>Value</th></tr></thead>"
+
+ "<tfoot><tr><td colspan=\"2\">Totol Search
Results: " + totalResultArray.length() + " found
</td></tr></tfoot><tbody>");
+
+ JSONObject result;
+ for (int i = 0; i < totalResultArray.length(); i++) {
+ result = (JSONObject) totalResultArray.get(i);
+ out.println(generateDataProductSummary(result, i + 1));
+ }
+ out.println("</tbody>\n" +
+ "</table></div>");
+ out.print("</div>");
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ } finally {
+ out.print("<div id=\"info\"></div>");
+ }
+ return isDataFound;
+ }
+
+ /**
+ * Generates a HTML table row of the summary table.
+ *
+ * @param data JSONObject
+ * @param i int
+ * @return HTML table row
+ * @throws UnsupportedEncodingException
+ * @throws JSONException
+ */
+ private String generateDataProductSummary(JSONObject data, int i)
throws UnsupportedEncodingException, JSONException {
+ StringBuilder resultData = new StringBuilder();
+ String alt = "";
+ if (i % 2 == 0) {
+ alt = "class=\"alt\"";
+ }
+ Iterator iterator = data.keys();
+ if (iterator.hasNext()) {
+ do {
+ String key = (String) iterator.next();
+ resultData.append("<tr ");
+ resultData.append(alt);
+ resultData.append(" ><td>");
+ resultData.append(i);
+ resultData.append("</td><td>");
+ resultData.append(key);
+ resultData.append("</td><td>");
+ resultData.append(data.get(key));
+ resultData.append("</td></tr>\n");
+ } while (iterator.hasNext());
+ }
+ return resultData.toString();
+ }
+
+
+ /**
+ * Retrieves and writes Data Product Ancestors.
+ *
+ * @param dataProductID String
+ * @param out PrintWriter
+ * @throws IOException
+ * @throws JSONException
+ */
+ private void getAndWriteDataProductAncestors(String dataProductID,
PrintWriter out) throws IOException {
+
+ String serviceURL = metcatHost + "/" +
SERVICE_GET_DATA_PRODUCT_ANCESTORS;
+
+ OMElement requestElement =
Utils.createPayLoad(SERVICE_GET_DATA_PRODUCT_ANCESTORS,
+ new String[]{DATA_PRODUCT_ID},
+ new String[]{dataProductID});
+
+ NonBlockingInvoker invoker = new NonBlockingInvoker(serviceURL,
requestElement);
+ invoker.invoke();
+ try {
+ JSONArray totalResultArray = new
JSONArray(Utils.getResults(invoker.getResponse()));
+ if (totalResultArray.length() > 0) {
+
+ out.print("<div id=\"ancestors\">");
+ out.println("<div
class=\"datagrid\"><table><thead><tr><th></th><th>Ancestors Data
Products</th></tr></thead>" +
+ "<tfoot><tr><td colspan=\"2\">Totol Search
Results: " + totalResultArray.length() + " found
</td></tr></tfoot><tbody>");
+
+ String ancestorID;
+ for (int i = 0; i < totalResultArray.length(); i++) {
+ ancestorID = (String) totalResultArray.get(i);
+ out.println(generateAncestorsSummary(ancestorID, i +
1));
+ }
+ out.println("</tbody>\n" +
+ "</table></div>");
+ out.print("</div>");
+ }
+ } catch (JSONException ex) {
+ ex.printStackTrace();
+ } finally {
+ out.print("<div id=\"ancestors\"></div>");
+ }
+ }
+
+ /**
+ * Generates a HTML table row of the Ancestors table.
+ *
+ * @param data String
+ * @param i int
+ * @return HTML String
+ * @throws UnsupportedEncodingException
+ */
+ private String generateAncestorsSummary(String data, int i) throws
UnsupportedEncodingException {
+ StringBuilder resultData = new StringBuilder();
+ String alt = "";
+ if (i % 2 == 0) {
+ alt = "class=\"alt\"";
+ }
+ resultData.append("<tr ");
+ resultData.append(alt);
+ resultData.append(" ><td>");
+ resultData.append(i);
+ resultData.append("</td><td class='modelWorkflow'><a
href='dataproduct.jsp?id=");
+ resultData.append(URLEncoder.encode(data, "UTF-8"));
+ resultData.append("' target='_blank' >");
+ resultData.append(data);
+ resultData.append("</a>");
+ resultData.append("</td>\n");
+ return resultData.toString();
+ }
+
+ /**
+ * Generates Consumer workflow related Data.
+ *
+ * @param dataProductID String
+ * @param out PrintWriter
+ * @throws IOException
+ * @throws JSONException
+ */
+ private void getAndWriteWorkflowConsumers(String dataProductID,
PrintWriter out) throws IOException {
+
+ String serviceURL = metcatHost + "/" +
SERVICE_GET_DATA_PRODUCT_CONSUMER_WORKFLOW;
+
+ OMElement requestElement =
Utils.createPayLoad(SERVICE_GET_DATA_PRODUCT_CONSUMER_WORKFLOW,
+ new String[]{DATA_PRODUCT_ID},
+ new String[]{dataProductID});
+
+ NonBlockingInvoker invoker = new NonBlockingInvoker(serviceURL,
requestElement);
+ invoker.invoke();
+ try {
+ JSONArray totalResultArray = new
JSONArray(Utils.getResults(invoker.getResponse()));
+ out.print("<div id=\"workflows\">");
+ out.println("<h3>Consumer Workflow(s)</h3>");
+ out.println("<div
class=\"datagrid\"><table><thead><tr><th></th><th>Workflow
ID</th><th>Timestamp</th></tr></thead>" +
+ "<tfoot><tr><td colspan=\"2\">Totol Search Results: "
+ totalResultArray.length() + " found </td></tr></tfoot><tbody>");
+
+ JSONObject result;
+ for (int i = 0; i < totalResultArray.length(); i++) {
+ result = (JSONObject) totalResultArray.get(i);
+ out.println(generateDataProductConsumerWorkflow(result, i
+ 1));
+ }
+ out.println("</tbody>\n" +
+ "</table></div>");
+ out.print("</div>");
+ } catch (JSONException e) {
+ e.printStackTrace();
+ } finally {
+ out.println("<div id=\"workflows\"></div>");
+ }
+ }
+
+ /**
+ * Generates HTML table row of the Consumer Workflow
+ *
+ * @param data JSONObject
+ * @param i int
+ * @return HTML String of the table row
+ * @throws UnsupportedEncodingException
+ * @throws JSONException
+ */
+ private String generateDataProductConsumerWorkflow(JSONObject data,
int i) throws UnsupportedEncodingException, JSONException {
+ StringBuilder resultData = new StringBuilder();
+ String alt = "";
+ if (i % 2 == 0) {
+ alt = "class=\"alt\"";
+ }
+ resultData.append("<tr ");
+ resultData.append(alt);
+ resultData.append(" ><td>");
+ resultData.append(i);
+ resultData.append("</td>");
+ resultData.append("<td class='modelWorkflow'><a
href='workflow.jsp?id=");
+ resultData.append(URLEncoder.encode((String)
data.get("WORKFLOWID"), "UTF-8"));
+ resultData.append("' target='_blank' >");
+ resultData.append(data.get("WORKFLOWID"));
+ resultData.append("</a>");
+ resultData.append("</td><td>");
+ resultData.append(data.get("TIMESTAMP"));
+ resultData.append("</td></tr>\n");
+ return resultData.toString();
+ }
+
+}
=======================================
--- /dev/null
+++ /trunk/metcat-dashboard/src/main/webapp/dataproduct.jsp Wed Aug 29
11:54:03 2012
@@ -0,0 +1,96 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+ pageEncoding="UTF-8" %>
+<%@ include file="WEB-INF/jspf/session.jspf" %>
+<%
+ String dataProductID = request.getParameter("id");
+ if (dataProductID == null) {
+ dataProductID = "";
+ }
+%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+ <link href="css/style.css" rel="stylesheet" type="text/css"
media="all"/>
+ <link href="css/message.css" rel="stylesheet" type="text/css"
media="all"/>
+ <link href="css/workflow.css" rel="stylesheet" type="text/css"
media="all"/>
+ <link href="css/base/jquery.ui.all.css" rel="stylesheet"
type="text/css" media="all"/>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>MetCat Quick Start Dashboard - Model DataProduct</title>
+ <script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
+ <script type="text/javascript"
src="js/jquery-ui-1.8.22.custom.min.js"></script>
+ <script type="text/javascript">
+ function modelDataProduct() {
+ document.getElementById("resultView").innerHTML = "<div
id=\"results\"></div>";
+ document.getElementById("results").innerHTML = "<h2>
Processing data</h2 > <br/><img src = \"images/animation/processing.gif\" /
>";
+ var dataProductID =
document.getElementById('dataProductID').value;
+ if (dataProductID != "") {
+ var searchval = "dataProductID=" +
encodeURIComponent(dataProductID);
+ var xmlhttp;
+ if (window.XMLHttpRequest) {// code for IE7+, Firefox,
Chrome, Opera, Safari
+ xmlhttp = new XMLHttpRequest();
+ }
+ else {// code for IE6, IE5
+ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
+ }
+ xmlhttp.onreadystatechange = function() {
+ if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
+
+ document.getElementById("results").innerHTML =
xmlhttp.responseText;
+ $('#results').tabs();
+ }
+ }
+ xmlhttp.open("Get", "getDataProduct?" + searchval, true);
+ xmlhttp.send();
+ } else {
+ document.getElementById("results").innerHTML = "<div
align=\"center\"><h2>Invalid Data Product ID ..!</h2></div>";
+ }
+ }
+ </script>
+ <script type="text/javascript">
+ function showHide(divname) {
+ $("#" + divname).dialog();
+ }
+</script>
+</head>
+<body>
+<%@ include file="WEB-INF/jspf/header.jspf" %>
+<div id="content">
+ <div class="contentBox">
+ <div align="left">
+ <h4>Model Workflow</h4>
+
+ <div class="back"><a href="index.jsp"><img
src="images/icons/back.png" alt=""/><br/>
+ Back</a></div>
+
+ <div class="optionPanel">
+ <table width="80%">
+ <tbody>
+ <tr>
+ <td width="20%">Workflow ID</td>
+ <td width="60%"><input type="text"
id="dataProductID" style="width: 100%;"
+
value="<%=dataProductID%>"/><br></td>
+ <td align="right"><input id="submitButton"
type="submit" value="Model" onclick="modelDataProduct()"/></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ <div id="resultView" align="center">
+ </div>
+
+ <div class="push"></div>
+</div>
+<!-- End of content -->
+<%@ include file="WEB-INF/jspf/footer.jspf" %>
+<%
+ if (!"".equals(dataProductID)) {
+%>
+<script type="text/javascript">
+ window.onload = modelDataProduct;
+</script>
+<%
+ }
+%>
+</body>
+</html>
=======================================
--- /dev/null
+++ /trunk/metcat-dashboard/src/main/webapp/searchdataproduct.jsp Wed Aug
29 11:54:03 2012
@@ -0,0 +1,106 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+ pageEncoding="UTF-8" %>
+<%@ page import="org.apache.airavata.metcat.dashboard.Utils" %>
+<%@ include file="WEB-INF/jspf/session.jspf" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+
+ <link href="css/style.css" rel="stylesheet" type="text/css"
media="all"/>
+ <link href="css/message.css" rel="stylesheet" type="text/css"
media="all"/>
+ <link href="css/workflow.css" rel="stylesheet" type="text/css"
media="all"/>
+ <link href="css/base/jquery.ui.all.css" rel="stylesheet"
type="text/css" media="all"/>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>MetCat Quick Start Dashboard - Workflow Data</title>
+ <script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
+ <script type="text/javascript"
src="js/jquery-ui-1.8.22.custom.min.js"></script>
+ <script type="text/javascript"
src="js/jquery-ui-timepicker-addon.js"></script>
+
+ <script type="text/javascript">
+ function searchDataProductByTme() {
+ document.getElementById("results").innerHTML = "<h2>
Processing data</h2 > <br/><img src = \"images/animation/processing.gif\" /
>";
+ var searchval = "query=queryByTime&t1=" +
encodeURIComponent(document.getElementById('t1').value) +
+ "&t2=" +
encodeURIComponent(document.getElementById('t2').value);
+ var xmlhttp;
+ if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome,
Opera, Safari
+ xmlhttp = new XMLHttpRequest();
+ }
+ else {// code for IE6, IE5
+ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
+ }
+ xmlhttp.onreadystatechange = function() {
+ if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
+
+ document.getElementById("results").innerHTML =
xmlhttp.responseText;
+ }
+ }
+ xmlhttp.open("Get", "getDataProductList?" + searchval, true);
+ xmlhttp.send();
+ }
+
+ $(function() {
+ $('#t1').datetimepicker({
+ showSecond: true,
+ timeFormat: 'hh:mm:ss'
+ });
+ $('#t2').datetimepicker({
+ showSecond: true,
+ timeFormat: 'hh:mm:ss'
+ });
+ $(".readonly").focus(function () {
+ $(this).blur();
+ });
+
+ });
+ </script>
+ <script type="text/javascript">
+ function displaySearchForm(show) {
+ document.getElementById('queryByTime').style.display = "none";
+ document.getElementById(show).style.display = "block";
+ }
+ </script>
+</head>
+<body>
+<%@ include file="WEB-INF/jspf/header.jspf" %>
+
+<div id="content">
+ <div class="contentBox">
+ <div align="left">
+ <div class="back"><a href="index.jsp"><img
src="images/icons/back.png" alt=""/><br/>
+ Back</a></div>
+ <div class="optionPanel">
+ <strong>Search :</strong>
+ <select style="margin-right: 50px;" id="queryBy"
onchange="displaySearchForm(document.getElementById('queryBy').value);">
+ <option selected="selected"></option>
+ <option value="queryByTime"> Consumed Data Products
Using Timestamp</option>
+ </select>
+ <br/>
+
+ <div id="queryByTime" style="display:none;">
+ <table width="80%">
+ <tbody>
+ <tr>
+ <td width="20%">Start Timestamp</td>
+ <td width="20%"><input type="text" id="t1"
value="00/00/0000 00:00:00" name="t1"
+ class="readonly"></td>
+ <td width="20%">End Timestamp</td>
+ <td width="20%"><input type="text" id="t2"
value="00/00/0000 00:00:00" name="t2"
+ class="readonly"></td>
+ <td><input type="button"
onclick="searchDataProductByTme();" value="Search"></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div id="resultView" align="center">
+ <div id="results">
+ </div>
+ </div>
+ <div class="push"></div>
+</div>
+<!-- End of content -->
+<%@ include file="WEB-INF/jspf/footer.jspf" %>
+</body>
+</html>
=======================================
---
/trunk/metcat-dashboard/src/main/java/org/apache/airavata/metcat/dashboard/servlets/GetWorkflowDataServlet.java
Sat Aug 11 22:09:15 2012
+++
/trunk/metcat-dashboard/src/main/java/org/apache/airavata/metcat/dashboard/servlets/GetWorkflowDataServlet.java
Wed Aug 29 11:54:03 2012
@@ -16,6 +16,7 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
import java.util.Iterator;
import java.util.LinkedHashMap;

@@ -27,6 +28,8 @@
private final static String SERVICE_GET_EVENTS = "getWorkflowEvents";
private final static String SERVICE_GET_INPUT_NODE
= "getNodesWithInputValues";
private final static String SERVICE_GET_OUTPUT_NODE
= "getNodesWithOutputValues";
+ private final static String SERVICE_GET_CONSUMED_DATA_PRODUCT
= "getConsumedDataProductsForWorkflow";
+ private final static String SERVICE_GET_CHANGED_DATA_PRODUCT
= "getChangedDataProductsForWorkflow";

private LinkedHashMap<String, JSONObject> eventData;
private LinkedHashMap<String, JSONObject> nodes;
@@ -54,6 +57,14 @@
}
}

+ /**
+ * Models workflow, for a given workflow ID
+ *
+ * @param request HttpServletRequest
+ * @param response HttpServletResponse
+ * @throws IOException
+ * @throws JSONException
+ */
private void modelWorkflow(HttpServletRequest request,
HttpServletResponse response) throws IOException, JSONException {
String workflowID = request.getParameter(WORKFLOW_ID);
PrintWriter out = response.getWriter();
@@ -64,18 +75,29 @@
"\t\t\t\t<li><a href=\"#summary\">Summary</a></li>\n" +
"\t\t\t\t<li><a
href=\"#progress\">Progress</a></li>\n" +
"\t\t\t\t<li><a href=\"#nodes\">Nodes</a></li>\n" +
+ "\t\t\t\t<li><a href=\"#dataproducts\">Data
Products</a></li>\n" +
"\t\t\t</ul>");
boolean datafound = getAndWriteWorkflowSummery(workflowID,
out);
if (datafound) { // To prevent unnecessary service call, if
there is no data for a given workflow ID.
getWorkflowEvents(workflowID);
getAndWriteWorkflowProgress(workflowID, out);
generateNodeStructure(workflowID, out);
+ generateDataProductStructure(workflowID, out);
}
} else {
out.print("<div align=\"center\"><h2>Invalid Workflow
ID</h2></div>");
}
}

+ /**
+ * Completes summary Tab
+ *
+ * @param workflowID String
+ * @param out PrintWriter
+ * @return boolean true if workflow summary data exists.
+ * @throws IOException
+ * @throws JSONException
+ */
private boolean getAndWriteWorkflowSummery(String workflowID,
PrintWriter out) throws IOException, JSONException {
boolean isDataFound = false;
String serviceURL = metcatHost + "/" + SERVICE_GET_SUMMERY;
@@ -90,7 +112,8 @@
if (totalResultArray.length() > 0) {
isDataFound = true;

- out.print("<div id=\"summary\">");
+ out.print("<div id=\"summary\">"); // Summary Div tag
+ // Printing Summary Data tabel.
out.println("<div
class=\"datagrid\"><table><thead><tr><th></th><th>Property</th><th>Value</th></tr></thead>"
+
"<tfoot><tr><td colspan=\"2\">Totol Search Results: "
+ totalResultArray.length() + " found </td></tr></tfoot><tbody>");

@@ -101,11 +124,20 @@
}
out.println("</tbody>\n" +
"</table></div>");
- out.print("</div>");
+ out.print("</div>"); // End of summary Div tag.
}
return isDataFound;
}

+ /**
+ * Formats JSON data into html table row
+ *
+ * @param data JSONObject
+ * @param i int
+ * @return
+ * @throws UnsupportedEncodingException
+ * @throws JSONException
+ */
private String generateWorkflowSummary(JSONObject data, int i) throws
UnsupportedEncodingException, JSONException {
StringBuilder resultData = new StringBuilder();
String alt = "";
@@ -122,6 +154,13 @@
return resultData.toString();
}

+ /**
+ * Get all workflow Events and store them.
+ *
+ * @param workflowID String
+ * @throws IOException
+ * @throws JSONException
+ */
private void getWorkflowEvents(String workflowID) throws IOException,
JSONException {

String serviceURL = metcatHost + "/" + SERVICE_GET_EVENTS;
@@ -136,6 +175,13 @@
eventData = extractEventData(totalResultArray);
}

+ /**
+ * Extract raw events data from service output.
+ *
+ * @param result JSONArray
+ * @return LinkedHashMap<String, JSONObject>
+ * @throws JSONException
+ */
private LinkedHashMap<String, JSONObject> extractEventData(JSONArray
result) throws JSONException {
LinkedHashMap<String, JSONObject> data = new LinkedHashMap<String,
JSONObject>();
if (result.length() > 0) {
@@ -148,6 +194,14 @@
return data;
}

+ /**
+ * Gets correct order of the Event and display it on HTML view.
+ *
+ * @param workflowID String
+ * @param out PrintWriter
+ * @throws IOException
+ * @throws JSONException
+ */
private void getAndWriteWorkflowProgress(String workflowID,
PrintWriter out) throws IOException, JSONException {

String serviceURL = metcatHost + "/" + SERVICE_GET_PROGRESS;
@@ -171,6 +225,14 @@

}

+ /**
+ * Generates Workflow Progress Event.
+ *
+ * @param event
+ * @param count
+ * @return
+ * @throws JSONException
+ */
private String generateWorkflowProgress(JSONObject event, int count)
throws JSONException {
String eventID = event.get("EVENT") + "::" +
event.get("TIMESTAMP");
JSONObject eventSource = eventData.get(eventID);
@@ -184,7 +246,13 @@
"</pre></div></div></div>";
}

-
+ /**
+ * Generates Node Structure tab
+ *
+ * @param workflowID String
+ * @param out PrintWriter
+ * @throws JSONException
+ */
private void generateNodeStructure(String workflowID, PrintWriter out)
throws JSONException {
String inputNodeServiceURL = metcatHost + "/" +
SERVICE_GET_INPUT_NODE;
String outputNodeServiceURL = metcatHost + "/" +
SERVICE_GET_OUTPUT_NODE;
@@ -214,7 +282,13 @@
out.print("</div></div>");
}

-
+ /**
+ * Extracts Node IO node data
+ *
+ * @param result JSONArray of result
+ * @param extractInputs set to true when only extracting Inputs.
otherwise set to false.
+ * @throws JSONException
+ */
private void extractNodeData(JSONArray result, boolean extractInputs)
throws JSONException {

if (result.length() > 0) {
@@ -230,7 +304,7 @@
}
} else {
JSONObject node = new JSONObject();
- node.put("NODEID",nodeID);
+ node.put("NODEID", nodeID);
JSONArray inputData = new JSONArray();
JSONArray outData = new JSONArray();
if (extractInputs) {
@@ -238,8 +312,8 @@
} else {
outData.put(currentNode);
}
- node.put("INPUT",inputData);
- node.put("OUTPUT",outData);
+ node.put("INPUT", inputData);
+ node.put("OUTPUT", outData);
nodes.put(nodeID, node);
}
}
@@ -247,20 +321,25 @@
}
}

+ /**
+ * Generates HTML structure of a workflowNode
+ *
+ * @param node JSONObject
+ * @return HTML String
+ * @throws JSONException
+ */
private String getNodeHTMLModel(JSONObject node) throws JSONException {
JSONArray inputs = node.getJSONArray("INPUT");
JSONArray outputs = node.getJSONArray("OUTPUT");
StringBuilder inputData = new StringBuilder();
StringBuilder outputData = new StringBuilder();
JSONObject nodeData;
- String alt= "";
- for(int i=0;i<inputs.length();i++)
- {
- if(i%2==0)
- {
+ String alt = "";
+ for (int i = 0; i < inputs.length(); i++) {
+ if (i % 2 == 0) {
alt = "class=\"alt\"";
}
- nodeData = (JSONObject) inputs.get(i);
+ nodeData = (JSONObject) inputs.get(i);

inputData.append("<tr ").append(alt).append("><td>").append(nodeData.get("TIMESTAMP")).append("</td><td>").append(nodeData.get("DESCRIPTION")).append("</td><td><pre>").append(StringEscapeUtils.escapeHtml((String)
nodeData.get("XML"))).append("</pre></td></tr>\n");
}
for (int i = 0; i < outputs.length(); i++) {
@@ -296,4 +375,89 @@
"</div></div>" +
"</div>";
}
+
+ /**
+ * Generates Data Product Structure
+ *
+ * @param workflowID
+ * @param out
+ * @throws JSONException
+ */
+ private void generateDataProductStructure(String workflowID,
PrintWriter out) throws JSONException, UnsupportedEncodingException {
+ String consumedDataProductServiceURL = metcatHost + "/" +
SERVICE_GET_CONSUMED_DATA_PRODUCT;
+ String changedDataProductServiceURL = metcatHost + "/" +
SERVICE_GET_CHANGED_DATA_PRODUCT;
+
+ OMElement requestElement =
Utils.createPayLoad(SERVICE_GET_INPUT_NODE,
+ new String[]{WORKFLOW_ID},
+ new String[]{workflowID});
+
+ NonBlockingInvoker invoker = new
NonBlockingInvoker(consumedDataProductServiceURL, requestElement);
+ invoker.invoke();
+ JSONArray consumedResultArray = new
JSONArray(Utils.getResults(invoker.getResponse()));
+
+ //For Changed Data Products.
+ requestElement = Utils.createPayLoad(SERVICE_GET_OUTPUT_NODE,
+ new String[]{WORKFLOW_ID},
+ new String[]{workflowID});
+ invoker = new NonBlockingInvoker(changedDataProductServiceURL,
requestElement);
+ invoker.invoke();
+ JSONArray producedResultArray = new
JSONArray(Utils.getResults(invoker.getResponse()));
+
+ out.print("<div id=\"dataproducts\">");
+ out.println("<div id=\"dataproductsView\">");
+ // Consumed Data
+ out.println("<h3>Consumed Data products</h3>");
+ out.println("<div
class=\"datagrid\"><table><thead><tr><th></th><th>Data Product
ID</th><th>Timestamp</th></tr></thead>" +
+ "<tfoot><tr><td colspan=\"2\">Totol Search Results: " +
consumedResultArray.length() + " found </td></tr></tfoot><tbody>");
+
+ JSONObject result;
+ for (int i = 0; i < consumedResultArray.length(); i++) {
+ result = (JSONObject) consumedResultArray.get(i);
+ out.println(generateDataProductSummary(result, i + 1));
+ }
+ out.println("</tbody>\n" +
+ "</table></div>");
+
+ //Data Produced
+ out.println("<h3>Produced Data products</h3>");
+ out.println("<div
class=\"datagrid\"><table><thead><tr><th></th><th>Data Product
ID</th><th>Time Stamp</th></tr></thead>" +
+ "<tfoot><tr><td colspan=\"2\">Totol Search Results: " +
producedResultArray.length() + " found </td></tr></tfoot><tbody>");
+
+ for (int i = 0; i < producedResultArray.length(); i++) {
+ result = (JSONObject) producedResultArray.get(i);
+ out.println(generateDataProductSummary(result, i + 1));
+ }
+ out.println("</tbody>\n" +
+ "</table></div>");
+
+ out.print("</div></div>");
+ }
+
+ /**
+ * Generates HTML table row for a Data product.
+ *
+ * @param data JSONObject
+ * @param i int
+ * @return HTML String
+ * @throws UnsupportedEncodingException
+ * @throws JSONException
+ */
+ private String generateDataProductSummary(JSONObject data, int i)
throws UnsupportedEncodingException, JSONException {
+ StringBuilder resultData = new StringBuilder();
+ String alt = "";
+ if (i % 2 == 0) {
+ alt = "class=\"alt\"";
+ }
+ resultData.append("<tr ");
+ resultData.append(alt);
+ resultData.append(" ><td>");
+ resultData.append(i);
+ resultData.append("</td>");
+ resultData.append("<td class='modelWorkflow'><a
href='dataproduct.jsp?id=" + URLEncoder.encode((String)
data.get("DATAPRODUCT"), "UTF-8") + "' target='_blank' >" +
data.get("DATAPRODUCT") + "</a>");
+ resultData.append("</td><td>");
+ resultData.append(data.get("TIMESTAMP"));
+ resultData.append("</td></tr>\n");
+ return resultData.toString();
+ }
+
}
=======================================
--- /trunk/metcat-dashboard/src/main/webapp/WEB-INF/web.xml Wed Aug 29
03:52:49 2012
+++ /trunk/metcat-dashboard/src/main/webapp/WEB-INF/web.xml Wed Aug 29
11:54:03 2012
@@ -20,6 +20,14 @@

<servlet-name>org.apache.airavata.metcat.dashboard.servlets.GetWorkflowPropertyListServlet</servlet-name>

<servlet-class>org.apache.airavata.metcat.dashboard.servlets.GetWorkflowPropertyListServlet</servlet-class>
</servlet>
+ <servlet>
+
<servlet-name>org.apache.airavata.metcat.dashboard.servlets.GetDataProductServlet</servlet-name>
+
<servlet-class>org.apache.airavata.metcat.dashboard.servlets.GetDataProductServlet</servlet-class>
+ </servlet>
+ <servlet>
+
<servlet-name>org.apache.airavata.metcat.dashboard.servlets.GetDataProductListServlet</servlet-name>
+
<servlet-class>org.apache.airavata.metcat.dashboard.servlets.GetDataProductListServlet</servlet-class>
+ </servlet>
<servlet-mapping>

<servlet-name>org.apache.airavata.metcat.dashboard.servlets.ConnectionServlet</servlet-name>
<url-pattern>/CheckConnection</url-pattern>
@@ -36,4 +44,12 @@

<servlet-name>org.apache.airavata.metcat.dashboard.servlets.GetWorkflowPropertyListServlet</servlet-name>
<url-pattern>/getPropertyData</url-pattern>
</servlet-mapping>
+ <servlet-mapping>
+
<servlet-name>org.apache.airavata.metcat.dashboard.servlets.GetDataProductServlet</servlet-name>
+ <url-pattern>/getDataProduct</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+
<servlet-name>org.apache.airavata.metcat.dashboard.servlets.GetDataProductListServlet</servlet-name>
+ <url-pattern>/getDataProductList</url-pattern>
+ </servlet-mapping>
</web-app>
=======================================
--- /trunk/metcat-dashboard/src/main/webapp/index.jsp Wed Aug 29 03:52:49
2012
+++ /trunk/metcat-dashboard/src/main/webapp/index.jsp Wed Aug 29 11:54:03
2012
@@ -18,6 +18,7 @@
%>
<div class="block"></div>
<h4>Search Data</h4>
+
<div class="menudiv">
<span> <a href="searchworkflow.jsp"> <img
src="images/icons/search.png" alt=""></a>
@@ -27,15 +28,15 @@
</span>
</div>
<div class="menudiv">
- <span> <a href="searchworkflow.jsp"> <img
+ <span> <a href="searchdataproduct.jsp"> <img
src="images/icons/search.png" alt=""></a>
- </span> <span> <span> <a href="searchworkflow.jsp"> Search
+ </span> <span> <span> <a href="searchdataproduct.jsp"> Search
Data Products</a>
</span> <br>
</span>
</div>
- <div class="menudiv">
- <span> <a href="searchworkflow.jsp"> <img
+ <div class="menudiv">
+ <span> <a href="searchproperty.jsp"> <img
src="images/icons/search.png" alt=""></a>
</span> <span> <span> <a href="searchproperty.jsp"> Search
Properties</a>
@@ -45,20 +46,30 @@

<div class="block"></div>
<h4>Model Experiment/Workflow/Data products</h4>
+
<div class="menudiv">
- <span> <a href="workflow.jsp" > <img
+ <span> <a href="workflow.jsp"> <img
src="images/icons/workflow.png" alt=""></a>
- </span> <span> <span> <a href="workflow.jsp" > Model a
+ </span> <span> <span> <a href="workflow.jsp"> Model a
Airavata Workflow</a>
</span> <br>
</span>
</div>
+ <div class="menudiv">
+ <span> <a href="dataproduct.jsp"> <img
+ src="images/icons/workflow.png" alt=""></a>
+ </span> <span> <span> <a href="dataproduct.jsp"> Model a
+ Data Product</a>
+ </span> <br>
+ </span>
+ </div>

<%
}
%>
<div class="block"></div>
<h4>Configuration</h4>
+
<div class="menudiv">
<span> <a href="config.jsp"> <img
src="images/icons/settings.png" alt=""></a>
=======================================
--- /trunk/metcat-dashboard/src/main/webapp/searchworkflow.jsp Wed Aug 29
02:58:19 2012
+++ /trunk/metcat-dashboard/src/main/webapp/searchworkflow.jsp Wed Aug 29
11:54:03 2012
@@ -126,9 +126,6 @@
</tr>
</tbody>
</table>
- <script type="text/javascript">
-
- </script>
</div>
<div id="queryByState" style="display:none;">
<table width="80%">
@@ -143,7 +140,6 @@
<option
value="terminated">Terminated</option>
<option
value="initialized">Initialized</option>
<option value="paused">Paused</option>
- <option
value="running">Running</option>
<option value="failed">Failed</option>
</select>
</td>
=======================================
---
/trunk/metcatserver/src/main/java/org/apache/airavata/metcat/api/MetCatAPI.java
Wed Aug 29 04:25:04 2012
+++
/trunk/metcatserver/src/main/java/org/apache/airavata/metcat/api/MetCatAPI.java
Wed Aug 29 11:54:03 2012
@@ -735,7 +735,7 @@
* @return JSON Array String which contains JSON objects with values
* DATAPRODUCT
*/
- public String getDataProductAncestors(String dataproduct, int depth) {
+ public String getDataProductAncestorsWithDepth(String dataproduct, int
depth) {
IndexedRelationshipFinder rf = new IndexedRelationshipFinder();
try {

@@ -765,7 +765,7 @@
* DATAPRODUCT
*/
public String getDataProductAncestors(String dataproduct) {
- return this.getDataProductAncestors(dataproduct, 16);
+ return this.getDataProductAncestorsWithDepth(dataproduct, 16);
}

}
Reply all
Reply to author
Forward
0 new messages