001 /**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 package org.apache.camel;
019
020 import java.util.ArrayList;
021 import java.util.List;
022
023 /**
024 * Implements a Choice structure where one or more predicates are used which if they are true their processors
025 * are used, with a default otherwise clause used if none match.
026 *
027 * @version $Revision: 519941 $
028 */
029 public class ChoiceProcessor<E> implements Processor<E> {
030 private List<FilterProcessor<E>> filters = new ArrayList<FilterProcessor<E>>();
031 private Processor<E> otherwise;
032
033 public ChoiceProcessor(List<FilterProcessor<E>> filters, Processor<E> otherwise) {
034 this.filters = filters;
035 this.otherwise = otherwise;
036 }
037
038 public void onExchange(E exchange) {
039 for (FilterProcessor<E> filterProcessor : filters) {
040 Predicate<E> predicate = filterProcessor.getPredicate();
041 if (predicate != null) {
042 filterProcessor.getProcessor().onExchange(exchange);
043 return;
044 }
045 }
046 if (otherwise != null) {
047 otherwise.onExchange(exchange);
048 }
049 }
050
051 @Override
052 public String toString() {
053 StringBuilder builder = new StringBuilder("choice{");
054 boolean first = true;
055 for (FilterProcessor<E> processor : filters) {
056 if (first) {
057 first = false;
058 }
059 else {
060 builder.append(", ");
061 }
062 builder.append("when ");
063 builder.append(processor.getPredicate().toString());
064 builder.append(": ");
065 builder.append(processor.getProcessor());
066 }
067 if (otherwise != null) {
068 builder.append(", otherwise: ");
069 builder.append(otherwise);
070 }
071 builder.append("}");
072 return builder.toString();
073 }
074
075 public List<FilterProcessor<E>> getFilters() {
076 return filters;
077 }
078
079 public Processor<E> getOtherwise() {
080 return otherwise;
081 }
082 }