/* * Copyright (c) 2012. The Genome Analysis Centre, Norwich, UK * MISO project contacts: Robert Davey, Mario Caccamo @ TGAC * ********************************************************************* * * This file is part of MISO. * * MISO is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MISO is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MISO. If not, see <http://www.gnu.org/licenses/>. * * ********************************************************************* */ package uk.ac.bbsrc.tgac.miso.integration.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.URISyntaxException; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import org.apache.commons.codec.binary.Base64InputStream; import org.apache.commons.codec.binary.Base64OutputStream; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; /** * uk.ac.bbsrc.tgac.miso.integration.util * <p/> * Info * * @author Rob Davey * @date 04/11/11 * @since 0.1.3 */ public class IntegrationUtils { public static String makePostRequest(String host, int port, String query) throws IntegrationException { if (query == null || query.isEmpty()) { throw new IntegrationException("Query must be populated when calling makePostRequest."); } String rtn = null; HttpClient httpclient = HttpClientBuilder.create().build(); String url = "http://" + host + ":" + port + "/miso/"; try { HttpPost httpPost = new HttpPost(url); // Request parameters and other properties. httpPost.setHeader("content-type", "application/x-www-form-urlencoded"); System.out.println(query); httpPost.setEntity(new StringEntity(query)); // Execute and get the response. HttpResponse response = httpclient.execute(httpPost); rtn = EntityUtils.toString(response.getEntity()); if (rtn.charAt(0) == '"' && rtn.charAt(rtn.length() - 1) == '"') { System.out.println("Removing quotes"); rtn = rtn.substring(1, rtn.length() - 1); } } catch (IOException ex) { ex.printStackTrace(); throw new IntegrationException("Cannot connect to " + url + " Cause: " + ex.getMessage()); } return rtn; } /** * Sets up the socket connection to a given host * * @param host * of type String * @param port * of type int * @return Socket * @throws IntegrationException * when the socket couldn't be created */ public static Socket prepareSocket(String host, int port) throws IntegrationException { try { return new Socket(host, port); } catch (IOException e) { e.printStackTrace(); throw new IntegrationException("Cannot connect to " + host + ":" + port + ". Cause: " + e.getMessage()); } } /** * Sends a String message to a given host socket * * @param socket * of type Socket * @param query * of type String * @return String * @throws IntegrationException * when the socket couldn't be created */ public static String sendMessage(Socket socket, String query) throws IntegrationException { BufferedWriter wr = null; BufferedReader rd = null; try { wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8")); // Send data wr.write(query + "\r\n"); wr.flush(); // Get response rd = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line; StringBuilder sb = new StringBuilder(); while ((line = rd.readLine()) != null) { sb.append(line); } wr.close(); rd.close(); String dirty = sb.toString(); StringBuilder response = new StringBuilder(); int codePoint; int i = 0; while (i < dirty.length()) { codePoint = dirty.codePointAt(i); if ((codePoint == 0x9) || (codePoint == 0xA) || (codePoint == 0xD) || ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF))) { response.append(Character.toChars(codePoint)); } i += Character.charCount(codePoint); } return response.toString().replace("\\\n", "").replace("\\\t", ""); } catch (UnknownHostException e) { System.err.println("Cannot resolve host: " + socket.getInetAddress()); throw new IntegrationException(e.getMessage()); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to: " + socket.getInetAddress()); throw new IntegrationException(e.getMessage()); } finally { try { if (wr != null) { wr.close(); } if (rd != null) { rd.close(); } } catch (Throwable t) { t.printStackTrace(); } } } public static byte[] compress(byte[] content) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); Base64OutputStream b64os = new Base64OutputStream(baos); GZIPOutputStream gzip = new GZIPOutputStream(b64os); gzip.write(content); gzip.close(); return baos.toByteArray(); } public static byte[] decompress(byte[] contentBytes) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); GZIPInputStream bis = new GZIPInputStream(new Base64InputStream(new ByteArrayInputStream(contentBytes))); byte[] buffer = new byte[1024 * 4]; int n = 0; while (-1 != (n = bis.read(buffer))) { out.write(buffer, 0, n); } return out.toByteArray(); } }