1/*
2 * Copyright (c) 2007 Mockito contributors
3 * This program is made available under the terms of the MIT License.
4 */
5package org.mockito.internal.creation;
6
7import org.mockito.cglib.proxy.Callback;
8import org.mockito.cglib.proxy.Factory;
9import org.mockito.exceptions.base.MockitoException;
10import org.mockito.internal.InternalMockHandler;
11import org.mockito.invocation.MockHandler;
12import org.mockito.mock.MockCreationSettings;
13import org.mockito.plugins.MockMaker;
14import org.mockito.internal.creation.jmock.ClassImposterizer;
15
16/**
17 * A MockMaker that uses cglib to generate mocks on a JVM.
18 */
19public final class CglibMockMaker implements MockMaker {
20
21    public <T> T createMock(MockCreationSettings<T> settings, MockHandler handler) {
22        InternalMockHandler mockitoHandler = cast(handler);
23        new AcrossJVMSerializationFeature().enableSerializationAcrossJVM(settings);
24        return ClassImposterizer.INSTANCE.imposterise(
25                new MethodInterceptorFilter(mockitoHandler, settings), settings.getTypeToMock(), settings.getExtraInterfaces());
26    }
27
28    private InternalMockHandler cast(MockHandler handler) {
29        if (!(handler instanceof InternalMockHandler)) {
30            throw new MockitoException("At the moment you cannot provide own implementations of MockHandler." +
31                    "\nPlease see the javadocs for the MockMaker interface.");
32        }
33        return (InternalMockHandler) handler;
34    }
35
36    public void resetMock(Object mock, MockHandler newHandler, MockCreationSettings settings) {
37        ((Factory) mock).setCallback(0, new MethodInterceptorFilter(cast(newHandler), settings));
38    }
39
40    public MockHandler getHandler(Object mock) {
41        if (!(mock instanceof Factory)) {
42            return null;
43        }
44        Factory factory = (Factory) mock;
45        Callback callback = factory.getCallback(0);
46        if (!(callback instanceof MethodInterceptorFilter)) {
47            return null;
48        }
49        return ((MethodInterceptorFilter) callback).getHandler();
50    }
51}
52