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 Murashkinimport android.hardware.camera2.utils.UncheckedThrow;
190b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport android.util.Log;
200b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
210b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport java.lang.reflect.InvocationTargetException;
220b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport java.lang.reflect.Method;
230b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
240b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport static com.android.internal.util.Preconditions.*;
250b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
260b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
270b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinpublic class InvokeDispatcher<T> implements Dispatchable<T> {
280b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
290b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin    private static final String TAG = "InvocationSink";
300b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin    private final T mTarget;
310b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
320b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin    public InvokeDispatcher(T target) {
330b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        mTarget = checkNotNull(target, "target must not be null");
340b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin    }
350b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
360b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin    @Override
370b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin    public Object dispatch(Method method, Object[] args) {
380b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        try {
390b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            return method.invoke(mTarget, args);
400b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        } catch (InvocationTargetException e) {
410b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            Throwable t = e.getTargetException();
420b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            // Potential UB. Hopefully 't' is a runtime exception.
430b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            UncheckedThrow.throwAnyException(t);
440b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        } catch (IllegalAccessException e) {
450b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            // Impossible
460b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            Log.wtf(TAG, "IllegalAccessException while invoking " + method, e);
470b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        } catch (IllegalArgumentException e) {
480b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            // Impossible
490b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            Log.wtf(TAG, "IllegalArgumentException while invoking " + method, e);
500b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
510b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
520b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        // unreachable
530b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        return null;
540b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin    }
550b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin}
56