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

nl.rrd.wool.model.command.WoolInputTimeCommand Maven / Gradle / Ivy

Go to download

WOOL is a simple, powerful dialogue framework for creating virtual agent conversations.

The newest version!
package nl.rrd.wool.model.command;

import nl.rrd.wool.exception.LineNumberParseException;
import nl.rrd.wool.execution.WoolVariableStore;
import nl.rrd.wool.expressions.EvaluationException;
import nl.rrd.wool.expressions.Value;
import nl.rrd.wool.model.WoolNodeBody;
import nl.rrd.wool.model.WoolVariableString;
import nl.rrd.wool.parser.WoolBodyToken;
import org.joda.time.LocalTime;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

public class WoolInputTimeCommand extends WoolInputCommand {
	public static final String TIME_NOW = "now";

	private String variableName;
	private int granularityMinutes = 1;
	private WoolVariableString startTime = null;
	private WoolVariableString minTime = null;
	private WoolVariableString maxTime = null;

	public WoolInputTimeCommand(String variableName) {
		super(TYPE_TIME);
		this.variableName = variableName;
	}

	public WoolInputTimeCommand(WoolInputTimeCommand other) {
		super(other);
		this.variableName = other.variableName;
		this.granularityMinutes = other.granularityMinutes;
		if (other.startTime != null)
			this.startTime = new WoolVariableString(other.startTime);
		if (other.minTime != null)
			this.minTime = new WoolVariableString(other.minTime);
		if (other.maxTime != null)
			this.maxTime = new WoolVariableString(other.maxTime);
	}

	public String getVariableName() {
		return variableName;
	}

	public void setVariableName(String variableName) {
		this.variableName = variableName;
	}

	public int getGranularityMinutes() {
		return granularityMinutes;
	}

	public void setGranularityMinutes(int granularityMinutes) {
		this.granularityMinutes = granularityMinutes;
	}

	public WoolVariableString getStartTime() {
		return startTime;
	}

	public void setStartTime(WoolVariableString startTime) {
		this.startTime = startTime;
	}

	public WoolVariableString getMinTime() {
		return minTime;
	}

	public void setMinTime(WoolVariableString minTime) {
		this.minTime = minTime;
	}

	public WoolVariableString getMaxTime() {
		return maxTime;
	}

	public void setMaxTime(WoolVariableString maxTime) {
		this.maxTime = maxTime;
	}

	@Override
	public Map getParameters() {
		Map result = new LinkedHashMap<>();
		result.put("variableName", variableName);
		result.put("granularityMinutes", granularityMinutes);
		if (startTime != null)
			result.put("startTime", startTime.evaluate(null));
		if (minTime != null)
			result.put("minTime", minTime.evaluate(null));
		if (maxTime != null)
			result.put("maxTime", maxTime.evaluate(null));
		return result;
	}

	@Override
	public String getStatementLog(WoolVariableStore varStore) {
		Value value = new Value(varStore.getValue(variableName));
		return value.toString();
	}

	@Override
	public void getReadVariableNames(Set varNames) {
		if (startTime != null)
			startTime.getReadVariableNames(varNames);
		if (minTime != null)
			minTime.getReadVariableNames(varNames);
		if (maxTime != null)
			maxTime.getReadVariableNames(varNames);
	}

	@Override
	public void getWriteVariableNames(Set varNames) {
		varNames.add(variableName);
	}

	@Override
	public void executeBodyCommand(Map variables,
			WoolNodeBody processedBody) throws EvaluationException {
		WoolInputTimeCommand processedCmd = new WoolInputTimeCommand(
				variableName);
		processedCmd.granularityMinutes = granularityMinutes;
		if (startTime != null) {
			processedCmd.startTime = evaluateTime(startTime.evaluate(
					variables));
		}
		if (minTime != null) {
			processedCmd.minTime = evaluateTime(minTime.evaluate(variables));
		}
		if (maxTime != null) {
			processedCmd.maxTime = evaluateTime(maxTime.evaluate(variables));
		}
		processedBody.addSegment(new WoolNodeBody.CommandSegment(processedCmd));
	}

	@Override
	public WoolInputTimeCommand clone() {
		return new WoolInputTimeCommand(this);
	}

	private static WoolVariableString evaluateTime(String text)
			throws EvaluationException {
		if (text.toLowerCase().equals(TIME_NOW))
			return new WoolVariableString(TIME_NOW);
		DateTimeFormatter parser = ISODateTimeFormat.localTimeParser();
		LocalTime time;
		try {
			time = parser.parseLocalTime(text);
		} catch (IllegalArgumentException ex) {
			throw new EvaluationException("Invalid local time value: " + text);
		}
		return new WoolVariableString(time.toString("HH:mm"));
	}

	@Override
	public String toString() {
		char[] escapes = new char[] { '"' };
		StringBuilder builder = new StringBuilder("<>");
		return builder.toString();
	}

	public static WoolInputTimeCommand parse(WoolBodyToken cmdStartToken,
			Map attrs) throws LineNumberParseException {
		String variableName = readVariableAttr("value", attrs, cmdStartToken,
				true);
		WoolInputTimeCommand command = new WoolInputTimeCommand(variableName);
		Integer granularityMinutes = readIntAttr("granularityMinutes", attrs,
				cmdStartToken, false, 1, null);
		if (granularityMinutes != null)
			command.granularityMinutes = granularityMinutes;
		command.startTime = readTimeAttribute("startTime", attrs,
				cmdStartToken);
		command.minTime = readTimeAttribute("minTime", attrs, cmdStartToken);
		command.maxTime = readTimeAttribute("maxTime", attrs, cmdStartToken);
		return command;
	}

	private static WoolVariableString readTimeAttribute(String attrName,
			Map attrs, WoolBodyToken cmdStartToken)
			throws LineNumberParseException {
		WoolVariableString result = readAttr(attrName, attrs, cmdStartToken,
				false);
		if (result == null || !result.isPlainText())
			return result;
		WoolBodyToken token = attrs.get(attrName);
		String value = result.evaluate(null);
		try {
			return evaluateTime(value);
		} catch (EvaluationException ex) {
			throw new LineNumberParseException(String.format(
					"Invalid value for attribute \"%s\"", attrName) + ": " +
					ex.getMessage(), token.getLineNum(), token.getColNum(), ex);
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy