package com.baselet.element.elementnew.plot.parser; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; public class PlotState { private final List<PlotState> subPlots; private DataSet dataset; private final HashMap<String, KeyValue> values; private final int plotLineNr; protected PlotState(int plotLineNr, HashMap<String, KeyValue> values) { subPlots = new ArrayList<PlotState>(); this.plotLineNr = plotLineNr; this.values = values; } /** * Is only called once by the parser to calculate the dataset. */ protected void setDataSet(DataSet dataset) { this.dataset = dataset; } public void addSubPlot(PlotState plotState) { subPlots.add(plotState); } public List<PlotState> getSubplots() { return subPlots; } public DataSet getDataSet() { return dataset; } public boolean containsKey(String key) { return values.containsKey(key); } public int getLine(String key) { if (values.get(key) != null) { return values.get(key).getLine(); } else { return -1; } } public int getPlotLineNr() { return plotLineNr; } public String getValue(String key, String defaultValue) { KeyValue keyValue = values.get(key); if (keyValue != null) { keyValue.setUsed(true); } if (keyValue == null || keyValue.getValue().equals(PlotConstants.DEFAULT_VALUE)) { return defaultValue; } else { return keyValue.getValue(); } } public String getValueValidated(String key, String defaultValue, List<String> validValues) { String value = getValue(key, defaultValue); if (!validValues.contains(value)) { throw new ParserException(key, value, getLine(key)); } return value; } public Double getValueAsDouble(String key, Double defaultValue) { try { String value = getValue(key, null); if (value == null) { return defaultValue; } else { return Double.parseDouble(value); } } catch (Exception e) { throw new ParserException(key, values.get(key).getValue(), values.get(key).getLine()); } } public Integer getValueAsInt(String key, Integer defaultValue) { try { String value = getValue(key, null); if (value == null) { return defaultValue; } else { return Integer.parseInt(value); } } catch (Exception e) { throw new ParserException(key, values.get(key).getValue(), values.get(key).getLine()); } } public Boolean getValueAsBoolean(String key, Boolean defaultValue) { String value = getValue(key, null); if (value == null) { return defaultValue; } else if (value.equals("true")) { return true; } else if (value.equals("false")) { return false; } else { throw new ParserException(key, values.get(key).getValue(), values.get(key).getLine()); } } public List<String> getValueList(String key, List<String> defaultValue) { List<String> returnArray; String value = getValue(key, null); if (value == null) { returnArray = defaultValue; } else { returnArray = Arrays.asList(value.split(PlotConstants.VALUE_LIST_SEPARATOR)); } return returnArray; } public List<String> getValueListValidated(String key, List<String> defaultValue, List<String> validValues, boolean doubleValuesAllowed) { List<String> valueList = getValueList(key, defaultValue); for (String value : valueList) { boolean intAllowedAndValueIsInt = doubleValuesAllowed && isDoubleValue(value); if (!validValues.contains(value) && !intAllowedAndValueIsInt) { throw new ParserException(key, value, getLine(key)); } } return valueList; } private boolean isDoubleValue(String value) { try { Double.parseDouble(value); return true; } catch (Exception e) { return false; } } /** * Checks if all declared values are used. It throws an error for declarations which are not used by the plot (=they are invalid) */ public void checkIfAllValuesUsed() { StringBuilder sb = new StringBuilder(""); for (KeyValue keyValue : values.values()) { if (!keyValue.isUsed()) { sb.append("\"").append(keyValue.getKey()).append("=").append(keyValue.getValue()).append("\" (line ").append(keyValue.getLine()).append(") "); } } String unusedVariables = sb.toString(); if (!unusedVariables.isEmpty()) { throw new ParserException("Invalid variables: " + unusedVariables); } } @Override public String toString() { StringBuilder sb = new StringBuilder(""); sb.append("PlotState (").append(plotLineNr).append(")\n"); if (dataset != null) { sb.append("\tdataset -> ").append(dataset.getLineNr()).append("\n"); } for (KeyValue keyValue : values.values()) { sb.append("\t").append(keyValue).append("\n"); } if (!subPlots.isEmpty()) { sb.append("---Begin Subplots---\n"); for (PlotState subPlot : subPlots) { sb.append(subPlot.toString()); } sb.append("---End Subplots---\n"); } return sb.toString(); } }