1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.commons.text.translate; 18 19 import java.io.IOException; 20 import java.io.Writer; 21 import java.util.ArrayList; 22 import java.util.List; 23 import java.util.Objects; 24 import java.util.stream.Stream; 25 26 /** 27 * Executes a sequence of translators one after the other. Execution ends whenever 28 * the first translator consumes code points from the input. 29 * 30 * @since 1.0 31 */ 32 public class AggregateTranslator extends CharSequenceTranslator { 33 34 /** 35 * Translator list. 36 */ 37 private final List<CharSequenceTranslator> translators = new ArrayList<>(); 38 39 /** 40 * Specify the translators to be used at creation time. 41 * 42 * @param translators CharSequenceTranslator array to aggregate 43 */ 44 public AggregateTranslator(final CharSequenceTranslator... translators) { 45 if (translators != null) { 46 Stream.of(translators).filter(Objects::nonNull).forEach(this.translators::add); 47 } 48 } 49 50 /** 51 * The first translator to consume code points from the input is the 'winner'. 52 * Execution stops with the number of consumed code points being returned. 53 * {@inheritDoc} 54 */ 55 @Override 56 public int translate(final CharSequence input, final int index, final Writer writer) throws IOException { 57 for (final CharSequenceTranslator translator : translators) { 58 final int consumed = translator.translate(input, index, writer); 59 if (consumed != 0) { 60 return consumed; 61 } 62 } 63 return 0; 64 } 65 66 }