You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oodt.apache.org by ma...@apache.org on 2011/11/10 08:06:04 UTC

svn commit: r1200194 - in /oodt/trunk/webapp/components: ./ src/main/java/org/apache/oodt/pcs/ src/main/java/org/apache/oodt/pcs/webcomponents/ src/main/java/org/apache/oodt/pcs/webcomponents/health/

Author: mattmann
Date: Thu Nov 10 07:06:04 2011
New Revision: 1200194

URL: http://svn.apache.org/viewvc?rev=1200194&view=rev
Log:
- OODT-157: refactor HealthMonitor component into the webapp/components package
            reflow webapp in OPSUI to take advantage of now componentized HealthMonitor widget. Yay.

Added:
    oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/
    oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/
    oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/
    oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.css
    oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.html
    oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.java
    oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/VisibilityAndSortToggler.java
    oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/VisibilityToggler.java
    oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/icon_arrow_down.gif   (with props)
    oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/icon_arrow_up.gif   (with props)
Modified:
    oodt/trunk/webapp/components/pom.xml

Modified: oodt/trunk/webapp/components/pom.xml
URL: http://svn.apache.org/viewvc/oodt/trunk/webapp/components/pom.xml?rev=1200194&r1=1200193&r2=1200194&view=diff
==============================================================================
--- oodt/trunk/webapp/components/pom.xml (original)
+++ oodt/trunk/webapp/components/pom.xml Thu Nov 10 07:06:04 2011
@@ -18,12 +18,12 @@ the License.
 <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>
-        <parent>
-                <groupId>org.apache.oodt</groupId>
-                <artifactId>oodt-core</artifactId>
-                <version>0.4-SNAPSHOT</version>
-                <relativePath>../../core/pom.xml</relativePath>
-        </parent>
+    <parent>
+        <groupId>org.apache.oodt</groupId>
+        <artifactId>oodt-core</artifactId>
+        <version>0.4-SNAPSHOT</version>
+        <relativePath>../../core/pom.xml</relativePath>
+    </parent>
 	<groupId>org.apache.oodt</groupId>
 	<artifactId>oodt-webapp-components</artifactId>
 	<packaging>jar</packaging>
@@ -44,7 +44,12 @@ the License.
 		  <groupId>org.apache.oodt</groupId>
 		  <artifactId>cas-workflow</artifactId>
 		  <version>0.4-SNAPSHOT</version>
-		</dependency>		
+		</dependency>
+		<dependency>	
+		  <groupId>org.apache.oodt</groupId>
+		  <artifactId>pcs-core</artifactId>
+		  <version>${project.parent.version}</version>
+		</dependency>			
 		<dependency>
 			<groupId>org.slf4j</groupId>
 			<artifactId>slf4j-log4j12</artifactId>

Added: oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.css
URL: http://svn.apache.org/viewvc/oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.css?rev=1200194&view=auto
==============================================================================
--- oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.css (added)
+++ oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.css Thu Nov 10 07:06:04 2011
@@ -0,0 +1,69 @@
+
+#widenoborder{
+  width:100%;
+  border:0px;
+}
+
+#fm_status{
+
+}
+
+#wm_status{
+
+}
+
+#rm_status{
+
+}
+
+#report_date{
+
+}
+
+.roundtable table{
+border-top: 2px solid #bbb8a9;
+border-bottom: 2px solid #bbb8a9;
+border-left: 2px solid #bbb8a9;
+border-right: 2px solid #bbb8a9;
+}
+
+.nowrap{
+  white-space:nowrap;
+}
+
+.heading{
+  font-size:14px;
+  font-weight:bold;
+}
+
+.avg_crawl_time{
+
+}
+
+.num_crawls{
+
+}
+
+.crawler_name{
+
+}
+
+.file_ingest_datetime{
+
+}
+
+.file_path{
+
+}
+
+.status_name{
+
+}
+
+.batch_stub_url{
+
+}
+
+.crawler_name_and_url{
+
+}

Added: oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.html
URL: http://svn.apache.org/viewvc/oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.html?rev=1200194&view=auto
==============================================================================
--- oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.html (added)
+++ oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.html Thu Nov 10 07:06:04 2011
@@ -0,0 +1,178 @@
+<wicket:panel>
+<wicket:remove>
+<link rel="stylesheet" type="text/css" href="HealthMonitor.css"/>
+</wicket:remove>
+
+<table id="widenoborder">
+	<tr>
+		<td><font style="font-size:16px;font-weight:bold;">PCS Status</font></td>
+		<td>
+		<table style="text-align:right:">
+			<tr>
+				<td style="text-align:right:">Current Information as of:</td>
+			</tr>
+			<tr>
+				<td style="text-align:right:" wicket:id="report_date" id="report_date">2011-01-01T00:00:00.000Z</td>
+			</tr>
+		</table>
+		</td>
+	</tr>
+	<tr style="vertical-align:top;">
+		<td>
+		<table>
+			<tr>
+				<td><font class="heading">Server Status:</font></td>
+			</tr>
+			<tr>
+				<td>
+				<div class="roundtable">
+				<table style="width:100px;">
+					<tr>
+						<td class="nowrap" id="fm_status">File Manager&nbsp;(<span wicket:id="fmurl">http://localhost:9000</span>)</td>
+						<td><img wicket:id="fmstatus_icon" src="icon_arrow_up.gif"/></td>
+					</tr>
+					<tr>
+						<td class="nowrap" id="wm_status">Wokflow Manager&nbsp;(<span wicket:id="wmurl">http://localhost:9001</span>)</td>
+						<td><img wicket:id="wmstatus_icon" src="icon_arrow_down.gif"></td>
+					</tr>
+					<tr>
+						<td class="nowrap" id="rm_status">Resource Manager&nbsp;(<span wicket:id="rmurl">http://localhost:9002</span>)</td>
+						<td><img wicket:id="rmstatus_icon" src="icon_arrow_down.gif"></td>
+					</tr>
+				</table>
+				</div>
+				</td>
+			</tr>
+			<tr>
+				<td><font class="heading">Crawler Status:</font></td>
+			</tr>
+			<tr>
+				<td>
+				<div class="roundtable">
+				<table>
+				   <tr wicket:id="crawler_status_list">
+				     <td wicket:id="crawler_name_and_url" class="crawler_name_and_url">Local File Crawler (http://localhost:9091)</td>
+				     <td><img wicket:id="crawler_status_icon" src="icon_arrow_up.gif" /></td>
+				   </tr> 	
+				   <wicket:container wicket:id="crawler_toggler">
+				   <wicket:enclosure child="crawler_status_more">			   
+                    <tr>
+                      <td wicket:id="crawler_status_more" colspan="2">... ...</td>
+					</tr>
+					</wicket:enclosure>
+				    <tr id="crawler_status_options">
+					   <td><a wicket:id="crawler_status_showall" href="#">See All</a></td>
+					   <td><a wicket:id="crawler_status_hide" "href="#">Hide</a></td>
+					   <td><a wicket:id="crawler_status_sort" href="#">Sorting By Status</a></td>
+					   <td><a wicket:id="crawler_status_unsort" href="#">Unsort</a></td>
+					</tr>
+					</wicket:container>
+				</table>
+				</div>
+				</td>
+			</tr>
+			<tr>
+				<td><font class="heading">Batch Stub Status:</font></td>
+			</tr>
+			<tr>
+				<td>
+				<div class="roundtable">
+				<table>
+					<tr wicket:id="batch_stub_list">
+						<td class="nowrap"><span wicket:id="batch_stub_url" class="batch_stub_url">http://compute-0-1:2001</span></td>
+						<td><img wicket:id="batch_stub_status_icon" src="icon_arrow_down.gif" /></td>
+				    </tr>
+				    <wicket:container wicket:id="batch_stub_toggler">
+				    <wicket:enclosure child="batch_stub_more">
+				    <tr>
+						<td wicket:id="batch_stub_more" colspan="2">... ...</td></tr><tr>				     
+				    </tr>
+				    </wicket:enclosure>
+					<tr id="batch_stub_options">
+						<td><a wicket:id="batch_stub_showall" href="#">See All</a></td>
+						<td><a wicket:id="batch_stub_hide" href="#">Hide</a></td>
+						<td><a wicket:id="batch_stub_sort" href="#">Sorting By Status</a></td>
+                        <td><a wicket:id="batch_stub_unsort" href="#">Unsort</a></td>
+					</tr>
+					</wicket:container>
+				</table>
+				</div>
+				</td>
+			</tr>
+		</table>
+		</td>
+		<td>
+		<table>
+			<tr>
+				<td><font class="heading">Job Processing Status:</font></td>
+			</tr>
+			<tr>
+				<td>
+				<div class="roundtable">
+				<table style="width:100px;">
+					<tr wicket:id="jobstatus_list">
+					  <td class="nowrap">
+						<span wicket:id="status_name" class="status_name">QUEUED</span> pipelines
+				      </td>
+					  <td style="text-align:right">	
+						<a href="#" wicket:id="jobstatus_count_link"><span id="status_num_jobs" wicket:id="status_num_jobs">250</span></a>
+					  </td>	
+					</tr>
+						<wicket:remove>
+						 <tr><td class="nowrap"><span class="status_name">STARTED</span> pipelines</td><td style="text-align:right"><a href="#">3</a></td></tr>
+						 <tr><td class="nowrap"><span class="status_name">RSUBMIT</span> pipelines</td><td style="text-align:right"><a href="#">45</a></td></tr>
+						 <tr><td class="nowrap"><span class="status_name">PGE_EXEC</span> pipelines</td><td style="text-align:right"><a href="#">1000</a></td></tr>
+						 <tr><td class="nowrap"><span class="status_name">CRAWLING</span> pipelines</td><td style="text-align:right"><a href="#">4</a></td></tr>
+						 <tr><td class="nowrap"><span class="status_name">FINISHED</span> pipelines</td><td style="text-align:right"><a href="#">10000</a></td></tr>
+						</wicket:remove>						
+				</table>
+				</div>
+				</td>
+			</tr>
+			<tr>
+				<td><font class="heading">Latest Files Ingested:</font></td>
+			</tr>
+			<tr>
+				<td>
+				<div class="roundtable">
+				<table>
+                     <tr wicket:id="file_health_list">
+                       <td>
+						<a href="#" wicket:id="view_product_link"><span wicket:id="file_path" class="file_path">/data/archive/products/file1.txt</span></a> at <span wicket:id="file_ingest_datetime" class="file_ingest_datetime">2011-01-01T00:01:01.001Z</span>
+					   </td>
+					 </tr>
+				</table>
+				</div>
+				</td>
+			</tr>
+			<tr>
+				<td><font class="heading">Crawler Statistics:</font></td>
+			</tr>
+			<tr>
+				<td>
+				<div class="roundtable">
+				<table>
+					 <tr wicket:id="crawler_health_list">
+						<td class="nowrap" colspan="2"><span wicket:id="crawler_name" class="crawler_name">Local File Crawler</span> Number of Crawls: <span wicket:id="num_crawls" class="num_crawls">32</span> Avg Time: <span wicket:id="avg_crawl_time" class="avg_crawl_time">5</span> sec
+						</td>
+					   </tr>
+					<wicket:container wicket:id="crawler_health_toggler">
+					<wicket:enclosure child="crawler_health_more">
+				    <tr>
+						<td colspan="2" wicket:id="crawler_health_more">... ...</td>
+				    </tr>
+				    </wicket:enclosure>
+				    <tr>
+						<td><a wicket:id="crawler_health_showall" href="#">See All</a></td>
+						<td><a wicket:id="crawler_health_hide" href="#">Hide</a></td>
+					</tr>
+					</wicket:container>
+				</table>
+				</div>
+				</td>
+			</tr>
+		</table>
+		</td>
+	</tr>
+</table>
+</wicket:panel>
\ No newline at end of file

Added: oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.java
URL: http://svn.apache.org/viewvc/oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.java?rev=1200194&view=auto
==============================================================================
--- oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.java (added)
+++ oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/HealthMonitor.java Thu Nov 10 07:06:04 2011
@@ -0,0 +1,232 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.oodt.pcs.webcomponents.health;
+
+//JDK imports
+import java.util.List;
+
+//OODT imports
+import org.apache.oodt.cas.filemgr.metadata.CoreMetKeys;
+import org.apache.oodt.cas.filemgr.structs.Product;
+import org.apache.oodt.cas.metadata.Metadata;
+import org.apache.oodt.pcs.health.CrawlerHealth;
+import org.apache.oodt.pcs.health.CrawlerStatus;
+import org.apache.oodt.pcs.health.JobHealthStatus;
+import org.apache.oodt.pcs.health.PCSDaemonStatus;
+import org.apache.oodt.pcs.health.PCSHealthMonitorReport;
+import org.apache.oodt.pcs.tools.PCSHealthMonitor;
+import org.apache.oodt.pcs.util.FileManagerUtils;
+
+//Wicket imports
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.ResourceReference;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.image.Image;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.util.ListModel;
+
+/**
+ * 
+ * A wicket controller for exposing the super awesome power of the
+ * {@link PCSHealthMonitor}.
+ * 
+ * @author mattmann
+ * @version $Revision$
+ * 
+ */
+public class HealthMonitor extends Panel {
+
+  /**
+   * @param parameters
+   * @throws InstantiationException
+   */
+  public HealthMonitor(String id, String fmUrlStr, String wmUrlStr,
+      String rmUrlStr, String crawlerConfFilePath, String statesFilePath,
+      final Class<? extends WebPage> productBrowser,
+      final Class<? extends WebPage> instancesPage)
+      throws InstantiationException {
+    super(id);
+    PCSHealthMonitor mon = new PCSHealthMonitor(fmUrlStr, wmUrlStr, rmUrlStr,
+        crawlerConfFilePath, statesFilePath);
+    final PCSHealthMonitorReport report = mon.getReport();
+
+    add(new Label("report_date", report.getCreateDateIsoFormat()));
+    add(new Label("fmurl", report.getFmStatus().getUrlStr()));
+    add(new Label("wmurl", report.getWmStatus().getUrlStr()));
+    add(new Label("rmurl", report.getRmStatus().getUrlStr()));
+
+    add(new Image("fmstatus_icon", getUpOrDownArrowRef(report.getFmStatus()
+        .getStatus())));
+    add(new Image("wmstatus_icon", getUpOrDownArrowRef(report.getWmStatus()
+        .getStatus())));
+    add(new Image("rmstatus_icon", getUpOrDownArrowRef(report.getRmStatus()
+        .getStatus())));
+
+    ListModel crawlerStatusListModel = new ListModel(report.getCrawlerStatus());
+    add(new VisibilityAndSortToggler("crawler_toggler",
+        "crawler_status_showall", "crawler_status_hide", "crawler_status_sort",
+        "crawler_status_unsort", "crawler_status_more", crawlerStatusListModel));
+
+    add(new ListView<CrawlerStatus>("crawler_status_list",
+        crawlerStatusListModel) {
+      /*
+       * (non-Javadoc)
+       * 
+       * @see
+       * org.apache.wicket.markup.html.list.ListView#populateItem(org.apache
+       * .wicket.markup.html.list.ListItem)
+       */
+      @Override
+      protected void populateItem(ListItem<CrawlerStatus> statusItem) {
+        CrawlerStatus status = statusItem.getModelObject();
+        String statusString = status.getInfo().getCrawlerName() + " ("
+            + status.getCrawlHost() + ":" + status.getInfo().getCrawlerPort()
+            + ")";
+        statusItem.add(new Label("crawler_name_and_url", statusString));
+        statusItem.add(new Image("crawler_status_icon",
+            getUpOrDownArrowRef(status.getStatus())));
+      }
+    });
+
+    ListModel batchStubStatusListModel = new ListModel(
+        report.getBatchStubStatus());
+    add(new VisibilityAndSortToggler("batch_stub_toggler",
+        "batch_stub_showall", "batch_stub_hide", "batch_stub_sort",
+        "batch_stub_unsort", "batch_stub_more", batchStubStatusListModel));
+
+    add(new ListView<PCSDaemonStatus>("batch_stub_list",
+        batchStubStatusListModel) {
+
+      @Override
+      protected void populateItem(ListItem<PCSDaemonStatus> item) {
+        item.add(new Label("batch_stub_url", item.getModelObject().getUrlStr()));
+        item.add(new Image("batch_stub_status_icon", getUpOrDownArrowRef(item
+            .getModelObject().getStatus())));
+
+      }
+    });
+
+    List<JobHealthStatus> jobHealthStatusList = report.getJobHealthStatus();
+    add(new ListView<JobHealthStatus>("jobstatus_list", jobHealthStatusList) {
+      /*
+       * (non-Javadoc)
+       * 
+       * @see
+       * org.apache.wicket.markup.html.list.ListView#populateItem(org.apache
+       * .wicket.markup.html.list.ListItem)
+       */
+      @Override
+      protected void populateItem(final ListItem<JobHealthStatus> item) {
+        item.add(new Label("status_name", item.getModelObject().getStatus()));
+        Link<String> countLink = new Link<String>("jobstatus_count_link",
+            new Model<String>(item.getModelObject().getStatus())) {
+
+          @Override
+          public void onClick() {
+            PageParameters params = new PageParameters();
+            params.add("pageNum", "1");
+            params.add("status", getModelObject());
+            setResponsePage(instancesPage, params);
+          }
+        };
+        countLink.add(new Label("status_num_jobs", String.valueOf(item
+            .getModelObject().getNumPipelines())));
+        item.add(countLink);
+      }
+    });
+
+    List<Product> prodList = report.getLatestProductsIngested();
+    final FileManagerUtils fm = new FileManagerUtils(fmUrlStr);
+
+    add(new ListView<Product>("file_health_list", prodList) {
+      /*
+       * (non-Javadoc)
+       * 
+       * @see
+       * org.apache.wicket.markup.html.list.ListView#populateItem(org.apache
+       * .wicket.markup.html.list.ListItem)
+       */
+      @Override
+      protected void populateItem(ListItem<Product> item) {
+        final Product product = item.getModelObject();
+        product.setProductType(fm.safeGetProductTypeById(product
+            .getProductType().getProductTypeId()));
+        product.setProductReferences(fm.safeGetProductReferences(product));
+        final Metadata prodMet = fm.safeGetMetadata(product);
+        final String filePath = fm.getFilePath(product);
+
+        Link link = new Link("view_product_link") {
+          /*
+           * (non-Javadoc)
+           * 
+           * @see org.apache.wicket.markup.html.link.Link#onClick()
+           */
+          @Override
+          public void onClick() {
+            PageParameters params = new PageParameters();
+            params.add("id", product.getProductId());
+            setResponsePage(productBrowser, params);
+          }
+        };
+
+        link.add(new Label("file_path", filePath));
+        item.add(link);
+        item.add(new Label("file_ingest_datetime", prodMet.getMetadata("CAS."
+            + CoreMetKeys.PRODUCT_RECEVIED_TIME)));
+
+      }
+    });
+
+    ListModel crawlerHealthListModel = new ListModel(
+        report.getCrawlerHealthStatus());
+    add(new VisibilityToggler("crawler_health_toggler",
+        "crawler_health_showall", "crawler_health_hide", "crawler_health_more",
+        crawlerHealthListModel));
+
+    add(new ListView<CrawlerHealth>("crawler_health_list",
+        crawlerHealthListModel) {
+      /*
+       * (non-Javadoc)
+       * 
+       * @see
+       * org.apache.wicket.markup.html.list.ListView#populateItem(org.apache
+       * .wicket.markup.html.list.ListItem)
+       */
+      @Override
+      protected void populateItem(ListItem<CrawlerHealth> item) {
+        CrawlerHealth health = item.getModelObject();
+        item.add(new Label("crawler_name", health.getCrawlerName()));
+        item.add(new Label("num_crawls", String.valueOf(health.getNumCrawls())));
+        item.add(new Label("avg_crawl_time", String.valueOf(health
+            .getAvgCrawlTime())));
+      }
+    });
+
+  }
+
+  private ResourceReference getUpOrDownArrowRef(String status) {
+    return new ResourceReference(HealthMonitor.class, "icon_arrow_"
+        + status.toLowerCase() + ".gif");
+  }
+
+}

Added: oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/VisibilityAndSortToggler.java
URL: http://svn.apache.org/viewvc/oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/VisibilityAndSortToggler.java?rev=1200194&view=auto
==============================================================================
--- oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/VisibilityAndSortToggler.java (added)
+++ oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/VisibilityAndSortToggler.java Thu Nov 10 07:06:04 2011
@@ -0,0 +1,143 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.oodt.pcs.webcomponents.health;
+
+//JDK imports
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Vector;
+
+//OODT imports
+import org.apache.oodt.pcs.health.CrawlerStatus;
+import org.apache.oodt.pcs.health.PCSDaemonStatus;
+
+//Wicket imports
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.util.ListModel;
+
+/**
+ * 
+ * Toggles both a show/hide link and a sort/unsort link for displaying
+ * PCSDaemonStatus and CrawlerStatus in the PCS OPSUI gui.
+ * 
+ * @author mattmann
+ * @version $Revision$
+ * 
+ */
+class VisibilityAndSortToggler extends VisibilityToggler {
+
+  private static final long serialVersionUID = 9003502303473741937L;
+
+  /**
+   * @param id
+   */
+  public VisibilityAndSortToggler(String id, String showLinkId,
+      String hideLinkId, String sortLinkId, String unsortLinkId, String moreId,
+      final ListModel model) {
+    super(id, showLinkId, hideLinkId, moreId, model);
+
+    Link<Link> sortLink = null;
+    Link<Link> unsortLink = null;
+
+    sortLink = new Link<Link>(sortLinkId, new Model<Link>(unsortLink)) {
+      /*
+       * (non-Javadoc)
+       * 
+       * @see org.apache.wicket.markup.html.link.Link#onClick()
+       */
+      @Override
+      public void onClick() {
+        Vector obj = (Vector) model.getObject();
+        sortByStatus(obj);
+        model.setObject(obj);
+        getModelObject().setVisible(true);
+        setVisible(false);
+      }
+    };
+
+    unsortLink = new Link<Link>(unsortLinkId, new Model<Link>(sortLink)) {
+      /*
+       * (non-Javadoc)
+       * 
+       * @see org.apache.wicket.markup.html.link.Link#onClick()
+       */
+      @Override
+      public void onClick() {
+        Vector obj = (Vector) model.getObject();
+        sortByName(obj);
+        model.setObject(obj);
+        getModelObject().setVisible(true);
+        setVisible(false);
+      }
+    };
+
+    unsortLink.setVisible(false);
+    sortLink.setModelObject(unsortLink);
+    unsortLink.setModelObject(sortLink);
+
+    add(sortLink);
+    add(unsortLink);
+
+  }
+
+  private static void sortByStatus(List statusList) {
+    Collections.sort(statusList, new Comparator() {
+
+      public int compare(Object o1, Object o2) {
+        if (o1 instanceof CrawlerStatus) {
+          CrawlerStatus stat1 = (CrawlerStatus) o1;
+          CrawlerStatus stat2 = (CrawlerStatus) o2;
+
+          return stat1.getStatus().compareTo(stat2.getStatus());
+        } else if (o1 instanceof PCSDaemonStatus) {
+          PCSDaemonStatus stat1 = (PCSDaemonStatus) o1;
+          PCSDaemonStatus stat2 = (PCSDaemonStatus) o2;
+
+          return stat1.getStatus().compareTo(stat2.getStatus());
+        } else
+          return 0;
+      }
+
+    });
+  }
+
+  private static void sortByName(List statusList) {
+    Collections.sort(statusList, new Comparator() {
+
+      public int compare(Object o1, Object o2) {
+        if (o1 instanceof CrawlerStatus) {
+          CrawlerStatus stat1 = (CrawlerStatus) o1;
+          CrawlerStatus stat2 = (CrawlerStatus) o2;
+
+          return stat1.getInfo().getCrawlerName()
+              .compareTo(stat2.getInfo().getCrawlerName());
+        } else if (o1 instanceof PCSDaemonStatus) {
+          PCSDaemonStatus stat1 = (PCSDaemonStatus) o1;
+          PCSDaemonStatus stat2 = (PCSDaemonStatus) o2;
+
+          return stat1.getDaemonName().compareTo(stat2.getDaemonName());
+        } else
+          return 0;
+      }
+
+    });
+  }
+
+}

Added: oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/VisibilityToggler.java
URL: http://svn.apache.org/viewvc/oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/VisibilityToggler.java?rev=1200194&view=auto
==============================================================================
--- oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/VisibilityToggler.java (added)
+++ oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/VisibilityToggler.java Thu Nov 10 07:06:04 2011
@@ -0,0 +1,122 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.oodt.pcs.webcomponents.health;
+
+//JDK imports
+import java.util.List;
+import java.util.Vector;
+
+//Wicket imports
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.util.ListModel;
+
+/**
+ * 
+ * Toggles a show/hide link for displaying PCSDaemonStatus and CrawlerStatus in
+ * the PCS OPSUI gui.
+ * 
+ * @author mattmann
+ * @version $Revision$
+ * 
+ */
+public class VisibilityToggler extends WebMarkupContainer {
+
+  private static final long serialVersionUID = -6325486547078308461L;
+
+  /**
+   * @param id
+   */
+  public VisibilityToggler(String id, String showLinkId, String hideLinkId,
+      String moreId, final ListModel model) {
+    super(id, model);
+
+    Link<Link> showLink = null;
+    Link<Link> hideLink = null;
+    final Vector allStatusList = (Vector) ((Vector) model.getObject()).clone();
+
+    // subset the model
+    model.setObject(subsetModelObject(model.getObject()));
+    final WebMarkupContainer moreComponent = new WebMarkupContainer(moreId);
+    add(moreComponent);
+
+    showLink = new Link<Link>(showLinkId, new Model<Link>(hideLink)) {
+      /*
+       * (non-Javadoc)
+       * 
+       * @see org.apache.wicket.markup.html.link.Link#onClick()
+       */
+      @Override
+      public void onClick() {
+        Vector obj = (Vector) model.getObject();
+        obj.clear();
+        obj.addAll(allStatusList);
+        model.setObject(obj);
+        moreComponent.setVisible(false);
+        getModelObject().setVisible(true);
+        setVisible(false);
+      }
+    };
+
+    hideLink = new Link<Link>(hideLinkId, new Model<Link>(showLink)) {
+      /*
+       * (non-Javadoc)
+       * 
+       * @see org.apache.wicket.markup.html.link.Link#onClick()
+       */
+      @Override
+      public void onClick() {
+        Vector obj = (Vector) model.getObject();
+        obj.clear();
+        obj.addAll(getTopN(allStatusList, 3));
+        model.setObject(obj);
+        getModelObject().setVisible(true);
+        setVisible(false);
+        moreComponent.setVisible(true);
+      }
+    };
+
+    hideLink.setVisible(false);
+    showLink.setModelObject(hideLink);
+    hideLink.setModelObject(showLink);
+
+    add(showLink);
+    add(hideLink);
+  }
+
+  private static List subsetModelObject(Object obj) {
+    List objList = (List) obj;
+    List subsetList = getTopN(objList, 3);
+    return subsetList;
+  }
+
+  private static List getTopN(List statuses, int topN) {
+    List subset = new Vector();
+    if (statuses != null && statuses.size() > 0) {
+      int numGobble = topN <= statuses.size() ? topN : statuses.size();
+      for (int i = 0; i < numGobble; i++) {
+        Object status = statuses.get(i);
+        subset.add(status);
+      }
+    }
+
+    return subset;
+  }
+
+}

Added: oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/icon_arrow_down.gif
URL: http://svn.apache.org/viewvc/oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/icon_arrow_down.gif?rev=1200194&view=auto
==============================================================================
Binary file - no diff available.

Propchange: oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/icon_arrow_down.gif
------------------------------------------------------------------------------
    svn:executable = *

Propchange: oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/icon_arrow_down.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/icon_arrow_up.gif
URL: http://svn.apache.org/viewvc/oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/icon_arrow_up.gif?rev=1200194&view=auto
==============================================================================
Binary file - no diff available.

Propchange: oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/icon_arrow_up.gif
------------------------------------------------------------------------------
    svn:executable = *

Propchange: oodt/trunk/webapp/components/src/main/java/org/apache/oodt/pcs/webcomponents/health/icon_arrow_up.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream