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; 019 020 import java.util.HashMap; 021 import java.util.Map; 022 import java.util.concurrent.Callable; 023 024 import org.apache.camel.impl.DefaultEndpointResolver; 025 import org.apache.camel.impl.DefaultExchangeConverter; 026 027 /** 028 * Represents the container used to configure routes and the policies to use. 029 * 030 * @version $Revision: 520124 $ 031 */ 032 public class CamelContainer<E> { 033 034 private EndpointResolver<E> endpointResolver; 035 private ExchangeConverter exchangeConverter; 036 private Map<String, Component> components = new HashMap<String, Component>(); 037 038 public EndpointResolver<E> getEndpointResolver() { 039 if (endpointResolver == null) { 040 endpointResolver = createEndpointResolver(); 041 } 042 return endpointResolver; 043 } 044 045 public void setEndpointResolver(EndpointResolver<E> endpointResolver) { 046 this.endpointResolver = endpointResolver; 047 } 048 049 public ExchangeConverter getExchangeConverter() { 050 if (exchangeConverter == null) { 051 exchangeConverter = createExchangeConverter(); 052 } 053 return exchangeConverter; 054 } 055 056 public void setExchangeConverter(ExchangeConverter exchangeConverter) { 057 this.exchangeConverter = exchangeConverter; 058 } 059 060 // Implementation methods 061 //----------------------------------------------------------------------- 062 protected EndpointResolver<E> createEndpointResolver() { 063 return new DefaultEndpointResolver<E>(); 064 } 065 066 /** 067 * Lazily create a default exchange converter implementation 068 */ 069 protected ExchangeConverter createExchangeConverter() { 070 return new DefaultExchangeConverter(); 071 } 072 073 public Component getOrCreateComponent(String componentName, Callable<Component<E,? extends Endpoint<E>>> factory) { 074 synchronized(components) { 075 Component component = components.get(componentName); 076 if( component == null ) { 077 try { 078 component = factory.call(); 079 if( component == null ) 080 throw new IllegalArgumentException("Factory failed to create the "+componentName+" component, it returned null."); 081 } catch (Exception e) { 082 throw new IllegalArgumentException("Factory failed to create the "+componentName+" component", e); 083 } 084 } 085 return component; 086 } 087 } 088 089 public Component getComponent(String componentName) { 090 synchronized(components) { 091 Component component = components.get(componentName); 092 return component; 093 } 094 } 095 }