001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.tools.template_engine;
003
004import java.util.Collection;
005
006public class Variable implements TemplateEntry {
007
008    private static final String SPECIAL_VARIABLE_PREFIX = "special:";
009    private static final String SPECIAL_VALUE_EVERYTHING = "everything";
010
011
012    private final String variableName;
013    private final boolean special;
014
015    public Variable(String variableName) {
016        if (variableName.toLowerCase().startsWith(SPECIAL_VARIABLE_PREFIX)) {
017            this.variableName = variableName.substring(SPECIAL_VARIABLE_PREFIX.length());
018            // special:special:key means that real key named special:key is needed, not special variable
019            this.special = !this.variableName.toLowerCase().startsWith(SPECIAL_VARIABLE_PREFIX);
020        } else {
021            this.variableName = variableName;
022            this.special = false;
023        }
024    }
025
026    @Override
027    public void appendText(StringBuilder result, TemplateEngineDataProvider dataProvider) {
028        if (special && SPECIAL_VALUE_EVERYTHING.equals(variableName)) {
029            Collection<String> keys = dataProvider.getTemplateKeys();
030            boolean first = true;
031            for (String key: keys) {
032                if (!first) {
033                    result.append(", ");
034                } else {
035                    first = false;
036                }
037                result.append(key).append("=").append(dataProvider.getTemplateValue(key, false));
038            }
039        } else {
040            Object value = dataProvider.getTemplateValue(variableName, special);
041            if (value != null) {
042                result.append(value);
043            }
044        }
045    }
046
047    @Override
048    public boolean isValid(TemplateEngineDataProvider dataProvider) {
049        if (special && SPECIAL_VALUE_EVERYTHING.equals(variableName))
050            return true;
051        else
052            return dataProvider.getTemplateValue(variableName, special) != null;
053    }
054
055    @Override
056    public String toString() {
057        return "{" + variableName + "}";
058    }
059
060    public boolean isSpecial() {
061        return special;
062    }
063}