001/* 002 * HA-JDBC: High-Availability JDBC 003 * Copyright (C) 2012 Paul Ferraro 004 * 005 * This program is free software: you can redistribute it and/or modify 006 * it under the terms of the GNU Lesser General Public License as published by 007 * the Free Software Foundation, either version 3 of the License, or 008 * (at your option) any later version. 009 * 010 * This program is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 * GNU Lesser General Public License for more details. 014 * 015 * You should have received a copy of the GNU Lesser General Public License 016 * along with this program. If not, see <http://www.gnu.org/licenses/>. 017 */ 018package net.sf.hajdbc.sql; 019 020import java.lang.reflect.Method; 021import java.sql.SQLException; 022import java.util.Set; 023 024import net.sf.hajdbc.Database; 025import net.sf.hajdbc.invocation.InvocationStrategies; 026import net.sf.hajdbc.invocation.InvocationStrategy; 027import net.sf.hajdbc.invocation.Invoker; 028import net.sf.hajdbc.util.reflect.Methods; 029 030/** 031 * @author Paul Ferraro 032 * @param <Z> 033 * @param <D> 034 * @param <P> 035 * @param <T> 036 */ 037public abstract class LocatorInvocationHandler<Z, D extends Database<Z>, P, T, F extends LocatorProxyFactory<Z, D, P, T>> extends ChildInvocationHandler<Z, D, P, SQLException, T, SQLException, F> 038{ 039 private final Method freeMethod; 040 private final Set<Method> readMethods; 041 private final Set<Method> writeMethods; 042 043 protected LocatorInvocationHandler(Class<T> proxyClass, F proxyFactory, Set<Method> readMethods, Set<Method> writeMethods) 044 { 045 super(proxyClass, proxyFactory, null); 046 047 this.freeMethod = Methods.findMethod(proxyClass, "free"); 048 this.readMethods = readMethods; 049 this.writeMethods = writeMethods; 050 } 051 052 /** 053 * {@inheritDoc} 054 */ 055 @Override 056 protected InvocationStrategy getInvocationStrategy(T locator, Method method, Object... parameters) throws SQLException 057 { 058 if (this.readMethods.contains(method)) 059 { 060 return this.getProxyFactory().locatorsUpdateCopy() ? InvocationStrategies.INVOKE_ON_ANY : InvocationStrategies.INVOKE_ON_NEXT; 061 } 062 063 if (this.writeMethods.contains(method)) 064 { 065 return this.getProxyFactory().locatorsUpdateCopy() ? InvocationStrategies.INVOKE_ON_EXISTING : InvocationStrategies.INVOKE_ON_ALL; 066 } 067 068 return super.getInvocationStrategy(locator, method, parameters); 069 } 070 071 @Override 072 protected <R> void postInvoke(Invoker<Z, D, T, R, SQLException> invoker, T proxy, Method method, Object... parameters) 073 { 074 super.postInvoke(invoker, proxy, method, parameters); 075 076 if ((this.freeMethod != null) && method.equals(this.freeMethod)) 077 { 078 this.getProxyFactory().remove(); 079 } 080 } 081}