Java tutorial
/* * Copyright 2014 Alexey Plotnik * * 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.stem.api; import org.apache.http.HttpHeaders; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.utils.URIBuilder; import org.apache.http.conn.HttpHostConnectException; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.AbstractHttpMessage; import org.stem.api.request.ClusterManagerRequest; import org.stem.api.response.StemResponse; import org.stem.utils.JsonUtils; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; public abstract class BaseHttpClient { protected URI root; protected CloseableHttpClient client; public BaseHttpClient(String uri) { try { this.root = new URI(uri); client = HttpClients.createDefault(); } catch (URISyntaxException e) { throw new RuntimeException(e); } } protected static void setHeaders(AbstractHttpMessage request) { request.addHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString()); request.addHeader(HttpHeaders.ACCEPT, ContentType.APPLICATION_JSON.toString()); } protected static StringEntity prepareJsonBody(Object obj) { try { return new StringEntity(JsonUtils.encode(obj)); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } public <T extends StemResponse> T send(HttpEntityEnclosingRequestBase request, ClusterManagerRequest msg, Class<T> clazz) { try { setHeaders(request); StringEntity body = prepareJsonBody(msg); request.setEntity(body); return (T) client.execute(request, getResponseHandler(clazz)); } catch (Exception e) { throw new RuntimeException(e); } } public <T extends StemResponse> T send(HttpRequestBase request, Class<T> clazz) { try { setHeaders(request); return (T) client.execute(request, getResponseHandler(clazz)); } catch (HttpHostConnectException e) { throw new RuntimeException("Failed to connect to cluster manager", e); } catch (Exception e) { throw new RuntimeException("Unexpected error while sending request to cluster manager", e); } } public <T extends StemResponse> T sendGet(String uriStr, Class<T> clazz) { try { URI uri = getURI(uriStr); HttpGet request = new HttpGet(uri); setHeaders(request); return (T) client.execute(request, getResponseHandler(clazz)); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } protected CloseableHttpClient getClient() { return client; } protected URI getURI(String relativeUri) { try { return new URIBuilder(root).setPath(relativeUri).build(); } catch (Exception e) { throw new RuntimeException(e); } } protected ResponseHandler getResponseHandler(Class<? extends StemResponse> clazz) { return new JsonResponseHandler(clazz); } }