/* 
 * Copyright 2001-2009 Terracotta, Inc. 
 * 
 * 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.quartz.jobs.ee.jms;

import java.lang.reflect.Method;
import java.util.Hashtable;

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

import org.quartz.JobDataMap;

/**
 * Utility class that aids in the processing of JMS based jobs and sending of
 * <code>javax.jms.Message</code>
 * 
 * @author Fernando Ribeiro
 * @author Weston M. Price
 */
public final class JmsHelper {
    public static final String CREDENTIALS = "java.naming.security.credentials";

    public static final String INITIAL_CONTEXT_FACTORY = "java.naming.factory.initial";

    public static final String JMS_ACK_MODE = "jms.acknowledge";

    public static final String JMS_CONNECTION_FACTORY_JNDI = "jms.connection.factory";

    public static final String JMS_DESTINATION_JNDI = "jms.destination";

    public static final String JMS_MSG_FACTORY_CLASS_NAME = "jms.message.factory.class.name";

    public static final String JMS_PASSWORD = "jms.password";

    public static final String JMS_USE_TXN = "jms.use.transaction";

    public static final String JMS_USER = "jms.user";

    public static final String PRINCIPAL = "java.naming.security.principal";

    public static final String PROVIDER_URL = "java.naming.provider.url";

    public static void closeResource(final Object resource) {

        if (resource == null)
            return;

        try {
            final Method m = resource.getClass().getMethod("close",
                    new Class[0]);

            m.invoke(resource, new Object[0]);
        } catch (final Exception e) {
        }

    }

    public static InitialContext getInitialContext(final JobDataMap dataMap)
            throws NamingException {
        final Hashtable<String, String> params = new Hashtable<String, String>(4);

        final String initialContextFactory = dataMap
                .getString(INITIAL_CONTEXT_FACTORY);

        if (initialContextFactory != null)
            params.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory);

        final String providerUrl = dataMap.getString(PROVIDER_URL);

        if (providerUrl != null)
            params.put(Context.PROVIDER_URL, providerUrl);

        final String principal = dataMap.getString(PRINCIPAL);

        if (principal != null)
            params.put(Context.SECURITY_PRINCIPAL, principal);

        final String credentials = dataMap.getString(CREDENTIALS);

        if (credentials != null)
            params.put(Context.SECURITY_CREDENTIALS, credentials);

        if (params.size() == 0)
            return new InitialContext();
        else
            return new InitialContext(params);

    }

    public static JmsMessageFactory getMessageFactory(final String name)
            throws JmsJobException {

        try {
            final Class<?> cls = Class.forName(name);

            final JmsMessageFactory factory = (JmsMessageFactory) cls
                    .newInstance();

            return factory;
        } catch (final Exception e) {
            throw new JmsJobException(e.getMessage(), e);
        }

    }

    public static boolean isDestinationSecure(final JobDataMap dataMap) {
        return ((dataMap.getString(JmsHelper.JMS_USER) != null) && (dataMap
                .getString(JmsHelper.JMS_PASSWORD) != null));
    }

    public static boolean useTransaction(final JobDataMap dataMap) {
        return dataMap.getBoolean(JMS_USE_TXN);
    }

    private JmsHelper() {
    }

}
