001/*
002 * HA-JDBC: High-Availability JDBC
003 * Copyright (c) 2004-2008 Paul Ferraro
004 * 
005 * This library is free software; you can redistribute it and/or modify it 
006 * under the terms of the GNU Lesser General Public License as published by the 
007 * Free Software Foundation; either version 2.1 of the License, or (at your 
008 * option) any later version.
009 * 
010 * This library is distributed in the hope that it will be useful, but WITHOUT
011 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
012 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License 
013 * for more details.
014 * 
015 * You should have received a copy of the GNU Lesser General Public License
016 * along with this library; if not, write to the Free Software Foundation, 
017 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
018 * 
019 * Contact: ferraro@users.sourceforge.net
020 */
021package net.sf.hajdbc.sql;
022
023import java.lang.reflect.Method;
024import java.util.Set;
025
026import net.sf.hajdbc.DatabaseCluster;
027import net.sf.hajdbc.util.reflect.Methods;
028
029/**
030 * @author Paul Ferraro
031 * @param <D> 
032 */
033@SuppressWarnings("nls")
034public class CommonDataSourceInvocationHandler<D> extends AbstractRootInvocationHandler<D>
035{
036//      private static final Set<Method> getMethodSet = Methods.findMethods(CommonDataSource.class, "get\\w+");
037//      private static final Set<Method> setMethodSet = Methods.findMethods(CommonDataSource.class, "set\\w+");
038        
039        private final Set<Method> getMethodSet;
040        private final Set<Method> setMethodSet;
041        
042        /**
043         * @param databaseCluster
044         * @param proxyClass
045         */
046        protected CommonDataSourceInvocationHandler(DatabaseCluster<D> databaseCluster, Class<D> proxyClass)
047        {
048                super(databaseCluster, proxyClass);
049                
050                this.getMethodSet = Methods.findMethods(proxyClass, "get\\w+");
051                this.setMethodSet = Methods.findMethods(proxyClass, "set\\w+");
052        }
053
054        @Override
055        protected InvocationStrategy<D, D, ?> getInvocationStrategy(D object, Method method, Object[] parameters) throws Exception
056        {
057                if (this.getMethodSet.contains(method))
058                {
059                        return new DriverReadInvocationStrategy<D, D, Object>();
060                }
061
062                if (this.setMethodSet.contains(method))
063                {
064                        return new DriverWriteInvocationStrategy<D, D, Object>();
065                }
066                
067                return super.getInvocationStrategy(object, method, parameters);
068        }
069
070        /**
071         * @see net.sf.hajdbc.sql.AbstractInvocationHandler#isRecordable(java.lang.reflect.Method)
072         */
073        @Override
074        protected boolean isRecordable(Method method)
075        {
076                return this.setMethodSet.contains(method);
077        }
078}