/* * * * JBoss, Home of Professional Open Source. * * Copyright 2015, Red Hat, Inc., and individual contributors * * as indicated by the @author tags. See the copyright.txt file in the * * distribution for a full listing of individual contributors. * * * * This is free software; you can redistribute it and/or modify it * * under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 2.1 of * * the License, or (at your option) any later version. * * * * This software is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this software; if not, write to the Free * * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * * 02110-1301 USA, or see the FSF site: http://www.fsf.org. * */ package org.jboss.as.test.integration.jca; import static org.junit.Assert.fail; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.concurrent.ConcurrentMap; import org.jboss.as.connector.subsystems.datasources.WildFlyDataSource; import org.jboss.jca.adapters.jdbc.WrapperDataSource; import org.jboss.jca.core.api.connectionmanager.pool.PoolConfiguration; import org.jboss.jca.core.connectionmanager.ConnectionManager; import org.jboss.jca.core.connectionmanager.pool.api.Pool; import org.jboss.jca.core.connectionmanager.pool.mcp.ManagedConnectionPool; import org.jboss.jca.core.util.Injection; /** * Utility class for JCA integration test * * @author <a href="mailto:msimka@redhat.com">Martin Simka</a> */ public class JcaTestsUtil { /** * set lastIdleCheck property in ManagedConnectionPool to minimun and ManagedConnectionPool's removeIdleConnection * * @param mcp * @throws Exception */ public static void callRemoveIdleConnections(ManagedConnectionPool mcp) throws Exception { Injection in = new Injection(); in.inject(mcp, "lastIdleCheck", Long.MIN_VALUE, long.class.getName(), true); mcp.removeIdleConnections(); } /** * Extract ManagedConnectionPool from ConnectionFactory by using reflection * * @param connectionFactory * @return ManagedConnectionPool instance. <code>null</code> if not found */ public static ManagedConnectionPool extractManagedConnectionPool(Object connectionFactory) { ConnectionManager cm = extractConnectionManager(connectionFactory); // org.jboss.jca.core.connectionmanager.pool.strategy.OnePool Object onePool = cm.getPool(); Class<?> clz = onePool.getClass(); // org.jboss.jca.core.connectionmanager.pool.AbstractPrefillPool clz = clz.getSuperclass(); // org.jboss.jca.core.connectionmanager.pool.AbstractPool clz = clz.getSuperclass(); try { Method getManagedConnectionPools = clz.getDeclaredMethod("getManagedConnectionPools"); getManagedConnectionPools.setAccessible(true); ConcurrentMap<Object, ManagedConnectionPool> mcps = (ConcurrentMap<Object, ManagedConnectionPool>) getManagedConnectionPools.invoke(onePool); return mcps.values().iterator().next(); } catch (Throwable t) { fail(t.getMessage()); } return null; } public static PoolConfiguration exctractPoolConfiguration(Object connectionFactory) { ConnectionManager cm = extractConnectionManager(connectionFactory); // org.jboss.jca.core.connectionmanager.pool.strategy.OnePool Pool pool = cm.getPool(); Class<?> clz = pool.getClass(); // org.jboss.jca.core.connectionmanager.pool.AbstractPrefillPool clz = clz.getSuperclass(); // org.jboss.jca.core.connectionmanager.pool.AbstractPool clz = clz.getSuperclass(); try { Method getPoolConfiguration = clz.getDeclaredMethod("getPoolConfiguration"); getPoolConfiguration.setAccessible(true); return (PoolConfiguration) getPoolConfiguration.invoke(pool); } catch (Throwable t) { fail(t.getMessage()); } return null; } public static PoolConfiguration extractDSPoolConfiguration(Object datasource) { try { Field delegateField = datasource.getClass().getDeclaredField("delegate"); Object delegate = delegateField.get(datasource); } catch (Throwable t) { fail(t.getMessage()); } return null; } /** * Extract ConnectionManager from the passed object * * @param connectionFactory The object; typically a ConnectionFactory implementation * @return The connection manager; <code>null</code> if not found */ private static ConnectionManager extractConnectionManager(Object connectionFactory) { Class<?> clz = connectionFactory.getClass(); while (!Object.class.equals(clz)) { try { Field[] fields = clz.getDeclaredFields(); if (fields != null && fields.length > 0) { for (Field field : fields) { Class<?> fieldType = field.getType(); if (fieldType.equals(javax.resource.spi.ConnectionManager.class) || fieldType.equals(ConnectionManager.class)) { field.setAccessible(true); return (ConnectionManager) field.get(connectionFactory); } } } } catch (Throwable t) { fail(t.getMessage()); } try { Method[] methods = clz.getDeclaredMethods(); for (Method method : methods) { Class<?> type = method.getReturnType(); if (type.equals(javax.resource.spi.ConnectionManager.class) || type.equals(ConnectionManager.class)) { method.setAccessible(true); return (ConnectionManager) method.invoke(connectionFactory); } } } catch (Throwable t) { fail(t.getMessage()); } clz = clz.getSuperclass(); } return null; } /** * Extract WrapperDataSource from WildflyDataSource by using reflection * * @param wfds * @return WrapperDataSource instance, <code>null</code> if not found */ public static WrapperDataSource extractWrapperDatasource(WildFlyDataSource wfds) { Class clazz = wfds.getClass(); try { Field delegate = clazz.getDeclaredField("delegate"); delegate.setAccessible(true); return (WrapperDataSource) delegate.get(wfds); } catch (Throwable t) { // } return null; } }