001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.camel.builder; 018 019 import org.apache.camel.model.PipelineDefinition; 020 import org.apache.camel.model.ProcessorDefinition; 021 import org.apache.camel.model.RouteDefinition; 022 023 /** 024 * A builder when using the <a href="http://camel.apache.org/advicewith.html">advice with</a> feature. 025 */ 026 public class AdviceWithBuilder<T extends ProcessorDefinition<?>> { 027 028 private final AdviceWithRouteBuilder builder; 029 private final String id; 030 private final String toString; 031 private final Class<T> type; 032 private boolean selectFirst; 033 private boolean selectLast; 034 private int selectFrom = -1; 035 private int selectTo = -1; 036 037 public AdviceWithBuilder(AdviceWithRouteBuilder builder, String id, String toString, Class<T> type) { 038 this.builder = builder; 039 this.id = id; 040 this.toString = toString; 041 this.type = type; 042 043 if (id == null && toString == null && type == null) { 044 throw new IllegalArgumentException("Either id, toString or type must be specified"); 045 } 046 } 047 048 /** 049 * Will only apply the first node matched. 050 * 051 * @return the builder to build the nodes. 052 */ 053 public AdviceWithBuilder<T> selectFirst() { 054 selectFirst = true; 055 selectLast = false; 056 return this; 057 } 058 059 /** 060 * Will only apply the last node matched. 061 * 062 * @return the builder to build the nodes. 063 */ 064 public AdviceWithBuilder<T> selectLast() { 065 selectLast = true; 066 selectFirst = false; 067 return this; 068 } 069 070 /** 071 * Will only apply the n'th node matched. 072 * 073 * @param index index of node to match (is 0-based) 074 * @return the builder to build the nodes. 075 */ 076 public AdviceWithBuilder<T> selectIndex(int index) { 077 if (index < 0) { 078 throw new IllegalArgumentException("Index must be a non negative number, was: " + index); 079 } 080 selectFrom = index; 081 selectTo = index; 082 return this; 083 } 084 085 /** 086 * Will only apply the node in the index range matched. 087 * 088 * @param from from index of node to start matching (inclusive) 089 * @param to to index of node to stop matching (inclusive) 090 * @return the builder to build the nodes. 091 */ 092 public AdviceWithBuilder<T> selectRange(int from, int to) { 093 if (from < 0) { 094 throw new IllegalArgumentException("From must be a non negative number, was: " + from); 095 } 096 if (from > to) { 097 throw new IllegalArgumentException("From must be equal or lower than to. from: " + from + ", to: " + to); 098 } 099 selectFrom = from; 100 selectTo = to; 101 return this; 102 } 103 104 /** 105 * Replaces the matched node(s) with the following nodes. 106 * 107 * @return the builder to build the nodes. 108 */ 109 public ProcessorDefinition<?> replace() { 110 RouteDefinition route = builder.getOriginalRoute(); 111 PipelineDefinition answer = new PipelineDefinition(); 112 if (id != null) { 113 builder.getAdviceWithTasks().add(AdviceWithTasks.replaceById(route, id, answer, selectFirst, selectLast, selectFrom, selectTo)); 114 } else if (toString != null) { 115 builder.getAdviceWithTasks().add(AdviceWithTasks.replaceByToString(route, toString, answer, selectFirst, selectLast, selectFrom, selectTo)); 116 } else if (type != null) { 117 builder.getAdviceWithTasks().add(AdviceWithTasks.replaceByType(route, type, answer, selectFirst, selectLast, selectFrom, selectTo)); 118 } 119 return answer; 120 } 121 122 /** 123 * Removes the matched node(s) 124 */ 125 public void remove() { 126 RouteDefinition route = builder.getOriginalRoute(); 127 if (id != null) { 128 builder.getAdviceWithTasks().add(AdviceWithTasks.removeById(route, id, selectFirst, selectLast, selectFrom, selectTo)); 129 } else if (toString != null) { 130 builder.getAdviceWithTasks().add(AdviceWithTasks.removeByToString(route, toString, selectLast, selectFirst, selectFrom, selectTo)); 131 } else if (type != null) { 132 builder.getAdviceWithTasks().add(AdviceWithTasks.removeByType(route, type, selectFirst, selectFirst, selectFrom, selectTo)); 133 } 134 } 135 136 /** 137 * Insert the following node(s) <b>before</b> the matched node(s) 138 * 139 * @return the builder to build the nodes. 140 */ 141 public ProcessorDefinition<?> before() { 142 RouteDefinition route = builder.getOriginalRoute(); 143 PipelineDefinition answer = new PipelineDefinition(); 144 if (id != null) { 145 builder.getAdviceWithTasks().add(AdviceWithTasks.beforeById(route, id, answer, selectFirst, selectLast, selectFrom, selectTo)); 146 } else if (toString != null) { 147 builder.getAdviceWithTasks().add(AdviceWithTasks.beforeByToString(route, toString, answer, selectLast, selectFirst, selectFrom, selectTo)); 148 } else if (type != null) { 149 builder.getAdviceWithTasks().add(AdviceWithTasks.beforeByType(route, type, answer, selectFirst, selectLast, selectFrom, selectTo)); 150 } 151 return answer; 152 } 153 154 /** 155 * Insert the following node(s) <b>after</b> the matched node(s) 156 * 157 * @return the builder to build the nodes. 158 */ 159 public ProcessorDefinition<?> after() { 160 RouteDefinition route = builder.getOriginalRoute(); 161 PipelineDefinition answer = new PipelineDefinition(); 162 if (id != null) { 163 builder.getAdviceWithTasks().add(AdviceWithTasks.afterById(route, id, answer, selectFirst, selectLast, selectFrom, selectTo)); 164 } else if (toString != null) { 165 builder.getAdviceWithTasks().add(AdviceWithTasks.afterByToString(route, toString, answer, selectLast, selectFirst, selectFrom, selectTo)); 166 } else if (type != null) { 167 builder.getAdviceWithTasks().add(AdviceWithTasks.afterByType(route, type, answer, selectFirst, selectLast, selectFrom, selectTo)); 168 } 169 return answer; 170 } 171 172 }