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