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;