You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/10/18 23:24:30 UTC

[sling-org-apache-sling-jmx-provider] 07/39: SLING-2999 : JMX Resource Provider - initial support for tabular and composite data

This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jmx-provider.git

commit 417713e9a6f8e0f0f5302e9ab92010903bc0f354
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Mon Aug 19 16:15:14 2013 +0000

    SLING-2999 : JMX Resource Provider - initial support for tabular and composite data
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1515488 13f79535-47bb-0310-9956-ffa450edef68
---
 .../sling/jmx/provider/impl/AttributeResource.java | 160 ++++++++++++++++++++-
 .../jmx/provider/impl/JMXResourceProvider.java     |  52 +++++--
 .../sling/jmx/provider/impl/MapResource.java       |  95 ++++++++++++
 3 files changed, 296 insertions(+), 11 deletions(-)

diff --git a/src/main/java/org/apache/sling/jmx/provider/impl/AttributeResource.java b/src/main/java/org/apache/sling/jmx/provider/impl/AttributeResource.java
index 1c5e1f0..1bf47a7 100644
--- a/src/main/java/org/apache/sling/jmx/provider/impl/AttributeResource.java
+++ b/src/main/java/org/apache/sling/jmx/provider/impl/AttributeResource.java
@@ -19,16 +19,24 @@
 package org.apache.sling.jmx.provider.impl;
 
 import java.lang.reflect.Array;
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Map;
+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;
+import javax.management.openmbean.TabularType;
 
 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;
@@ -126,9 +134,9 @@ public class AttributeResource extends AbstractResource {
                     }
                     result.put("mbean:value", values);
                 } else if (value instanceof TabularData) {
-                    // TODO
+                    // Nothing to do, value is child resource
                 } else if (value instanceof CompositeData) {
-                    // TODO
+                    // Nothing to do, value is child resource
                 } else {
                     result.put("mbean:value", convert(value));
                 }
@@ -154,4 +162,152 @@ public class AttributeResource extends AbstractResource {
         }
         return value.toString();
     }
+
+    public Resource getChildResource(final String subPath) {
+        final Map<String, Object> childStructure = this.convertData();
+        if ( childStructure != null ) {
+            final String[] segments = subPath.split("/");
+            Map<String, Object> current = childStructure;
+            for(final String path : segments) {
+                final Object child = current.get(path);
+                if ( child == null ) {
+                    return null;
+                }
+                if ( !(child instanceof Map) ) {
+                    return null;
+                }
+                current = (Map<String, Object>)child;
+            }
+
+            return new MapResource(this.getResourceResolver(), this.getPath(), current);
+        }
+        return null;
+    }
+
+    private Map<String, Object> convertData() {
+        try {
+            final Object value = server.getAttribute(this.on, info.getName());
+
+            if ( value instanceof TabularData ) {
+                return convertObject((TabularData)value);
+            } else if ( value instanceof CompositeData ) {
+                return convertObject((CompositeData)value);
+            }
+        } catch (final Exception ignore) {
+            // ignore and return null
+        }
+        return null;
+    }
+
+    private Map<String, Object> convertObject(final TabularData td) {
+        final TabularType type = td.getTabularType();
+        final Map<String, Object> result = new HashMap<String, Object>();
+        result.put("sling:resourceSuperType", "mbean:attributes");
+        result.put("sling:resourceType", type.getTypeName());
+
+        final Map<String, Map<String, Object>> rows = new LinkedHashMap<String, Map<String, Object>>();
+        int index = 1;
+        // TODO - use index values
+        for(final CompositeData data : (Collection<CompositeData>)td.values()) {
+            rows.put(String.valueOf(index), convertObject(data));
+            index++;
+        }
+        result.put("mbean:value", rows);
+
+        return result;
+    }
+
+    private Map<String, Object> convertObject(final CompositeData cd) {
+        final CompositeType type = cd.getCompositeType();
+        final Map<String, Object> result = new HashMap<String, Object>();
+        result.put("sling:resourceSuperType", "mbean:attributes");
+        result.put("sling:resourceType", type.getTypeName());
+
+        final Map<String, Object> attrMap = new TreeMap<String, Object>();
+        attrMap.put("sling:resourceType", "mbean:attributes");
+        result.put("mbean:attributes", attrMap);
+
+        final Set<String> names = type.keySet();
+        for(final String name : names) {
+            final Map<String, Object> dataMap = new HashMap<String, Object>();
+            attrMap.put(name, dataMap);
+            dataMap.put(ResourceResolver.PROPERTY_RESOURCE_TYPE, type.getType(name));
+            dataMap.put("sling:resourceSuperType", "mbean:attributes");
+
+            if ( type.getDescription() != null ) {
+                dataMap.put("mbean:description", type.getDescription());
+            }
+            dataMap.put("mbean:type", type.getType(name));
+
+            final Object value = cd.get(name);
+            if ( value != null ) {
+                if ( value.getClass().isArray() ) {
+                    final int length = Array.getLength(value);
+                    final Object[] values = new Object[length];
+                    for (int i = 0; i < length; i ++) {
+                        final Object o = Array.get(value, i);
+                        values[i] = convert(o);
+                    }
+                    dataMap.put("mbean:value", values);
+                } else if (value instanceof TabularData) {
+                    dataMap.put("mbean:value", convertObject((TabularData)value));
+                } else if (value instanceof CompositeData) {
+                    dataMap.put("mbean:value", convertObject((CompositeData)value));
+                } else {
+                    dataMap.put("mbean:value", convert(value));
+                }
+            }
+        }
+
+        return result;
+    }
+
+    public Iterator<Resource> getChildren(String subPath) {
+        final Map<String, Object> childStructure = this.convertData();
+        if ( childStructure != null ) {
+            Map<String, Object> current = childStructure;
+            if ( subPath != null ) {
+                final String[] segments = subPath.split("/");
+                for(final String path : segments) {
+                    final Object child = current.get(path);
+                    if ( child == null ) {
+                        return null;
+                    }
+                    if ( !(child instanceof Map) ) {
+                        return null;
+                    }
+                    current = (Map<String, Object>)child;
+                }
+            }
+            final Iterator<Map.Entry<String, Object>> removeIter = current.entrySet().iterator();
+            while ( removeIter.hasNext() ) {
+                final Map.Entry<String, Object> c = removeIter.next();
+                if ( !(c.getValue() instanceof Map) ) {
+                    removeIter.remove();
+                }
+            }
+            if ( current.size() == 0 ) {
+                return null;
+            }
+            final Iterator<Map.Entry<String, Object>> childIter = current.entrySet().iterator();
+
+            return new Iterator<Resource>() {
+
+                public void remove() {
+                    throw new UnsupportedOperationException("remove");
+                }
+
+                public Resource next() {
+                    final Map.Entry<String, Object> props = childIter.next();
+
+                    return new MapResource(getResourceResolver(), getPath() + '/' + props.getKey(), (Map)props.getValue());
+                }
+
+                public boolean hasNext() {
+                    return childIter.hasNext();
+                }
+            };
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/org/apache/sling/jmx/provider/impl/JMXResourceProvider.java b/src/main/java/org/apache/sling/jmx/provider/impl/JMXResourceProvider.java
index 5cdd7a3..bfdbd85 100644
--- a/src/main/java/org/apache/sling/jmx/provider/impl/JMXResourceProvider.java
+++ b/src/main/java/org/apache/sling/jmx/provider/impl/JMXResourceProvider.java
@@ -144,16 +144,28 @@ public class JMXResourceProvider implements ResourceProvider {
                 if (info.pathInfo == null ) {
                     return new MBeanResource(resourceResolver, this.convertObjectNameToResourcePath(info.objectName), path, info.mbeanInfo, info.objectName);
                 }
-                if ( info.pathInfo.equals("attributes") ) {
+                if ( info.pathInfo.equals("mbean:attributes") ) {
                     return new AttributesResource(resourceResolver, path);
                 }
-                if ( info.pathInfo.startsWith("attributes/") ) {
-                    final String attrName = info.pathInfo.substring(11);
-                    if ( attrName.indexOf('/') == - 1) {
-                        for(final MBeanAttributeInfo mai : info.mbeanInfo.getAttributes()) {
-                            if ( mai.getName().equals(attrName) ) {
-                                return new AttributeResource(mbeanServer, info.objectName, resourceResolver, path, mai);
+                if ( info.pathInfo.startsWith("mbean:attributes/") ) {
+                    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, resourceResolver, path, mai);
+                            if ( subPath != null ) {
+                                return rsrc.getChildResource(subPath);
                             }
+                            return rsrc;
                         }
                     }
                 }
@@ -256,9 +268,9 @@ public class JMXResourceProvider implements ResourceProvider {
             } else {
                 if ( info.pathInfo == null ) {
                     final List<Resource> list = new ArrayList<Resource>();
-                    list.add(new AttributesResource(parent.getResourceResolver(), parent.getPath() + "/attributes"));
+                    list.add(new AttributesResource(parent.getResourceResolver(), parent.getPath() + "/mbean:attributes"));
                     return list.iterator();
-                } else if ( info.pathInfo.equals("attributes") ) {
+                } else if ( info.pathInfo.equals("mbean:attributes") ) {
                     final MBeanAttributeInfo[] infos = info.mbeanInfo.getAttributes();
                     final List<MBeanAttributeInfo> list = Arrays.asList(infos);
                     final Iterator<MBeanAttributeInfo> iter = list.iterator();
@@ -277,6 +289,25 @@ public class JMXResourceProvider implements ResourceProvider {
                             return iter.hasNext();
                         }
                     };
+                } else if ( info.pathInfo.startsWith("mbean:attributes/") ) {
+                    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);
+                        }
+                    }
+
                 }
             }
         }
@@ -378,6 +409,9 @@ public class JMXResourceProvider implements ResourceProvider {
                             sb.append(",");
                         }
                         final int pos = keyValue.indexOf('=');
+                        if ( pos == -1 ) {
+                            return null;
+                        }
                         sb.append(decode(keyValue.substring(0, pos)));
                         sb.append('=');
                         sb.append(decode(keyValue.substring(pos+1)));
diff --git a/src/main/java/org/apache/sling/jmx/provider/impl/MapResource.java b/src/main/java/org/apache/sling/jmx/provider/impl/MapResource.java
new file mode 100644
index 0000000..920c366
--- /dev/null
+++ b/src/main/java/org/apache/sling/jmx/provider/impl/MapResource.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.jmx.provider.impl;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.sling.api.resource.AbstractResource;
+import org.apache.sling.api.resource.ResourceMetadata;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.api.wrappers.ValueMapDecorator;
+
+public class MapResource extends AbstractResource {
+
+    private final String path;
+
+    private final ResourceResolver resolver;
+
+    private final Map<String, Object> properties;
+
+    private final ResourceMetadata metadata = new ResourceMetadata();
+
+    public MapResource(final ResourceResolver resolver, final String path, final Map<String, Object> props) {
+        this.resolver = resolver;
+        this.path = path;
+        this.properties = new HashMap<String, Object>();
+        for(final Map.Entry<String, Object> entry : props.entrySet() ) {
+            if ( !(entry.getValue() instanceof Map) ) {
+                this.properties.put(entry.getKey(), entry.getValue());
+            }
+        }
+    }
+
+    /**
+     * @see org.apache.sling.api.resource.Resource#getPath()
+     */
+    public String getPath() {
+        return this.path;
+    }
+
+    /**
+     * @see org.apache.sling.api.resource.Resource#getResourceType()
+     */
+    public String getResourceType() {
+        return (String)properties.get("sling:resourceType");
+    }
+
+    /**
+     * @see org.apache.sling.api.resource.Resource#getResourceSuperType()
+     */
+    public String getResourceSuperType() {
+        return (String)properties.get("sling:resourceSuperType");
+    }
+
+    /**
+     * @see org.apache.sling.api.resource.Resource#getResourceMetadata()
+     */
+    public ResourceMetadata getResourceMetadata() {
+        return metadata;
+    }
+
+    /**
+     * @see org.apache.sling.api.resource.Resource#getResourceResolver()
+     */
+    public ResourceResolver getResourceResolver() {
+        return this.resolver;
+    }
+
+    @Override
+    public <AdapterType> AdapterType adaptTo(final Class<AdapterType> type) {
+        if ( type == ValueMap.class || type == Map.class ) {
+            final Map<String, Object> propMap = Collections.unmodifiableMap(this.properties);
+            return (AdapterType) new ValueMapDecorator(propMap);
+        }
+        return super.adaptTo(type);
+    }
+}
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.