in src/main/java/org/apache/sling/jmx/provider/impl/JMXResourceProvider.java [236:382]
public Iterator<Resource> listChildren(final Resource parent) {
final PathInfo info = this.parse(parent.getPath());
if ( info != null ) {
if ( info.isRoot || info.mbeanInfo == null ) {
// list all MBeans
final Set<ObjectName> names = this.queryObjectNames(info.isRoot ? null : info.pathInfo);
final Set<String> filteredNames = new HashSet<>();
final String prefix = (info.isRoot ? null : info.pathInfo + "/");
for(final ObjectName name : names) {
final String path = this.convertObjectNameToResourcePath(name);
final String testName = (info.isRoot ? path : path.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;
{
seek();
}
private void seek() {
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 String path = convertObjectNameToResourcePath(on);
final int sep = path.lastIndexOf('/');
this.next = new MBeanResource(mbeanServer, parent.getResourceResolver(), path, parent.getPath() + "/" + path.substring(sep + 1), info, on);
} 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);
}
}
}
public boolean hasNext() {
return next != null;
}
public Resource next() {
if ( next != null ) {
final Resource rsrc = next;
this.next = null;
seek();
return rsrc;
}
throw new NoSuchElementException();
}
public void remove() {
throw new UnsupportedOperationException("remove");
}
};
} else {
if ( info.pathInfo == null ) {
final MBeanResource parentResource;
if ( parent instanceof MBeanResource ) {
parentResource = (MBeanResource)parent;
} else {
parentResource = (MBeanResource)this.getResource(parent.getResourceResolver(), parent.getPath());
}
final List<Resource> list = new ArrayList<>();
list.add(new AttributesResource(parent.getResourceResolver(), parent.getPath() + "/mbean:attributes", parentResource));
return list.iterator();
} else if ( info.pathInfo.equals("mbean:attributes") ) {
final AttributesResource parentResource;
if ( parent instanceof AttributesResource ) {
parentResource = (AttributesResource)parent;
} else {
parentResource = (AttributesResource) this.getResource(parent.getResourceResolver(), parent.getPath());
}
final MBeanResource parentMBeanResource = (MBeanResource)parentResource.getParent();
final AttributeList result = parentMBeanResource.getAttributes();
final MBeanAttributeInfo[] infos = info.mbeanInfo.getAttributes();
final Map<String, MBeanAttributeInfo> infoMap = new HashMap<>();
for(final MBeanAttributeInfo i : infos) {
infoMap.put(i.getName(), i);
}
final Iterator iter = result.iterator();
return new Iterator<Resource>() {
public void remove() {
throw new UnsupportedOperationException("remove");
}
public Resource next() {
final Attribute attr = (Attribute)iter.next();
return new AttributeResource(parent.getResourceResolver(),
parent.getPath() + "/" + attr.getName(),
infoMap.get(attr.getName()),
attr.getValue(),
parentResource);
}
public boolean hasNext() {
return iter.hasNext();
}
};
} else if ( info.pathInfo.startsWith("mbean:attributes/") ) {
Resource checkParentResource = parent;
if ( !(checkParentResource instanceof AttributeResource) && !(checkParentResource instanceof MapResource ) ) {
checkParentResource = this.getResource(parent.getResourceResolver(), parent.getPath());
}
final AttributeResource parentResource;
if ( checkParentResource instanceof AttributeResource ) {
parentResource = (AttributeResource)checkParentResource;
} else {
parentResource = ((MapResource)checkParentResource).getAttributeResource();
}
final String attrPath = info.pathInfo.substring("mbean:attributes/".length());
final int pos = attrPath.indexOf('/');
final String subPath;
if ( pos == -1 ) {
subPath = null;
} else {
subPath = attrPath.substring(pos + 1);
}
return parentResource.getChildren(parent.getPath(), subPath);
}
}
}
return null;
}