com.basho.riak.client.raw.http.HTTPClusterClient.java Source code

Java tutorial

Introduction

Here is the source code for com.basho.riak.client.raw.http.HTTPClusterClient.java

Source

/*
 * This file is provided 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 com.basho.riak.client.raw.http;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpHost;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.routing.HttpRoute;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;

import com.basho.riak.client.http.RiakClient;
import com.basho.riak.client.http.RiakConfig;
import com.basho.riak.client.raw.ClusterClient;
import com.basho.riak.client.raw.RawClient;
import com.basho.riak.client.raw.Transport;
import com.basho.riak.client.raw.config.ClusterConfig;

/**
 * Cluster client that creates a collection of {@link HTTPClientAdapter}
 * {@link RawClient} instances from a given {@link HTTPClusterConfig}
 * <p>
 * NOTE: In the case the the {@link HTTPClusterConfig#getMaxConnections} is NOT
 * {@link ClusterConfig#UNLIMITED_CONNECTIONS} an {@link HttpClient} delegate is
 * created for each node. This is to ensure that the cluster maximum connections
 * limit is enforced. The {@link HTTPClientConfig#getHttpClient()} value for
 * each node config is, therefore, ignored.
 *
 * </p>
 * 
 * @author russell
 * 
 */
public class HTTPClusterClient extends ClusterClient<HTTPClientConfig> {

    /**
     * @param clusterConfig
     * @throws IOException
     */
    public HTTPClusterClient(ClusterConfig<HTTPClientConfig> clusterConfig) throws IOException {
        super(clusterConfig);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.basho.riak.client.raw.ClusterClient#fromConfig(com.basho.riak.client
     * .raw.config.ClusterConfig)
     */
    @Override
    protected RawClient[] fromConfig(ClusterConfig<HTTPClientConfig> clusterConfig) throws IOException {
        List<RawClient> clients = new ArrayList<RawClient>();
        int maxTotal = clusterConfig.getTotalMaximumConnections();

        // IE limitless
        if (maxTotal == ClusterConfig.UNLIMITED_CONNECTIONS) {
            // independent pools, independent clients
            HTTPRiakClientFactory fac = HTTPRiakClientFactory.getInstance();
            for (HTTPClientConfig node : clusterConfig.getClients()) {
                clients.add(fac.newClient(node));
            }
        } else {
            // create a ThreadSafeClientConnManager to be shared by all the
            // RiakClient instances
            // in the cluster
            // add a route per host and a max per route
            ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager();
            cm.setMaxTotal(maxTotal);

            for (HTTPClientConfig node : clusterConfig.getClients()) {
                if (node.getMaxConnections() != null) {
                    cm.setMaxForRoute(makeRoute(node.getUrl()), node.getMaxConnections());
                }
                DefaultHttpClient httpClient = new DefaultHttpClient(cm);

                if (node.getRetryHandler() != null) {
                    httpClient.setHttpRequestRetryHandler(node.getRetryHandler());
                }

                RiakConfig riakConfig = new RiakConfig(node.getUrl());
                riakConfig.setMapReducePath(node.getMapreducePath());
                riakConfig.setTimeout(node.getTimeout());
                riakConfig.setHttpClient(httpClient);

                clients.add(new HTTPClientAdapter(new RiakClient(riakConfig)));
            }
        }
        return clients.toArray(new RawClient[clients.size()]);
    }

    /**
     * Make an {@link HttpRoute} for the given URL
     * 
     * @param url
     * @return a {@link HttpRoute} for the given URL
     */
    private HttpRoute makeRoute(String url) throws IOException {
        try {
            URI uri = new URI(url);
            HttpHost host = new HttpHost(uri.getHost(), uri.getPort());
            return new HttpRoute(host);
        } catch (URISyntaxException e) {
            throw new IOException(e.toString());
        }
    }

    /* (non-Javadoc)
     * @see com.basho.riak.client.raw.RawClient#getTransport()
     */
    public Transport getTransport() {
        return Transport.HTTP;
    }

}