From a3397ec4e0e6c70b6caab535173a08bbefb62ef4 Mon Sep 17 00:00:00 2001
From: ludovicp <ludovicp@localhost>
Date: Mon, 31 May 2010 12:03:51 +0000
Subject: [PATCH] Add support for statistics for WorkFlowElements

---
 opends/src/server/org/opends/server/workflowelement/WorkflowElement.java           |   27 ++++++++
 opends/src/server/org/opends/server/workflowelement/WorkflowElementStatistics.java |  113 +++++++++++++++++++++++++++++++++++++
 2 files changed, 139 insertions(+), 1 deletions(-)

diff --git a/opends/src/server/org/opends/server/workflowelement/WorkflowElement.java b/opends/src/server/org/opends/server/workflowelement/WorkflowElement.java
index 70e57c0..4038899 100644
--- a/opends/src/server/org/opends/server/workflowelement/WorkflowElement.java
+++ b/opends/src/server/org/opends/server/workflowelement/WorkflowElement.java
@@ -33,8 +33,11 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import org.opends.server.admin.std.server.MonitorProviderCfg;
 
 import org.opends.server.admin.std.server.WorkflowElementCfg;
+import org.opends.server.api.MonitorProvider;
+import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.Operation;
 import org.opends.server.types.CanceledOperationException;
 
@@ -86,6 +89,8 @@
   private ObservableWorkflowElementStatus observableStatus =
     new ObservableWorkflowElementStatus(this);
 
+  // The statistics exported by the workflow element
+  private MonitorProvider<MonitorProviderCfg> statistics;
 
   /**
    * Provides the observable state of the workflow element.
@@ -275,6 +280,10 @@
   {
     this.workflowElementID = workflowElementID;
     this.workflowElementTypeInfo = workflowElementTypeInfo;
+    this.statistics = this.createStatistics();
+    if (this.statistics != null) {
+      DirectoryServer.registerMonitorProvider(this.statistics);
+    }
   }
 
 
@@ -331,7 +340,11 @@
    */
   public void finalizeWorkflowElement()
   {
-    // No action is required by default.
+    // Deregister the monitor provider.
+    if (this.statistics != null) {
+      DirectoryServer.deregisterMonitorProvider(
+          this.statistics.getMonitorInstanceName());
+    }
   }
 
   /**
@@ -461,4 +474,16 @@
     }
     return false;
   }
+
+  /**
+   * Creates the statistics exposed by the workflow element. By default,
+   * workflow elements do not expose anything but specific implementations
+   * can override this method and provide their own stats.
+   * @return the statistics exposed by the workflow element.
+   */
+  public MonitorProvider<MonitorProviderCfg> createStatistics() {
+    // by default, no stats are created;
+    // This method should be overriden if necessary
+    return null;
+  }
 }
diff --git a/opends/src/server/org/opends/server/workflowelement/WorkflowElementStatistics.java b/opends/src/server/org/opends/server/workflowelement/WorkflowElementStatistics.java
new file mode 100644
index 0000000..6f78877
--- /dev/null
+++ b/opends/src/server/org/opends/server/workflowelement/WorkflowElementStatistics.java
@@ -0,0 +1,113 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2010 Sun Microsystems, Inc.
+ */
+package org.opends.server.workflowelement;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.opends.server.admin.std.server.MonitorProviderCfg;
+import org.opends.server.api.MonitorProvider;
+import org.opends.server.config.ConfigException;
+import org.opends.server.types.Attribute;
+import org.opends.server.types.Attributes;
+import org.opends.server.types.InitializationException;
+
+
+/**
+ * This class implements the statistics associated to a workflow element.
+ * The workflow element provides a saturation index.
+ */
+public class WorkflowElementStatistics
+    extends MonitorProvider<MonitorProviderCfg> {
+
+  // The instance name for this monitor provider instance.
+  private final String instanceName;
+  private final WorkflowElement<?> workflowElement;
+
+  /**
+   * Constructor.
+   * @param workflowElement The workflowElement owning these stats
+   */
+  public WorkflowElementStatistics(WorkflowElement<?> workflowElement)
+  {
+    super(workflowElement.getWorkflowElementID());
+    this.instanceName = workflowElement.getWorkflowElementID();
+    this.workflowElement = workflowElement;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void initializeMonitorProvider(MonitorProviderCfg configuration)
+      throws ConfigException, InitializationException
+  {
+    // No initialization required
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public String getMonitorInstanceName()
+  {
+    return this.instanceName + ",cn=Workflow Elements";
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public long getUpdateInterval()
+  {
+    // This monitor should not run periodically.
+    return -1;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void updateMonitorData()
+  {
+    // No implementation is required since this does not do periodic updates.
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public List<Attribute> getMonitorData()
+  {
+    ArrayList<Attribute> attrs = new ArrayList<Attribute>();
+
+    attrs.add(Attributes.create(
+        "ds-mon-saturation-index",
+        String.valueOf(this.workflowElement.getSaturationIndex())));
+
+    return attrs;
+  }
+}

--
Gitblit v1.10.0