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.configuration;
6
7import java.io.Serializable;
8import org.mockito.configuration.AnnotationEngine;
9import org.mockito.configuration.DefaultMockitoConfiguration;
10import org.mockito.configuration.IMockitoConfiguration;
11import org.mockito.internal.configuration.plugins.Plugins;
12import org.mockito.stubbing.Answer;
13
14/**
15 * Thread-safe wrapper on user-defined org.mockito.configuration.MockitoConfiguration implementation
16 */
17public class GlobalConfiguration implements IMockitoConfiguration, Serializable {
18    private static final long serialVersionUID = -2860353062105505938L;
19
20    private static final ThreadLocal<IMockitoConfiguration> GLOBAL_CONFIGURATION = new ThreadLocal<IMockitoConfiguration>();
21
22    //back door for testing
23    IMockitoConfiguration getIt() {
24        return GLOBAL_CONFIGURATION.get();
25    }
26
27    public GlobalConfiguration() {
28        //Configuration should be loaded only once but I cannot really test it
29        if (GLOBAL_CONFIGURATION.get() == null) {
30            GLOBAL_CONFIGURATION.set(createConfig());
31        }
32    }
33
34    private IMockitoConfiguration createConfig() {
35        IMockitoConfiguration defaultConfiguration = new DefaultMockitoConfiguration();
36        IMockitoConfiguration config = new ClassPathLoader().loadConfiguration();
37        if (config != null) {
38            return config;
39        } else {
40            return defaultConfiguration;
41        }
42    }
43
44    public static void validate() {
45        new GlobalConfiguration();
46    }
47
48    public AnnotationEngine getAnnotationEngine() {
49        return GLOBAL_CONFIGURATION.get().getAnnotationEngine();
50    }
51
52    public org.mockito.plugins.AnnotationEngine tryGetPluginAnnotationEngine() {
53        IMockitoConfiguration configuration = GLOBAL_CONFIGURATION.get();
54        if (configuration.getClass() == DefaultMockitoConfiguration.class) {
55            return Plugins.getAnnotationEngine();
56        }
57        return configuration.getAnnotationEngine();
58    }
59
60
61
62    public boolean cleansStackTrace() {
63        return GLOBAL_CONFIGURATION.get().cleansStackTrace();
64    }
65
66    public boolean enableClassCache() {
67        return GLOBAL_CONFIGURATION.get().enableClassCache();
68    }
69
70    public Answer<Object> getDefaultAnswer() {
71        return GLOBAL_CONFIGURATION.get().getDefaultAnswer();
72    }
73}
74