com.denimgroup.threadfix.service.defects.RestUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.denimgroup.threadfix.service.defects.RestUtils.java

Source

////////////////////////////////////////////////////////////////////////
//
//     Copyright (c) 2009-2013 Denim Group, Ltd.
//
//     The contents of this file are subject to the Mozilla Public 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.mozilla.org/MPL/
//
//     Software distributed under the License is distributed on an "AS IS"
//     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
//     License for the specific language governing rights and limitations
//     under the License.
//
//     The Original Code is ThreadFix.
//
//     The Initial Developer of the Original Code is Denim Group, Ltd.
//     Portions created by Denim Group, Ltd. are Copyright (C)
//     Denim Group, Ltd. All Rights Reserved.
//
//     Contributor(s): Denim Group, Ltd.
//
////////////////////////////////////////////////////////////////////////
package com.denimgroup.threadfix.service.defects;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.denimgroup.threadfix.service.SanitizedLogger;

/**
 * This class holds code for more easily interacting with HTTP-authenticated REST services.
 * So far this is just JIRA but this code could be useful in other places too.
 * 
 * TODO further genericize and move to threadfix common code
 * @author mcollins
 *
 */
public class RestUtils {

    private RestUtils() {
    } // intentional, we shouldn't be instantiating this class.

    private static final SanitizedLogger log = new SanitizedLogger(RestUtils.class);

    //The following methods help with REST interfaces.
    public static InputStream getUrl(String urlString, String username, String password) {
        URL url = null;
        try {
            url = new URL(urlString);
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return null;
        }
        InputStream is = null;
        HttpURLConnection httpConnection;
        try {
            httpConnection = (HttpURLConnection) url.openConnection();

            setupAuthorization(httpConnection, username, password);

            httpConnection.addRequestProperty("Content-Type", "application/json");
            httpConnection.addRequestProperty("Accept", "application/json");

            is = httpConnection.getInputStream();

            return is;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return is;
    }

    public static String getUrlAsString(String urlString, String username, String password) {
        InputStream responseStream = getUrl(urlString, username, password);

        if (responseStream == null) {
            return null;
        }

        String test = null;
        try {
            test = IOUtils.toString(responseStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            closeInputStream(responseStream);
        }

        return test;
    }

    public static void closeInputStream(InputStream stream) {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException ex) {
                log.warn("Closing an input stream failed.", ex);
            }
        }
    }

    public static InputStream postUrl(String urlString, String data, String username, String password) {
        URL url = null;
        try {
            url = new URL(urlString);
        } catch (MalformedURLException e) {
            log.warn("URL used for POST was bad: '" + urlString + "'");
            return null;
        }

        HttpURLConnection httpConnection = null;
        OutputStreamWriter outputWriter = null;
        try {
            httpConnection = (HttpURLConnection) url.openConnection();

            setupAuthorization(httpConnection, username, password);

            httpConnection.addRequestProperty("Content-Type", "application/json");
            httpConnection.addRequestProperty("Accept", "application/json");

            httpConnection.setDoOutput(true);
            outputWriter = new OutputStreamWriter(httpConnection.getOutputStream());
            outputWriter.write(data);
            outputWriter.flush();

            InputStream is = httpConnection.getInputStream();

            return is;
        } catch (IOException e) {
            log.warn("IOException encountered trying to post to URL with message: " + e.getMessage());
            if (httpConnection == null) {
                log.warn(
                        "HTTP connection was null so we cannot do further debugging of why the HTTP request failed");
            } else {
                try {
                    InputStream errorStream = httpConnection.getErrorStream();
                    if (errorStream == null) {
                        log.warn("Error stream from HTTP connection was null");
                    } else {
                        log.warn(
                                "Error stream from HTTP connection was not null. Attempting to get response text.");
                        String postErrorResponse = IOUtils.toString(errorStream);
                        log.warn("Error text in response was '" + postErrorResponse + "'");
                    }
                } catch (IOException e2) {
                    log.warn("IOException encountered trying to read the reason for the previous IOException: "
                            + e2.getMessage(), e2);
                }
            }
        } finally {
            if (outputWriter != null) {
                try {
                    outputWriter.close();
                } catch (IOException e) {
                    log.warn("Failed to close output stream in postUrl.", e);
                }
            }
        }

        return null;
    }

    public static String postUrlAsString(String urlString, String data, String username, String password) {
        InputStream responseStream = postUrl(urlString, data, username, password);

        if (responseStream == null) {
            return null;
        }

        String test = null;
        try {
            test = IOUtils.toString(responseStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            closeInputStream(responseStream);
        }

        return test;
    }

    public static void setupAuthorization(HttpURLConnection connection, String username, String password) {
        String login = username + ":" + password;
        String encodedLogin = new String(Base64.encodeBase64(login.getBytes()));
        //String encodedLogin = Base64.encodeBase64String(login.getBytes());
        connection.setRequestProperty("Authorization", "Basic " + encodedLogin);
    }

    /**
     * Convenience method to wrap the exception catching.
     * TODO validate to save generating an exception on invalid input
     * @param responseContents
     * @return
     */
    public static JSONArray getJSONArray(String responseContents) {
        try {
            return new JSONArray(responseContents);
        } catch (JSONException e) {
            log.warn("JSON Parsing failed.", e);
            return null;
        }
    }

    /**
     * Convenience method to wrap the exception catching.
     * TODO validate to save generating an exception on invalid input
     * @param responseContents
     * @return
     */
    public static JSONObject getJSONObject(String responseContents) {
        try {
            return new JSONObject(responseContents);
        } catch (JSONException e) {
            log.warn("JSON Parsing failed.", e);
            return null;
        }
    }

    /**
     * Convenience method to wrap the exception catching.
     * TODO validate to save generating an exception on invalid input
     * @param object
     * @return
     */
    public static Integer getId(JSONObject object) {
        try {
            return object.getInt("id");
        } catch (JSONException e) {
            log.warn("Failed when trying to parse an ID out of the object.", e);
            return null;
        }
    }
}