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 * @param  source 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