org.springframework.remoting.thrift.TestThriftServiceExporter.java Source code

Java tutorial

Introduction

Here is the source code for org.springframework.remoting.thrift.TestThriftServiceExporter.java

Source

/*
 * Copyright 2011 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.springframework.remoting.thrift;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.thrift.TException;
import org.apache.thrift.transport.THttpClient;
import org.apache.thrift.transport.TTransport;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mortbay.jetty.Server;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.obm.thrift.crm.Crm;
import org.springframework.obm.thrift.crm.Customer;
import org.springframework.util.http.DispatcherServletJettyConfigurationCallback;
import org.springframework.util.http.EndpointTestUtils;
import org.springframework.util.http.RestIntegrationTestUtils;
import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping;

import java.util.Arrays;
import java.util.List;
import java.util.Random;

/**
 * Tests the {@link ThriftServiceExporter} which is a Spring Web {@link org.springframework.web.HttpRequestHandler}
 * that can satisfy requests over HTTP in the native Thrift RPC format.
 * <p/>
 * This is <EM>not</EM> a REST service, however. It just uses HTTP as a transport.
 *
 * @author Josh Long
 */
public class TestThriftServiceExporter {

    private Log log = LogFactory.getLog(getClass());

    private Server jettyServer;

    @Before
    public void before() throws Throwable {
        jettyServer = EndpointTestUtils
                .serve(new DispatcherServletJettyConfigurationCallback(ExporterConfiguration.class));
        jettyServer.start();
        if (log.isDebugEnabled()) {
            log.debug("started jetty server");
        }
    }

    @After
    public void after() throws Throwable {

        RestIntegrationTestUtils.stopServerQuietly(this.jettyServer);
        if (log.isDebugEnabled()) {
            log.debug("stopped jetty server");
        }
    }

    @Test
    public void testCreateCustomerOnRpcClient() throws Throwable {

        String fn = "fn", ln = "ln", email = "email@email.com";

        ApplicationContext clientContext = new AnnotationConfigApplicationContext(
                ThriftProxyClientConfiguration.class);
        Crm.Iface clientCrm = clientContext.getBean(Crm.Iface.class);

        Customer customer = clientCrm.createCustomer(fn, ln, email);

        if (log.isDebugEnabled()) {
            log.debug("the response from the server is " + ToStringBuilder.reflectionToString(customer));
        }

        Assert.assertNotNull(customer);
        Assert.assertEquals(customer.getFirstName(), fn);
        Assert.assertEquals(customer.getLastName(), ln);
        Assert.assertEquals(customer.getEmail(), email);
        Assert.assertTrue(customer.getId() > 0);
    }

}

/**
 * The server
 */
@Configuration
class ExporterConfiguration {

    static public final String SERVLET = "/crm";

    @Bean
    public Crm.Iface crmServiceImpl() {
        return new CrmService();
    }

    @Bean
    public BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() {
        return new BeanNameUrlHandlerMapping();
    }

    @Bean(name = SERVLET)
    public ThriftServiceExporter crm() {
        ThriftServiceExporter exporter = new ThriftServiceExporter();
        exporter.setService(crmServiceImpl());
        exporter.setServiceInterface(Crm.Iface.class);
        return exporter;
    }
}

/**
 * the client
 */
@Configuration
class ThriftProxyClientConfiguration {
    @Bean
    public ThriftProxyFactoryBean client() {
        // demonstrates how to use the protocol over HTTP
        THttpClient.Factory httpClientFactory = new THttpClient.Factory(
                "http://localhost:8080" + ExporterConfiguration.SERVLET);
        TTransport tTransport = httpClientFactory.getTransport(null);

        ThriftProxyFactoryBean proxy = new ThriftProxyFactoryBean();
        proxy.setTransport(tTransport);
        proxy.setServiceInterface(Crm.class);
        return proxy;
    }
}

class CrmService implements Crm.Iface {

    private List<String> firstNames = Arrays.asList("Josh", "Oliver", "Costin", "Juergen", "Rod", "Mark", "Dave",
            "Arjen", "Keith", "Adam", "Mike", "Mario");
    private List<String> lastNames = Arrays.asList("Lee", "Loo", "Wi", "Li", "Humble", "Duong", "Kuo");

    private final Random lnRandom = new Random();
    private final Random fnRandom = new Random();

    private String lastName() {
        int i = lnRandom.nextInt(lastNames.size());
        return lastNames.get(i);
    }

    private String firstName() {
        int i = fnRandom.nextInt(firstNames.size());
        return firstNames.get(i);
    }

    public Customer createCustomer(String fn, String ln, String email, int id) {
        return new Customer(fn, ln, email, id);
    }

    @Override
    public Customer createCustomer(String fn, String ln, String email) throws TException {
        return createCustomer(fn, ln, email, (int) (Math.random() * 2002));
    }

    public Customer getCustomerById(int customerId) {
        String fn = firstName();
        String ln = lastName();
        return new Customer(fn, ln, fn + "@email.com", customerId);
    }
}