You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ma...@apache.org on 2013/07/26 11:04:36 UTC
svn commit: r1507228 - in
/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl:
GenericObjectPool.java GenericObjectPoolMXBean.java PoolImplUtils.java
Author: markt
Date: Fri Jul 26 09:04:35 2013
New Revision: 1507228
URL: http://svn.apache.org/r1507228
Log:
Use some reflection trickery on the factory to work out what type of objects are being handled by the pool.
Modified:
commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java
commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPoolMXBean.java
commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/PoolImplUtils.java
Modified: commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java?rev=1507228&r1=1507227&r2=1507228&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java (original)
+++ commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java Fri Jul 26 09:04:35 2013
@@ -910,6 +910,8 @@ public class GenericObjectPool<T> extend
//--- JMX support ----------------------------------------------------------
+ private volatile String factoryType = null;
+
/**
* Return an estimate of the number of threads currently blocked waiting for
* an object from the pool. This is intended for monitoring only, not for
@@ -924,8 +926,37 @@ public class GenericObjectPool<T> extend
}
}
+ /**
+ * Return the type - included the specific type rather than the generic - of
+ * the factory.
+ */
+ @Override
+ public String getFactoryType() {
+ // Not thread safe. Accept that there may be multiple evaluations.
+ if (factoryType == null) {
+ StringBuilder result = new StringBuilder();
+ result.append(factory.getClass().getName());
+ result.append('<');
+ Class<?> pooledObjectType =
+ PoolImplUtils.getFactoryType(factory.getClass());
+ result.append(pooledObjectType.getName());
+ result.append('>');
+ factoryType = result.toString();
+ }
+ return factoryType;
+ }
+
+ /**
+ * Provides information on all the objects in the pool, both idle (waiting
+ * to be borrowed) and active (currently borrowed).
+ * <p>
+ * Note: This is named listAllObjects so it is presented as an operation via
+ * JMX. That means it won't be invoked unless the explicitly requested
+ * whereas all attributes will be automatically requested when viewing the
+ * attributes for an object in a tool like JConsole.
+ */
@Override
- public Set<DefaultPooledObjectInfo> getAllObjects() {
+ public Set<DefaultPooledObjectInfo> listAllObjects() {
Set<DefaultPooledObjectInfo> result =
new HashSet<DefaultPooledObjectInfo>(allObjects.size());
for (PooledObject<T> p : allObjects.values()) {
Modified: commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPoolMXBean.java
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPoolMXBean.java?rev=1507228&r1=1507227&r2=1507228&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPoolMXBean.java (original)
+++ commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPoolMXBean.java Fri Jul 26 09:04:35 2013
@@ -163,7 +163,11 @@ public interface GenericObjectPoolMXBean
*/
int getRemoveAbandonedTimeout();
/**
- * See {@link GenericObjectPool#getAllObjects()}
+ * See {@link GenericObjectPool#getFactoryType()}
*/
- Set<DefaultPooledObjectInfo> getAllObjects();
+ public String getFactoryType();
+ /**
+ * See {@link GenericObjectPool#listAllObjects()}
+ */
+ Set<DefaultPooledObjectInfo> listAllObjects();
}
Modified: commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/PoolImplUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/PoolImplUtils.java?rev=1507228&r1=1507227&r2=1507228&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/PoolImplUtils.java (original)
+++ commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/PoolImplUtils.java Fri Jul 26 09:04:35 2013
@@ -16,6 +16,10 @@
*/
package org.apache.commons.pool2.impl;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+
import org.apache.commons.pool2.KeyedPoolableObjectFactory;
import org.apache.commons.pool2.KeyedPooledObjectFactory;
import org.apache.commons.pool2.PoolableObjectFactory;
@@ -47,6 +51,80 @@ public class PoolImplUtils {
}
+ /**
+ * Identifies the concrete type of object that an object factory creates.
+ */
+ @SuppressWarnings("rawtypes")
+ static Class<?> getFactoryType(Class<? extends PooledObjectFactory> factory) {
+ return (Class<?>) getGenericType(PooledObjectFactory.class, factory);
+ }
+
+
+ private static <T> Object getGenericType(Class<T> type,
+ Class<? extends T> clazz) {
+
+ // Look to see if this class implements the generic interface
+
+ // Get all the interfaces
+ Type[] interfaces = clazz.getGenericInterfaces();
+ for (Type iface : interfaces) {
+ // Only need to check interfaces that use generics
+ if (iface instanceof ParameterizedType) {
+ ParameterizedType pi = (ParameterizedType) iface;
+ // Look for the generic interface
+ if (pi.getRawType() instanceof Class) {
+ if (type.isAssignableFrom((Class<?>) pi.getRawType())) {
+ return getTypeParameter(
+ clazz, pi.getActualTypeArguments()[0]);
+ }
+ }
+ }
+ }
+
+ // Interface not found on this class. Look at the superclass.
+ Class<? extends T> superClazz =
+ (Class<? extends T>) clazz.getSuperclass();
+
+ Object result = getGenericType(type, superClazz);
+ if (result instanceof Class<?>) {
+ // Superclass implements interface and defines explicit type for
+ // generic
+ return result;
+ } else if (result instanceof Integer) {
+ // Superclass implements interface and defines unknown type for
+ // generic
+ // Map that unknown type to the generic types defined in this class
+ ParameterizedType superClassType =
+ (ParameterizedType) clazz.getGenericSuperclass();
+ return getTypeParameter(clazz,
+ superClassType.getActualTypeArguments()[
+ ((Integer) result).intValue()]);
+ } else {
+ // Error will be logged further up the call stack
+ return null;
+ }
+ }
+
+
+ /*
+ * For a generic parameter, return either the Class used or if the type
+ * is unknown, the index for the type in definition of the class
+ */
+ private static Object getTypeParameter(Class<?> clazz, Type argType) {
+ if (argType instanceof Class<?>) {
+ return argType;
+ } else {
+ TypeVariable<?>[] tvs = clazz.getTypeParameters();
+ for (int i = 0; i < tvs.length; i++) {
+ if (tvs[i].equals(argType)) {
+ return Integer.valueOf(i);
+ }
+ }
+ return null;
+ }
+ }
+
+
private static class PoolableObjectFactoryWrapper<T>
implements PooledObjectFactory<T> {