You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2013/10/22 18:17:12 UTC

svn commit: r1534693 - in /sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl: AttributeResource.java AttributesResource.java JMXResourceProvider.java MBeanResource.java

Author: cziegeler
Date: Tue Oct 22 16:17:12 2013
New Revision: 1534693

URL: http://svn.apache.org/r1534693
Log:
SLING-3200 : Avoid duplicated requests to mbeans when creating resources

Modified:
    sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/AttributeResource.java
    sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/AttributesResource.java
    sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/JMXResourceProvider.java
    sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/MBeanResource.java

Modified: sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/AttributeResource.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/AttributeResource.java?rev=1534693&r1=1534692&r2=1534693&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/AttributeResource.java (original)
+++ sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/AttributeResource.java Tue Oct 22 16:17:12 2013
@@ -32,8 +32,6 @@ import java.util.Set;
 import java.util.TreeMap;
 
 import javax.management.MBeanAttributeInfo;
-import javax.management.MBeanServer;
-import javax.management.ObjectName;
 import javax.management.openmbean.CompositeData;
 import javax.management.openmbean.CompositeType;
 import javax.management.openmbean.TabularData;
@@ -56,18 +54,25 @@ public class AttributeResource extends A
 
     private final MBeanAttributeInfo info;
 
-    private final MBeanServer server;
+    private final Object attrValue;
 
-    private final ObjectName on;
+    private final AttributesResource parent;
 
-    public AttributeResource(final MBeanServer server,
-                             final ObjectName on,
-                             final ResourceResolver resolver, final String p, final MBeanAttributeInfo mai) {
+    public AttributeResource(final ResourceResolver resolver,
+                             final String path,
+                             final MBeanAttributeInfo info,
+                             final Object value,
+                             final AttributesResource parent) {
         this.resourceResolver = resolver;
-        this.path = p;
-        this.info = mai;
-        this.on = on;
-        this.server = server;
+        this.path = path;
+        this.info = info;
+        this.attrValue = value;
+        this.parent = parent;
+    }
+
+    @Override
+    public Resource getParent() {
+        return this.parent;
     }
 
     /**
@@ -127,7 +132,7 @@ public class AttributeResource extends A
         result.put(Constants.PROP_TYPE, info.getType());
 
         try {
-            final Object value = server.getAttribute(this.on, info.getName());
+            final Object value = attrValue;
             if ( value != null ) {
                 if ( value.getClass().isArray() ) {
                     final int length = Array.getLength(value);
@@ -190,7 +195,7 @@ public class AttributeResource extends A
 
     private Map<String, Object> convertData() {
         try {
-            final Object value = server.getAttribute(this.on, info.getName());
+            final Object value = attrValue;
 
             if ( value instanceof TabularData ) {
                 return convertObject((TabularData)value);

Modified: sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/AttributesResource.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/AttributesResource.java?rev=1534693&r1=1534692&r2=1534693&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/AttributesResource.java (original)
+++ sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/AttributesResource.java Tue Oct 22 16:17:12 2013
@@ -22,6 +22,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.sling.api.resource.AbstractResource;
+import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceMetadata;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ValueMap;
@@ -35,10 +36,17 @@ public class AttributesResource extends 
 
     private final ResourceMetadata metadata = new ResourceMetadata();
 
-    public AttributesResource(final ResourceResolver resolver, final String p) {
+    private final MBeanResource parent;
+
+    public AttributesResource(final ResourceResolver resolver, final String p, final MBeanResource parent) {
         this.resourceResolver = resolver;
         this.path = p;
+        this.parent = parent;
+    }
 
+    @Override
+    public Resource getParent() {
+        return this.parent;
     }
 
     /**

Modified: sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/JMXResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/JMXResourceProvider.java?rev=1534693&r1=1534692&r2=1534693&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/JMXResourceProvider.java (original)
+++ sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/JMXResourceProvider.java Tue Oct 22 16:17:12 2013
@@ -23,8 +23,8 @@ import java.lang.management.ManagementFa
 import java.net.URLDecoder;
 import java.net.URLEncoder;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -33,6 +33,8 @@ import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.TreeMap;
 
+import javax.management.Attribute;
+import javax.management.AttributeList;
 import javax.management.InstanceNotFoundException;
 import javax.management.IntrospectionException;
 import javax.management.MBeanAttributeInfo;
@@ -52,6 +54,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceProvider;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 
 @Component
@@ -145,9 +148,14 @@ public class JMXResourceProvider impleme
                     return new MBeanResource(this.mbeanServer, resourceResolver, this.convertObjectNameToResourcePath(info.objectName), path, info.mbeanInfo, info.objectName);
                 }
                 if ( info.pathInfo.equals("mbean:attributes") ) {
-                    return new AttributesResource(resourceResolver, path);
+                    final MBeanResource parent = (MBeanResource)resourceResolver.getResource(ResourceUtil.getParent(path));
+                    return new AttributesResource(resourceResolver, path, parent);
                 }
                 if ( info.pathInfo.startsWith("mbean:attributes/") ) {
+                    final AttributesResource parent = (AttributesResource)resourceResolver.getResource(ResourceUtil.getParent(path));
+                    final MBeanResource parentMBeanResource = (MBeanResource) parent.getParent();
+                    final AttributeList result = parentMBeanResource.getAttributes();
+
                     final String attrPath = info.pathInfo.substring("mbean:attributes/".length());
                     final int pos = attrPath.indexOf('/');
                     final String attrName;
@@ -161,7 +169,15 @@ public class JMXResourceProvider impleme
                     }
                     for(final MBeanAttributeInfo mai : info.mbeanInfo.getAttributes()) {
                         if ( mai.getName().equals(attrName) ) {
-                            final AttributeResource rsrc = new AttributeResource(mbeanServer, info.objectName, resourceResolver, path, mai);
+                            final Iterator iter = result.iterator();
+                            Object value = null;
+                            while ( iter.hasNext() && value == null ) {
+                                final Attribute a = (Attribute) iter.next();
+                                if ( a.getName().equals(attrName) ) {
+                                    value = a.getValue();
+                                }
+                            }
+                            final AttributeResource rsrc = new AttributeResource(resourceResolver, path, mai, value, parent);
                             if ( subPath != null ) {
                                 return rsrc.getChildResource(subPath);
                             }
@@ -264,16 +280,24 @@ public class JMXResourceProvider impleme
                     public void remove() {
                         throw new UnsupportedOperationException("remove");
                     }
-                    };
+                };
             } else {
                 if ( info.pathInfo == null ) {
+                    final MBeanResource parentResource = (MBeanResource)parent;
                     final List<Resource> list = new ArrayList<Resource>();
-                    list.add(new AttributesResource(parent.getResourceResolver(), parent.getPath() + "/mbean:attributes"));
+                    list.add(new AttributesResource(parent.getResourceResolver(), parent.getPath() + "/mbean:attributes", parentResource));
                     return list.iterator();
                 } else if ( info.pathInfo.equals("mbean:attributes") ) {
+                    final AttributesResource parentResource = (AttributesResource)parent;
+                    final MBeanResource parentMBeanResource = (MBeanResource)parentResource.getParent();
+                    final AttributeList result = parentMBeanResource.getAttributes();
+
                     final MBeanAttributeInfo[] infos = info.mbeanInfo.getAttributes();
-                    final List<MBeanAttributeInfo> list = Arrays.asList(infos);
-                    final Iterator<MBeanAttributeInfo> iter = list.iterator();
+                    final Map<String, MBeanAttributeInfo> infoMap = new HashMap<String, MBeanAttributeInfo>();
+                    for(final MBeanAttributeInfo i : infos) {
+                        infoMap.put(i.getName(), i);
+                    }
+                    final Iterator iter = result.iterator();
                     return new Iterator<Resource>() {
 
                         public void remove() {
@@ -281,8 +305,12 @@ public class JMXResourceProvider impleme
                         }
 
                         public Resource next() {
-                            final MBeanAttributeInfo mai = iter.next();
-                            return new AttributeResource(mbeanServer, info.objectName, parent.getResourceResolver(), parent.getPath() + "/" + mai.getName(), mai);
+                            final Attribute attr = (Attribute)iter.next();
+                            return new AttributeResource(parent.getResourceResolver(),
+                                    parent.getPath() + "/" + attr.getName(),
+                                    infoMap.get(attr.getName()),
+                                    attr,
+                                    parentResource);
                         }
 
                         public boolean hasNext() {
@@ -290,23 +318,17 @@ public class JMXResourceProvider impleme
                         }
                     };
                 } else if ( info.pathInfo.startsWith("mbean:attributes/") ) {
+                    final AttributeResource parentResource = (AttributeResource)parent;
                     final String attrPath = info.pathInfo.substring("mbean:attributes/".length());
                     final int pos = attrPath.indexOf('/');
-                    final String attrName;
                     final String subPath;
                     if ( pos == -1 ) {
-                        attrName = attrPath;
                         subPath = null;
                     } else {
-                        attrName = attrPath.substring(0, pos);
                         subPath = attrPath.substring(pos + 1);
                     }
-                    for(final MBeanAttributeInfo mai : info.mbeanInfo.getAttributes()) {
-                        if ( mai.getName().equals(attrName) ) {
-                            final AttributeResource rsrc = new AttributeResource(mbeanServer, info.objectName, parent.getResourceResolver(), parent.getPath(), mai);
-                            return rsrc.getChildren(subPath);
-                        }
-                    }
+
+                    return parentResource.getChildren(subPath);
 
                 }
             }

Modified: sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/MBeanResource.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/MBeanResource.java?rev=1534693&r1=1534692&r2=1534693&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/MBeanResource.java (original)
+++ sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/MBeanResource.java Tue Oct 22 16:17:12 2013
@@ -54,6 +54,8 @@ public class MBeanResource extends Abstr
     /** The mbean server. */
     private final MBeanServer mbeanServer;
 
+    private volatile AttributeList attributeList;
+
     public MBeanResource(final MBeanServer mbeanServer,
             final ResourceResolver resolver,
             final String resourceType,
@@ -73,6 +75,28 @@ public class MBeanResource extends Abstr
         }
     }
 
+    public AttributeList getAttributes() {
+        if ( this.attributeList == null ) {
+            final MBeanAttributeInfo[] infos = info.getAttributes();
+            final String[] names = new String[infos.length];
+            int index = 0;
+            for(final MBeanAttributeInfo i : infos) {
+                names[index] = i.getName();
+                index++;
+            }
+            try {
+                this.attributeList = mbeanServer.getAttributes(objectName, names);
+            } catch (InstanceNotFoundException e) {
+                // ignore
+                this.attributeList = new AttributeList();
+            } catch (ReflectionException e) {
+                // ignore
+                this.attributeList = new AttributeList();
+            }
+        }
+        return this.attributeList;
+    }
+
     /**
      * @see org.apache.sling.api.resource.Resource#getPath()
      */
@@ -128,30 +152,14 @@ public class MBeanResource extends Abstr
         result.put(Constants.PROP_CLASSNAME, this.info.getClassName());
         result.put(Constants.PROP_OBJECTNAME, this.objectName.getCanonicalName());
 
-        final MBeanAttributeInfo[] attribs = this.info.getAttributes();
-        final String[] names = new String[attribs.length];
-        int index = 0;
-        for(final MBeanAttributeInfo i : attribs) {
-            names[index] = i.getName();
-            index++;
-        }
-         AttributeList values = null;
-         try {
-            values = this.mbeanServer.getAttributes(this.objectName, names);
-            if ( values != null ) {
-                final Iterator iter = values.iterator();
-                while ( iter.hasNext() ) {
-                    final Attribute a = (Attribute)iter.next();
-                    final Object value = a.getValue();
-                    if ( value != null ) {
-                        result.put(a.getName(), value);
-                    }
-                }
+        final AttributeList values = this.getAttributes();
+        final Iterator iter = values.iterator();
+        while ( iter.hasNext() ) {
+            final Attribute a = (Attribute)iter.next();
+            final Object value = a.getValue();
+            if ( value != null ) {
+                result.put(a.getName(), value);
             }
-        } catch (final InstanceNotFoundException e) {
-            // ignore
-        } catch (final ReflectionException e) {
-            // ignore
         }
 
         return result;