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