1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2001-2009 OFFIS, Tammo Freese
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Licensed under the Apache License, Version 2.0 (the "License");
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * you may not use this file except in compliance with the License.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * You may obtain a copy of the License at
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *     http://www.apache.org/licenses/LICENSE-2.0
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unless required by applicable law or agreed to in writing, software
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distributed under the License is distributed on an "AS IS" BASIS,
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * See the License for the specific language governing permissions and
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * limitations under the License.
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpackage org.easymock.internal;
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport java.io.Serializable;
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport java.lang.reflect.InvocationHandler;
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport java.lang.reflect.Method;
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic final class MockInvocationHandler implements InvocationHandler, Serializable {
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    private static final long serialVersionUID = -7799769066534714634L;
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    private final MocksControl control;
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    public MockInvocationHandler(MocksControl control) {
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        this.control = control;
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    public Object invoke(Object proxy, Method method, Object[] args)
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            throws Throwable {
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        try {
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (control.getState() instanceof RecordState) {
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                LastControl.reportLastControl(control);
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return control.getState().invoke(
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    new Invocation(proxy, method, args));
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        } catch (RuntimeExceptionWrapper e) {
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            throw e.getRuntimeException().fillInStackTrace();
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        } catch (AssertionErrorWrapper e) {
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            throw e.getAssertionError().fillInStackTrace();
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        } catch (ThrowableWrapper t) {
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            throw t.getThrowable().fillInStackTrace();
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        } catch (Throwable t) {
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            throw t; // let all unwrapped pass unmodified
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        }
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    public MocksControl getControl() {
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return control;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}