1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/*
2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors
3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License.
4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage org.mockito.internal.configuration;
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.ReturnValues;
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.configuration.AnnotationEngine;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.configuration.DefaultMockitoConfiguration;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.configuration.IMockitoConfiguration;
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.stubbing.Answer;
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.io.Serializable;
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/**
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Thread-safe wrapper on user-defined org.mockito.configuration.MockitoConfiguration implementation
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson@SuppressWarnings("deprecation")//supressed until ReturnValues are removed
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class GlobalConfiguration implements IMockitoConfiguration, Serializable {
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    static final long serialVersionUID = -2860353062105505938L;
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private static ThreadLocal<IMockitoConfiguration> globalConfiguration = new ThreadLocal<IMockitoConfiguration>();
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    //back door for testing
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    IMockitoConfiguration getIt() {
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return globalConfiguration.get();
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public GlobalConfiguration() {
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        //Configuration should be loaded only once but I cannot really test it
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (globalConfiguration.get() == null) {
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            globalConfiguration.set(createConfig());
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private IMockitoConfiguration createConfig() {
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        IMockitoConfiguration defaultConfiguration = new DefaultMockitoConfiguration();
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        IMockitoConfiguration config = new ClassPathLoader().loadConfiguration();
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (config != null) {
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return config;
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        } else {
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return defaultConfiguration;
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public static void validate() {
47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        new GlobalConfiguration();
48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public ReturnValues getReturnValues() {
51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return globalConfiguration.get().getReturnValues();
52e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
53e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
54e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public AnnotationEngine getAnnotationEngine() {
55e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return globalConfiguration.get().getAnnotationEngine();
56e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
57e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
58e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public boolean cleansStackTrace() {
59e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return globalConfiguration.get().cleansStackTrace();
60e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
61e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
62e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public boolean enableClassCache() {
63e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return globalConfiguration.get().enableClassCache();
64e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
65e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
66e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public Answer<Object> getDefaultAnswer() {
67e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return globalConfiguration.get().getDefaultAnswer();
68e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
69e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}