001 /** 002 * 003 * Licensed to the Apache Software Foundation (ASF) under one or more 004 * contributor license agreements. See the NOTICE file distributed with 005 * this work for additional information regarding copyright ownership. 006 * The ASF licenses this file to You under the Apache License, Version 2.0 007 * (the "License"); you may not use this file except in compliance with 008 * the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 package org.apache.camel.spring; 019 020 import org.apache.camel.CamelContext; 021 import org.apache.camel.Exchange; 022 import org.apache.camel.builder.RouteBuilder; 023 import org.springframework.context.ApplicationContext; 024 025 /** 026 * An extension of the {@link RouteBuilder} to provide some additional helper methods 027 * 028 * @version $Revision: 1.1 $ 029 */ 030 public abstract class SpringRouteBuilder extends RouteBuilder { 031 private ApplicationContext applicationContext; 032 033 /** 034 * Looks up the bean with the given name in the application context and returns it, or throws an exception if the 035 * bean is not present or is not of the given type 036 * 037 * @param type the type of the bean 038 * @param beanName the name of the bean in the application context 039 * @return the bean 040 */ 041 public <T> T bean(Class<T> type, String beanName) { 042 ApplicationContext context = getApplicationContext(); 043 return (T) context.getBean(beanName, type); 044 } 045 046 /** 047 * Looks up the bean with the given type in the application context and returns it, or throws an exception if the 048 * bean is not present or there are multiple possible beans to choose from for the given type 049 * 050 * @param type the type of the bean 051 * @return the bean 052 */ 053 public <T> T bean(Class<T> type) { 054 ApplicationContext context = getApplicationContext(); 055 String[] names = context.getBeanNamesForType(type, true, true); 056 if (names != null) { 057 int count = names.length; 058 if (count == 1) { 059 // lets instantiate the single bean 060 return (T) context.getBean(names[0]); 061 } 062 else if (count > 1) { 063 throw new IllegalArgumentException("Too many beans in the application context of type: " + type + ". Found: " + count); 064 } 065 } 066 throw new IllegalArgumentException("No bean available in the application context of type: " + type); 067 } 068 069 /** 070 * Returns the application context which has been configured via the {@link #setApplicationContext(ApplicationContext)} 071 * method or from the underlying {@link SpringCamelContext} 072 * 073 * @return 074 */ 075 public ApplicationContext getApplicationContext() { 076 if (applicationContext == null) { 077 CamelContext camelContext = getContext(); 078 if (camelContext instanceof SpringCamelContext) { 079 SpringCamelContext springCamelContext = (SpringCamelContext) camelContext; 080 return springCamelContext.getApplicationContext(); 081 } 082 else { 083 throw new IllegalArgumentException("This SpringBuilder is not being used with a SpringCamelContext and there is no applicationContext property configured"); 084 } 085 } 086 return applicationContext; 087 } 088 089 /** 090 * Sets the application context to use to lookup beans 091 */ 092 public void setApplicationContext(ApplicationContext applicationContext) { 093 this.applicationContext = applicationContext; 094 } 095 }