Initial Commit of the Hyracks Admin Console
git-svn-id: https://hyracks.googlecode.com/svn/branches/hyracks_dev_next@562 123451ca-8445-de46-9d55-352943316053
diff --git a/hyracks-admin-console/.classpath b/hyracks-admin-console/.classpath
new file mode 100644
index 0000000..c5921a9
--- /dev/null
+++ b/hyracks-admin-console/.classpath
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" output="target/hyracks-admin-console-0.1.8-SNAPSHOT/WEB-INF/classes" path="src/main/java"/>
+ <classpathentry excluding="**" kind="src" output="target/hyracks-admin-console-0.1.8-SNAPSHOT/WEB-INF/classes" path="src/main/resources"/>
+ <classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
+ <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/>
+ <classpathentry kind="src" path="target/generated-sources/gwt"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
+ <classpathentry kind="con" path="com.google.gwt.eclipse.core.GWT_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
+ <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
+ <classpathentry kind="output" path="target/hyracks-admin-console-0.1.8-SNAPSHOT/WEB-INF/classes"/>
+</classpath>
diff --git a/hyracks-admin-console/.project b/hyracks-admin-console/.project
new file mode 100644
index 0000000..df60f9a
--- /dev/null
+++ b/hyracks-admin-console/.project
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>hyracks-admin-console</name>
+ <comment>hyracks-admin-console project</comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.validation.validationbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.google.gdt.eclipse.core.webAppProjectValidator</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.google.gwt.eclipse.core.gwtProjectValidator</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.maven.ide.eclipse.maven2Builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+ <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+ <nature>org.maven.ide.eclipse.maven2Nature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+ <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+ <nature>com.google.gwt.eclipse.core.gwtNature</nature>
+ </natures>
+</projectDescription>
diff --git a/hyracks-admin-console/.settings/.jsdtscope b/hyracks-admin-console/.settings/.jsdtscope
new file mode 100644
index 0000000..ba3c245
--- /dev/null
+++ b/hyracks-admin-console/.settings/.jsdtscope
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src/main/webapp" />
+ <classpathentry kind="con"
+ path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER" />
+ <classpathentry kind="con"
+ path="org.eclipse.wst.jsdt.launching.WebProject">
+ <attributes>
+ <attribute name="hide" value="true" />
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con"
+ path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary" />
+ <classpathentry kind="output" path="" />
+</classpath>
diff --git a/hyracks-admin-console/.settings/com.google.appengine.eclipse.core.prefs b/hyracks-admin-console/.settings/com.google.appengine.eclipse.core.prefs
new file mode 100644
index 0000000..a60576c
--- /dev/null
+++ b/hyracks-admin-console/.settings/com.google.appengine.eclipse.core.prefs
@@ -0,0 +1,3 @@
+#Thu Jun 16 10:18:26 CEST 2011
+eclipse.preferences.version=1
+filesCopiedToWebInfLib=
diff --git a/hyracks-admin-console/.settings/com.google.gdt.eclipse.core.prefs b/hyracks-admin-console/.settings/com.google.gdt.eclipse.core.prefs
new file mode 100644
index 0000000..8019224
--- /dev/null
+++ b/hyracks-admin-console/.settings/com.google.gdt.eclipse.core.prefs
@@ -0,0 +1,5 @@
+#Thu Sep 02 10:55:28 CEST 2010
+eclipse.preferences.version=1
+jarsExcludedFromWebInfLib=
+warSrcDir=src/main/webapp
+warSrcDirIsOutput=true
diff --git a/hyracks-admin-console/.settings/com.google.gwt.eclipse.core.prefs b/hyracks-admin-console/.settings/com.google.gwt.eclipse.core.prefs
new file mode 100644
index 0000000..c803c44
--- /dev/null
+++ b/hyracks-admin-console/.settings/com.google.gwt.eclipse.core.prefs
@@ -0,0 +1,5 @@
+#Thu Jun 16 11:14:17 CEST 2011
+eclipse.preferences.version=1
+entryPointModules=
+filesCopiedToWebInfLib=gwt-servlet.jar
+gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgc3JjL21haW4vd2ViYXBwXV0+PC9leHRyYS1hcmdzPjx2bS1hcmdzPjwhW0NEQVRBWy1YbXg1MTJtXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLmNvbXBhbnkuU29tZU1vZHVsZTwvZW50cnktcG9pbnQtbW9kdWxlPjwvZ3d0LWNvbXBpbGUtc2V0dGluZ3M+
diff --git a/hyracks-admin-console/.settings/org.eclipse.jdt.core.prefs b/hyracks-admin-console/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..96e4c8c
--- /dev/null
+++ b/hyracks-admin-console/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,9 @@
+#Wed Aug 24 10:20:07 PDT 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/hyracks-admin-console/.settings/org.eclipse.wst.common.component b/hyracks-admin-console/.settings/org.eclipse.wst.common.component
new file mode 100644
index 0000000..8b16bad
--- /dev/null
+++ b/hyracks-admin-console/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-modules id="moduleCoreId" project-version="1.5.0">
+ <wb-module deploy-name="${module}">
+ <wb-resource deploy-path="/" source-path="/src/main/webapp"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/test/java"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/target/generated-sources/gwt"/>
+ <property name="context-root" value="${module}"/>
+ <property name="java-output-path" value="/${module}/target/www/WEB-INF/classes"/>
+ </wb-module>
+</project-modules>
diff --git a/hyracks-admin-console/.settings/org.eclipse.wst.common.project.facet.core.xml b/hyracks-admin-console/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..18c1b9a
--- /dev/null
+++ b/hyracks-admin-console/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <fixed facet="wst.jsdt.web" />
+ <installed facet="java" version="1.5" />
+ <installed facet="jst.web" version="2.3" />
+ <installed facet="wst.jsdt.web" version="1.0" />
+</faceted-project>
diff --git a/hyracks-admin-console/.settings/org.eclipse.wst.jsdt.ui.superType.container b/hyracks-admin-console/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 0000000..3bd5d0a
--- /dev/null
+++ b/hyracks-admin-console/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/hyracks-admin-console/.settings/org.maven.ide.eclipse.prefs b/hyracks-admin-console/.settings/org.maven.ide.eclipse.prefs
new file mode 100644
index 0000000..c74c58e
--- /dev/null
+++ b/hyracks-admin-console/.settings/org.maven.ide.eclipse.prefs
@@ -0,0 +1,9 @@
+#Thu Sep 02 10:42:12 CEST 2010
+activeProfiles=
+eclipse.preferences.version=1
+fullBuildGoals=process-test-resources
+includeModules=false
+resolveWorkspaceProjects=true
+resourceFilterGoals=process-resources resources\:testResources
+skipCompilerPlugin=true
+version=1
diff --git a/hyracks-admin-console/pom.xml b/hyracks-admin-console/pom.xml
new file mode 100644
index 0000000..ca200e5
--- /dev/null
+++ b/hyracks-admin-console/pom.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>edu.uci.ics.hyracks</groupId>
+ <artifactId>hyracks-admin-console</artifactId>
+ <packaging>war</packaging>
+ <version>0.1.8-SNAPSHOT</version>
+
+ <parent>
+ <groupId>edu.uci.ics.hyracks</groupId>
+ <artifactId>hyracks</artifactId>
+ <version>0.1.8-SNAPSHOT</version>
+ </parent>
+
+ <properties>
+ <gwtVersion>2.3.0</gwtVersion>
+ <webappDirectory>${project.build.directory}/${project.build.finalName}</webappDirectory>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.google.gwt</groupId>
+ <artifactId>gwt-user</artifactId>
+ <version>${gwtVersion}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.7</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.validation</groupId>
+ <artifactId>validation-api</artifactId>
+ <version>1.0.0.GA</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.validation</groupId>
+ <artifactId>validation-api</artifactId>
+ <version>1.0.0.GA</version>
+ <classifier>sources</classifier>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.googlecode.gchart</groupId>
+ <artifactId>gchart</artifactId>
+ <version>2.6</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <!-- Generate compiled stuff in the folder used for developing mode -->
+ <outputDirectory>${webappDirectory}/WEB-INF/classes</outputDirectory>
+
+ <plugins>
+
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>gwt-maven-plugin</artifactId>
+ <version>2.3.0-1</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>compile</goal>
+ <goal>test</goal>
+ <goal>i18n</goal>
+ <goal>generateAsync</goal>
+ </goals>
+ </execution>
+ </executions>
+ <!-- Plugin configuration. There are many available options, see
+ gwt-maven-plugin documentation at codehaus.org -->
+ <configuration>
+ <runTarget>HyracksAdminConsole.html</runTarget>
+ <hostedWebapp>${webappDirectory}</hostedWebapp>
+ <i18nMessagesBundle>edu.uci.ics.hyracks.adminconsole.client.Messages</i18nMessagesBundle>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-war-plugin</artifactId>
+ <version>2.1.1</version>
+ <executions>
+ <execution>
+ <phase>compile</phase>
+ <goals>
+ <goal>exploded</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <webappDirectory>${webappDirectory}</webappDirectory>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>2.3.2</version>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/HyracksAdminConsole.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/HyracksAdminConsole.java
new file mode 100644
index 0000000..587a8a4
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/HyracksAdminConsole.java
@@ -0,0 +1,67 @@
+package edu.uci.ics.hyracks.adminconsole.client;
+
+import com.google.gwt.core.client.EntryPoint;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.DockLayoutPanel;
+import com.google.gwt.user.client.ui.RootLayoutPanel;
+
+import edu.uci.ics.hyracks.adminconsole.client.connection.ServerConnection;
+import edu.uci.ics.hyracks.adminconsole.client.panels.ApplicationsPanel;
+import edu.uci.ics.hyracks.adminconsole.client.panels.DashboardPanel;
+import edu.uci.ics.hyracks.adminconsole.client.panels.JobsPanel;
+import edu.uci.ics.hyracks.adminconsole.client.panels.NodeControllersPanel;
+import edu.uci.ics.hyracks.adminconsole.client.panels.TopPanel;
+
+public class HyracksAdminConsole implements EntryPoint {
+ public static HyracksAdminConsole INSTANCE;
+
+ private final Messages messages = GWT.create(Messages.class);
+
+ private ServerConnection serverConnection;
+
+ @UiField
+ TopPanel topPanel;
+
+ @UiField
+ DashboardPanel dashboardPanel;
+
+ @UiField
+ ApplicationsPanel applicationsPanel;
+
+ @UiField
+ NodeControllersPanel nodeControllersPanel;
+
+ @UiField
+ JobsPanel jobsPanel;
+
+ interface Binder extends UiBinder<DockLayoutPanel, HyracksAdminConsole> {
+ }
+
+ private final static Binder binder = GWT.create(Binder.class);
+
+ public ServerConnection getServerConnection() {
+ return serverConnection;
+ }
+
+ public void onModuleLoad() {
+ INSTANCE = this;
+ serverConnection = new ServerConnection();
+ String serverURLPrefix = Window.Location.getParameter("cclocation");
+ serverConnection.setServerURLPrefix(serverURLPrefix);
+
+ DockLayoutPanel lp = binder.createAndBindUi(this);
+
+ // Get rid of scrollbars, and clear out the window's built-in margin,
+ // because we want to take advantage of the entire client area.
+ Window.enableScrolling(false);
+ Window.setMargin("0px");
+
+ // Add the outer panel to the RootLayoutPanel, so that it will be
+ // displayed.
+ RootLayoutPanel root = RootLayoutPanel.get();
+ root.add(lp);
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/HyracksAdminConsole.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/HyracksAdminConsole.ui.xml
new file mode 100644
index 0000000..929e1de
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/HyracksAdminConsole.ui.xml
@@ -0,0 +1,44 @@
+<!DOCTYPE ui:UiBinder
+ SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+ xmlns:ui='urn:ui:com.google.gwt.uibinder'
+ xmlns:g='urn:import:com.google.gwt.user.client.ui'
+ xmlns:hac.panels='urn:import:edu.uci.ics.hyracks.adminconsole.client.panels'>
+
+ <g:DockLayoutPanel unit='EM'>
+ <g:north size='5'>
+ <hac.panels:TopPanel ui:field='topPanel' />
+ </g:north>
+
+ <g:center>
+ <g:TabLayoutPanel barUnit="EM" barHeight="2">
+ <g:tab>
+ <g:header>
+ Dashboard
+ </g:header>
+ <hac.panels:DashboardPanel ui:field='dashboardPanel' />
+ </g:tab>
+ <g:tab>
+ <g:header>
+ Applications
+ </g:header>
+ <hac.panels:ApplicationsPanel ui:field='applicationsPanel' />
+ </g:tab>
+ <g:tab>
+ <g:header>
+ Node Controllers
+ </g:header>
+ <hac.panels:NodeControllersPanel ui:field='nodeControllersPanel' />
+ </g:tab>
+ <g:tab>
+ <g:header>
+ Jobs
+ </g:header>
+ <hac.panels:JobsPanel ui:field='jobsPanel' />
+ </g:tab>
+ </g:TabLayoutPanel>
+ </g:center>
+ </g:DockLayoutPanel>
+
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/JobSummary.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/JobSummary.java
new file mode 100644
index 0000000..d7af7f7
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/JobSummary.java
@@ -0,0 +1,46 @@
+package edu.uci.ics.hyracks.adminconsole.client.beans;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.view.client.ProvidesKey;
+
+public final class JobSummary extends JavaScriptObject {
+ public static final ProvidesKey<JobSummary> KEY_PROVIDER = new ProvidesKey<JobSummary>() {
+ @Override
+ public Object getKey(JobSummary item) {
+ return item.getJobId();
+ }
+ };
+
+ protected JobSummary() {
+ }
+
+ public native String getJobId()
+ /*-{
+ return this["job-id"];
+ }-*/;
+
+ public native String getApplicationName()
+ /*-{
+ return this["application-name"];
+ }-*/;
+
+ public native String getStatus()
+ /*-{
+ return this.status;
+ }-*/;
+
+ public native Long getCreateTime()
+ /*-{
+ return this["create-time"];
+ }-*/;
+
+ public native Long getStartTime()
+ /*-{
+ return this["start-time"];
+ }-*/;
+
+ public native Long getEndTime()
+ /*-{
+ return this["end-time"];
+ }-*/;
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/NodeDetails.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/NodeDetails.java
new file mode 100644
index 0000000..d04c02c
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/NodeDetails.java
@@ -0,0 +1,101 @@
+package edu.uci.ics.hyracks.adminconsole.client.beans;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArrayInteger;
+import com.google.gwt.core.client.JsArrayNumber;
+
+public final class NodeDetails extends JavaScriptObject {
+ protected NodeDetails() {
+
+ }
+
+ public native String getNodeId()
+ /*-{
+ return this["node-id"];
+ }-*/;
+
+ public native String getOSName()
+ /*-{
+ return this["os-name"];
+ }-*/;
+
+ public native String getArch()
+ /*-{
+ return this["arch"];
+ }-*/;
+
+ public native String getOSVersion()
+ /*-{
+ return this["os-version"];
+ }-*/;
+
+ public native int getNProcessors()
+ /*-{
+ return this["num-processors"];
+ }-*/;
+
+ public native int getRRDPtr()
+ /*-{
+ return this["rrd-ptr"];
+ }-*/;
+
+ public native JsArrayNumber getHeartbeatTimes()
+ /*-{
+ return this["heartbeat-times"];
+ }-*/;
+
+ public native JsArrayNumber getHeapInitSizes()
+ /*-{
+ return this["heap-init-sizes"];
+ }-*/;
+
+ public native JsArrayNumber getHeapUsedSizes()
+ /*-{
+ return this["heap-used-sizes"];
+ }-*/;
+
+ public native JsArrayNumber getHeapCommittedSizes()
+ /*-{
+ return this["heap-committed-sizes"];
+ }-*/;
+
+ public native JsArrayNumber getHeapMaxSizes()
+ /*-{
+ return this["heap-max-sizes"];
+ }-*/;
+
+ public native JsArrayNumber getNonHeapInitSizes()
+ /*-{
+ return this["nonheap-init-sizes"];
+ }-*/;
+
+ public native JsArrayNumber getNonHeapUsedSizes()
+ /*-{
+ return this["nonheap-used-sizes"];
+ }-*/;
+
+ public native JsArrayNumber getNonHeapCommittedSizes()
+ /*-{
+ return this["nonheap-committed-sizes"];
+ }-*/;
+
+ public native JsArrayNumber getNonHeapMaxSizes()
+ /*-{
+ return this["nonheap-max-sizes"];
+ }-*/;
+
+ public native JsArrayInteger getThreadCounts()
+ /*-{
+ return this["thread-counts"];
+ }-*/;
+
+ public native JsArrayInteger getPeakThreadCounts()
+ /*-{
+ return this["peak-thread-counts"];
+ }-*/;
+
+ public native JsArrayNumber getSystemLoadAverages()
+ /*-{
+ return this["system-load-averages"];
+ }-*/;
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/NodeSummary.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/NodeSummary.java
new file mode 100644
index 0000000..1ee5e85
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/NodeSummary.java
@@ -0,0 +1,37 @@
+package edu.uci.ics.hyracks.adminconsole.client.beans;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArray;
+import com.google.gwt.view.client.ProvidesKey;
+
+public final class NodeSummary extends JavaScriptObject {
+ public static final ProvidesKey<NodeSummary> KEY_PROVIDER = new ProvidesKey<NodeSummary>() {
+ @Override
+ public Object getKey(NodeSummary item) {
+ return item.getNodeId();
+ }
+ };
+
+ protected NodeSummary() {
+ }
+
+ public native String getNodeId()
+ /*-{
+ return this["node-id"];
+ }-*/;
+
+ public native Double getSystemLoadAverage()
+ /*-{
+ return this["system-load-average"];
+ }-*/;
+
+ public native Long getHeapUsed()
+ /*-{
+ return this["heap-used"];
+ }-*/;
+
+ public static native JsArray<NodeSummary> parseNodeSummariesResult(String json)
+ /*-{
+ return eval(json)[0].result;
+ }-*/;
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/connection/ServerConnection.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/connection/ServerConnection.java
new file mode 100644
index 0000000..0d147c6
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/connection/ServerConnection.java
@@ -0,0 +1,16 @@
+package edu.uci.ics.hyracks.adminconsole.client.connection;
+
+public class ServerConnection {
+ private String serverURLPrefix;
+
+ public ServerConnection() {
+ }
+
+ public String getServerURLPrefix() {
+ return serverURLPrefix;
+ }
+
+ public void setServerURLPrefix(String serverURLPrefix) {
+ this.serverURLPrefix = serverURLPrefix;
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/MemoryUsageChart.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/MemoryUsageChart.java
new file mode 100644
index 0000000..dbc670f
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/MemoryUsageChart.java
@@ -0,0 +1,51 @@
+package edu.uci.ics.hyracks.adminconsole.client.details.node.charts;
+
+import com.google.gwt.core.client.JsArrayNumber;
+import com.googlecode.gchart.client.GChart;
+
+public class MemoryUsageChart extends GChart {
+ private String prefix;
+
+ public MemoryUsageChart() {
+ setChartSize(720, 200);
+ setPadding("30px");
+ }
+
+ public void setPrefix(String prefix) {
+ this.prefix = prefix;
+ }
+
+ public void reset(int rrdPtr, JsArrayNumber times, JsArrayNumber initSizes, JsArrayNumber usedSizes,
+ JsArrayNumber committedSizes, JsArrayNumber maxSizes) {
+ clearCurves();
+ addCurve();
+ getCurve().setLegendLabel(prefix + " Initial Size");
+ getCurve().getSymbol().setWidth(0);
+ getCurve().getSymbol().setHeight(0);
+ getCurve().getSymbol().setSymbolType(SymbolType.LINE);
+ addCurve();
+ getCurve().setLegendLabel(prefix + " Used Size");
+ getCurve().getSymbol().setWidth(0);
+ getCurve().getSymbol().setHeight(0);
+ getCurve().getSymbol().setSymbolType(SymbolType.LINE);
+ addCurve();
+ getCurve().setLegendLabel(prefix + " Committed Size");
+ getCurve().getSymbol().setWidth(0);
+ getCurve().getSymbol().setHeight(0);
+ getCurve().getSymbol().setSymbolType(SymbolType.LINE);
+ addCurve();
+ getCurve().setLegendLabel(prefix + " Maximum Size");
+ getCurve().getSymbol().setWidth(0);
+ getCurve().getSymbol().setHeight(0);
+ getCurve().getSymbol().setSymbolType(SymbolType.LINE);
+ int ptr = rrdPtr;
+ for (int i = 0; i < times.length(); ++i) {
+ getCurve(0).addPoint(i, initSizes.get(ptr));
+ getCurve(1).addPoint(i, usedSizes.get(ptr));
+ getCurve(2).addPoint(i, committedSizes.get(ptr));
+ getCurve(3).addPoint(i, maxSizes.get(ptr));
+ ptr = (ptr + 1) % times.length();
+ }
+ update();
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/SystemLoadAverageChart.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/SystemLoadAverageChart.java
new file mode 100644
index 0000000..21faf21
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/SystemLoadAverageChart.java
@@ -0,0 +1,26 @@
+package edu.uci.ics.hyracks.adminconsole.client.details.node.charts;
+
+import com.google.gwt.core.client.JsArrayNumber;
+import com.googlecode.gchart.client.GChart;
+
+public class SystemLoadAverageChart extends GChart {
+ public SystemLoadAverageChart() {
+ setChartSize(720, 200);
+ setPadding("30px");
+ }
+
+ public void reset(int rrdPtr, JsArrayNumber times, JsArrayNumber systemLoadAverages) {
+ clearCurves();
+ addCurve();
+ getCurve().setLegendLabel("System Load Average");
+ getCurve().getSymbol().setWidth(0);
+ getCurve().getSymbol().setHeight(0);
+ getCurve().getSymbol().setSymbolType(SymbolType.LINE);
+ int ptr = rrdPtr;
+ for (int i = 0; i < times.length(); ++i) {
+ getCurve().addPoint(i, systemLoadAverages.get(ptr));
+ ptr = (ptr + 1) % times.length();
+ }
+ update();
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/ThreadCountChart.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/ThreadCountChart.java
new file mode 100644
index 0000000..77b6b8c
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/ThreadCountChart.java
@@ -0,0 +1,33 @@
+package edu.uci.ics.hyracks.adminconsole.client.details.node.charts;
+
+import com.google.gwt.core.client.JsArrayInteger;
+import com.google.gwt.core.client.JsArrayNumber;
+import com.googlecode.gchart.client.GChart;
+
+public class ThreadCountChart extends GChart {
+ public ThreadCountChart() {
+ setChartSize(720, 200);
+ setPadding("30px");
+ }
+
+ public void reset(int rrdPtr, JsArrayNumber times, JsArrayInteger threadCounts, JsArrayInteger peakThreadCounts) {
+ clearCurves();
+ addCurve();
+ getCurve().setLegendLabel("Thread Count");
+ getCurve().getSymbol().setWidth(0);
+ getCurve().getSymbol().setHeight(0);
+ getCurve().getSymbol().setSymbolType(SymbolType.LINE);
+ addCurve();
+ getCurve().setLegendLabel("Peak Thread Count");
+ getCurve().getSymbol().setWidth(0);
+ getCurve().getSymbol().setHeight(0);
+ getCurve().getSymbol().setSymbolType(SymbolType.LINE);
+ int ptr = rrdPtr;
+ for (int i = 0; i < times.length(); ++i) {
+ getCurve(0).addPoint(i, threadCounts.get(ptr));
+ getCurve(1).addPoint(i, peakThreadCounts.get(ptr));
+ ptr = (ptr + 1) % times.length();
+ }
+ update();
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/ApplicationsPanel.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/ApplicationsPanel.java
new file mode 100644
index 0000000..f25ea7f
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/ApplicationsPanel.java
@@ -0,0 +1,17 @@
+package edu.uci.ics.hyracks.adminconsole.client.panels;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+
+public class ApplicationsPanel extends Composite {
+ interface Binder extends UiBinder<Widget, ApplicationsPanel> {
+ }
+
+ private final static Binder binder = GWT.create(Binder.class);
+
+ public ApplicationsPanel() {
+ initWidget(binder.createAndBindUi(this));
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/ApplicationsPanel.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/ApplicationsPanel.ui.xml
new file mode 100644
index 0000000..74669b0
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/ApplicationsPanel.ui.xml
@@ -0,0 +1,9 @@
+<!DOCTYPE ui:UiBinder
+ SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+ xmlns:ui='urn:ui:com.google.gwt.uibinder'
+ xmlns:g='urn:import:com.google.gwt.user.client.ui'
+ xmlns:hac.panels='urn:import:edu.uci.ics.hyracks.adminconsole.client.panels'>
+ <g:HTML></g:HTML>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/DashboardPanel.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/DashboardPanel.java
new file mode 100644
index 0000000..6917090
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/DashboardPanel.java
@@ -0,0 +1,17 @@
+package edu.uci.ics.hyracks.adminconsole.client.panels;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+
+public class DashboardPanel extends Composite {
+ interface Binder extends UiBinder<Widget, DashboardPanel> {
+ }
+
+ private final static Binder binder = GWT.create(Binder.class);
+
+ public DashboardPanel() {
+ initWidget(binder.createAndBindUi(this));
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/DashboardPanel.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/DashboardPanel.ui.xml
new file mode 100644
index 0000000..74669b0
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/DashboardPanel.ui.xml
@@ -0,0 +1,9 @@
+<!DOCTYPE ui:UiBinder
+ SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+ xmlns:ui='urn:ui:com.google.gwt.uibinder'
+ xmlns:g='urn:import:com.google.gwt.user.client.ui'
+ xmlns:hac.panels='urn:import:edu.uci.ics.hyracks.adminconsole.client.panels'>
+ <g:HTML></g:HTML>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/JobsPanel.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/JobsPanel.java
new file mode 100644
index 0000000..c8350dc
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/JobsPanel.java
@@ -0,0 +1,82 @@
+package edu.uci.ics.hyracks.adminconsole.client.panels;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JsArray;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.SplitLayoutPanel;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.view.client.AsyncDataProvider;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.JobSummary;
+import edu.uci.ics.hyracks.adminconsole.client.rest.AbstractRestFunction;
+import edu.uci.ics.hyracks.adminconsole.client.rest.GetJobSummariesFunction;
+import edu.uci.ics.hyracks.adminconsole.client.widgets.JobsTableWidget;
+
+public class JobsPanel extends Composite implements JobsTableWidget.IRefreshRequestHandler {
+ interface Binder extends UiBinder<Widget, JobsPanel> {
+ }
+
+ private final static Binder binder = GWT.create(Binder.class);
+
+ @UiField
+ SplitLayoutPanel split;
+
+ @UiField
+ JobsTableWidget jobs;
+
+ @UiField
+ Widget details;
+
+ private int callCounter;
+
+ public JobsPanel() {
+ initWidget(binder.createAndBindUi(this));
+
+ jobs.setRefreshRequestHandler(this);
+
+ Timer timer = new Timer() {
+ @Override
+ public void run() {
+ refresh();
+ }
+ };
+ refresh();
+ timer.scheduleRepeating(5000);
+ }
+
+ @Override
+ public void refresh() {
+ try {
+ final int counter = ++callCounter;
+ GetJobSummariesFunction.INSTANCE.call(new AbstractRestFunction.ResultCallback<JsArray<JobSummary>>() {
+ @Override
+ public void onSuccess(JsArray<JobSummary> result) {
+ if (counter == callCounter) {
+ AsyncDataProvider<JobSummary> dataProvider = jobs.getDataProvider();
+ List<JobSummary> data = new ArrayList<JobSummary>();
+ for (int i = 0; i < result.length(); ++i) {
+ data.add(result.get(i));
+ }
+ dataProvider.updateRowData(0, data);
+ dataProvider.updateRowCount(result.length(), true);
+ }
+ }
+
+ @Override
+ public void onError(Throwable exception) {
+
+ }
+ });
+ } catch (RequestException e) {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/JobsPanel.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/JobsPanel.ui.xml
new file mode 100644
index 0000000..c12640f
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/JobsPanel.ui.xml
@@ -0,0 +1,18 @@
+<!DOCTYPE ui:UiBinder
+ SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+ xmlns:ui='urn:ui:com.google.gwt.uibinder'
+ xmlns:g='urn:import:com.google.gwt.user.client.ui'
+ xmlns:widgets='urn:import:edu.uci.ics.hyracks.adminconsole.client.widgets'>
+ <g:SplitLayoutPanel ui:field="split">
+ <g:north size="300">
+ <g:ScrollPanel>
+ <widgets:JobsTableWidget ui:field="jobs" width="100%" height="300px"></widgets:JobsTableWidget>
+ </g:ScrollPanel>
+ </g:north>
+ <g:center>
+ <g:HTML ui:field="details"></g:HTML>
+ </g:center>
+ </g:SplitLayoutPanel>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllerDetailsPanel.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllerDetailsPanel.java
new file mode 100644
index 0000000..bbc08d4
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllerDetailsPanel.java
@@ -0,0 +1,91 @@
+package edu.uci.ics.hyracks.adminconsole.client.panels;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.NodeDetails;
+import edu.uci.ics.hyracks.adminconsole.client.details.node.charts.MemoryUsageChart;
+import edu.uci.ics.hyracks.adminconsole.client.details.node.charts.SystemLoadAverageChart;
+import edu.uci.ics.hyracks.adminconsole.client.details.node.charts.ThreadCountChart;
+import edu.uci.ics.hyracks.adminconsole.client.rest.AbstractRestFunction;
+import edu.uci.ics.hyracks.adminconsole.client.rest.GetNodeDetailsFunction;
+
+public class NodeControllerDetailsPanel extends Composite {
+ interface Binder extends UiBinder<Widget, NodeControllerDetailsPanel> {
+ }
+
+ private final static Binder binder = GWT.create(Binder.class);
+
+ private final String nodeId;
+
+ @UiField
+ MemoryUsageChart heapUsage;
+
+ @UiField
+ MemoryUsageChart nonheapUsage;
+
+ @UiField
+ SystemLoadAverageChart loadAverage;
+
+ @UiField
+ ThreadCountChart threadCount;
+
+ private int callCounter;
+
+ private Timer timer;
+
+ public NodeControllerDetailsPanel(String nodeId) {
+ initWidget(binder.createAndBindUi(this));
+
+ this.nodeId = nodeId;
+ heapUsage.setPrefix("Heap ");
+ nonheapUsage.setPrefix("Non-Heap ");
+
+ timer = new Timer() {
+ @Override
+ public void run() {
+ refresh();
+ }
+ };
+ refresh();
+ timer.scheduleRepeating(10000);
+ }
+
+ public void destroy() {
+ timer.cancel();
+ }
+
+ private void refresh() {
+ try {
+ final int counter = ++callCounter;
+ new GetNodeDetailsFunction(nodeId).call(new AbstractRestFunction.ResultCallback<NodeDetails>() {
+ @Override
+ public void onSuccess(NodeDetails result) {
+ if (counter == callCounter) {
+ loadAverage.reset(result.getRRDPtr(), result.getHeartbeatTimes(),
+ result.getSystemLoadAverages());
+ heapUsage.reset(result.getRRDPtr(), result.getHeartbeatTimes(), result.getHeapInitSizes(),
+ result.getHeapUsedSizes(), result.getHeapCommittedSizes(), result.getHeapMaxSizes());
+ nonheapUsage.reset(result.getRRDPtr(), result.getHeartbeatTimes(),
+ result.getNonHeapInitSizes(), result.getNonHeapUsedSizes(),
+ result.getNonHeapCommittedSizes(), result.getNonHeapMaxSizes());
+ threadCount.reset(result.getRRDPtr(), result.getHeartbeatTimes(), result.getThreadCounts(),
+ result.getPeakThreadCounts());
+ }
+ }
+
+ @Override
+ public void onError(Throwable exception) {
+
+ }
+ });
+ } catch (RequestException e) {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllerDetailsPanel.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllerDetailsPanel.ui.xml
new file mode 100644
index 0000000..4506f2b
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllerDetailsPanel.ui.xml
@@ -0,0 +1,37 @@
+<!DOCTYPE ui:UiBinder
+ SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+ xmlns:ui='urn:ui:com.google.gwt.uibinder'
+ xmlns:g='urn:import:com.google.gwt.user.client.ui'
+ xmlns:charts='urn:import:edu.uci.ics.hyracks.adminconsole.client.details.node.charts'>
+ <g:StackLayoutPanel unit="EM">
+ <g:stack>
+ <g:header size="2">
+ System Load
+ </g:header>
+ <g:ScrollPanel>
+ <charts:SystemLoadAverageChart ui:field="loadAverage"/>
+ </g:ScrollPanel>
+ </g:stack>
+ <g:stack>
+ <g:header size="2">
+ Memory Usage
+ </g:header>
+ <g:ScrollPanel>
+ <g:FlowPanel>
+ <charts:MemoryUsageChart ui:field="heapUsage"/>
+ <charts:MemoryUsageChart ui:field="nonheapUsage"/>
+ </g:FlowPanel>
+ </g:ScrollPanel>
+ </g:stack>
+ <g:stack>
+ <g:header size="2">
+ Thread Count
+ </g:header>
+ <g:ScrollPanel>
+ <charts:ThreadCountChart ui:field="threadCount"/>
+ </g:ScrollPanel>
+ </g:stack>
+ </g:StackLayoutPanel>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllersPanel.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllersPanel.java
new file mode 100644
index 0000000..6110d17
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllersPanel.java
@@ -0,0 +1,92 @@
+package edu.uci.ics.hyracks.adminconsole.client.panels;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JsArray;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.SplitLayoutPanel;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.view.client.AsyncDataProvider;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.NodeSummary;
+import edu.uci.ics.hyracks.adminconsole.client.rest.AbstractRestFunction;
+import edu.uci.ics.hyracks.adminconsole.client.rest.GetNodeSummariesFunction;
+import edu.uci.ics.hyracks.adminconsole.client.widgets.NodesTableWidget;
+
+public class NodeControllersPanel extends Composite implements NodesTableWidget.IRefreshRequestHandler {
+ interface Binder extends UiBinder<Widget, NodeControllersPanel> {
+ }
+
+ private final static Binder binder = GWT.create(Binder.class);
+
+ @UiField
+ SplitLayoutPanel split;
+
+ @UiField
+ NodesTableWidget nodes;
+
+ @UiField
+ Widget details;
+
+ private int callCounter;
+
+ public NodeControllersPanel() {
+ initWidget(binder.createAndBindUi(this));
+
+ nodes.setRefreshRequestHandler(this);
+ nodes.setClickListener(new NodesTableWidget.IClickListener() {
+ @Override
+ public void click(String nodeId) {
+ if (details instanceof NodeControllerDetailsPanel) {
+ ((NodeControllerDetailsPanel) details).destroy();
+ }
+ split.remove(details);
+ details = new NodeControllerDetailsPanel(nodeId);
+ split.add(details);
+ }
+ });
+
+ Timer timer = new Timer() {
+ @Override
+ public void run() {
+ refresh();
+ }
+ };
+ refresh();
+ timer.scheduleRepeating(10000);
+ }
+
+ @Override
+ public void refresh() {
+ try {
+ final int counter = ++callCounter;
+ GetNodeSummariesFunction.INSTANCE.call(new AbstractRestFunction.ResultCallback<JsArray<NodeSummary>>() {
+ @Override
+ public void onSuccess(JsArray<NodeSummary> result) {
+ if (counter == callCounter) {
+ AsyncDataProvider<NodeSummary> dataProvider = nodes.getDataProvider();
+ List<NodeSummary> data = new ArrayList<NodeSummary>();
+ for (int i = 0; i < result.length(); ++i) {
+ data.add(result.get(i));
+ }
+ dataProvider.updateRowData(0, data);
+ dataProvider.updateRowCount(result.length(), true);
+ }
+ }
+
+ @Override
+ public void onError(Throwable exception) {
+
+ }
+ });
+ } catch (RequestException e) {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllersPanel.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllersPanel.ui.xml
new file mode 100644
index 0000000..80b4148
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllersPanel.ui.xml
@@ -0,0 +1,18 @@
+<!DOCTYPE ui:UiBinder
+ SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+ xmlns:ui='urn:ui:com.google.gwt.uibinder'
+ xmlns:g='urn:import:com.google.gwt.user.client.ui'
+ xmlns:widgets='urn:import:edu.uci.ics.hyracks.adminconsole.client.widgets'>
+ <g:SplitLayoutPanel ui:field="split">
+ <g:west size="300">
+ <g:ScrollPanel>
+ <widgets:NodesTableWidget ui:field="nodes" width="100%"></widgets:NodesTableWidget>
+ </g:ScrollPanel>
+ </g:west>
+ <g:center>
+ <g:HTML ui:field="details"></g:HTML>
+ </g:center>
+ </g:SplitLayoutPanel>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/TopPanel.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/TopPanel.java
new file mode 100644
index 0000000..a849615
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/TopPanel.java
@@ -0,0 +1,17 @@
+package edu.uci.ics.hyracks.adminconsole.client.panels;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+
+public class TopPanel extends Composite {
+ interface Binder extends UiBinder<Widget, TopPanel> {
+ }
+
+ private final static Binder binder = GWT.create(Binder.class);
+
+ public TopPanel() {
+ initWidget(binder.createAndBindUi(this));
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/TopPanel.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/TopPanel.ui.xml
new file mode 100644
index 0000000..71c7b24
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/TopPanel.ui.xml
@@ -0,0 +1,15 @@
+<!DOCTYPE ui:UiBinder
+ SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+ xmlns:ui='urn:ui:com.google.gwt.uibinder'
+ xmlns:g='urn:import:com.google.gwt.user.client.ui'
+ xmlns:mail='urn:import:com.google.gwt.sample.mail.client'>
+
+ <ui:style>
+
+ </ui:style>
+
+ <g:HTMLPanel>
+ </g:HTMLPanel>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/AbstractRestFunction.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/AbstractRestFunction.java
new file mode 100644
index 0000000..6297fd2
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/AbstractRestFunction.java
@@ -0,0 +1,47 @@
+package edu.uci.ics.hyracks.adminconsole.client.rest;
+
+import com.google.gwt.http.client.Request;
+import com.google.gwt.http.client.RequestBuilder;
+import com.google.gwt.http.client.RequestCallback;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.http.client.Response;
+import com.google.gwt.http.client.URL;
+
+import edu.uci.ics.hyracks.adminconsole.client.HyracksAdminConsole;
+
+public abstract class AbstractRestFunction<T> {
+ protected abstract void appendURLPath(StringBuilder buffer);
+
+ protected native T packageResults(String result)
+ /*-{
+ return eval("[" + result + "]")[0].result;
+ }-*/;
+
+ public interface ResultCallback<T> {
+ public void onSuccess(T result);
+
+ public void onError(Throwable exception);
+ }
+
+ public void call(final ResultCallback<T> callback) throws RequestException {
+ StringBuilder buffer = new StringBuilder();
+ buffer.append(HyracksAdminConsole.INSTANCE.getServerConnection().getServerURLPrefix());
+ buffer.append("/rest");
+ appendURLPath(buffer);
+ RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(buffer.toString()));
+
+ builder.sendRequest(null, new RequestCallback() {
+ public void onError(Request request, Throwable exception) {
+ callback.onError(exception);
+ }
+
+ public void onResponseReceived(Request request, Response response) {
+ if (200 == response.getStatusCode()) {
+ callback.onSuccess(packageResults(response.getText()));
+ } else {
+ callback.onError(null);
+ }
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetJobSummariesFunction.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetJobSummariesFunction.java
new file mode 100644
index 0000000..e96bc22
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetJobSummariesFunction.java
@@ -0,0 +1,17 @@
+package edu.uci.ics.hyracks.adminconsole.client.rest;
+
+import com.google.gwt.core.client.JsArray;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.JobSummary;
+
+public class GetJobSummariesFunction extends AbstractRestFunction<JsArray<JobSummary>> {
+ public static final GetJobSummariesFunction INSTANCE = new GetJobSummariesFunction();
+
+ private GetJobSummariesFunction() {
+ }
+
+ @Override
+ protected void appendURLPath(StringBuilder buffer) {
+ buffer.append("/jobs");
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetNodeDetailsFunction.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetNodeDetailsFunction.java
new file mode 100644
index 0000000..b535ffc
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetNodeDetailsFunction.java
@@ -0,0 +1,16 @@
+package edu.uci.ics.hyracks.adminconsole.client.rest;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.NodeDetails;
+
+public class GetNodeDetailsFunction extends AbstractRestFunction<NodeDetails> {
+ private String nodeId;
+
+ public GetNodeDetailsFunction(String nodeId) {
+ this.nodeId = nodeId;
+ }
+
+ @Override
+ protected void appendURLPath(StringBuilder buffer) {
+ buffer.append("/nodes/").append(nodeId);
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetNodeSummariesFunction.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetNodeSummariesFunction.java
new file mode 100644
index 0000000..6af5a01
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetNodeSummariesFunction.java
@@ -0,0 +1,17 @@
+package edu.uci.ics.hyracks.adminconsole.client.rest;
+
+import com.google.gwt.core.client.JsArray;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.NodeSummary;
+
+public class GetNodeSummariesFunction extends AbstractRestFunction<JsArray<NodeSummary>> {
+ public static final GetNodeSummariesFunction INSTANCE = new GetNodeSummariesFunction();
+
+ private GetNodeSummariesFunction() {
+ }
+
+ @Override
+ protected void appendURLPath(StringBuilder buffer) {
+ buffer.append("/nodes");
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/JobsTableWidget.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/JobsTableWidget.java
new file mode 100644
index 0000000..4e49bba
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/JobsTableWidget.java
@@ -0,0 +1,118 @@
+package edu.uci.ics.hyracks.adminconsole.client.widgets;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.cellview.client.CellTable;
+import com.google.gwt.user.cellview.client.TextColumn;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.view.client.AsyncDataProvider;
+import com.google.gwt.view.client.HasData;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.JobSummary;
+
+public class JobsTableWidget extends Composite {
+ public interface IRefreshRequestHandler {
+ public void refresh();
+ }
+
+ interface Binder extends UiBinder<Widget, JobsTableWidget> {
+ }
+
+ private final static Binder binder = GWT.create(Binder.class);
+
+ @UiField
+ CellTable<JobSummary> table;
+
+ private AsyncDataProvider<JobSummary> jobSummaryProvider;
+
+ private IRefreshRequestHandler refreshRequestHandler;
+
+ public JobsTableWidget() {
+ initWidget(binder.createAndBindUi(this));
+
+ TextColumn<JobSummary> idCol = new TextColumn<JobSummary>() {
+ @Override
+ public String getValue(JobSummary object) {
+ return object.getJobId();
+ }
+ };
+ idCol.setSortable(true);
+
+ TextColumn<JobSummary> appCol = new TextColumn<JobSummary>() {
+ @Override
+ public String getValue(JobSummary object) {
+ return object.getApplicationName();
+ }
+ };
+ appCol.setSortable(true);
+
+ TextColumn<JobSummary> statusCol = new TextColumn<JobSummary>() {
+ @Override
+ public String getValue(JobSummary object) {
+ return object.getStatus();
+ }
+ };
+ statusCol.setSortable(true);
+
+ /*
+ TextColumn<JobSummary> createTimeCol = new TextColumn<JobSummary>() {
+ @Override
+ public String getValue(JobSummary object) {
+ return renderTime(object.getCreateTime());
+ }
+ };
+ createTimeCol.setSortable(true);
+
+ TextColumn<JobSummary> startTimeCol = new TextColumn<JobSummary>() {
+ @Override
+ public String getValue(JobSummary object) {
+ return renderTime(object.getStartTime());
+ }
+ };
+ startTimeCol.setSortable(true);
+
+ TextColumn<JobSummary> endTimeCol = new TextColumn<JobSummary>() {
+ @Override
+ public String getValue(JobSummary object) {
+ return renderTime(object.getEndTime());
+ }
+ };
+ endTimeCol.setSortable(true);
+ */
+ table.addColumn(idCol, "Job Id");
+ table.addColumn(appCol, "Application Name");
+ table.addColumn(statusCol, "Status");
+ /*
+ table.addColumn(createTimeCol, "Created At");
+ table.addColumn(startTimeCol, "Started At");
+ table.addColumn(endTimeCol, "Finished At");
+ */
+
+ jobSummaryProvider = new AsyncDataProvider<JobSummary>(JobSummary.KEY_PROVIDER) {
+ @Override
+ protected void onRangeChanged(HasData<JobSummary> display) {
+ if (refreshRequestHandler != null) {
+ refreshRequestHandler.refresh();
+ }
+ }
+ };
+ jobSummaryProvider.addDataDisplay(table);
+ }
+
+ public AsyncDataProvider<JobSummary> getDataProvider() {
+ return jobSummaryProvider;
+ }
+
+ public void setRefreshRequestHandler(IRefreshRequestHandler refreshRequestHandler) {
+ this.refreshRequestHandler = refreshRequestHandler;
+ }
+
+ private static String renderTime(Long time) {
+ if (time < 0) {
+ return "";
+ }
+ return time.toString();
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/JobsTableWidget.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/JobsTableWidget.ui.xml
new file mode 100644
index 0000000..9c48d77
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/JobsTableWidget.ui.xml
@@ -0,0 +1,9 @@
+<!DOCTYPE ui:UiBinder
+ SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+ xmlns:ui='urn:ui:com.google.gwt.uibinder'
+ xmlns:g='urn:import:com.google.gwt.user.client.ui'
+ xmlns:c='urn:import:com.google.gwt.user.cellview.client'>
+ <c:CellTable ui:field="table" width="100%"></c:CellTable>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/NodesTableWidget.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/NodesTableWidget.java
new file mode 100644
index 0000000..088619c
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/NodesTableWidget.java
@@ -0,0 +1,102 @@
+package edu.uci.ics.hyracks.adminconsole.client.widgets;
+
+import com.google.gwt.cell.client.ClickableTextCell;
+import com.google.gwt.cell.client.FieldUpdater;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.cellview.client.CellTable;
+import com.google.gwt.user.cellview.client.Column;
+import com.google.gwt.user.cellview.client.TextColumn;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.view.client.AsyncDataProvider;
+import com.google.gwt.view.client.HasData;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.NodeSummary;
+
+public class NodesTableWidget extends Composite {
+ public interface IRefreshRequestHandler {
+ public void refresh();
+ }
+
+ public interface IClickListener {
+ public void click(String nodeId);
+ }
+
+ interface Binder extends UiBinder<Widget, NodesTableWidget> {
+ }
+
+ private final static Binder binder = GWT.create(Binder.class);
+
+ @UiField
+ CellTable<NodeSummary> table;
+
+ private AsyncDataProvider<NodeSummary> nodeSummaryProvider;
+
+ private IRefreshRequestHandler refreshRequestHandler;
+
+ private IClickListener cl;
+
+ public NodesTableWidget() {
+ initWidget(binder.createAndBindUi(this));
+
+ Column<NodeSummary, String> idCol = new Column<NodeSummary, String>(new ClickableTextCell()) {
+ @Override
+ public String getValue(NodeSummary object) {
+ return object.getNodeId();
+ }
+ };
+ idCol.setFieldUpdater(new FieldUpdater<NodeSummary, String>() {
+ @Override
+ public void update(int index, NodeSummary object, String value) {
+ if (cl != null) {
+ cl.click(value);
+ }
+ }
+ });
+ idCol.setSortable(true);
+
+ TextColumn<NodeSummary> heapUsedCol = new TextColumn<NodeSummary>() {
+ @Override
+ public String getValue(NodeSummary object) {
+ return String.valueOf(object.getHeapUsed());
+ }
+ };
+ heapUsedCol.setSortable(true);
+
+ TextColumn<NodeSummary> systemLoadAvgCol = new TextColumn<NodeSummary>() {
+ @Override
+ public String getValue(NodeSummary object) {
+ return String.valueOf(object.getSystemLoadAverage());
+ }
+ };
+ systemLoadAvgCol.setSortable(true);
+
+ table.addColumn(idCol, "Node Id");
+ table.addColumn(heapUsedCol, "Heap Used");
+ table.addColumn(systemLoadAvgCol, "System Load Average");
+
+ nodeSummaryProvider = new AsyncDataProvider<NodeSummary>(NodeSummary.KEY_PROVIDER) {
+ @Override
+ protected void onRangeChanged(HasData<NodeSummary> display) {
+ if (refreshRequestHandler != null) {
+ refreshRequestHandler.refresh();
+ }
+ }
+ };
+ nodeSummaryProvider.addDataDisplay(table);
+ }
+
+ public void setClickListener(IClickListener cl) {
+ this.cl = cl;
+ }
+
+ public AsyncDataProvider<NodeSummary> getDataProvider() {
+ return nodeSummaryProvider;
+ }
+
+ public void setRefreshRequestHandler(IRefreshRequestHandler refreshRequestHandler) {
+ this.refreshRequestHandler = refreshRequestHandler;
+ }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/NodesTableWidget.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/NodesTableWidget.ui.xml
new file mode 100644
index 0000000..9c48d77
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/NodesTableWidget.ui.xml
@@ -0,0 +1,9 @@
+<!DOCTYPE ui:UiBinder
+ SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+ xmlns:ui='urn:ui:com.google.gwt.uibinder'
+ xmlns:g='urn:import:com.google.gwt.user.client.ui'
+ xmlns:c='urn:import:com.google.gwt.user.cellview.client'>
+ <c:CellTable ui:field="table" width="100%"></c:CellTable>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/resources/edu/uci/ics/hyracks/adminconsole/HyracksAdminConsole.gwt.xml b/hyracks-admin-console/src/main/resources/edu/uci/ics/hyracks/adminconsole/HyracksAdminConsole.gwt.xml
new file mode 100644
index 0000000..765ad1b
--- /dev/null
+++ b/hyracks-admin-console/src/main/resources/edu/uci/ics/hyracks/adminconsole/HyracksAdminConsole.gwt.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module rename-to='HyracksAdminConsole'>
+ <!-- Inherit the core Web Toolkit stuff. -->
+ <inherits name='com.google.gwt.user.User' />
+ <inherits name='com.google.gwt.http.HTTP' />
+ <inherits name='com.googlecode.gchart.GChart' />
+
+ <inherits name='com.google.gwt.user.theme.standard.Standard' />
+ <!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
+ <!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/> -->
+
+ <!-- Other module inherits -->
+
+ <!-- Specify the app entry point class. -->
+ <entry-point class='edu.uci.ics.hyracks.adminconsole.client.HyracksAdminConsole' />
+
+ <!-- Specify the paths for translatable code -->
+ <source path='client' />
+
+ <!--set-property name="user.agent" value="safari"></set-property-->
+ <set-configuration-property name="UiBinder.useSafeHtmlTemplates" value="true"/>
+</module>
diff --git a/hyracks-admin-console/src/main/resources/edu/uci/ics/hyracks/adminconsole/client/Messages.properties b/hyracks-admin-console/src/main/resources/edu/uci/ics/hyracks/adminconsole/client/Messages.properties
new file mode 100644
index 0000000..c222555
--- /dev/null
+++ b/hyracks-admin-console/src/main/resources/edu/uci/ics/hyracks/adminconsole/client/Messages.properties
@@ -0,0 +1,2 @@
+sendButton = Send
+nameField = Enter your name
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/webapp/HyracksAdminConsole.css b/hyracks-admin-console/src/main/webapp/HyracksAdminConsole.css
new file mode 100644
index 0000000..7aca7ac
--- /dev/null
+++ b/hyracks-admin-console/src/main/webapp/HyracksAdminConsole.css
@@ -0,0 +1,34 @@
+/** Add css rules here for your application. */
+
+
+/** Example rules used by the template application (remove for your app) */
+h1 {
+ font-size: 2em;
+ font-weight: bold;
+ color: #777777;
+ margin: 40px 0px 70px;
+ text-align: center;
+}
+
+.sendButton {
+ display: block;
+ font-size: 16pt;
+}
+
+/** Most GWT widgets already have a style name defined */
+.gwt-DialogBox {
+ width: 400px;
+}
+
+.dialogVPanel {
+ margin: 5px;
+}
+
+.serverResponseLabelError {
+ color: red;
+}
+
+/** Set ids using widget.getElement().setId("idOfElement") */
+#closeButton {
+ margin: 15px 6px 6px;
+}
diff --git a/hyracks-admin-console/src/main/webapp/HyracksAdminConsole.html b/hyracks-admin-console/src/main/webapp/HyracksAdminConsole.html
new file mode 100644
index 0000000..b909e08
--- /dev/null
+++ b/hyracks-admin-console/src/main/webapp/HyracksAdminConsole.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html>
+ <head>
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+ <link type="text/css" rel="stylesheet" href="HyracksAdminConsole.css">
+ <title>Hyracks Administration Console</title>
+ <script type="text/javascript" language="javascript" src="HyracksAdminConsole/HyracksAdminConsole.nocache.js"></script>
+ </head>
+ <body>
+ <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>
+ <noscript>
+ <div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
+ Your web browser must have JavaScript enabled
+ in order for this application to display correctly.
+ </div>
+ </noscript>
+ </body>
+</html>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/webapp/WEB-INF/web.xml b/hyracks-admin-console/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..8c1ab37
--- /dev/null
+++ b/hyracks-admin-console/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app
+ PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd">
+
+<web-app>
+
+ <!-- Servlets -->
+ <!--servlet>
+ <servlet-name>greetServlet</servlet-name>
+ <servlet-class>edu.uci.ics.hyracks.adminconsole.server.GreetingServiceImpl</servlet-class>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>greetServlet</servlet-name>
+ <url-pattern>/HyracksAdminConsole/greet</url-pattern>
+ </servlet-mapping-->
+
+ <!-- Default page to serve -->
+ <welcome-file-list>
+ <welcome-file>HyracksAdminConsole.html</welcome-file>
+ </welcome-file-list>
+
+</web-app>