Merge pull request #654 from timl/fix_ttl_order
[collectd.git] / bindings / java / org / collectd / java / GenericJMXConfMBean.java
index eea2d8a..64a53ac 100644 (file)
@@ -1,35 +1,40 @@
-/*
- * collectd/java - org/collectd/java/GenericJMXConfMBean.java
- * Copyright (C) 2009  Florian octo Forster
+/**
+ * collectd - bindings/java/org/collectd/java/GenericJMXConfMBean.java
+ * Copyright (C) 2009,2010  Florian octo Forster
  *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; only version 2 of the License is applicable.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
  *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
  *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  *
  * Authors:
- *   Florian octo Forster <octo at verplant.org>
+ *   Florian octo Forster <octo at collectd.org>
  */
 
 package org.collectd.java;
 
-import java.util.List;
 import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
 import java.util.ArrayList;
 
 import javax.management.MBeanServerConnection;
 import javax.management.ObjectName;
 import javax.management.MalformedObjectNameException;
 
-
 import org.collectd.api.Collectd;
 import org.collectd.api.PluginData;
 import org.collectd.api.OConfigValue;
@@ -39,7 +44,8 @@ class GenericJMXConfMBean
 {
   private String _name; /* name by which this mapping is referenced */
   private ObjectName _obj_name;
-  private String _instance;
+  private String _instance_prefix;
+  private List<String> _instance_from;
   private List<GenericJMXConfValue> _values;
 
   private String getConfigString (OConfigItem ci) /* {{{ */
@@ -68,8 +74,9 @@ class GenericJMXConfMBean
 
 /*
  * <MBean "alias name">
- *   Instance "foobar"
  *   ObjectName "object name"
+ *   InstancePrefix "foobar"
+ *   InstanceFrom "name"
  *   <Value />
  *   <Value />
  *   :
@@ -87,6 +94,8 @@ class GenericJMXConfMBean
             + "MBean blocks need exactly one string argument."));
 
     this._obj_name = null;
+    this._instance_prefix = null;
+    this._instance_from = new ArrayList<String> ();
     this._values = new ArrayList<GenericJMXConfValue> ();
 
     children = ci.getChildren ();
@@ -97,13 +106,7 @@ class GenericJMXConfMBean
 
       Collectd.logDebug ("GenericJMXConfMBean: child.getKey () = "
           + child.getKey ());
-      if (child.getKey ().equalsIgnoreCase ("Instance"))
-      {
-        String tmp = getConfigString (child);
-        if (tmp != null)
-          this._instance = tmp;
-      }
-      else if (child.getKey ().equalsIgnoreCase ("ObjectName"))
+      if (child.getKey ().equalsIgnoreCase ("ObjectName"))
       {
         String tmp = getConfigString (child);
         if (tmp == null)
@@ -119,6 +122,18 @@ class GenericJMXConfMBean
                 + tmp, e));
         }
       }
+      else if (child.getKey ().equalsIgnoreCase ("InstancePrefix"))
+      {
+        String tmp = getConfigString (child);
+        if (tmp != null)
+          this._instance_prefix = tmp;
+      }
+      else if (child.getKey ().equalsIgnoreCase ("InstanceFrom"))
+      {
+        String tmp = getConfigString (child);
+        if (tmp != null)
+          this._instance_from.add (tmp);
+      }
       else if (child.getKey ().equalsIgnoreCase ("Value"))
       {
         GenericJMXConfValue cv;
@@ -139,17 +154,89 @@ class GenericJMXConfMBean
 
   } /* }}} GenericJMXConfMBean (OConfigItem ci) */
 
-  public String getName ()
+  public String getName () /* {{{ */
   {
     return (this._name);
-  }
+  } /* }}} */
 
-  public void query (MBeanServerConnection conn, PluginData pd) /* {{{ */
+  public int query (MBeanServerConnection conn, PluginData pd, /* {{{ */
+      String instance_prefix)
   {
-    pd.setPluginInstance ((this._instance != null) ? this._instance : "");
+    Set<ObjectName> names;
+    Iterator<ObjectName> iter;
+
+    try
+    {
+      names = conn.queryNames (this._obj_name, /* query = */ null);
+    }
+    catch (Exception e)
+    {
+      Collectd.logError ("GenericJMXConfMBean: queryNames failed: " + e);
+      return (-1);
+    }
+
+    if (names.size () == 0)
+    {
+      Collectd.logWarning ("GenericJMXConfMBean: No MBean matched "
+          + "the ObjectName " + this._obj_name);
+    }
+
+    iter = names.iterator ();
+    while (iter.hasNext ())
+    {
+      ObjectName   objName;
+      PluginData   pd_tmp;
+      List<String> instanceList;
+      StringBuffer instance;
+
+      objName      = iter.next ();
+      pd_tmp       = new PluginData (pd);
+      instanceList = new ArrayList<String> ();
+      instance     = new StringBuffer ();
+
+      Collectd.logDebug ("GenericJMXConfMBean: objName = "
+          + objName.toString ());
+
+      for (int i = 0; i < this._instance_from.size (); i++)
+      {
+        String propertyName;
+        String propertyValue;
+
+        propertyName = this._instance_from.get (i);
+        propertyValue = objName.getKeyProperty (propertyName);
+        if (propertyValue == null)
+        {
+          Collectd.logError ("GenericJMXConfMBean: "
+              + "No such property in object name: " + propertyName);
+        }
+        else
+        {
+          instanceList.add (propertyValue);
+        }
+      }
+
+      if (instance_prefix != null)
+        instance.append (instance_prefix);
+
+      if (this._instance_prefix != null)
+        instance.append (this._instance_prefix);
+
+      for (int i = 0; i < instanceList.size (); i++)
+      {
+        if (i > 0)
+          instance.append ("-");
+        instance.append (instanceList.get (i));
+      }
+
+      pd_tmp.setPluginInstance (instance.toString ());
+
+      Collectd.logDebug ("GenericJMXConfMBean: instance = " + instance.toString ());
+
+      for (int i = 0; i < this._values.size (); i++)
+        this._values.get (i).query (conn, objName, pd_tmp);
+    }
 
-    for (int i = 0; i < this._values.size (); i++)
-      this._values.get (i).query (conn, this._obj_name, pd);
+    return (0);
   } /* }}} void query */
 }