/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.guice; import java.io.BufferedInputStream; import java.net.URL; import java.util.LinkedList; import java.util.Map; import java.util.Properties; import java.util.Set; import javax.naming.Context; import javax.naming.InitialContext; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.google.inject.Binding; import com.google.inject.Injector; import com.google.inject.Key; import org.apache.camel.CamelContext; import org.apache.camel.ProducerTemplate; import org.apache.camel.guice.inject.Injectors; import org.apache.camel.main.MainSupport; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ObjectHelper; /** * A command line tool for booting up a CamelContext using a Guice Injector via JNDI * assuming that a valid jndi.properties is on the classpath * * @version */ public class Main extends MainSupport { private static Main instance; private Injector injector; private String jndiProperties; public Main() { addOption(new ParameterOption("j", "jndiProperties", "Sets the classpath based jndi properties file location", "jndiProperties") { @Override protected void doProcess(String arg, String parameter, LinkedList<String> remainingArgs) { setJndiProperties(parameter); } }); } public void setJndiProperties(String properties) { this.jndiProperties = properties; } public String getJndiProperties() { return this.jndiProperties; } public static void main(String... args) throws Exception { Main main = new Main(); instance = main; main.run(args); } /** * Returns the currently executing main * * @return the current running instance */ public static Main getInstance() { return instance; } // Properties // ------------------------------------------------------------------------- protected void setInjector(Injector injector) { this.injector = injector; } protected Injector getInjector() { return injector; } // Implementation methods // ------------------------------------------------------------------------- protected Injector getInjectorFromContext() throws Exception { Context context = null; URL jndiPropertiesUrl = null; if (ObjectHelper.isNotEmpty(jndiProperties)) { jndiPropertiesUrl = this.getClass().getResource(jndiProperties); } if (jndiPropertiesUrl != null) { Properties properties = new Properties(); BufferedInputStream bis = null; try { bis = IOHelper.buffered(jndiPropertiesUrl.openStream()); properties.load(bis); } finally { IOHelper.close(bis); } context = new InitialContext(properties); } else { context = new InitialContext(); } return (Injector) context.lookup(Injector.class.getName()); } @Override protected void doStart() throws Exception { super.doStart(); setInjector(getInjectorFromContext()); postProcessContext(); } protected void doStop() throws Exception { super.doStop(); if (injector != null) { Injectors.close(injector); } } protected ProducerTemplate findOrCreateCamelTemplate() { if (injector != null) { Set<ProducerTemplate> set = Injectors.getInstancesOf(injector, ProducerTemplate.class); if (!set.isEmpty()) { // TODO should be Iterables.get(set, 0); return Iterables.getOnlyElement(set); } } for (CamelContext camelContext : getCamelContexts()) { return camelContext.createProducerTemplate(); } throw new IllegalArgumentException("No CamelContext is available so cannot create a ProducerTemplate!"); } protected Map<String, CamelContext> getCamelContextMap() { Map<String, CamelContext> answer = Maps.newHashMap(); if (injector != null) { Set<Map.Entry<Key<?>, Binding<?>>> entries = injector.getBindings().entrySet(); for (Map.Entry<Key<?>, Binding<?>> entry : entries) { Key<?> key = entry.getKey(); Class<?> keyType = Injectors.getKeyType(key); if (keyType != null && CamelContext.class.isAssignableFrom(keyType)) { Binding<?> binding = entry.getValue(); Object value = binding.getProvider().get(); if (value != null) { CamelContext castValue = CamelContext.class.cast(value); answer.put(key.toString(), castValue); } } } } return answer; } }