Author: cziegeler
Date: Mon Aug 12 13:49:54 2013
New Revision: 1513140
URL: http://svn.apache.org/r1513140
Log:
SLING-2999 : JMX Resource Provider
Modified:
sling/trunk/contrib/extensions/jmxprovider/src/main/java/org/apache/sling/jmx/provider/impl/JMXResourceProvider.java
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=1513140&r1=1513139&r2=1513140&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
Mon Aug 12 13:49:54 2013
@@ -22,6 +22,7 @@ import java.lang.management.ManagementFa
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -110,11 +111,14 @@ public class JMXResourceProvider impleme
if ( info.isRoot ) {
return new RootResource(resourceResolver, path);
}
- try {
- final ObjectName on = new ObjectName(info.mbeanName);
- final MBeanInfo mbi = this.mbeanServer.getMBeanInfo(on);
+ if ( info.mbeanInfo == null ) {
+ final Set<ObjectName> names =
this.queryObjectNames(info.pathInfo.replace('/', '.') + ".");
+ if ( names.size() != 0 ) {
+ return new RootResource(resourceResolver, path);
+ }
+ } else {
if (info.pathInfo == null ) {
- return new MBeanResource(resourceResolver, path, mbi);
+ return new MBeanResource(resourceResolver, path,
info.mbeanInfo);
}
if ( info.pathInfo.equals("attributes") ) {
return new AttributesResource(resourceResolver, path);
@@ -122,38 +126,55 @@ public class JMXResourceProvider impleme
if ( info.pathInfo.startsWith("attributes/") ) {
final String attrName = info.pathInfo.substring(11);
if ( attrName.indexOf('/') == - 1) {
- for(final MBeanAttributeInfo mai :
mbi.getAttributes()) {
+ for(final MBeanAttributeInfo mai :
info.mbeanInfo.getAttributes()) {
if ( mai.getName().equals(attrName) ) {
- return new AttributeResource(mbeanServer, on,
resourceResolver, path, mai);
+ return new AttributeResource(mbeanServer,
info.objectName, resourceResolver, path, mai);
}
}
}
}
- } catch (final MalformedObjectNameException e) {
- // ignore
- } catch (final IntrospectionException e) {
- // ignore
- } catch (final InstanceNotFoundException e) {
- // ignore
- } catch (final ReflectionException e) {
- // ignore
}
}
return null;
}
+ private Set<ObjectName> queryObjectNames(final String domainPrefix) {
+ final Set<ObjectName> allNames = this.mbeanServer.queryNames(null,
null);
+ Set<ObjectName> names = allNames;
+ if ( domainPrefix != null ) {
+ names = new HashSet<ObjectName>();
+ for(final ObjectName name : allNames) {
+ if ( name.getDomain().startsWith(domainPrefix)) {
+ names.add(name);
+ }
+ }
+ }
+ return names;
+ }
/**
* @see
org.apache.sling.api.resource.ResourceProvider#listChildren(org.apache.sling.api.resource.Resource)
*/
public Iterator<Resource> listChildren(final Resource parent) {
final PathInfo info = this.parse(parent.getPath());
if ( info != null ) {
- if ( info.isRoot ) {
- // list all mbeans
- final Set<ObjectName> beans =
this.mbeanServer.queryNames(null, null);
- final List<ObjectName> sortedBeans = new
ArrayList<ObjectName>(beans);
- Collections.sort(sortedBeans);
- final Iterator<ObjectName> iter = sortedBeans.iterator();
+ if ( info.isRoot || info.mbeanInfo == null ) {
+ // list all MBeans
+ final Set<ObjectName> names =
this.queryObjectNames(info.isRoot ? null : info.pathInfo.replace('/', '.') +
".");
+ final Set<String> filteredNames = new HashSet<String>();
+ final String prefix = (info.isRoot ? null :
info.pathInfo.replace('/', '.') + ".");
+ for(final ObjectName name : names) {
+ final String testName = (info.isRoot ? name.getDomain() :
name.getDomain().substring(prefix.length()));
+ final int sep = testName.indexOf('.');
+ if ( sep == -1 ) {
+ filteredNames.add(":" + name.getCanonicalName());
+ } else {
+ filteredNames.add(testName.substring(0, sep));
+ }
+ }
+ final List<String> sortedNames = new
ArrayList<String>(filteredNames);
+
+ Collections.sort(sortedNames);
+ final Iterator<String> iter = sortedNames.iterator();
return new Iterator<Resource>() {
private Resource next;
@@ -163,18 +184,25 @@ public class JMXResourceProvider impleme
}
private void seek() {
- while ( iter.hasNext() ) {
- final ObjectName on = iter.next();
- try {
- final MBeanInfo info =
mbeanServer.getMBeanInfo(on);
- this.next = new MBeanResource(parent,
on.getCanonicalName(), info);
- break;
- } catch (final IntrospectionException e) {
- // ignore
- } catch (final InstanceNotFoundException e) {
- // ignore
- } catch (final ReflectionException e) {
- // ignore
+ while ( iter.hasNext() && this.next == null ) {
+ final String name = iter.next();
+ if ( name.startsWith(":") ) {
+ try {
+ final ObjectName on = new
ObjectName(name.substring(1));
+ final MBeanInfo info =
mbeanServer.getMBeanInfo(on);
+ final int sep =
on.getDomain().lastIndexOf('.');
+ this.next = new MBeanResource(parent,
on.getCanonicalName().substring(sep + 1), info);
+ } catch (final IntrospectionException e) {
+ // ignore
+ } catch (final InstanceNotFoundException e) {
+ // ignore
+ } catch (final ReflectionException e) {
+ // ignore
+ } catch (final MalformedObjectNameException e)
{
+ // ignore
+ }
+ } else {
+ this.next = new
RootResource(parent.getResourceResolver(), parent.getPath() + '/' + name);
}
}
}
@@ -196,43 +224,31 @@ public class JMXResourceProvider impleme
public void remove() {
throw new UnsupportedOperationException("remove");
}
- };
+ };
} else {
- try {
- final ObjectName on = new ObjectName(info.mbeanName);
- final MBeanInfo mbi = this.mbeanServer.getMBeanInfo(on);
- if ( info.pathInfo == null ) {
- final List<Resource> list = new ArrayList<Resource>();
- list.add(new
AttributesResource(parent.getResourceResolver(), parent.getPath() +
"/attributes"));
- return list.iterator();
- } else if ( info.pathInfo.equals("attributes") ) {
- final MBeanAttributeInfo[] infos = mbi.getAttributes();
- final List<MBeanAttributeInfo> list =
Arrays.asList(infos);
- final Iterator<MBeanAttributeInfo> iter =
list.iterator();
- return new Iterator<Resource>() {
+ if ( info.pathInfo == null ) {
+ final List<Resource> list = new ArrayList<Resource>();
+ list.add(new
AttributesResource(parent.getResourceResolver(), parent.getPath() +
"/attributes"));
+ return list.iterator();
+ } else if ( info.pathInfo.equals("attributes") ) {
+ final MBeanAttributeInfo[] infos =
info.mbeanInfo.getAttributes();
+ final List<MBeanAttributeInfo> list = Arrays.asList(infos);
+ final Iterator<MBeanAttributeInfo> iter = list.iterator();
+ return new Iterator<Resource>() {
- public void remove() {
- throw new
UnsupportedOperationException("remove");
- }
+ public void remove() {
+ throw new UnsupportedOperationException("remove");
+ }
- public Resource next() {
- final MBeanAttributeInfo mai = iter.next();
- return new AttributeResource(mbeanServer, on,
parent.getResourceResolver(), parent.getPath() + "/" + mai.getName(), mai);
- }
+ public Resource next() {
+ final MBeanAttributeInfo mai = iter.next();
+ return new AttributeResource(mbeanServer,
info.objectName, parent.getResourceResolver(), parent.getPath() + "/" +
mai.getName(), mai);
+ }
- public boolean hasNext() {
- return iter.hasNext();
- }
- };
- }
- } catch (final MalformedObjectNameException e) {
- // ignore
- } catch (final IntrospectionException e) {
- // ignore
- } catch (final InstanceNotFoundException e) {
- // ignore
- } catch (final ReflectionException e) {
- // ignore
+ public boolean hasNext() {
+ return iter.hasNext();
+ }
+ };
}
}
}
@@ -240,23 +256,27 @@ public class JMXResourceProvider impleme
}
public final static class PathInfo {
+
public final boolean isRoot;
- public final String mbeanName;
public final String pathInfo;
+ public ObjectName objectName;
+ public MBeanInfo mbeanInfo;
+
public PathInfo(final boolean isRoot) {
this.isRoot = isRoot;
- this.mbeanName = null;
this.pathInfo = null;
}
- public PathInfo(final String name, final String info) {
+ public PathInfo(final String info) {
this.isRoot = false;
- this.mbeanName = name;
this.pathInfo = info;
}
}
+ /**
+ * Parse the path
+ */
private PathInfo parse(final String path) {
for(final String root : this.rootsWithSlash) {
if ( path.startsWith(root) ) {
@@ -264,18 +284,43 @@ public class JMXResourceProvider impleme
if ( subPath.length() == 0 ) {
return new PathInfo(true);
}
- // mbean name
- final int sep = subPath.indexOf('/');
- final String mbeanName;
- final String pathInfo;
- if ( sep == -1 ) {
- mbeanName = subPath;
- pathInfo = null;
- } else {
- mbeanName = subPath.substring(0, sep);
- pathInfo = subPath.substring(sep + 1);
+ // MBean name / path
+ String checkPath = subPath;
+ String pathInfo = null;
+
+ ObjectName objectName = null;
+ MBeanInfo mbi = null;
+
+ while ( checkPath.length() > 0 && mbi == null ) {
+ try {
+ objectName = new ObjectName(checkPath.replace('/',
'.'));
+ mbi = this.mbeanServer.getMBeanInfo(objectName);
+ } catch (final MalformedObjectNameException e) {
+ // ignore
+ } catch (final IntrospectionException e) {
+ // ignore
+ } catch (final InstanceNotFoundException e) {
+ // ignore
+ } catch (final ReflectionException e) {
+ // ignore
+ }
+ if ( mbi == null ) {
+ final int sep = checkPath.lastIndexOf('/');
+ if ( sep == -1 ) {
+ checkPath = "";
+ pathInfo = subPath;
+ } else {
+ checkPath = checkPath.substring(0, sep);
+ pathInfo = subPath.substring(sep + 1);
+ }
+ }
+ }
+ final PathInfo info = new PathInfo(pathInfo);
+ if ( mbi != null ) {
+ info.objectName = objectName;
+ info.mbeanInfo = mbi;
}
- return new PathInfo(mbeanName, pathInfo);
+ return info;
}
}
for(final String root : this.roots) {