org.compass.core.jndi.NamingHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.compass.core.jndi.NamingHelper.java

Source

/*
 * Copyright 2004-2009 the original author or authors.
 * 
 * Licensed 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.compass.core.jndi;

import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.Name;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.compass.core.config.CompassEnvironment;
import org.compass.core.config.CompassSettings;

public abstract class NamingHelper {

    private static final Log log = LogFactory.getLog(NamingHelper.class);

    public static InitialContext getInitialContext(CompassSettings settings) throws NamingException {
        Hashtable hash = getJndiProperties(settings);
        try {
            return (hash.size() == 0) ? new InitialContext() : new InitialContext(hash);
        } catch (NamingException e) {
            log.error("Could not obtain initial context with settings [" + hash + "]", e);
            throw e;
        }
    }

    /**
     * Bind val to name in ctx, and make sure that all intermediate contexts
     * exist.
     * 
     * @param ctx
     *            the root context
     * @param name
     *            the name as a string
     * @param val
     *            the object to be bound
     * @throws javax.naming.NamingException
     */
    public static void bind(Context ctx, String name, Object val) throws NamingException {
        try {
            ctx.rebind(name, val);
        } catch (Exception e) {
            Name n = ctx.getNameParser("").parse(name);
            while (n.size() > 1) {
                String ctxName = n.get(0);

                Context subctx = null;
                try {
                    subctx = (Context) ctx.lookup(ctxName);
                } catch (NameNotFoundException nfe) {
                    // don't do nothing
                }

                if (subctx != null) {
                    ctx = subctx;
                } else {
                    ctx = ctx.createSubcontext(ctxName);
                }
                n = n.getSuffix(1);
            }
            ctx.rebind(n, val);
        }
    }

    /**
     * Transform JNDI properties passed in the form
     * <code>compass.jndi. [vaules]</code> to the format accepted by
     * <code>InitialContext</code> by triming the leading "<code>compass.jndi</code>".
     */
    public static Properties getJndiProperties(CompassSettings settings) {
        HashSet specialProps = new HashSet();
        specialProps.add(CompassEnvironment.Jndi.CLASS);
        specialProps.add(CompassEnvironment.Jndi.URL);
        specialProps.add(CompassEnvironment.Jndi.ENABLE);

        Iterator iter = settings.keySet().iterator();
        Properties result = new Properties();
        while (iter.hasNext()) {
            String prop = (String) iter.next();
            if (prop.indexOf(CompassEnvironment.Jndi.PREFIX) > -1 && !specialProps.contains(prop)) {
                result.setProperty(prop.substring(CompassEnvironment.Jndi.PREFIX.length() + 1),
                        settings.getSetting(prop));
            }
        }

        String jndiClass = settings.getSetting(CompassEnvironment.Jndi.CLASS);
        String jndiURL = settings.getSetting(CompassEnvironment.Jndi.URL);
        // we want to be able to just use the defaults,
        // if JNDI environment properties are not supplied
        // so don't put null in anywhere
        if (jndiClass != null)
            result.put(Context.INITIAL_CONTEXT_FACTORY, jndiClass);
        if (jndiURL != null)
            result.put(Context.PROVIDER_URL, jndiURL);

        return result;
    }
}