You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ie...@apache.org on 2013/02/26 05:50:02 UTC

svn commit: r1450021 - in /sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server: impl/SlingServerRepository.java impl/jmx/StatisticsMBeanImpl.java jmx/RepositoryStatisticsMBean.java

Author: ieb
Date: Tue Feb 26 04:50:02 2013
New Revision: 1450021

URL: http://svn.apache.org/r1450021
Log:
SLING-2742 refactored so that there is 1 stats bean per repository.

Modified:
    sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/impl/SlingServerRepository.java
    sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/impl/jmx/StatisticsMBeanImpl.java
    sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/jmx/RepositoryStatisticsMBean.java

Modified: sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/impl/SlingServerRepository.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/impl/SlingServerRepository.java?rev=1450021&r1=1450020&r2=1450021&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/impl/SlingServerRepository.java (original)
+++ sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/impl/SlingServerRepository.java Tue Feb 26 04:50:02 2013
@@ -23,9 +23,13 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.lang.reflect.Field;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 import javax.jcr.Credentials;
 import javax.jcr.Repository;
@@ -37,16 +41,23 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Property;
 import org.apache.jackrabbit.api.management.DataStoreGarbageCollector;
 import org.apache.jackrabbit.api.management.RepositoryManager;
+import org.apache.jackrabbit.core.RepositoryContext;
 import org.apache.jackrabbit.core.RepositoryImpl;
 import org.apache.jackrabbit.core.config.RepositoryConfig;
+import org.apache.jackrabbit.core.stats.RepositoryStatisticsImpl;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.jcr.base.AbstractSlingRepository;
+import org.apache.sling.jcr.jackrabbit.server.impl.jmx.StatisticsMBeanImpl;
 import org.apache.sling.jcr.jackrabbit.server.impl.security.AdministrativeCredentials;
 import org.apache.sling.jcr.jackrabbit.server.impl.security.AnonCredentials;
+import org.apache.sling.jcr.jackrabbit.server.jmx.RepositoryStatisticsMBean;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.log.LogService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The <code>SlingServerRepository</code> TODO
@@ -90,13 +101,17 @@ public class SlingServerRepository exten
     @Property(value="")
     public static final String REPOSITORY_REGISTRATION_NAME = "name";
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(SlingServerRepository.class);
+
+    private Map<String, ServiceRegistration> statisticsServices = new ConcurrentHashMap<String, ServiceRegistration>();
+
     //---------- Repository Management ----------------------------------------
 
     @Override
     protected Repository acquireRepository() {
         Repository repository = super.acquireRepository();
         if (repository != null) {
-            return repository;
+            return registerStatistics(repository);
         }
 
         @SuppressWarnings("unchecked")
@@ -162,7 +177,7 @@ public class SlingServerRepository exten
                 crc = RepositoryConfig.create(homeFile);
             }
 
-            return RepositoryImpl.create(crc);
+            return registerStatistics(RepositoryImpl.create(crc));
 
         } catch (IOException ioe) {
 
@@ -189,9 +204,35 @@ public class SlingServerRepository exten
         return null;
     }
 
+    private Repository registerStatistics(Repository repository) {
+        if (repository instanceof RepositoryImpl) {
+            try {
+                RepositoryImpl repositoryImpl = (RepositoryImpl) repository;
+                StatisticsMBeanImpl mbean = new StatisticsMBeanImpl(
+                        repositoryImpl);
+                Dictionary<String, Object> properties = new Hashtable<String, Object>();
+                String mbeanName = StatisticsMBeanImpl
+                        .getMBeanName(repositoryImpl);
+                properties.put("jmx.objectname", mbeanName);
+                properties.put(Constants.SERVICE_VENDOR, "Apache");
+                statisticsServices.put(
+                        mbeanName,
+                        getComponentContext().getBundleContext()
+                                .registerService(
+                                        RepositoryStatisticsMBean.class
+                                                .getName(), mbean, properties));
+            } catch (Exception e) {
+                LOGGER.error("Unable to register statistics ", e);
+            }
+        }
+        return repository;
+    }
+
+
     @Override
     protected void disposeRepository(Repository repository) {
         super.disposeRepository(repository);
+        unregisterStatistics(repository);
 
         if (repository instanceof RepositoryImpl) {
 
@@ -209,9 +250,27 @@ public class SlingServerRepository exten
         }
     }
 
+    private void unregisterStatistics(Repository repository) {
+        if (repository instanceof RepositoryImpl) {
+            String mbeanName = StatisticsMBeanImpl
+                    .getMBeanName((RepositoryImpl) repository);
+            try {
+                ServiceRegistration serviceRegistration = statisticsServices
+                        .get(mbeanName);
+                if (serviceRegistration != null) {
+                    serviceRegistration.unregister();
+                }
+            } catch (Exception e) {
+                LOGGER.warn("Failed to unregister statistics JMX bean {} ",
+                        e.getMessage());
+            }
+            statisticsServices.remove(mbeanName);
+        }
+    }
 
     //---------- Repository Manager Interface Methods -------------------------
 
+
     /**
      * @throws UnsupportedOperationException This method is not supported
      *      in this context.

Modified: sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/impl/jmx/StatisticsMBeanImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/impl/jmx/StatisticsMBeanImpl.java?rev=1450021&r1=1450020&r2=1450021&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/impl/jmx/StatisticsMBeanImpl.java (original)
+++ sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/impl/jmx/StatisticsMBeanImpl.java Tue Feb 26 04:50:02 2013
@@ -18,14 +18,14 @@
 package org.apache.sling.jcr.jackrabbit.server.impl.jmx;
 
 import java.lang.reflect.Field;
-import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Dictionary;
 import java.util.HashSet;
+import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.concurrent.atomic.AtomicLong;
 
 import javax.management.Attribute;
 import javax.management.AttributeList;
@@ -38,21 +38,16 @@ import javax.management.MBeanInfo;
 import javax.management.NotCompliantMBeanException;
 import javax.management.ReflectionException;
 
-import org.apache.felix.scr.annotations.Activate;
 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.jackrabbit.api.stats.RepositoryStatistics;
 import org.apache.jackrabbit.api.stats.TimeSeries;
 import org.apache.jackrabbit.core.RepositoryContext;
 import org.apache.jackrabbit.core.RepositoryImpl;
 import org.apache.jackrabbit.core.stats.RepositoryStatisticsImpl;
-import org.apache.sling.jcr.api.SlingRepository;
-import org.apache.sling.jcr.base.AbstractSlingRepository;
 import org.apache.sling.jcr.jackrabbit.server.jmx.RepositoryStatisticsMBean;
-import org.osgi.service.component.ComponentContext;
+import org.osgi.framework.Constants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -61,44 +56,36 @@ import org.slf4j.LoggerFactory;
  * available to other components read only.
  */
 @Component(immediate = true)
-@Service(value = { RepositoryStatisticsMBean.class, RepositoryStatistics.class })
+@Service(value = { RepositoryStatisticsMBean.class })
 @Properties(@Property(name = "jmx.objectname", value = "org.apache.sling.Resository:type=Statistics"))
 public class StatisticsMBeanImpl implements DynamicMBean,
-        RepositoryStatisticsMBean, RepositoryStatistics {
+        RepositoryStatisticsMBean {
 
     private static final Logger LOGGER = LoggerFactory
             .getLogger(StatisticsMBeanImpl.class);
-    @Reference
-    public SlingRepository repository;
-    private RepositoryStatisticsImpl statistics;
 
-    public StatisticsMBeanImpl() throws NotCompliantMBeanException {
-    }
+    private RepositoryStatisticsImpl statistics;
 
-    @Activate
-    public void activate(ComponentContext context) {
+    public StatisticsMBeanImpl(RepositoryImpl repositoryImpl) throws IllegalArgumentException {
         try {
-            Method getRepositoryMethod = AbstractSlingRepository.class
-                    .getDeclaredMethod("getRepository", (Class<?>[]) null);
-            if (!getRepositoryMethod.isAccessible()) {
-                getRepositoryMethod.setAccessible(true);
-            }
-            RepositoryImpl repositoryImpl = (RepositoryImpl) getRepositoryMethod
-                    .invoke(repository, (Object[]) null);
-            Field contextField = RepositoryImpl.class
-                    .getDeclaredField("context");
-            if (!contextField.isAccessible()) {
+            Field contextField = RepositoryImpl.class.getDeclaredField("context");
+            if ( !contextField.isAccessible() ) {
                 contextField.setAccessible(true);
             }
-            RepositoryContext repositoryContext = (RepositoryContext) contextField
-                    .get(repositoryImpl);
-            statistics = repositoryContext.getRepositoryStatistics();
-
-        } catch (Exception e) {
-            LOGGER.error("Unable to retrive repository statistics ", e);
+            RepositoryContext respositoryContext = (RepositoryContext) contextField.get(repositoryImpl);
+            this.statistics = respositoryContext.getRepositoryStatistics();
+        } catch (SecurityException e) {
+            throw new IllegalArgumentException(e);
+        } catch (NoSuchFieldException e) {
+            throw new IllegalArgumentException(e);
+        } catch (IllegalAccessException e) {
+            throw new IllegalArgumentException(e);
         }
     }
 
+    public static String getMBeanName(RepositoryImpl repositoryImpl) {
+        return "org.apache.sling.Resository:type=Statistics,name="+repositoryImpl.getConfig().getSecurityConfig().getAppName();
+    }
     /*
      * (non-Javadoc)
      *
@@ -143,7 +130,7 @@ public class StatisticsMBeanImpl impleme
         } catch (AttributeNotFoundException e) {
             LOGGER.debug(e.getMessage(), e);
         }
-        return getCounter(attribute);
+        return getTimeSeries(attribute);
     }
 
     /*
@@ -297,26 +284,6 @@ public class StatisticsMBeanImpl impleme
     }
 
     /* Private Utility methods */
-    /**
-     * @param name
-     *            name of the attribute.
-     * @return the value of the counter
-     * @throws AttributeNotFoundException
-     *             if the attribute doesnt exist.
-     */
-    private long getCounter(String name) throws AttributeNotFoundException {
-        try {
-            AtomicLong ts = statistics.getCounter(Type.valueOf(name));
-            if (ts == null) {
-                throw new AttributeNotFoundException("Attribute " + name
-                        + " doesnt exist");
-            }
-            return ts.get();
-        } catch (Exception e) {
-            throw new AttributeNotFoundException("Attribute " + name
-                    + " doesnt exist");
-        }
-    }
 
     /**
      * @param values

Modified: sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/jmx/RepositoryStatisticsMBean.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/jmx/RepositoryStatisticsMBean.java?rev=1450021&r1=1450020&r2=1450021&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/jmx/RepositoryStatisticsMBean.java (original)
+++ sling/trunk/bundles/jcr/jackrabbit-server/src/main/java/org/apache/sling/jcr/jackrabbit/server/jmx/RepositoryStatisticsMBean.java Tue Feb 26 04:50:02 2013
@@ -17,11 +17,12 @@
  */
 package org.apache.sling.jcr.jackrabbit.server.jmx;
 
+import org.apache.jackrabbit.api.stats.RepositoryStatistics;
+
 /**
  * Marker interface to ensure that the OSGi Whiteboard (Aries) registers the
- * bean with JMX. To access the statistics use the RespositoryStatistics from
- * the Jackrabbit API.
+ * bean with JMX, extends RepositoryStatistics.
  */
-public interface RepositoryStatisticsMBean {
+public interface RepositoryStatisticsMBean extends RepositoryStatistics {
 
 }