10b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin/* 20b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * Copyright (C) 2014 The Android Open Source Project 30b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * 40b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 50b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * you may not use this file except in compliance with the License. 60b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * You may obtain a copy of the License at 70b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * 80b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 90b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * 100b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * Unless required by applicable law or agreed to in writing, software 110b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 120b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * See the License for the specific language governing permissions and 140b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * limitations under the License. 150b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin */ 160b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinpackage android.hardware.camera2.dispatch; 170b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 180b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 190b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport java.lang.reflect.Method; 200b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 210b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport static com.android.internal.util.Preconditions.*; 220b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 230b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin/** 240b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * Duck typing dispatcher; converts dispatch methods calls from one class to another by 250b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * looking up equivalently methods at runtime by name. 260b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * 270b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * <p>For example, if two types have identical method names and arguments, but 280b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * are not subclasses/subinterfaces of each other, this dispatcher will allow calls to be 290b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * made from one type to the other.</p> 300b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * 310b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * @paramsource dispatch type, whose methods with {@link #dispatch} will be called 320b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * @param <T> destination dispatch type, methods will be converted to the class of {@code T} 330b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin */ 340b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinpublic class DuckTypingDispatcher<TFrom, T> implements Dispatchable<TFrom> { 350b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 360b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin private final MethodNameInvoker<T> mDuck; 370b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 380b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin /** 390b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * Create a new duck typing dispatcher. 400b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * 410b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * @param target destination dispatch type, methods will be redirected to this dispatcher 420b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * @param targetClass destination dispatch class, methods will be converted to this class's 430b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin */ 440b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin public DuckTypingDispatcher(Dispatchable<T> target, Class<T> targetClass) { 450b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin checkNotNull(targetClass, "targetClass must not be null"); 460b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin checkNotNull(target, "target must not be null"); 470b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 480b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin mDuck = new MethodNameInvoker<T>(target, targetClass); 490b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin } 500b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 510b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin @Override 520b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin public Object dispatch(Method method, Object[] args) { 530b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin return mDuck.invoke(method.getName(), args); 540b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin } 550b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin} 56