001package com.hammurapi.extract;
002
003import java.lang.reflect.InvocationTargetException;
004import java.lang.reflect.Method;
005import java.lang.reflect.Modifier;
006import java.util.Collections;
007import java.util.Map;
008import java.util.Set;
009import java.util.TreeSet;
010import java.util.concurrent.TimeUnit;
011
012public class MethodExtractor<T, V, C> extends ExtractorBase<T, V, C> implements     Extractor<T, V, C> {
013        
014        private Method method;
015        private Set<Integer> parameterIndices;
016
017        public MethodExtractor(double initialCost, TimeUnit costUnit, Method method) {
018                super(initialCost, costUnit);
019                this.method = method;
020                Set<Integer> pi = new TreeSet<Integer>();   
021                for (int i=0, l=method.getParameterTypes().length; i<l; ++i) {
022                        pi.add(i);
023                }
024                parameterIndices = Collections.unmodifiableSet(pi);
025        }
026
027        @Override
028        public Set<Integer> parameterIndices() {
029                return parameterIndices;
030        }
031
032        @Override
033        public boolean isContextDependent() {
034                return Modifier.isStatic(method.getModifiers());
035        }
036
037        @SuppressWarnings("unchecked")
038        @Override
039        protected V extractInternal(
040                        C context,
041                        Map<C, Map<Extractor<T, ? super V, C>, ? super V>> cache, 
042                        T... obj) {
043                try {
044                        return (V) method.invoke(context, obj);
045                } catch (IllegalAccessException e) {
046                        throw new ExtractorException(e);
047                } catch (InvocationTargetException e) {
048                        throw new ExtractorException(e);
049                }
050        }
051        
052
053}