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}