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.impl;
018
019 import java.util.ArrayList;
020 import java.util.Collection;
021 import java.util.List;
022
023 import org.apache.camel.CamelContext;
024 import org.apache.camel.Endpoint;
025 import org.apache.camel.NoSuchEndpointException;
026 import org.apache.camel.Processor;
027 import org.apache.camel.Route;
028 import org.apache.camel.model.FromType;
029 import org.apache.camel.model.ProcessorType;
030 import org.apache.camel.model.RouteType;
031 import org.apache.camel.processor.Interceptor;
032 import org.apache.camel.processor.Pipeline;
033 import org.apache.camel.processor.ProceedProcessor;
034
035 /**
036 * The context used to activate new routing rules
037 *
038 * @version $Revision: $
039 */
040 public class RouteContext {
041 private final RouteType route;
042 private final FromType from;
043 private final Collection<Route> routes;
044 private Endpoint endpoint;
045 private List<Processor> eventDrivenProcessors = new ArrayList<Processor>();
046 private Interceptor lastInterceptor;
047
048 public RouteContext(RouteType route, FromType from, Collection<Route> routes) {
049 this.route = route;
050 this.from = from;
051 this.routes = routes;
052 }
053
054 public Endpoint getEndpoint() {
055 if (endpoint == null) {
056 endpoint = from.resolveEndpoint(this);
057 }
058 return endpoint;
059 }
060
061 public FromType getFrom() {
062 return from;
063 }
064
065 public RouteType getRoute() {
066 return route;
067 }
068
069 public CamelContext getCamelContext() {
070 return getRoute().getCamelContext();
071 }
072
073 public Processor createProcessor(ProcessorType node) throws Exception {
074 return node.createOutputsProcessor(this);
075 }
076
077 public Endpoint resolveEndpoint(String uri) {
078 return route.resolveEndpoint(uri);
079 }
080
081 /**
082 * Resolves an endpoint from either a URI or a named reference
083 */
084 public Endpoint resolveEndpoint(String uri, String ref) {
085 Endpoint endpoint = null;
086 if (uri != null) {
087 endpoint = resolveEndpoint(uri);
088 if (endpoint == null) {
089 throw new NoSuchEndpointException(uri);
090 }
091 }
092 if (ref != null) {
093 endpoint = lookup(ref, Endpoint.class);
094 if (endpoint == null) {
095 throw new NoSuchEndpointException("ref:" + ref);
096 }
097 }
098 if (endpoint == null) {
099 throw new IllegalArgumentException("Either 'uri' or 'ref' must be specified on: " + this);
100 } else {
101 return endpoint;
102 }
103 }
104
105 /**
106 * lookup an object by name and type
107 */
108 public <T> T lookup(String name, Class<T> type) {
109 return getCamelContext().getRegistry().lookup(name, type);
110 }
111
112 /**
113 * Lets complete the route creation, creating a single event driven route
114 * for the current from endpoint with any processors required
115 */
116 public void commit() {
117 // now lets turn all of the event driven consumer processors into a
118 // single route
119 if (!eventDrivenProcessors.isEmpty()) {
120 Processor processor = Pipeline.newInstance(eventDrivenProcessors);
121 routes.add(new EventDrivenConsumerRoute(getEndpoint(), processor));
122 }
123 }
124
125 public void addEventDrivenProcessor(Processor processor) {
126 eventDrivenProcessors.add(processor);
127 }
128
129 public void intercept(Interceptor interceptor) {
130 getRoute().intercept(interceptor);
131 lastInterceptor = interceptor;
132 }
133
134 public Processor createProceedProcessor() {
135 if (lastInterceptor == null) {
136 throw new IllegalArgumentException("Cannot proceed() from outside of an interceptor!");
137 }
138 else {
139 return new ProceedProcessor(lastInterceptor);
140 }
141 }
142 }