All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fitlibrary.definedAction.DefinedActionsRepositoryStandard Maven / Gradle / Ivy

Go to download

FitLibrary provides general-purpose fixtures (and runners) for storytests with Fit and FitNesse.

The newest version!
/*
 * Copyright (c) 2009 Rick Mugridge, www.RimuResearch.com
 * Released under the terms of the GNU General Public License version 2 or later.
 */
package fitlibrary.definedAction;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import fitlibrary.exception.FitLibraryException;
import fitlibrary.global.TemporaryPlugBoardForRuntime;
import fitlibrary.runtime.RuntimeContext;
import fitlibrary.table.Row;
import fitlibrary.table.Tables;
import fitlibrary.traverse.Evaluator;
import fitlibrary.traverse.workflow.caller.ValidCall;

// This could easily be split into separate repositories.
// But I suspect the map for camel approach may disappear
public class DefinedActionsRepositoryStandard implements DefinedActionsRepository {
	private Map definedActionMapForPlainText = new ConcurrentHashMap();
	private Map> classMapForPlainText = new ConcurrentHashMap>();

	private Map definedActionMapForCamel = new ConcurrentHashMap();
	private Map> classMapForCamel = new ConcurrentHashMap>();

	private Map definedMultiActionMap = new ConcurrentHashMap();
	private Map> classMultiActionMap = new ConcurrentHashMap>();

	public void define(Row parametersRow, String wikiClassName,
			ParameterSubstitution parameterSubstitution, Evaluator evaluator,
			String absoluteFileName) {
		defineCamel(parametersRow, wikiClassName, parameterSubstitution,
				evaluator, absoluteFileName);
		definePlain(parametersRow, wikiClassName, parameterSubstitution,
				evaluator, absoluteFileName);
	}
	public ParameterSubstitution lookupByCamel(String name, int argCount) {
		return definedActionMapForCamel.get(new DefinedAction(name, argCount));
	}
	public ParameterSubstitution lookupByClassByCamel(String className,
			String name, int argCount, RuntimeContext variables) {
		DefinedAction macro = new DefinedAction(name, argCount);
		Map map = classMapForCamel
				.get(className);
		if (map != null) {
			ParameterSubstitution macroSubstitution = map.get(macro);
			if (macroSubstitution != null)
				return macroSubstitution;
		}
		String superClass = variables.dynamicVariables().getAsString(
				(className + ".super"));
		if (superClass != null && !"".equals(superClass))
			return TemporaryPlugBoardForRuntime
					.definedActionsRepository()
					.lookupByClassByCamel(superClass, name, argCount, variables);
		return definedActionMapForCamel.get(macro);
	}
	public void findPlainTextCall(String textCall, List results) {
		for (DefinedAction action : definedActionMapForPlainText.keySet())
			action.findCall(textCall, results);
	}
	public void defineMultiDefinedAction(String name, ArrayList formalParameters,
			Tables body, String absoluteFileName) {
		definedMultiActionMap.put(new DefinedMultiAction(name),
				new MultiParameterSubstitution(formalParameters, body,
						absoluteFileName));
	}
	public MultiParameterSubstitution lookupMulti(String name) {
		return definedMultiActionMap.get(new DefinedMultiAction(name));
	}
	public void clear() {
		definedActionMapForPlainText.clear();
		classMapForPlainText.clear();
		definedActionMapForCamel.clear();
		classMapForCamel.clear();
		definedMultiActionMap.clear();
		classMultiActionMap.clear();
	}
	protected void definePlain(Row parametersRow, String wikiClassName,
			ParameterSubstitution parameterSubstitution, Evaluator evaluator, String absoluteFileName) {
		String name = parametersRow.methodNameForPlain(evaluator);
		DefinedAction definedAction = new DefinedAction(name, parametersRow
				.argumentCount());
		Map map = getClassMapForPlain(wikiClassName);
		if (map.get(definedAction) != null)
			throw new FitLibraryException("Duplicate defined action: " + name
					+ " defined in " + absoluteFileName
					+ " but already defined in "
					+ map.get(definedAction).getAbsoluteFileName());
		map.put(definedAction, parameterSubstitution);
	}
	protected void defineCamel(Row parametersRow, String wikiClassName,
			ParameterSubstitution parameterSubstitution, Evaluator evaluator, String absoluteFileName) {
		String name = parametersRow.methodNameForCamel(evaluator);
		DefinedAction definedAction = new DefinedAction(name, parametersRow
				.argumentCount());
		Map map = getClassMapForCamel(wikiClassName);
		if (map.get(definedAction) != null)
			throw new FitLibraryException("Duplicate defined action: " + name
					+ "/" + parametersRow.argumentCount() + " defined in "
					+ absoluteFileName + " but already defined in "
					+ map.get(definedAction).getAbsoluteFileName());
		map.put(definedAction, parameterSubstitution);
	}
	protected Map getClassMapForPlain(String wikiClassName) {
		Map currentMap = definedActionMapForPlainText;
		if (wikiClassBased(wikiClassName)) {
			currentMap = classMapForPlainText.get(wikiClassName);
			if (currentMap == null) {
				currentMap = new ConcurrentHashMap();
				classMapForPlainText.put(wikiClassName, currentMap);
			}
		}
		return currentMap;
	}
	protected Map getClassMapForCamel(String wikiClassName) {
		Map currentMap = definedActionMapForCamel;
		if (wikiClassBased(wikiClassName)) {
			currentMap = classMapForCamel.get(wikiClassName);
			if (currentMap == null) {
				currentMap = new ConcurrentHashMap();
				classMapForCamel.put(wikiClassName, currentMap);
			}
		}
		return currentMap;
	}
	protected boolean wikiClassBased(String wikiClassName) {
		return !"".equals(wikiClassName);
	}
	@Override
	public String toString() {
		StringBuilder s = new StringBuilder();
		s.append("Plain Text:\n");
		for (DefinedAction action : definedActionMapForPlainText.keySet()) {
			s.append(action.toString());
			s.append("\n");
		}
		s.append("\n\nCamel:\n");
		for (DefinedAction action : definedActionMapForCamel.keySet()) {
			s.append(action.toString());
			s.append("\n");
		}
		return s.toString();
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy