org.objectweb.joram.mom.dest.amqp.AmqpConnectionService.java Source code

Java tutorial

Introduction

Here is the source code for org.objectweb.joram.mom.dest.amqp.AmqpConnectionService.java

Source

/*
 * JORAM: Java(TM) Open Reliable Asynchronous Messaging
 * Copyright (C) 2011 - 2012 ScalAgent Distributed Technologies
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
 * USA.
 *
 * Initial developer(s): ScalAgent Distributed Technologies
 * Contributor(s): 
 */
package org.objectweb.joram.mom.dest.amqp;

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import org.objectweb.util.monolog.api.BasicLevel;
import org.objectweb.util.monolog.api.Logger;

import com.rabbitmq.client.ConnectionFactory;

import fr.dyade.aaa.agent.AgentServer;
import fr.dyade.aaa.common.Debug;
import fr.dyade.aaa.util.management.MXWrapper;

public class AmqpConnectionService {

    private static final Logger logger = Debug.getLogger(AmqpConnectionService.class.getName());

    private static AmqpConnections singleton;

    public synchronized static AmqpConnections getInstance() {
        if (singleton == null) {
            singleton = new AmqpConnections();
            try {
                MXWrapper.registerMBean(singleton, "AMQP#" + AgentServer.getServerId(), "type=Connections");
            } catch (Exception e) {
                logger.log(BasicLevel.DEBUG, "registerMBean", e);
            }
        }
        return singleton;
    }

    /**
     * Adds an AMQP server and starts a live connection with it, accessible via
     * the host and port provided. A server is uniquely identified by the given
     * name. Adding an existing server won't do anything.
     * 
     * @param name the name identifying the server
     * @param host host of the added server
     * @param port port of the added server
     */
    public static void addServer(String name, String host, int port) {
        getInstance().addServer(name, host, port);
    }

    /**
     * Adds an AMQP server and starts a live connection with it, accessible via
     * the host and port provided. A server is uniquely identified by the given
     * name. Adding an existing server won't do anything.
     * 
     * @param name the name identifying the server
     * @param host host of the added server
     * @param port port of the added server
     * @param user user name
     * @param pass user password
     */
    public static void addServer(String name, String host, int port, String user, String pass) {
        getInstance().addServer(name, host, port, user, pass);
    }

    /**
     * Adds an AMQP server and starts a live connection with it, accessible via
     * the host and port provided. A server is uniquely identified by the given
     * name. Adding an existing server won't do anything.
     * 
     * @param urls the amqp url list identifying the servers separate by space.
     * ex: amqp://user:pass@localhost:5672/?name=serv1 amqp://user:pass@localhost:5678/?name=serv2
     * serv1 and serv2 are the name identifying the server.
     */
    public static void addServer(String urls) {
        if (logger.isLoggable(BasicLevel.DEBUG)) {
            logger.log(BasicLevel.DEBUG, "AmqpConnectionService.addServer(" + urls + ')');
        }

        StringTokenizer tk = new StringTokenizer(urls);
        while (tk.hasMoreTokens()) {
            URL url = null;
            try {
                url = new URL(null, tk.nextToken(), new MyURLStreamHandler());
            } catch (Exception e) {
                if (logger.isLoggable(BasicLevel.ERROR)) {
                    logger.log(BasicLevel.ERROR, "AmqpConnectionService.addServer : Exception ", e);
                }
                continue;
            }
            String host = null;
            int port = -1;
            String name = "default";
            String userName = null;
            String userPass = null;

            String userInfo = url.getUserInfo();
            if (userInfo != null) {
                StringTokenizer token = new StringTokenizer(userInfo, ":");
                if (token.hasMoreTokens())
                    userName = token.nextToken();
                if (token.hasMoreTokens())
                    userPass = token.nextToken();
            }

            host = url.getHost();
            if (host == null)
                host = ConnectionFactory.DEFAULT_HOST;

            port = url.getPort();
            if (port < 0)
                port = ConnectionFactory.DEFAULT_AMQP_PORT;

            String query = url.getQuery();
            if (query != null) {
                int index = query.indexOf('=');
                if (index > 0)
                    name = query.substring(index + 1, query.length());
            }

            if (logger.isLoggable(BasicLevel.DEBUG)) {
                logger.log(BasicLevel.DEBUG, "AmqpConnectionService.addServer(" + name + ", " + host + ", " + port
                        + ", " + userName + ')');
            }
            getInstance().addServer(name, host, port, userName, userPass);
        }
    }

    /**
     * Removes the live connection to the specified AMQP server.
     * 
     * @param names the name identifying the server or list of name separate by space
     */
    public static void deleteServer(String names) {
        StringTokenizer token = new StringTokenizer(names, " ");
        while (token.hasMoreTokens()) {
            getInstance().deleteServer(token.nextToken());
        }
    }

    /**
     * Gets the list of known servers.
     */
    public static String[] getServerNames() {
        return getInstance().getServerNames();
    }

    /**
     * Initializes the service. Starts a connection with one server.
     */
    public static void init(String args, boolean firstTime) throws Exception {
        if (logger.isLoggable(BasicLevel.DEBUG)) {
            logger.log(BasicLevel.DEBUG, "AmqpConnectionService.init(" + args + ", " + firstTime + ')');
        }

        if (firstTime) {
            if (args != null && args.length() > 0) {
                addServer(args);
            }
        } else {
            getInstance().readSavedConf();
        }

    }

    /**
     * Stops all connections to AMQP servers.
     */
    public static void stopService() {
        if (logger.isLoggable(BasicLevel.DEBUG)) {
            logger.log(BasicLevel.DEBUG, "Stopping AmqpConnectionHandler service.");
        }
        getInstance().stop();
    }

    public static List<String> convertToList(final String value) {
        String[] values = value.split(",");
        List<String> injection = null;

        // We should have at least 1 real value
        if (!((values.length == 1) && ("".equals(values[0])))) {
            injection = new ArrayList<String>();
            for (int i = 0; i < values.length; i++) {
                String part = values[i];
                injection.add(part.trim());
            }
        }
        return injection;
    }

    static class MyURLStreamHandler extends URLStreamHandler {
        @Override
        protected URLConnection openConnection(URL u) throws IOException {
            throw new IOException("sorry, not possible to openConnection with this URL (juste use to parse) " + u);
        }
    }
}