package com.vladmihalcea.flexypool.adaptor; import bitronix.tm.internal.BitronixRuntimeException; import bitronix.tm.resource.jdbc.PoolingDataSource; import com.vladmihalcea.flexypool.common.ConfigurationProperties; import com.vladmihalcea.flexypool.metric.Metrics; import java.util.regex.Pattern; /** * <code>BitronixPoolAdapter</code> extends {@link AbstractPoolAdapter} and it adapts the required API to * communicate with the bitronix {@link PoolingDataSource} * * @author Vlad Mihalcea * @since 1.0 */ public class BitronixPoolAdapter extends AbstractPoolAdapter<PoolingDataSource> { public static final String ACQUIRE_TIMEOUT_MESSAGE = "XA pool of resource .*? still empty after .*?s wait time"; /** * Singleton factory object reference */ public static final PoolAdapterFactory<PoolingDataSource> FACTORY = new PoolAdapterFactory<PoolingDataSource>() { @Override public PoolAdapter<PoolingDataSource> newInstance( ConfigurationProperties<PoolingDataSource, Metrics, PoolAdapter<PoolingDataSource>> configurationProperties) { return new BitronixPoolAdapter(configurationProperties); } }; /** * Init constructor */ public BitronixPoolAdapter(ConfigurationProperties<PoolingDataSource, Metrics, PoolAdapter<PoolingDataSource>> configurationProperties) { super(configurationProperties); } /** * {@inheritDoc} */ @Override public int getMaxPoolSize() { return getTargetDataSource().getMaxPoolSize(); } /** * {@inheritDoc} */ @Override public void setMaxPoolSize(int maxPoolSize) { getTargetDataSource().setMaxPoolSize(maxPoolSize); } /** * {@inheritDoc} */ @Override protected boolean isAcquireTimeoutException(Exception e) { if (e.getCause() instanceof BitronixRuntimeException) { BitronixRuntimeException cause = (BitronixRuntimeException) e.getCause(); return cause.getMessage() != null && Pattern.matches(ACQUIRE_TIMEOUT_MESSAGE, cause.getMessage()); } return false; } }