blob: 9cf224c0cbe7b811aac6694b9e178aafe53f2cba [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.camel.builder;
import org.apache.camel.model.PipelineDefinition;
import org.apache.camel.model.ProcessorDefinition;
import org.apache.camel.model.RouteDefinition;
/**
* A builder when using the <a href="http://camel.apache.org/advicewith.html">advice with</a> feature.
*/
public class AdviceWithBuilder<T extends ProcessorDefinition> {
private final AdviceWithRouteBuilder builder;
private final String id;
private final String toString;
private final Class<T> type;
private boolean selectFirst;
private boolean selectLast;
private int selectFrom = -1;
private int selectTo = -1;
public AdviceWithBuilder(AdviceWithRouteBuilder builder, String id, String toString, Class<T> type) {
this.builder = builder;
this.id = id;
this.toString = toString;
this.type = type;
if (id == null && toString == null && type == null) {
throw new IllegalArgumentException("Either id, toString or type must be specified");
}
}
/**
* Will only apply the first node matched.
*
* @return the builder to build the nodes.
*/
public AdviceWithBuilder<T> selectFirst() {
selectFirst = true;
selectLast = false;
return this;
}
/**
* Will only apply the last node matched.
*
* @return the builder to build the nodes.
*/
public AdviceWithBuilder<T> selectLast() {
selectLast = true;
selectFirst = false;
return this;
}
/**
* Will only apply the n'th node matched.
*
* @param index index of node to match (is 0-based)
* @return the builder to build the nodes.
*/
public AdviceWithBuilder<T> selectIndex(int index) {
if (index < 0) {
throw new IllegalArgumentException("Index must be a non negative number, was: " + index);
}
selectFrom = index;
selectTo = index;
return this;
}
/**
* Will only apply the node in the index range matched.
*
* @param from from index of node to start matching (inclusive)
* @param to to index of node to stop matching (inclusive)
* @return the builder to build the nodes.
*/
public AdviceWithBuilder<T> selectRange(int from, int to) {
if (from < 0) {
throw new IllegalArgumentException("From must be a non negative number, was: " + from);
}
if (from > to) {
throw new IllegalArgumentException("From must be equal or lower than to. from: " + from + ", to: " + to);
}
selectFrom = from;
selectTo = to;
return this;
}
/**
* Replaces the matched node(s) with the following nodes.
*
* @return the builder to build the nodes.
*/
public ProcessorDefinition replace() {
RouteDefinition route = builder.getOriginalRoute();
PipelineDefinition answer = new PipelineDefinition();
if (id != null) {
builder.getAdviceWithTasks().add(AdviceWithTasks.replaceById(route, id, answer, selectFirst, selectLast, selectFrom, selectTo));
} else if (toString != null) {
builder.getAdviceWithTasks().add(AdviceWithTasks.replaceByToString(route, toString, answer, selectFirst, selectLast, selectFrom, selectTo));
} else if (type != null) {
builder.getAdviceWithTasks().add(AdviceWithTasks.replaceByType(route, type, answer, selectFirst, selectLast, selectFrom, selectTo));
}
return answer;
}
/**
* Removes the matched node(s)
*/
public void remove() {
RouteDefinition route = builder.getOriginalRoute();
if (id != null) {
builder.getAdviceWithTasks().add(AdviceWithTasks.removeById(route, id, selectFirst, selectLast, selectFrom, selectTo));
} else if (toString != null) {
builder.getAdviceWithTasks().add(AdviceWithTasks.removeByToString(route, toString, selectLast, selectFirst, selectFrom, selectTo));
} else if (type != null) {
builder.getAdviceWithTasks().add(AdviceWithTasks.removeByType(route, type, selectFirst, selectFirst, selectFrom, selectTo));
}
}
/**
* Insert the following node(s) <b>before</b> the matched node(s)
*
* @return the builder to build the nodes.
*/
public ProcessorDefinition before() {
RouteDefinition route = builder.getOriginalRoute();
PipelineDefinition answer = new PipelineDefinition();
if (id != null) {
builder.getAdviceWithTasks().add(AdviceWithTasks.beforeById(route, id, answer, selectFirst, selectLast, selectFrom, selectTo));
} else if (toString != null) {
builder.getAdviceWithTasks().add(AdviceWithTasks.beforeByToString(route, toString, answer, selectLast, selectFirst, selectFrom, selectTo));
} else if (type != null) {
builder.getAdviceWithTasks().add(AdviceWithTasks.beforeByType(route, type, answer, selectFirst, selectLast, selectFrom, selectTo));
}
return answer;
}
/**
* Insert the following node(s) <b>after</b> the matched node(s)
*
* @return the builder to build the nodes.
*/
public ProcessorDefinition after() {
RouteDefinition route = builder.getOriginalRoute();
PipelineDefinition answer = new PipelineDefinition();
if (id != null) {
builder.getAdviceWithTasks().add(AdviceWithTasks.afterById(route, id, answer, selectFirst, selectLast, selectFrom, selectTo));
} else if (toString != null) {
builder.getAdviceWithTasks().add(AdviceWithTasks.afterByToString(route, toString, answer, selectLast, selectFirst, selectFrom, selectTo));
} else if (type != null) {
builder.getAdviceWithTasks().add(AdviceWithTasks.afterByType(route, type, answer, selectFirst, selectLast, selectFrom, selectTo));
}
return answer;
}
}