// Modified or written by Luca Marrocco for inclusion with airbrake.
// Copyright (c) 2009 Luca Marrocco.
// Licensed under the Apache License, Version 2.0 (the "License")

package airbrake;

import java.io.*;
import java.net.*;

public class AirbrakeNotifier {

	public static String slurp(InputStream stream) {
		try {
			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
			byte[] buff = new byte[4096];
			for (int len; (len = stream.read(buff)) != -1;) {
				outputStream.write(buff, 0, len);
			}
			return outputStream.toString();

		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	private String url;

	public AirbrakeNotifier() {
		setUrl("http://api.airbrake.io/notifier_api/v2/notices");
	}

	public AirbrakeNotifier(String url) {
		setUrl(url);
	}

	private void addingPropertiesTo(final HttpURLConnection connection) throws ProtocolException {
		connection.setDoOutput(true);
		connection.setRequestProperty("Content-type", "text/xml");
		connection.setRequestProperty("Accept", "text/xml, application/xml");
		connection.setRequestMethod("POST");
	}

	private HttpURLConnection createConnection() throws IOException {
		return (HttpURLConnection) new URL(url).openConnection();
	}

	public int notify(final AirbrakeNotice notice) {
		try {
			final HttpURLConnection airbrakeConnection = createConnection();
			addingPropertiesTo(airbrakeConnection);
			String noticeXml = new NoticeXml(notice).toString();
			return send(noticeXml, airbrakeConnection);
		} catch (final Exception e) {
			printStacktrace(notice, e);
		}
		return 0;
	}

	private void printStacktrace(final AirbrakeNotice notice, final Exception e) {
		e.printStackTrace();
	}

	private int send(final String xml, final HttpURLConnection connection) throws IOException {
		final OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
		writer.write(xml);
		writer.close();
		int statusCode = connection.getResponseCode();
		return statusCode;
	}

	public void setUrl(String url) {
		this.url = url;
	}
}

// Modified or written by Luca Marrocco for inclusion with airbrake.
// Copyright (c) 2009 Luca Marrocco.
// Licensed under the Apache License, Version 2.0 (the "License")

package airbrake;

import java.io.*;
import java.net.*;

public class AirbrakeNotifier {

	public static String slurp(InputStream stream) {
		try {
			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
			byte[] buff = new byte[4096];
			for (int len; (len = stream.read(buff)) != -1;) {
				outputStream.write(buff, 0, len);
			}
			return outputStream.toString();

		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	private String url;

	public AirbrakeNotifier() {
		setUrl("http://api.airbrake.io/notifier_api/v2/notices");
	}

	public AirbrakeNotifier(String url) {
		setUrl(url);
	}

	private void addingPropertiesTo(final HttpURLConnection connection) throws ProtocolException {
		connection.setDoOutput(true);
		connection.setReadTimeout(60*1000); // 60 secs.
		connection.setConnectTimeout(60*1000); // 60 secs.
		connection.setRequestProperty("Content-type", "text/xml");
		connection.setRequestProperty("Accept", "text/xml, application/xml");
		connection.setRequestMethod("POST");
	}

	private HttpURLConnection createConnection() throws IOException {
		return (HttpURLConnection) new URL(url).openConnection();
	}

	public int notify(final AirbrakeNotice notice) {
		try {
			final HttpURLConnection airbrakeConnection = createConnection();
			addingPropertiesTo(airbrakeConnection);
			String noticeXml = new NoticeXml(notice).toString();
			return send(noticeXml, airbrakeConnection);
		} catch (final Exception e) {
			printStacktrace(notice, e);
		}
		return 0;
	}

	private void printStacktrace(final AirbrakeNotice notice, final Exception e) {
		e.printStackTrace();
	}

	private int send(final String xml, final HttpURLConnection connection) throws IOException {
		final OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
		writer.write(xml);
		writer.close();
		int statusCode = connection.getResponseCode();
		return statusCode;
	}

	public void setUrl(String url) {
		this.url = url;
	}
}

Set timeouts to AirbrakeNotifier's connection