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 {
}