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.ArrayList; 020 import java.util.Collection; 021 import java.util.List; 022 023 import javax.xml.bind.annotation.XmlAccessType; 024 import javax.xml.bind.annotation.XmlAccessorType; 025 import javax.xml.bind.annotation.XmlElement; 026 import javax.xml.bind.annotation.XmlElementRef; 027 import javax.xml.bind.annotation.XmlRootElement; 028 import javax.xml.bind.annotation.XmlTransient; 029 import javax.xml.bind.annotation.XmlType; 030 031 import org.apache.camel.CamelContext; 032 import org.apache.camel.CamelContextAware; 033 import org.apache.camel.Endpoint; 034 import org.apache.camel.NoSuchEndpointException; 035 import org.apache.camel.Route; 036 import org.apache.camel.impl.RouteContext; 037 import org.apache.camel.util.CamelContextHelper; 038 import org.apache.commons.logging.Log; 039 import org.apache.commons.logging.LogFactory; 040 041 /** 042 * Represents an XML <route/> element 043 * 044 * @version $Revision: $ 045 */ 046 @XmlRootElement(name = "route") 047 @XmlType(propOrder = {"interceptors", "inputs", "outputs" }) 048 @XmlAccessorType(XmlAccessType.FIELD) 049 public class RouteType extends ProcessorType implements CamelContextAware { 050 private static final transient Log LOG = LogFactory.getLog(RouteType.class); 051 @XmlElementRef 052 private List<InterceptorType> interceptors = new ArrayList<InterceptorType>(); 053 @XmlElementRef 054 private List<FromType> inputs = new ArrayList<FromType>(); 055 @XmlElementRef 056 private List<ProcessorType> outputs = new ArrayList<ProcessorType>(); 057 @XmlTransient 058 private CamelContext camelContext; 059 060 public RouteType() { 061 } 062 063 public RouteType(String uri) { 064 getInputs().add(new FromType(uri)); 065 } 066 067 public RouteType(Endpoint endpoint) { 068 getInputs().add(new FromType(endpoint)); 069 } 070 071 @Override 072 public String toString() { 073 return "Route[ " + inputs + " -> " + outputs + "]"; 074 } 075 076 // TODO should we zap this and replace with next method? 077 public void addRoutes(CamelContext context) throws Exception { 078 Collection<Route> routes = new ArrayList<Route>(); 079 080 addRoutes(context, routes); 081 082 context.addRoutes(routes); 083 } 084 085 public void addRoutes(CamelContext context, Collection<Route> routes) throws Exception { 086 setCamelContext(context); 087 088 for (FromType fromType : inputs) { 089 addRoutes(routes, fromType); 090 } 091 } 092 093 public Endpoint resolveEndpoint(String uri) throws NoSuchEndpointException { 094 CamelContext context = getCamelContext(); 095 if (context == null) { 096 throw new IllegalArgumentException("No CamelContext has been injected!"); 097 } 098 return CamelContextHelper.getMandatoryEndpoint(context, uri); 099 } 100 101 // Fluent API 102 // ----------------------------------------------------------------------- 103 104 /** 105 * Creates an input to the route 106 */ 107 public RouteType from(String uri) { 108 getInputs().add(new FromType(uri)); 109 return this; 110 } 111 112 // Properties 113 // ----------------------------------------------------------------------- 114 115 public List<InterceptorType> getInterceptors() { 116 return interceptors; 117 } 118 119 public void setInterceptors(List<InterceptorType> interceptors) { 120 this.interceptors = interceptors; 121 } 122 123 public List<FromType> getInputs() { 124 return inputs; 125 } 126 127 public void setInputs(List<FromType> inputs) { 128 this.inputs = inputs; 129 } 130 131 public List<ProcessorType> getOutputs() { 132 return outputs; 133 } 134 135 public void setOutputs(List<ProcessorType> outputs) { 136 this.outputs = outputs; 137 138 if (outputs != null) { 139 for (ProcessorType output : outputs) { 140 configureChild(output); 141 } 142 } 143 } 144 145 public CamelContext getCamelContext() { 146 return camelContext; 147 } 148 149 public void setCamelContext(CamelContext camelContext) { 150 this.camelContext = camelContext; 151 } 152 153 // Implementation methods 154 // ------------------------------------------------------------------------- 155 156 protected void addRoutes(Collection<Route> routes, FromType fromType) throws Exception { 157 RouteContext routeContext = new RouteContext(this, fromType, routes); 158 Endpoint endpoint = routeContext.getEndpoint(); 159 160 for (ProcessorType output : outputs) { 161 output.addRoutes(routeContext, routes); 162 } 163 164 routeContext.commit(); 165 } 166 167 @Override 168 protected void configureChild(ProcessorType output) { 169 if (isInheritErrorHandler()) { 170 output.setErrorHandlerBuilder(getErrorHandlerBuilder()); 171 } 172 List<InterceptorType> list = output.getInterceptors(); 173 if (list == null) { 174 LOG.warn("No interceptor collection: " + output); 175 } else { 176 list.addAll(getInterceptors()); 177 } 178 } 179 }