All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.meschbach.psi.util.RESTClient Maven / Gradle / Ivy

Go to download

Reusable utility classes for interacting with PSI components. This includes a series of components which are utilized in testing the system.

The newest version!
/*
 *  Copyright 2011 Mark Eschbach
 *
 *  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.
 *
 * $HeadURL: https://phunctional-system-integration.googlecode.com/svn/tags/psi-reactor-2.4/trunk/psi-util/src/main/java/com/meschbach/psi/util/RESTClient.java $
 * $Id: RESTClient.java 242 2011-03-07 02:48:48Z [email protected] $
 */
package com.meschbach.psi.util;

import com.meschbach.psi.PSIException;
import com.meschbach.psi.util.rest.GetRequest;
import com.meschbach.psi.util.rest.PostRequest;
import com.meschbach.psi.util.rest.PutRequest;
import com.meschbach.psi.util.rest.RequestBuilder;
import com.meschbach.psi.util.rest.ResponseEntityAssertion;
import com.meschbach.psi.util.rest.ResponseHandler;
import com.meschbach.psi.util.rest.StatusAssertionResponseHandler;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;

/**
 * A RESTClient is a class for constructing simple RESTful client
 * against a remote host.  The primary intention of the instances is to provide
 * a DRYer implementation of the DSL class methods attached to this class.
 * 

* If you are searching for the HttpStatusCode enumeration then it has moved * into the package in version 1.2.0. * * @author "Mark Eschbach" [email protected] * @since 1.1.0 * @version 1.1.0 */ public class RESTClient { /** * The url is the URL to request. This is the * plain text URL, without being encoded. * @since 1.2.0 */ protected String url; /** * The builder is responsible for constructing an HTTPClient * request to be issued. * @since 1.2.0 */ protected RequestBuilder builder; /** * The handlers is a list of handlers to deal with the * response in an application specific method. * @since 1.2.0 */ protected List handlers; /** * Constructs a new RESTful client to contact the named remote resource * url with the method specified by the given builder * * @param url is the URL to the resource to be contacted * @param builder is the builder for the method to be used * @since 1.2.0 */ public RESTClient(String url, RequestBuilder builder) { this.url = url; this.builder = builder; handlers = new LinkedList(); } /** * Issues the request represented by this client and notifies the response * handlers of th results of the request. * * @throws PSIException if a problem occurs issuing or processing the request * @throws AssertionError maybe thrown depending on the implementation of the response handlers */ public void doRequest() throws PSIException { /* * Issue the request */ HttpClient client = new DefaultHttpClient(); try { /* * Escape our URL */ URI uri = new URI(url); /* * Construct and issue request */ HttpResponse response = client.execute(builder.buildRequest(uri)); /* * Ensure the response code is as expected */ HttpStatusCode responseCode = HttpStatusCode.getCode(response.getStatusLine().getStatusCode()); Iterator rhit = handlers.iterator(); while (rhit.hasNext()) { rhit.next().handleResponse(response, responseCode); } } catch (URISyntaxException use) { throw new PSIException(use); } catch (IOException ioe) { throw new PSIException(ioe); } finally { client.getConnectionManager().shutdown(); } } /** * Adds a response handler to the set of handlers to be notified when our * request has completed. * * @param rs is the response handler to be notified */ public void addHandler(ResponseHandler rs) { handlers.add(rs); } /** * Issues a GET request to the given remote resource and asserts we will * receive the specified HTTP response code * * @param url is a string in URL format (http://host/resource/path) of the resource to be contacted * @param expectedCode is the HTTP status code we expect to receive * @throws PSIException if a problem attempting to issue the request */ public static void assertGetStatus(String url, HttpStatusCode expectedCode) { try { RESTClient rc = new RESTClient(url, new GetRequest()); rc.addHandler(new StatusAssertionResponseHandler(expectedCode)); rc.doRequest(); } catch (PSIException pe) { throw new IllegalStateException(pe); } } /** * Attempts to issue an HTTP PUT request against with the * given HTTP entity to the named resource at url, * asserting the resulting status cde will be expectedCode. * * @param url is a string in URL format of the resource to put * @param entity is the entity body to put * @param expectedCode is the status code expected to be returned * @throws PSIException if there is a problem contacting the remote service for the request */ public static void assertPutStatus(String url, String entity, HttpStatusCode expectedCode) { try { RESTClient rc = new RESTClient(url, new PutRequest(entity)); rc.addHandler(new StatusAssertionResponseHandler(expectedCode)); rc.doRequest(); } catch (PSIException pe) { throw new IllegalStateException(pe); } } /** * Issues an HTTP GET request to the named resource at url * expecting an HTTP 200 Ok response with the given expectedEntity * as the response entity. * * @param url is the resource to GET * @param expectedEntity is the entity we are expecting in return * @throws PSIException if we are unable to contact the remote service. */ public static void assertGet(String url, String expectedEntity) { assertGet(url, HttpStatusCode.Ok, expectedEntity); } /** * Issues the given GET request with to the specified url/code>, * asserting we recieve a response with HTTP response code expectedCode * and an HTTP entity of expectedEntity. * * @param url is the URL of the resource to get * @param expectedCode is the code we expect to be returned * @param expectedEntity is the entity we expect to receive * @throws PSIException if we are unable to communicate with the remote HTTP service */ public static void assertGet(String url, HttpStatusCode expectedCode, String expectedEntity) { try { RESTClient rc = new RESTClient(url, new GetRequest()); rc.addHandler(new StatusAssertionResponseHandler(expectedCode)); rc.addHandler(new ResponseEntityAssertion(expectedEntity)); rc.doRequest(); } catch (PSIException pe) { throw new IllegalStateException(pe); } } /** * Issues an HTTP POST request with the specified content within the HTTP * entity. This function will then assert that the given * expectedCode and expectedEntity is received * in response. * * @param url is the URL to POST to * @param entity is the entity to POST * @param expectedCode is the expected response code * @param expectedEntity is the expected entity */ public static void assertPost(String url, String entity, HttpStatusCode expectedCode, String expectedEntity) { try { RESTClient rc = new RESTClient(url, new PostRequest(entity)); rc.addHandler(new StatusAssertionResponseHandler(expectedCode)); rc.addHandler(new ResponseEntityAssertion(expectedEntity)); rc.doRequest(); } catch (PSIException pe) { throw new IllegalStateException(pe); } } /** * Issues an HTTP POST request with the specified content within the HTTP * entity. This function will then assert that the given * expectedCode is received * in response. * * @param url is the URL to POST to * @param entity is the entity to POST * @param expectedCode is the expected response code * @param expectedEntity is the expected entity */ public static void assertPost(String url, String entity, HttpStatusCode expectedCode) { try { RESTClient rc = new RESTClient(url, new PostRequest(entity)); rc.addHandler(new StatusAssertionResponseHandler(expectedCode)); rc.doRequest(); } catch (PSIException pe) { throw new IllegalStateException(pe); } } }