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.model; 018 019 import java.util.Collections; 020 import java.util.List; 021 import javax.xml.bind.annotation.XmlAccessType; 022 import javax.xml.bind.annotation.XmlAccessorType; 023 import javax.xml.bind.annotation.XmlAttribute; 024 import javax.xml.bind.annotation.XmlRootElement; 025 026 import org.apache.camel.Expression; 027 import org.apache.camel.Processor; 028 import org.apache.camel.model.language.HeaderExpression; 029 import org.apache.camel.processor.RoutingSlip; 030 import org.apache.camel.spi.RouteContext; 031 032 /** 033 * Represents an XML <routingSlip/> element 034 */ 035 @XmlRootElement(name = "routingSlip") 036 @XmlAccessorType(XmlAccessType.FIELD) 037 public class RoutingSlipDefinition<Type extends ProcessorDefinition<Type>> extends NoOutputExpressionNode { 038 public static final String DEFAULT_DELIMITER = ","; 039 040 @XmlAttribute 041 private String uriDelimiter; 042 @XmlAttribute 043 private Boolean ignoreInvalidEndpoints; 044 045 public RoutingSlipDefinition() { 046 this((String)null, DEFAULT_DELIMITER); 047 } 048 049 public RoutingSlipDefinition(String headerName) { 050 this(headerName, DEFAULT_DELIMITER); 051 } 052 053 public RoutingSlipDefinition(String headerName, String uriDelimiter) { 054 super(new HeaderExpression(headerName)); 055 setUriDelimiter(uriDelimiter); 056 } 057 058 public RoutingSlipDefinition(Expression expression, String uriDelimiter) { 059 super(expression); 060 setUriDelimiter(uriDelimiter); 061 } 062 063 public RoutingSlipDefinition(Expression expression) { 064 this(expression, DEFAULT_DELIMITER); 065 } 066 067 @Override 068 public String toString() { 069 return "RoutingSlip[" + getExpression() + "]"; 070 } 071 072 @Override 073 public String getShortName() { 074 return "routingSlip"; 075 } 076 077 @Override 078 public String getLabel() { 079 return "routingSlip[" + getExpression() + "]"; 080 } 081 082 @Override 083 public Processor createProcessor(RouteContext routeContext) throws Exception { 084 Expression expression = getExpression().createExpression(routeContext); 085 String delimiter = getUriDelimiter() != null ? getUriDelimiter() : DEFAULT_DELIMITER; 086 087 RoutingSlip routingSlip = new RoutingSlip(routeContext.getCamelContext(), expression, delimiter); 088 if (getIgnoreInvalidEndpoints() != null) { 089 routingSlip.setIgnoreInvalidEndpoints(getIgnoreInvalidEndpoints()); 090 } 091 return routingSlip; 092 } 093 094 @Override 095 public List<ProcessorDefinition<?>> getOutputs() { 096 return Collections.emptyList(); 097 } 098 099 public void setUriDelimiter(String uriDelimiter) { 100 this.uriDelimiter = uriDelimiter; 101 } 102 103 public String getUriDelimiter() { 104 return uriDelimiter; 105 } 106 107 public void setIgnoreInvalidEndpoints(Boolean ignoreInvalidEndpoints) { 108 this.ignoreInvalidEndpoints = ignoreInvalidEndpoints; 109 } 110 111 public Boolean getIgnoreInvalidEndpoints() { 112 return ignoreInvalidEndpoints; 113 } 114 115 // Fluent API 116 // ------------------------------------------------------------------------- 117 118 @Override 119 @SuppressWarnings("unchecked") 120 public Type end() { 121 // allow end() to return to previous type so you can continue in the DSL 122 return (Type) super.end(); 123 } 124 125 /** 126 * Ignore the invalidate endpoint exception when try to create a producer with that endpoint 127 * 128 * @return the builder 129 */ 130 public RoutingSlipDefinition<Type> ignoreInvalidEndpoints() { 131 setIgnoreInvalidEndpoints(true); 132 return this; 133 } 134 135 /** 136 * Sets the uri delimiter to use 137 * 138 * @param uriDelimiter the delimiter 139 * @return the builder 140 */ 141 public RoutingSlipDefinition<Type> uriDelimiter(String uriDelimiter) { 142 setUriDelimiter(uriDelimiter); 143 return this; 144 } 145 }