StepsContext.java
package org.jbehave.core.steps.context;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.jbehave.core.annotations.ToContext;
/**
* Holds runtime context-related objects.
*/
public class StepsContext {
private static final String OBJECT_ALREADY_STORED_MESSAGE = "Object key '%s' has been already stored before.";
private static final String OBJECT_NOT_STORED_MESSAGE = "Object key '%s' has not been stored";
private static final ThreadLocal<Map<String, Object>> exampleObjects = new ThreadLocal<>();
private static final ThreadLocal<Map<String, Object>> scenarioObjects = new ThreadLocal<>();
private static final ThreadLocal<Map<String, Object>> storyObjects = new ThreadLocal<>();
private static final ThreadLocal<Set<String>> keysStored = new ThreadLocal<>();
public void put(String key, Object object, ToContext.RetentionLevel retentionLevel) {
checkForDuplicate(key);
Map<String, Object> objects;
if (ToContext.RetentionLevel.EXAMPLE.equals(retentionLevel)) {
objects = getExampleObjects();
} else if (ToContext.RetentionLevel.SCENARIO.equals(retentionLevel)) {
objects = getScenarioObjects();
} else {
objects = getStoryObjects();
}
objects.put(key, object);
}
private void checkForDuplicate(String key) {
Set<String> keys = keysStored.get();
if (keys.contains(key)) {
throw new ObjectAlreadyStoredException(String.format(OBJECT_ALREADY_STORED_MESSAGE, key));
} else {
keys.add(key);
}
}
public Object get(String key) {
Object object = getExampleObjects().get(key);
if (object == null) {
object = getScenarioObjects().get(key);
if (object == null) {
object = getStoryObjects().get(key);
}
}
if (object == null) {
throw new ObjectNotStoredException(String.format(OBJECT_NOT_STORED_MESSAGE, key));
}
return object;
}
private Map<String, Object> getExampleObjects() {
Map<String, Object> objects = exampleObjects.get();
if (objects == null) {
objects = new HashMap<>();
exampleObjects.set(objects);
}
return objects;
}
private Map<String, Object> getScenarioObjects() {
Map<String, Object> objects = scenarioObjects.get();
if (objects == null) {
objects = new HashMap<>();
scenarioObjects.set(objects);
}
return objects;
}
private Map<String, Object> getStoryObjects() {
Map<String, Object> objects = storyObjects.get();
if (objects == null) {
objects = new HashMap<>();
storyObjects.set(objects);
}
return objects;
}
private Set<String> getKeys() {
Set<String> keys = keysStored.get();
if (keys == null) {
keys = new HashSet<>();
keysStored.set(keys);
}
return keys;
}
public void resetExample() {
Set<String> keys = getKeys();
keys.removeAll(getExampleObjects().keySet());
exampleObjects.set(new HashMap<String, Object>());
}
public void resetScenario() {
Set<String> keys = getKeys();
keys.removeAll(getScenarioObjects().keySet());
scenarioObjects.set(new HashMap<String, Object>());
}
public void resetStory() {
storyObjects.set(new HashMap<String, Object>());
keysStored.set(new HashSet<String>());
}
@SuppressWarnings("serial")
public static class ObjectNotStoredException extends RuntimeException {
public ObjectNotStoredException(String message) {
super(message);
}
}
@SuppressWarnings("serial")
public static class ObjectAlreadyStoredException extends RuntimeException {
public ObjectAlreadyStoredException(String message) {
super(message);
}
}
}