Author: ieb
Date: Tue Mar  5 03:44:55 2013
New Revision: 1452654

URL: http://svn.apache.org/r1452654
Log:
Re-factored to provide information on the DispatcherQueue size, number added, 
number removed, rate added, rate removed. Last 2 using a simple first order 
finite difference approach. Uses reflection and JDKProxy to insert 
instrumentation arround the queue. Can be added to a instance to expose the 
metrics, and unloaded.

Added:
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/DispatcherQueueMBean.java
   (contents, props changed)
      - copied, changed from r1451503, 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/Statistics.java
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/DispatcherQueueMBeanImpl.java
   (with props)
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/ObservationDispatchAccess.java
   (with props)
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/TimeDifferential.java
   (with props)
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/http/
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/http/StatisticsServletDirect.java
   (with props)
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/jmx/
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/jmx/MultiMBeanServer.java
   (with props)
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/CGLibCallbackProxy.java
   (with props)
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/Introspect.java
   (with props)
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/JDKCallbackProxy.java
   (with props)
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/ProxyCallback.java
   (contents, props changed)
      - copied, changed from r1451503, 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/StatisticsFactory.java
Removed:
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/Statistics.java
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/StatisticsFactory.java
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/StatisticsImpl.java
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/StatisticsServlet.java
    
sling/whiteboard/ieb/monitor/src/test/java/org/apache/sling/commons/monitor/impl/CounterTest.java
    
sling/whiteboard/ieb/monitor/src/test/java/org/apache/sling/commons/monitor/impl/StatisticsServletTest.java
Modified:
    sling/whiteboard/ieb/monitor/pom.xml
    
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/package-info.java

Modified: sling/whiteboard/ieb/monitor/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/ieb/monitor/pom.xml?rev=1452654&r1=1452653&r2=1452654&view=diff
==============================================================================
--- sling/whiteboard/ieb/monitor/pom.xml (original)
+++ sling/whiteboard/ieb/monitor/pom.xml Tue Mar  5 03:44:55 2013
@@ -41,6 +41,9 @@
         
<developerConnection>scm:svn:https://svn.apache.org/repos/asf/sling/whiteboard/ieb/monitor</developerConnection>
         <url>http://svn.apache.org/viewvc/sling/whiteboard/ieb/monitor</url>
     </scm>
+    <properties>
+        <sling.java.version>6</sling.java.version>
+    </properties>
     
 
     <build>
@@ -56,8 +59,17 @@
                 <configuration>
                     <instructions>
                         <Import-Package>
+                          net.sf.cglib.asm.util;resolution:=optional,
+                          org.apache.bcel.*;resolution:=optional,
+                                 !org.apache.tools.*,
                           *
                         </Import-Package>
+                        <Embed-Transitive>true</Embed-Transitive>
+                        <Embed-Dependency>
+                            json-simple,
+                            cglib-nodep,
+                            cglib-asm
+                        </Embed-Dependency>
                     </instructions>
                 </configuration>                
             </plugin>
@@ -71,6 +83,41 @@
             <scope>provided</scope>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.api</artifactId>
+            <version>2.3.0</version>
+            <scope>provided</scope>
+        </dependency>
+        
+        <dependency>
+               <groupId>cglib</groupId>
+               <artifactId>cglib-nodep</artifactId>
+               <version>2.2.2</version>
+        </dependency>
+
+        <dependency>
+               <groupId>cglib</groupId>
+               <artifactId>cglib-asm</artifactId>
+               <version>1.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.jcr.api</artifactId>
+            <version>2.1.1-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+               <groupId>javax.jcr</groupId>
+               <artifactId>jcr</artifactId>
+        </dependency>
+        <dependency>
+               <groupId>org.apache.sling</groupId>
+               <artifactId>org.apache.sling.commons.json</artifactId>
+               <version>2.0.6</version>
+        </dependency>
+
         <!-- OSGi Libraries not included here -->
         <dependency>
             <groupId>org.osgi</groupId>
@@ -94,7 +141,7 @@
             <groupId>biz.aQute</groupId>
             <artifactId>bndlib</artifactId>
         </dependency>
-
+ 
         <!-- testing -->
         <!--  using mockito because its a bit more relaxed and makes it easier 
to maintain
               the test cases if dependencies change -->
@@ -110,12 +157,6 @@
                        <scope>test</scope>
         </dependency>
         <dependency>
-               <groupId>org.apache.sling</groupId>
-               <artifactId>org.apache.sling.commons.json</artifactId>
-               <version>2.0.6</version>
-               <scope>test</scope>
-        </dependency>
-        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
         </dependency>

Copied: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/DispatcherQueueMBean.java
 (from r1451503, 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/Statistics.java)
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/DispatcherQueueMBean.java?p2=sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/DispatcherQueueMBean.java&p1=sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/Statistics.java&r1=1451503&r2=1452654&rev=1452654&view=diff
==============================================================================
--- 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/Statistics.java
 (original)
+++ 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/DispatcherQueueMBean.java
 Tue Mar  5 03:44:55 2013
@@ -17,21 +17,21 @@
  */
 package org.apache.sling.commons.monitor;
 
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
 /**
- * A Collection of statistics registered by the user of the interface.
+ * Interface of exposed mmonitoring data on the DispatcherQueue. This must be
+ * exposed by the OSGi classloade so that the StandardMBean can introspect it 
to
+ * build methods.
  */
-public interface Statistics {
-    /**
-     * Get a statistic by name of type T. Type is not checked.
-     * @param name the name of the statistic
-     * @return return the statistic.
-     */
-    <T> AtomicLong get(String name);
-    /**
-     * @return an read only map of all statistics at the time the call method 
was invoked.
-     */
-    Map<String, AtomicLong> all();
+public interface DispatcherQueueMBean {
+
+    long getSize();
+
+    long getAdded();
+
+    double getAddedRate();
+
+    long getRemoved();
+
+    double getRemovedRate();
+
 }

Propchange: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/DispatcherQueueMBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/DispatcherQueueMBeanImpl.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/DispatcherQueueMBeanImpl.java?rev=1452654&view=auto
==============================================================================
--- 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/DispatcherQueueMBeanImpl.java
 (added)
+++ 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/DispatcherQueueMBeanImpl.java
 Tue Mar  5 03:44:55 2013
@@ -0,0 +1,141 @@
+/*
+ * 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 SF 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.commons.monitor.impl;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.management.DynamicMBean;
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Properties;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.commons.monitor.DispatcherQueueMBean;
+import org.apache.sling.commons.monitor.impl.reflect.JDKCallbackProxy;
+import org.apache.sling.commons.monitor.impl.reflect.ProxyCallback;
+import org.apache.sling.jcr.api.SlingRepository;
+import org.osgi.service.component.ComponentContext;
+
+import aQute.bnd.annotation.component.Activate;
+import aQute.bnd.annotation.component.Deactivate;
+
+@Component(immediate = true)
+@Service(value = DynamicMBean.class)
+@Properties({ @Property(name = "jmx.objectname", propertyPrivate = true, value 
= "org.apache.sling:type=Repository,name=DispatcherQueue") })
+public class DispatcherQueueMBeanImpl extends StandardMBean
+        implements DispatcherQueueMBean {
+
+
+    @Reference
+    private SlingRepository slingRepository;
+
+    private boolean active;
+
+    private ObservationDispatchAccess observationDispatchAccess;
+
+    private AtomicInteger queueSize;
+
+    private Object originalQueue;
+
+    private JDKCallbackProxy proxiedQueue;
+    
+    private TimeDifferential added = new TimeDifferential(1000, new 
AtomicLong());
+    
+    private TimeDifferential removed = new TimeDifferential(1000, new 
AtomicLong());
+
+
+
+
+    public DispatcherQueueMBeanImpl() throws NotCompliantMBeanException {
+        super(DispatcherQueueMBean.class, false);
+    }
+
+    @Activate
+    protected void activate(ComponentContext context)
+            throws IllegalArgumentException, IllegalAccessException,
+            InvocationTargetException, NoSuchMethodException,
+            NoSuchFieldException {
+        observationDispatchAccess = new 
ObservationDispatchAccess(slingRepository);
+        queueSize = (AtomicInteger) 
observationDispatchAccess.getDispatcherField("eventQueueSize");
+        originalQueue = 
observationDispatchAccess.getDispatcherField("eventQueue");
+        proxiedQueue = new JDKCallbackProxy(originalQueue, new ProxyCallback() 
{
+            public void callback(String name, Object[] args) {
+                if ( "add".equals(name) ) {
+                   added.increment(1);
+                } else if ( "remove".equals(name)) {
+                   removed.increment(1);                    
+                }
+            }
+        });
+        observationDispatchAccess.setDispatcherField("eventQueue", 
proxiedQueue.getProxy());
+        active = true;
+    }
+
+    @Deactivate
+    protected void deactivate(ComponentContext context)
+            throws IllegalArgumentException, NoSuchFieldException, 
IllegalAccessException, InvocationTargetException, NoSuchMethodException {
+        active = true;
+        observationDispatchAccess.setDispatcherField("eventQueue", 
originalQueue);
+        observationDispatchAccess = null;
+        proxiedQueue = null;
+    }
+
+
+
+
+    public long getSize() {
+        if (!active) {
+            return 0;
+        }
+        return (long) queueSize.get();
+    }
+
+    public long getAdded() {
+        if (!active) {
+            return 0;
+        }
+        return (long) added.getValue();
+    }
+
+    public double getAddedRate() {
+        if (!active) {
+            return 0;
+        }
+        return added.getRate();
+    }
+
+    public long getRemoved() {
+        if (!active) {
+            return 0;
+        }
+        return (long) removed.getValue();
+    }
+
+    public double getRemovedRate() {
+        if (!active) {
+            return 0;
+        }
+        return removed.getRate();
+    }
+
+}

Propchange: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/DispatcherQueueMBeanImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/ObservationDispatchAccess.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/ObservationDispatchAccess.java?rev=1452654&view=auto
==============================================================================
--- 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/ObservationDispatchAccess.java
 (added)
+++ 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/ObservationDispatchAccess.java
 Tue Mar  5 03:44:55 2013
@@ -0,0 +1,72 @@
+/*
+ * 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 SF 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.commons.monitor.impl;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.sling.commons.monitor.impl.reflect.Introspect;
+import org.apache.sling.jcr.api.SlingRepository;
+
+public class ObservationDispatchAccess {
+
+    private SlingRepository slingRepository;
+
+    public ObservationDispatchAccess(SlingRepository slingRepository) {
+        this.slingRepository = slingRepository;
+    }
+
+    public Object getDispatcherField(String name)
+            throws IllegalArgumentException, IllegalAccessException,
+            InvocationTargetException, NoSuchMethodException,
+            NoSuchFieldException {
+        Object repositoryImpl = Introspect.safeGetMethod(slingRepository,
+            "getRepository").invoke(slingRepository, (Object[]) null);
+        Object repConfig = Introspect.safeGetField(repositoryImpl, 
"repConfig").get(
+            repositoryImpl);
+        Object defaultWorkspaceName = Introspect.safeGetMethod(repConfig,
+            "getDefaultWorkspaceName").invoke(repConfig, (Object[]) null);
+        Object workspaceInfo = Introspect.safeGetMethod(repositoryImpl,
+            "getWorkspaceInfo", String.class).invoke(repositoryImpl,
+            new Object[] { defaultWorkspaceName });
+        Object observationDispatcher = Introspect.safeGetMethod(workspaceInfo,
+            "getObservationDispatcher").invoke(workspaceInfo, (Object[]) null);
+        Field field = Introspect.safeGetField(observationDispatcher, name);
+        return field.get(observationDispatcher);
+    }
+
+    public void setDispatcherField(String name, Object obj)
+            throws NoSuchFieldException, IllegalArgumentException,
+            IllegalAccessException, InvocationTargetException,
+            NoSuchMethodException {
+        Object repositoryImpl = Introspect.safeGetMethod(slingRepository,
+            "getRepository").invoke(slingRepository, (Object[]) null);
+        Object repConfig = Introspect.safeGetField(repositoryImpl, 
"repConfig").get(
+            repositoryImpl);
+        Object defaultWorkspaceName = Introspect.safeGetMethod(repConfig,
+            "getDefaultWorkspaceName").invoke(repConfig, (Object[]) null);
+        Object workspaceInfo = Introspect.safeGetMethod(repositoryImpl,
+            "getWorkspaceInfo", String.class).invoke(repositoryImpl,
+            new Object[] { defaultWorkspaceName });
+        Object observationDispatcher = Introspect.safeGetMethod(workspaceInfo,
+            "getObservationDispatcher").invoke(workspaceInfo, (Object[]) null);
+        Field field = Introspect.safeGetField(observationDispatcher, name);
+        field.set(observationDispatcher, obj);
+    }
+
+}

Propchange: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/ObservationDispatchAccess.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/TimeDifferential.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/TimeDifferential.java?rev=1452654&view=auto
==============================================================================
--- 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/TimeDifferential.java
 (added)
+++ 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/TimeDifferential.java
 Tue Mar  5 03:44:55 2013
@@ -0,0 +1,61 @@
+/*
+ * 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 SF 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.commons.monitor.impl;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+public class TimeDifferential {
+    
+    private long last = 0;
+    private long vlast;
+    private double diff;
+    private double period;
+    private AtomicLong counter;
+
+    public TimeDifferential(double d, AtomicLong counter) {
+        period = d;
+        this.counter = counter;
+    }
+    public void differentiate() {
+        long now = System.currentTimeMillis();
+        long vnow = counter.longValue();
+        if ( (now - last)  > period ) {
+            if ( last > 0 ) {
+                diff = ((vnow - vlast)*period)/(double)(now-last);
+            }
+            vlast = vnow;
+            last = System.currentTimeMillis();
+        }
+    }
+    
+    public double getRate() {
+        differentiate();
+        return diff;
+    }
+
+    public long getValue() {
+        differentiate();
+        return vlast;
+    }
+    
+    public void increment(int delta) {
+        counter.addAndGet(delta);
+    }
+
+
+}

Propchange: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/TimeDifferential.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/http/StatisticsServletDirect.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/http/StatisticsServletDirect.java?rev=1452654&view=auto
==============================================================================
--- 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/http/StatisticsServletDirect.java
 (added)
+++ 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/http/StatisticsServletDirect.java
 Tue Mar  5 03:44:55 2013
@@ -0,0 +1,88 @@
+/*
+ * 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 SF 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.commons.monitor.impl.http;
+
+import java.io.IOException;
+import java.util.Iterator;
+
+import javax.management.Attribute;
+import javax.management.AttributeList;
+import javax.management.MBeanServerConnection;
+import javax.management.ObjectName;
+import javax.servlet.ServletException;
+
+import org.apache.felix.scr.annotations.sling.SlingServlet;
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
+import org.apache.sling.commons.json.JSONException;
+import org.apache.sling.commons.json.JSONObject;
+import org.apache.sling.commons.monitor.impl.jmx.MultiMBeanServer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@SlingServlet(methods = { "GET" }, paths = { "/system/stats" })
+public class StatisticsServletDirect extends SlingSafeMethodsServlet {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 8473046624953080315L;
+
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(StatisticsServletDirect.class);
+
+    @Override
+    protected void doGet(SlingHttpServletRequest request,
+            SlingHttpServletResponse response) throws ServletException,
+            IOException {
+        try {
+            MBeanServerConnection servers = new MultiMBeanServer();
+            String[] targets = request.getParameterValues("q");
+            JSONObject jsonOutput = new JSONObject();
+            jsonOutput.put("timestamp", System.currentTimeMillis());
+            jsonOutput.put("_query", targets);
+            for (String t : targets) {
+                String[] n = t.split("/", 2);
+                String[] attributes = n[1].split(",");
+                JSONObject obj = new JSONObject();
+                jsonOutput.put(n[0], obj);
+                AttributeList list = servers.getAttributes(
+                    new ObjectName(n[0]), attributes);
+                Iterator<Object> i = list.iterator();
+                while (i.hasNext()) {
+                    Attribute a = (Attribute) i.next();
+                    try {
+                        obj.put(a.getName(), a.getValue());
+                    } catch (JSONException e) {
+                        LOGGER.debug(e.getMessage(), e);
+                    }
+                }
+            }
+            String r = jsonOutput.toString(2);
+            response.setContentType("application/json; charset=utf8");
+            response.setHeader("Cache-Control", "no-cache");
+            response.setCharacterEncoding("UTF-8");
+            response.setContentLength(r.length());
+            response.getWriter().write(r);
+        } catch (Exception e) {
+            throw new ServletException(e.getMessage(), e);
+        }
+
+    }
+
+}

Propchange: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/http/StatisticsServletDirect.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/jmx/MultiMBeanServer.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/jmx/MultiMBeanServer.java?rev=1452654&view=auto
==============================================================================
--- 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/jmx/MultiMBeanServer.java
 (added)
+++ 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/jmx/MultiMBeanServer.java
 Tue Mar  5 03:44:55 2013
@@ -0,0 +1,243 @@
+/*
+ * 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 SF 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.commons.monitor.impl.jmx;
+
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.management.Attribute;
+import javax.management.AttributeList;
+import javax.management.AttributeNotFoundException;
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.IntrospectionException;
+import javax.management.InvalidAttributeValueException;
+import javax.management.ListenerNotFoundException;
+import javax.management.MBeanException;
+import javax.management.MBeanInfo;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.MBeanServerConnection;
+import javax.management.MBeanServerFactory;
+import javax.management.NotCompliantMBeanException;
+import javax.management.NotificationFilter;
+import javax.management.NotificationListener;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+import javax.management.QueryExp;
+import javax.management.ReflectionException;
+
+public class MultiMBeanServer implements MBeanServerConnection {
+
+    private List<MBeanServer> servers = new ArrayList<MBeanServer>();
+
+    public MultiMBeanServer() {
+        servers.addAll(MBeanServerFactory.findMBeanServer(null));
+        servers.add(ManagementFactory.getPlatformMBeanServer());
+
+    }
+
+    public Object getAttribute(ObjectName name, String attribute)
+            throws MBeanException, AttributeNotFoundException,
+            InstanceNotFoundException, ReflectionException, IOException {
+        return getServer(name).getAttribute(name, attribute);
+    }
+
+    public AttributeList getAttributes(ObjectName name, String[] attributes)
+            throws InstanceNotFoundException, ReflectionException, IOException 
{
+        return getServer(name).getAttributes(name, attributes);
+    }
+
+    public String getDefaultDomain() throws IOException {
+        return servers.get(servers.size() - 1).getDefaultDomain();
+    }
+
+    public String[] getDomains() throws IOException {
+        Set<String> domains = new LinkedHashSet<String>();
+        for (MBeanServer c : servers) {
+            for (String d : c.getDomains()) {
+                domains.add(d);
+            }
+        }
+        return domains.toArray(new String[domains.size()]);
+    }
+
+    public Integer getMBeanCount() throws IOException {
+        int i = 0;
+        for (MBeanServer c : servers) {
+            i += c.getMBeanCount();
+        }
+        return i;
+    }
+
+    public MBeanInfo getMBeanInfo(ObjectName name)
+            throws InstanceNotFoundException, IntrospectionException,
+            ReflectionException, IOException {
+        return getServer(name).getMBeanInfo(name);
+    }
+
+    public ObjectInstance getObjectInstance(ObjectName name)
+            throws InstanceNotFoundException, IOException {
+        return getServer(name).getObjectInstance(name);
+    }
+
+    public boolean isInstanceOf(ObjectName name, String className)
+            throws InstanceNotFoundException, IOException {
+        try {
+            return getServer(name).isInstanceOf(name, className);
+        } catch (InstanceNotFoundException e) {
+            return false;
+        }
+    }
+
+    public boolean isRegistered(ObjectName name) throws IOException {
+        try {
+            return getServer(name).isRegistered(name);
+        } catch (InstanceNotFoundException e) {
+            return false;
+        }
+    }
+
+    public Set<ObjectInstance> queryMBeans(ObjectName name, QueryExp query)
+            throws IOException {
+        Set<ObjectInstance> instances = new LinkedHashSet<ObjectInstance>();
+        for (MBeanServer c : servers) {
+            instances.addAll(c.queryMBeans(name, query));
+        }
+        return instances;
+    }
+
+    public Set<ObjectName> queryNames(ObjectName name, QueryExp query)
+            throws IOException {
+        Set<ObjectName> names = new LinkedHashSet<ObjectName>();
+        for (MBeanServer c : servers) {
+            names.addAll(c.queryNames(name, query));
+        }
+        return names;
+    }
+
+    private MBeanServer getServer(ObjectName name)
+            throws InstanceNotFoundException {
+        for (MBeanServer c : servers) {
+            if (c.isRegistered(name)) {
+                return c;
+            }
+        }
+        throw new InstanceNotFoundException(name.getCanonicalName());
+    }
+
+    // the implementation is read only and doesnt suppor the following methods.
+
+    public void addNotificationListener(ObjectName name,
+            NotificationListener listener, NotificationFilter filter,
+            Object handback) throws InstanceNotFoundException, IOException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void addNotificationListener(ObjectName name, ObjectName listener,
+            NotificationFilter filter, Object handback)
+            throws InstanceNotFoundException, IOException {
+        throw new UnsupportedOperationException();
+    }
+
+    public ObjectInstance createMBean(String className, ObjectName name)
+            throws ReflectionException, InstanceAlreadyExistsException,
+            MBeanRegistrationException, MBeanException,
+            NotCompliantMBeanException, IOException {
+        throw new UnsupportedOperationException();
+    }
+
+    public ObjectInstance createMBean(String className, ObjectName name,
+            ObjectName loaderName) throws ReflectionException,
+            InstanceAlreadyExistsException, MBeanRegistrationException,
+            MBeanException, NotCompliantMBeanException,
+            InstanceNotFoundException, IOException {
+        throw new UnsupportedOperationException();
+    }
+
+    public ObjectInstance createMBean(String className, ObjectName name,
+            Object[] params, String[] signature) throws ReflectionException,
+            InstanceAlreadyExistsException, MBeanRegistrationException,
+            MBeanException, NotCompliantMBeanException, IOException {
+        throw new UnsupportedOperationException();
+    }
+
+    public ObjectInstance createMBean(String className, ObjectName name,
+            ObjectName loaderName, Object[] params, String[] signature)
+            throws ReflectionException, InstanceAlreadyExistsException,
+            MBeanRegistrationException, MBeanException,
+            NotCompliantMBeanException, InstanceNotFoundException, IOException 
{
+        throw new UnsupportedOperationException();
+    }
+
+    public Object invoke(ObjectName name, String operationName,
+            Object[] params, String[] signature)
+            throws InstanceNotFoundException, MBeanException,
+            ReflectionException, IOException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void removeNotificationListener(ObjectName name, ObjectName 
listener)
+            throws InstanceNotFoundException, ListenerNotFoundException,
+            IOException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void removeNotificationListener(ObjectName name,
+            NotificationListener listener) throws InstanceNotFoundException,
+            ListenerNotFoundException, IOException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void removeNotificationListener(ObjectName name,
+            ObjectName listener, NotificationFilter filter, Object handback)
+            throws InstanceNotFoundException, ListenerNotFoundException,
+            IOException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void removeNotificationListener(ObjectName name,
+            NotificationListener listener, NotificationFilter filter,
+            Object handback) throws InstanceNotFoundException,
+            ListenerNotFoundException, IOException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void setAttribute(ObjectName name, Attribute attribute)
+            throws InstanceNotFoundException, AttributeNotFoundException,
+            InvalidAttributeValueException, MBeanException,
+            ReflectionException, IOException {
+        throw new UnsupportedOperationException();
+    }
+
+    public AttributeList setAttributes(ObjectName name, AttributeList 
attributes)
+            throws InstanceNotFoundException, ReflectionException, IOException 
{
+        throw new UnsupportedOperationException();
+    }
+
+    public void unregisterMBean(ObjectName name)
+            throws InstanceNotFoundException, MBeanRegistrationException,
+            IOException {
+        throw new UnsupportedOperationException();
+    }
+
+}

Propchange: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/jmx/MultiMBeanServer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/CGLibCallbackProxy.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/CGLibCallbackProxy.java?rev=1452654&view=auto
==============================================================================
--- 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/CGLibCallbackProxy.java
 (added)
+++ 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/CGLibCallbackProxy.java
 Tue Mar  5 03:44:55 2013
@@ -0,0 +1,70 @@
+/*
+ * 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 SF 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.commons.monitor.impl.reflect;
+
+import java.lang.reflect.Method;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.sf.cglib.proxy.Enhancer;
+import net.sf.cglib.proxy.MethodInterceptor;
+import net.sf.cglib.proxy.MethodProxy;
+
+/**
+ * Proxy a class including all non final methods
+ */
+public class CGLibCallbackProxy {
+
+    
+    private Object proxiedAtomic;
+    private Object proxy;
+
+    public CGLibCallbackProxy(Object object, final ProxyCallback 
proxyCallback) {
+        proxiedAtomic = object;
+        
+        Enhancer e = new Enhancer();
+        e.setSuperclass(object.getClass());
+        Class<?> cls = object.getClass();
+        Set<Class<?>> classes = new HashSet<Class<?>>();
+        Introspect.getInterfaces(cls,classes);
+        Class<?>[] toImplement = classes.toArray(new Class<?>[classes.size()]);
+        e.setInterfaces(toImplement);
+        e.setCallback(new MethodInterceptor() {
+            
+            public Object intercept(Object obj, Method method, Object[] args,
+                    MethodProxy methodProxy) throws Throwable {                
+                proxyCallback.callback(method.getName(), args);
+                return methodProxy.invokeSuper(obj, args);
+            }
+        });
+        proxy = e.create();
+        
+    }
+
+
+    public Object getProxy() {
+        return proxy;
+    }
+
+    public Object getProxied() {
+        return proxiedAtomic;
+    }
+    
+    
+
+}

Propchange: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/CGLibCallbackProxy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/Introspect.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/Introspect.java?rev=1452654&view=auto
==============================================================================
--- 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/Introspect.java
 (added)
+++ 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/Introspect.java
 Tue Mar  5 03:44:55 2013
@@ -0,0 +1,90 @@
+/*
+ * 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 SF 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.commons.monitor.impl.reflect;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Introspect {
+
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(Introspect.class);
+
+    public static Method safeGetMethod(Object obj, String method) throws 
NoSuchMethodException {
+        return safeGetMethod(obj, method, (Class<?>[])null);
+    }
+
+    public static Method safeGetMethod(Object obj, String method,
+            Class<?> ... params) throws NoSuchMethodException {
+        Method m = null;
+        Class<?> cls = obj.getClass();
+        while (m == null && cls != null && !Object.class.equals(cls)) {
+            try {
+                m = cls.getDeclaredMethod(method, params);
+                LOGGER.debug("Got method {} on class {} with params {} ",new 
Object[]{ m, cls, Arrays.toString(params)});
+            } catch (NoSuchMethodException e) {
+                LOGGER.debug("No method on class {} with params {} ",new 
Object[]{ cls, Arrays.toString(params)});
+                cls = cls.getSuperclass();
+            }
+        }
+        if (m == null) {
+            throw new NoSuchMethodException(method);
+        }
+        if (!m.isAccessible()) {
+            m.setAccessible(true);
+        }
+        return m;
+    }
+
+    public static Field safeGetField(Object obj, String field)
+            throws NoSuchFieldException {
+        Field m = null;
+        Class<?> cls = obj.getClass();
+        while (m == null && cls != null && !Object.class.equals(cls)) {
+            try {
+                m = cls.getDeclaredField(field);
+                LOGGER.debug("Got method {} on class {} ", m, cls);
+            } catch (NoSuchFieldException e) {
+                LOGGER.debug("No method, trying super {} ", cls);
+                cls = cls.getSuperclass();
+            }
+        }
+        if (m == null) {
+            throw new NoSuchFieldException(field);
+        }
+        if (!m.isAccessible()) {
+            m.setAccessible(true);
+        }
+        return m;
+    }
+    
+    public static void getInterfaces(Class<?> cls, Set<Class<?>> classes) {
+        if ( cls != null ) {
+            for (Class<?> c : cls.getInterfaces()) {
+                classes.add(c);
+            }
+            getInterfaces(cls.getSuperclass(), classes);
+        }
+    }
+
+
+}

Propchange: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/Introspect.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/JDKCallbackProxy.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/JDKCallbackProxy.java?rev=1452654&view=auto
==============================================================================
--- 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/JDKCallbackProxy.java
 (added)
+++ 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/JDKCallbackProxy.java
 Tue Mar  5 03:44:55 2013
@@ -0,0 +1,69 @@
+/*
+ * 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 SF 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.commons.monitor.impl.reflect;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Proxy a objects interface. 
+ */
+public class JDKCallbackProxy {
+
+    
+    protected static final Logger LOGGER = 
LoggerFactory.getLogger(JDKCallbackProxy.class);
+    private Object proxied;
+    private Object proxy;
+
+    public JDKCallbackProxy(Object object, final ProxyCallback proxyCallback) {
+        proxied = object;
+        Class<?> cls = object.getClass();
+        Set<Class<?>> classes = new HashSet<Class<?>>();
+        Introspect.getInterfaces(cls,classes);
+        Class<?>[] toImplement = classes.toArray(new Class<?>[classes.size()]);
+        proxy = Proxy.newProxyInstance(cls.getClassLoader(), toImplement , new 
InvocationHandler() {
+            
+            public Object invoke(Object obj, Method method, Object[] args)
+                    throws Throwable {
+                proxyCallback.callback(method.getName(), args);
+                return method.invoke(proxied, args);
+            }
+        });
+        
+    }
+
+
+
+
+    public Object getProxy() {
+        return proxy;
+    }
+
+    public Object getProxied() {
+        return proxied;
+    }
+    
+    
+
+}

Propchange: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/JDKCallbackProxy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/ProxyCallback.java
 (from r1451503, 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/StatisticsFactory.java)
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/ProxyCallback.java?p2=sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/ProxyCallback.java&p1=sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/StatisticsFactory.java&r1=1451503&r2=1452654&rev=1452654&view=diff
==============================================================================
--- 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/StatisticsFactory.java
 (original)
+++ 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/ProxyCallback.java
 Tue Mar  5 03:44:55 2013
@@ -15,26 +15,10 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations under the License.
  */
-package org.apache.sling.commons.monitor;
+package org.apache.sling.commons.monitor.impl.reflect;
 
-import org.apache.sling.commons.monitor.impl.StatisticsImpl;
+public interface ProxyCallback {
 
-
-/**
- * A statistics factory that manages a singleton collection of statistics.
- */
-public abstract class StatisticsFactory {
-    
-    public static final Statistics statisticsSingleton = new StatisticsImpl();
-    
-    private StatisticsFactory() {
-        // cant create a factory class.
-    }
-    /**
-     * @return the singleton instance of the collection of statistics.
-     */
-    public static Statistics instance() {
-        return statisticsSingleton;
-    }
+    void callback(String name, Object[] args);
 
 }

Propchange: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/impl/reflect/ProxyCallback.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/package-info.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/package-info.java?rev=1452654&r1=1452653&r2=1452654&view=diff
==============================================================================
--- 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/package-info.java
 (original)
+++ 
sling/whiteboard/ieb/monitor/src/main/java/org/apache/sling/commons/monitor/package-info.java
 Tue Mar  5 03:44:55 2013
@@ -1,22 +1,7 @@
-/*
- * 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 SF 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.
- */
 
-@Version("1.0.0")
+@Export()
+@Version(value="1.0.0")
 package org.apache.sling.commons.monitor;
 
+import aQute.bnd.annotation.Export;
 import aQute.bnd.annotation.Version;


Reply via email to