Author: mattmann
Date: Mon Nov  7 21:56:11 2011
New Revision: 1198964

URL: http://svn.apache.org/viewvc?rev=1198964&view=rev
Log:
- progress towards OODT-157: PCS Operator User Interface web application
  - fully done with Status page (show/hide, and sort/unsort all work)
  - tested
  
- onto frame, and Configuration/Resource monitoring, almost done!

Added:
    
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/VisibilityAndSortToggler.java
    
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/VisibilityToggler.java
Modified:
    oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/OpsuiApp.java
    
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/StatusPage.html
    
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/StatusPage.java

Modified: 
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/OpsuiApp.java
URL: 
http://svn.apache.org/viewvc/oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/OpsuiApp.java?rev=1198964&r1=1198963&r2=1198964&view=diff
==============================================================================
--- oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/OpsuiApp.java 
(original)
+++ oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/OpsuiApp.java 
Mon Nov  7 21:56:11 2011
@@ -18,7 +18,7 @@
 package org.apache.oodt.pcs.opsui;
 
 //OODT imports
-import java.util.Arrays;
+import java.io.Serializable;
 import java.util.List;
 import java.util.Vector;
 
@@ -44,7 +44,9 @@ import org.apache.wicket.request.target.
  * @version $Revision$
  * 
  */
-public class OpsuiApp extends WebApplication {
+public class OpsuiApp extends WebApplication implements Serializable{
+  
+  private static final long serialVersionUID = 1403288657369282259L;
 
   public OpsuiApp() {
     MixedParamUrlCodingStrategy types = new MixedParamUrlCodingStrategy(

Modified: 
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/StatusPage.html
URL: 
http://svn.apache.org/viewvc/oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/StatusPage.html?rev=1198964&r1=1198963&r2=1198964&view=diff
==============================================================================
--- 
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/StatusPage.html
 (original)
+++ 
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/StatusPage.html
 Mon Nov  7 21:56:11 2011
@@ -53,16 +53,20 @@
                                   <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> 
+                                  </tr>        
+                                  <wicket:container 
wicket:id="crawler_toggler">
+                                  <wicket:enclosure 
child="crawler_status_more">                          
                     <tr>
-                      <td colspan="2">... ...</td>
+                      <td wicket:id="crawler_status_more" colspan="2">... 
...</td>
                                        </tr>
-                                   <tr>
-                                          <td><a 
href="javascript:toggleOn('crawlerShowAll');">See All</a></td>
-                                          <td><a 
href="javascript:toggleOff('crawlerShowAll');">Hide</a></td>
-                                          <td><a 
href="javascript:toggleOn('crawlerSort');">Sorting By Status</a></td>
-                                          <td><a 
href="javascript:toggleOff('crawlerSort');">Unsort</a></td>
+                                       </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>
@@ -78,13 +82,19 @@
                                                <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>
-                                       <tr>
-                                               <td colspan="2">... 
...</td></tr><tr>
-                                               <td><a 
href="javascript:toggleOn('batchStubShowAll');">See All</a></td>
-                                               <td><a 
href="javascript:toggleOff('batchStubShowAll');">Hide</a></td>
-                                               <td><a 
href="javascript:toggleOn('batchStubSort');">Sorting By Status</a></td>
-                        <td><a 
href="javascript:toggleOff('batchStubSort');">Unsort</a></td>
+                                   <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>
@@ -142,15 +152,21 @@
                                <td>
                                <div class="roundtable">
                                <table>
-                                        <tr>
-                                               <td class="nowrap"><span 
class="crawler_name">Local File Crawler</span> Number of Crawls: <span 
class="num_crawls">32</span> Avg Time: <span class="avg_crawl_time">5 sec</span>
+                                        <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 colspan="2">... 
...</td></tr><tr>
-                                               <td colspan="2"><a 
href="javascript:toggleOn('crawlerHealthShowAll');">See All</a></td>
-                                               <td colspan="2"><a 
href="javascript:toggleOff('crawlerHealthShowAll');">Hide</a></td>
+                                               <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>

Modified: 
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/StatusPage.java
URL: 
http://svn.apache.org/viewvc/oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/StatusPage.java?rev=1198964&r1=1198963&r2=1198964&view=diff
==============================================================================
--- 
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/StatusPage.java
 (original)
+++ 
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/StatusPage.java
 Mon Nov  7 21:56:11 2011
@@ -18,16 +18,14 @@
 package org.apache.oodt.pcs.opsui.status;
 
 //JDK imports
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
-import java.util.Vector;
 
 //OODT imports
 import org.apache.oodt.cas.filemgr.metadata.CoreMetKeys;
 import org.apache.oodt.cas.filemgr.structs.Product;
 import org.apache.oodt.pcs.opsui.ProductBrowserPage;
 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;
@@ -47,10 +45,12 @@ import org.apache.wicket.markup.html.lin
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.model.util.ListModel;
 
 /**
  * 
- * Describe your class here.
+ * A wicket controller for exposing the super awesome power of 
+ * the {@link PCSHealthMonitor}.
  * 
  * @author mattmann
  * @version $Revision$
@@ -73,7 +73,7 @@ public class StatusPage extends BasePage
     String statesFilePath = app.getStatesFilePath();
     PCSHealthMonitor mon = new PCSHealthMonitor(fmUrlStr, wmUrlStr, rmUrlStr,
         crawlerConfFilePath, statesFilePath);
-    PCSHealthMonitorReport report = mon.getReport();
+    final PCSHealthMonitorReport report = mon.getReport();
 
     add(new Label("report_date", report.getCreateDateIsoFormat()));
     add(new Label("fmurl", report.getFmStatus().getUrlStr()));
@@ -87,8 +87,13 @@ public class StatusPage extends BasePage
     add(new Image("rmstatus_icon", getUpOrDownArrowRef(report.getRmStatus()
         .getStatus())));
 
-    List<CrawlerStatus> crawlerStatusList = report.getCrawlerStatus();
-    add(new ListView<CrawlerStatus>("crawler_status_list", crawlerStatusList) {
+    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)
        * 
@@ -108,8 +113,14 @@ public class StatusPage extends BasePage
       }
     });
 
-    List<PCSDaemonStatus> batchStubStatusList = report.getBatchStubStatus();
-    add(new ListView<PCSDaemonStatus>("batch_stub_list", batchStubStatusList) {
+    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) {
@@ -191,45 +202,36 @@ public class StatusPage extends BasePage
       }
     });
 
-  }
-
-  private ResourceReference getUpOrDownArrowRef(String status) {
-    return new ResourceReference(StatusPage.class, "icon_arrow_"
-        + status.toLowerCase() + ".gif");
-  }
+    ListModel crawlerHealthListModel = new ListModel(
+        report.getCrawlerHealthStatus());
+    add(new VisibilityToggler("crawler_health_toggler",
+        "crawler_health_showall", "crawler_health_hide", "crawler_health_more",
+        crawlerHealthListModel));
 
-  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);
+    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())));
       }
-    }
+    });
 
-    return subset;
   }
 
-  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 ResourceReference getUpOrDownArrowRef(String status) {
+    return new ResourceReference(StatusPage.class, "icon_arrow_"
+        + status.toLowerCase() + ".gif");
   }
 
 }

Added: 
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/VisibilityAndSortToggler.java
URL: 
http://svn.apache.org/viewvc/oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/VisibilityAndSortToggler.java?rev=1198964&view=auto
==============================================================================
--- 
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/VisibilityAndSortToggler.java
 (added)
+++ 
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/VisibilityAndSortToggler.java
 Mon Nov  7 21:56:11 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.opsui.status;
+
+//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/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/VisibilityToggler.java
URL: 
http://svn.apache.org/viewvc/oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/VisibilityToggler.java?rev=1198964&view=auto
==============================================================================
--- 
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/VisibilityToggler.java
 (added)
+++ 
oodt/trunk/pcs/opsui/src/main/java/org/apache/oodt/pcs/opsui/status/VisibilityToggler.java
 Mon Nov  7 21:56:11 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.opsui.status;
+
+//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;
+  }
+
+}


Reply via email to