• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2001-2009 OFFIS, Tammo Freese
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.easymock.internal;
17 
18 import java.util.ArrayList;
19 import java.util.LinkedList;
20 import java.util.List;
21 import java.util.Stack;
22 
23 import org.easymock.IArgumentMatcher;
24 import org.easymock.internal.matchers.And;
25 import org.easymock.internal.matchers.Not;
26 import org.easymock.internal.matchers.Or;
27 
28 public class LastControl {
29     private static final ThreadLocal<MocksControl> threadToControl = new ThreadLocal<MocksControl>();
30 
31     private static final ThreadLocal<Stack<Invocation>> threadToCurrentInvocation = new ThreadLocal<Stack<Invocation>>();
32 
33     private static final ThreadLocal<Stack<IArgumentMatcher>> threadToArgumentMatcherStack = new ThreadLocal<Stack<IArgumentMatcher>>();
34 
reportLastControl(MocksControl control)35     public static void reportLastControl(MocksControl control) {
36         if (control != null) {
37             threadToControl.set(control);
38         } else {
39             threadToControl.remove();
40         }
41     }
42 
lastControl()43     public static MocksControl lastControl() {
44         return threadToControl.get();
45     }
46 
reportMatcher(IArgumentMatcher matcher)47     public static void reportMatcher(IArgumentMatcher matcher) {
48         Stack<IArgumentMatcher> stack = threadToArgumentMatcherStack.get();
49         if (stack == null) {
50             stack = new Stack<IArgumentMatcher>();
51             threadToArgumentMatcherStack.set(stack);
52         }
53         stack.push(matcher);
54     }
55 
pullMatchers()56     public static List<IArgumentMatcher> pullMatchers() {
57         Stack<IArgumentMatcher> stack = threadToArgumentMatcherStack.get();
58         if (stack == null) {
59             return null;
60         }
61         threadToArgumentMatcherStack.remove();
62         return new ArrayList<IArgumentMatcher>(stack);
63     }
64 
reportAnd(int count)65     public static void reportAnd(int count) {
66         Stack<IArgumentMatcher> stack = threadToArgumentMatcherStack.get();
67         assertState(stack != null, "no matchers found.");
68         stack.push(new And(popLastArgumentMatchers(count)));
69     }
70 
reportNot()71     public static void reportNot() {
72         Stack<IArgumentMatcher> stack = threadToArgumentMatcherStack.get();
73         assertState(stack != null, "no matchers found.");
74         stack.push(new Not(popLastArgumentMatchers(1).get(0)));
75     }
76 
popLastArgumentMatchers(int count)77     private static List<IArgumentMatcher> popLastArgumentMatchers(int count) {
78         Stack<IArgumentMatcher> stack = threadToArgumentMatcherStack.get();
79         assertState(stack != null, "no matchers found.");
80         assertState(stack.size() >= count, "" + count + " matchers expected, "
81                 + stack.size() + " recorded.");
82         List<IArgumentMatcher> result = new LinkedList<IArgumentMatcher>();
83         result.addAll(stack.subList(stack.size() - count, stack.size()));
84         for (int i = 0; i < count; i++) {
85             stack.pop();
86         }
87         return result;
88     }
89 
assertState(boolean toAssert, String message)90     private static void assertState(boolean toAssert, String message) {
91         if (!toAssert) {
92             threadToArgumentMatcherStack.remove();
93             throw new IllegalStateException(message);
94         }
95     }
96 
reportOr(int count)97     public static void reportOr(int count) {
98         Stack<IArgumentMatcher> stack = threadToArgumentMatcherStack.get();
99         assertState(stack != null, "no matchers found.");
100         stack.push(new Or(popLastArgumentMatchers(count)));
101     }
102 
getCurrentInvocation()103     public static Invocation getCurrentInvocation() {
104         Stack<Invocation> stack = threadToCurrentInvocation.get();
105         if (stack == null || stack.empty()) {
106             return null;
107         }
108         return stack.lastElement();
109     }
110 
pushCurrentInvocation(Invocation invocation)111     public static void pushCurrentInvocation(Invocation invocation) {
112         Stack<Invocation> stack = threadToCurrentInvocation.get();
113         if (stack == null) {
114             stack = new Stack<Invocation>();
115             threadToCurrentInvocation.set(stack);
116         }
117         stack.push(invocation);
118     }
119 
popCurrentInvocation()120     public static void popCurrentInvocation() {
121         Stack<Invocation> stack = threadToCurrentInvocation.get();
122         stack.pop();
123     }
124 }
125