blob: 7501f60febd186f3b176e1e5b6c49d52f358a54e [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.uibinder.elementparsers;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.uibinder.rebind.XMLElement;
import com.google.gwt.uibinder.rebind.XMLElement.Interpreter;
import com.google.gwt.uibinder.rebind.XMLElement.PostProcessingInterpreter;
import java.util.ArrayList;
import java.util.List;
/**
* Pairs {@link XMLElement.Interpreter} instances.
*
* @param <T> The type returned by all members of the pipe
*/
class InterpreterPipe<T> implements PostProcessingInterpreter<T> {
public static <T>InterpreterPipe<T> newPipe(Interpreter<T>... pipes) {
InterpreterPipe<T> rtn = new InterpreterPipe<T>();
for (int i = 0; i < pipes.length; ++i) {
rtn.add(pipes[i]);
}
return rtn;
}
private final List<Interpreter<T>> pipe =
new ArrayList<Interpreter<T>>();
public void add(Interpreter<T> i) {
pipe.add(i);
}
/**
* Interpreters are fired in the order they were handed to the constructor. If
* an interpreter gives a non-null result, downstream interpreters don't
* fire.
*
* @return The T or null returned by the last pipelined interpreter to run
* @throws UnableToCompleteException on error
*/
public T interpretElement(XMLElement elem) throws UnableToCompleteException {
T rtn = null;
for (XMLElement.Interpreter<T> i : pipe) {
rtn = i.interpretElement(elem);
if (null != rtn) {
break;
}
}
return rtn;
}
/**
* Called by various {@link XMLElement} consumeInner*() methods after all
* elements have been handed to {@link #interpretElement}. Passes the
* text to be post processed to each pipe member that is instanceof
* {@link PostProcessingInterpreter}.
*/
public String postProcess(String consumedText) throws UnableToCompleteException {
for (XMLElement.Interpreter<T> i : pipe) {
if (i instanceof PostProcessingInterpreter<?>) {
consumedText = ((PostProcessingInterpreter<T>) i).postProcess(consumedText);
}
}
return consumedText;
}
}