001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.tools.template_engine;
003
004/**
005 * {@link TemplateEntry} that concatenates several templates.
006 */
007public final class CompoundTemplateEntry implements TemplateEntry {
008
009    /**
010     * Factory method to concatenate several {@code TemplateEntry}s.
011     *
012     * If the number of entries is 0 or 1, the result may not be a {@code CompoundTemplateEntry},
013     * but optimized to a static text or the single entry itself.
014     * @param entries the {@code TemplateEntry}s to concatenate
015     * @return a {@link TemplateEntry} that concatenates all the entries
016     */
017    public static TemplateEntry fromArray(TemplateEntry... entries) {
018        if (entries.length == 0)
019            return new StaticText("");
020        else if (entries.length == 1)
021            return entries[0];
022        else
023            return new CompoundTemplateEntry(entries);
024    }
025
026    private CompoundTemplateEntry(TemplateEntry... entries) {
027        this.entries = entries;
028    }
029
030    private final TemplateEntry[] entries;
031
032    @Override
033    public void appendText(StringBuilder result, TemplateEngineDataProvider dataProvider) {
034        for (TemplateEntry te: entries) {
035            te.appendText(result, dataProvider);
036        }
037    }
038
039    @Override
040    public boolean isValid(TemplateEngineDataProvider dataProvider) {
041        for (TemplateEntry te: entries) {
042            if (!te.isValid(dataProvider))
043                return false;
044        }
045        return true;
046    }
047
048    @Override
049    public String toString() {
050        StringBuilder result = new StringBuilder();
051        for (TemplateEntry te: entries) {
052            result.append(te);
053        }
054        return result.toString();
055    }
056}