All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.camel.guice.jndi.JndiBindings Maven / Gradle / Ivy

There is a newer version: 2.25.4
Show newest version
/**
 * 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.jndi;

import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;

import javax.naming.Context;
import javax.naming.NamingException;

import com.google.inject.Binding;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Provider;
import com.google.inject.name.Named;

import org.apache.camel.guice.jndi.internal.Classes;

/**
 * @version
 */
public final class JndiBindings {
    
    private JndiBindings() {
        //Helper class
    }
    /**
     * Binds the given injector and its binding providers to the given JNDI
     * context using this mapping
     * mechanism.
     * 

* This will expose all of the bindings providers to JNDI along with any * bindings which are annotated with {@link JndiBind} or {@link @Named} to * the given JNDI context. * * @param context * the context to export objects to * @param injector * the injector used to find the bindings */ public static void bindInjectorAndBindings(Context context, Injector injector, Properties jndiNames) throws NamingException { // lets find all the exported bindings Set, Binding>> entries = injector.getBindings() .entrySet(); for (Entry, Binding> entry : entries) { Key key = entry.getKey(); Binding binding = entry.getValue(); Annotation annotation = key.getAnnotation(); Type type = key.getTypeLiteral().getType(); JndiBind jndiBind = null; if (type instanceof Class) { Class aClass = (Class) type; jndiBind = aClass.getAnnotation(JndiBind.class); } if (annotation instanceof JndiBind) { jndiBind = (JndiBind) annotation; } String jndiName = null; if (jndiBind != null) { jndiName = jndiBind.value(); } if (jndiName == null) { if (annotation instanceof Named) { Named named = (Named) annotation; String name = named.value(); jndiName = type.toString() + "/" + name; } else if (type instanceof Class) { Class aClass = (Class) type; if (annotation == null) { jndiName = aClass.getName(); } else { jndiName = aClass.getName() + annotation; } } } if (jndiName != null) { Object value = binding.getProvider(); if (value != null) { context.bind(jndiName, value); } } } for (Entry entry : jndiNames.entrySet()) { String jndiName = entry.getKey().toString(); String expression = entry.getValue().toString(); Provider provider = getProviderForExpression(injector, expression); if (provider != null) { context.bind(jndiName, provider); } } } static Provider getProviderForExpression(Injector injector, String expression) { // TODO we could support more complex expressions // like 'className/name' to map to @Named annotations // or even 'className@annotationType(values) etc try { Class type = Classes.loadClass(expression, JndiBindings.class.getClassLoader()); return injector.getProvider(type); } catch (ClassNotFoundException e) { return null; } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy