com.lonepulse.robozombie.executor.ConfigurationService.java Source code

Java tutorial

Introduction

Here is the source code for com.lonepulse.robozombie.executor.ConfigurationService.java

Source

package com.lonepulse.robozombie.executor;

/*
 * #%L
 * RoboZombie
 * %%
 * Copyright (C) 2013 - 2014 Lonepulse
 * %%
 * 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.
 * #L%
 */

import org.apache.http.client.HttpClient;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;

import com.lonepulse.robozombie.annotation.Config;
import com.lonepulse.robozombie.proxy.Zombie;
import com.lonepulse.robozombie.proxy.Zombie.Configuration;

/**
 * <p>This is a concrete implementation of {@link ConfigurationManager} which manages request execution 
 * configurations defined as instances of {@link Zombie.Configuration}.</p> 
 * 
 * @version 1.1.0
 * <br><br>
 * @since 1.3.0
 * <br><br>
 * @author <a href="http://sahan.me">Lahiru Sahan Jayasinghe</a>
 */
final class ConfigurationService implements ConfigurationManager {

    /**
     * <p>The <i>out-of-the-box</i> configuration for an instance of {@link HttpClient} which will be used for 
     * executing all endpoint requests. Below is a detailed description of all configured properties.</p> 
     * <br>
     * <ul>
     * <li>
     * <p><b>HttpClient</b></p>
     * <br>
     * <p>It registers two {@link Scheme}s:</p>
     * <br>
     * <ol>
     *    <li><b>HTTP</b> on port <b>80</b> using sockets from {@link PlainSocketFactory#getSocketFactory}</li>
     *    <li><b>HTTPS</b> on port <b>443</b> using sockets from {@link SSLSocketFactory#getSocketFactory}</li>
     * </ol>
     * 
     * <p>It uses a {@link ThreadSafeClientConnManager} with the following parameters:</p>
     * <br>
     * <ol>
     *    <li><b>Redirecting:</b> enabled</li>
     *    <li><b>Connection Timeout:</b> 30 seconds</li>
     *    <li><b>Socket Timeout:</b> 30 seconds</li>
     *    <li><b>Socket Buffer Size:</b> 12000 bytes</li>
     *    <li><b>User-Agent:</b> via <code>System.getProperty("http.agent")</code></li>
     * </ol>
     * </li>
     * </ul>
     * @return the instance of {@link HttpClient} which will be used for request execution
     * <br><br>
     * @since 1.3.0
     */
    @Override
    public Configuration getDefault() {

        return new Configuration() {

            @Override
            public HttpClient httpClient() {

                try {

                    HttpParams params = new BasicHttpParams();
                    HttpClientParams.setRedirecting(params, true);
                    HttpConnectionParams.setConnectionTimeout(params, 30 * 1000);
                    HttpConnectionParams.setSoTimeout(params, 30 * 1000);
                    HttpConnectionParams.setSocketBufferSize(params, 12000);
                    HttpProtocolParams.setUserAgent(params, System.getProperty("http.agent"));

                    SchemeRegistry schemeRegistry = new SchemeRegistry();
                    schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
                    schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

                    ClientConnectionManager manager = new ThreadSafeClientConnManager(params, schemeRegistry);

                    return new DefaultHttpClient(manager, params);
                } catch (Exception e) {

                    throw new ConfigurationFailedException(e);
                }
            }
        };
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Configuration register(Class<?> endpointClass) {

        try {

            if (endpointClass.isAnnotationPresent(Config.class)) {

                Configuration configuration = endpointClass.getAnnotation(Config.class).value().newInstance();

                HttpClient httpClient = configuration.httpClient();
                HttpClientDirectory.INSTANCE.bind(endpointClass, httpClient); //currently the only configurable property

                return configuration;
            } else {

                HttpClientDirectory.INSTANCE.bind(endpointClass, HttpClientDirectory.DEFAULT);

                return new Configuration() {
                };
            }
        } catch (Exception e) {

            throw new ConfigurationFailedException(endpointClass, e);
        }
    }
}