// Path: src/main/java/com/splunk/logging/HttpEventCollectorErrorHandler.java
// public class HttpEventCollectorErrorHandler {
// 
//     /**
//      * This exception is passed to error callback when Splunk server replies an error
//      */
//     @SuppressWarnings("serial")
//     public static class ServerErrorException extends Exception {
//         private String reply;
//         private long errorCode = -1;
//         private String errorText;
// 
//         /**
//          * Create an exception with server error reply
//          * @param serverReply server reply
//          */
//         public ServerErrorException(final String serverReply) {
//             reply = serverReply;
//             try {
//                 // read server reply
//                 JsonObject json = JsonParser.parseString(serverReply).getAsJsonObject();
//                 errorCode = json.get("code").getAsLong();
//                 errorText = json.get("text").getAsString();
//             } catch (Exception e) {
//                 errorText = e.getMessage();
//             }
//         }
// 
//         /**
//          * @return Splunk server reply in json format
//          */
//         public String getReply() {
//             return reply;
//         }
// 
//         /**
//          * @return error code replied by Splunk server
//          */
//         public long getErrorCode() {
//             return errorCode;
//         }
// 
//         /**
//          * * @return error text replied by Splunk server
//          */
//         public String getErrorText() {
//             return errorText;
//         }
// 
//         @Override
//         public String getMessage() {
//             return getErrorText();
//         }
// 
// 
//         @Override public String toString() {
//             return getReply();
//         }
//     }
// 
//     public interface ErrorCallback {
//         void error(final List<HttpEventCollectorEventInfo> data, final Exception ex);
//     }
// 
//     private static ErrorCallback errorCallback;
// 
//     /**
//      * Register error callbacks
//      * @param callback ErrorCallback
//      */
//     public static void onError(ErrorCallback callback) {
//         errorCallback = callback;
//     }
// 
//     /**
//      * Report an exception
//      * @param data eventdata
//      * @param ex is an exception thrown by posting or processing data
//      */
//     public static void error(final List<HttpEventCollectorEventInfo> data, final Exception ex) {
//         if (errorCallback != null) {
//             errorCallback.error(data, ex);
//         }
//     }
// }
// 
// Path: src/main/java/com/splunk/logging/HttpEventCollectorEventInfo.java
// public class HttpEventCollectorEventInfo {
//     private double time; // time in fractional seconds since "unix epoch" format
//     private final String severity;
//     private final String message;
//     private final String logger_name;
//     private final String thread_name;
//     private final Map<String, String> properties;
//     private final String exception_message;
//     private final Serializable marker;
// 
//     /**
//      * Create a new HttpEventCollectorEventInfo container
//      * @param timeMsSinceEpoch in milliseconds since "unix epoch"
//      * @param severity of event
//      * @param message is an event content
//      * @param logger_name name of the logger
//      * @param thread_name name of the thread
//      * @param properties additional properties for this event
//      * @param exception_message text of an exception to log
//      * @param marker event marker
//      */
//     public HttpEventCollectorEventInfo(
//     		final long timeMsSinceEpoch,
//             final String severity,
//             final String message,
//             final String logger_name,
//             final String thread_name,
//             final Map<String, String> properties,
//             final String exception_message,
//             final Serializable marker
//     ) {
//         this.time = timeMsSinceEpoch / 1000.0;
//         this.severity = severity;
//         this.message = message;
//         this.logger_name = logger_name;
//         this.thread_name = thread_name;
//         this.properties = properties;
//         this.exception_message = exception_message;
//         this.marker = marker;
//     }
// 
//     /**
//      * @return event timestamp in epoch format
//      */
//     public double getTime() {
//         return time;
//     }
// 
//     /**
//      * @return event severity
//      */
//     public final String getSeverity() {
//         return severity;
//     }
// 
//     /**
//      * @return event message
//      */
//     public final String getMessage() {
//         return message;
//     }
// 
//     /**
//      * @return event logger name
//      */
//     public final String getLoggerName() { return logger_name; }
// 
//     /**
//      * @return event thread name
//      */
//     public final String getThreadName() { return thread_name; }
// 
//     /**
//      * @return event MDC properties
//      */
//     public Map<String,String> getProperties() { return properties; }
// 
//     /**
//      * @return event's exception message
//      */
//     public final String getExceptionMessage() { return exception_message; }
// 
//     /**
//      * @return event marker
//      */
//     public Serializable getMarker() { return marker; }
// }


import org.slf4j.*;
import ch.qos.logback.core.joran.spi.JoranException;
import com.splunk.logging.HttpEventCollectorErrorHandler;
import com.splunk.logging.HttpEventCollectorEventInfo;
import org.junit.Assert;
import org.junit.Test;
import java.io.*;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.*;
import java.lang.reflect.*;
import com.splunk.*;
        private String threadName;
        public int eventsGenerated = 0, testDurationInSecs = 300;
        java.util.logging.Logger logger;

        public DataSender(String threadName, int testDurationInSecs, java.util.logging.Logger logger) {
            this.threadName = threadName;
            this.testDurationInSecs = testDurationInSecs;
            this.logger = logger;
        }

        public void run() {
            Date dCurrent = new Date();
            Date dEnd = new Date();
            dEnd.setTime(dCurrent.getTime() + testDurationInSecs * 1000);
            while (dCurrent.before(dEnd)) {
                this.logger.info(String.format("javautil thread: %s, event: %d", this.threadName, eventsGenerated++));
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                dCurrent = new Date();
            }
        }
    }

    @Test
    public  void ResendDataToSplunk() throws  Exception
    {
        HttpEventCollectorErrorHandler.onError(new HttpEventCollectorErrorHandler.ErrorCallback() {
// Path: src/main/java/com/splunk/logging/HttpEventCollectorErrorHandler.java
// public class HttpEventCollectorErrorHandler {
// 
//     /**
//      * This exception is passed to error callback when Splunk server replies an error
//      */
//     @SuppressWarnings("serial")
//     public static class ServerErrorException extends Exception {
//         private String reply;
//         private long errorCode = -1;
//         private String errorText;
// 
//         /**
//          * Create an exception with server error reply
//          * @param serverReply server reply
//          */
//         public ServerErrorException(final String serverReply) {
//             reply = serverReply;
//             try {
//                 // read server reply
//                 JsonObject json = JsonParser.parseString(serverReply).getAsJsonObject();
//                 errorCode = json.get("code").getAsLong();
//                 errorText = json.get("text").getAsString();
//             } catch (Exception e) {
//                 errorText = e.getMessage();
//             }
//         }
// 
//         /**
//          * @return Splunk server reply in json format
//          */
//         public String getReply() {
//             return reply;
//         }
// 
//         /**
//          * @return error code replied by Splunk server
//          */
//         public long getErrorCode() {
//             return errorCode;
//         }
// 
//         /**
//          * * @return error text replied by Splunk server
//          */
//         public String getErrorText() {
//             return errorText;
//         }
// 
//         @Override
//         public String getMessage() {
//             return getErrorText();
//         }
// 
// 
//         @Override public String toString() {
//             return getReply();
//         }
//     }
// 
//     public interface ErrorCallback {
//         void error(final List<HttpEventCollectorEventInfo> data, final Exception ex);
//     }
// 
//     private static ErrorCallback errorCallback;
// 
//     /**
//      * Register error callbacks
//      * @param callback ErrorCallback
//      */
//     public static void onError(ErrorCallback callback) {
//         errorCallback = callback;
//     }
// 
//     /**
//      * Report an exception
//      * @param data eventdata
//      * @param ex is an exception thrown by posting or processing data
//      */
//     public static void error(final List<HttpEventCollectorEventInfo> data, final Exception ex) {
//         if (errorCallback != null) {
//             errorCallback.error(data, ex);
//         }
//     }
// }
// 
// Path: src/main/java/com/splunk/logging/HttpEventCollectorEventInfo.java
// public class HttpEventCollectorEventInfo {
//     private double time; // time in fractional seconds since "unix epoch" format
//     private final String severity;
//     private final String message;
//     private final String logger_name;
//     private final String thread_name;
//     private final Map<String, String> properties;
//     private final String exception_message;
//     private final Serializable marker;
// 
//     /**
//      * Create a new HttpEventCollectorEventInfo container
//      * @param timeMsSinceEpoch in milliseconds since "unix epoch"
//      * @param severity of event
//      * @param message is an event content
//      * @param logger_name name of the logger
//      * @param thread_name name of the thread
//      * @param properties additional properties for this event
//      * @param exception_message text of an exception to log
//      * @param marker event marker
//      */
//     public HttpEventCollectorEventInfo(
//     		final long timeMsSinceEpoch,
//             final String severity,
//             final String message,
//             final String logger_name,
//             final String thread_name,
//             final Map<String, String> properties,
//             final String exception_message,
//             final Serializable marker
//     ) {
//         this.time = timeMsSinceEpoch / 1000.0;
//         this.severity = severity;
//         this.message = message;
//         this.logger_name = logger_name;
//         this.thread_name = thread_name;
//         this.properties = properties;
//         this.exception_message = exception_message;
//         this.marker = marker;
//     }
// 
//     /**
//      * @return event timestamp in epoch format
//      */
//     public double getTime() {
//         return time;
//     }
// 
//     /**
//      * @return event severity
//      */
//     public final String getSeverity() {
//         return severity;
//     }
// 
//     /**
//      * @return event message
//      */
//     public final String getMessage() {
//         return message;
//     }
// 
//     /**
//      * @return event logger name
//      */
//     public final String getLoggerName() { return logger_name; }
// 
//     /**
//      * @return event thread name
//      */
//     public final String getThreadName() { return thread_name; }
// 
//     /**
//      * @return event MDC properties
//      */
//     public Map<String,String> getProperties() { return properties; }
// 
//     /**
//      * @return event's exception message
//      */
//     public final String getExceptionMessage() { return exception_message; }
// 
//     /**
//      * @return event marker
//      */
//     public Serializable getMarker() { return marker; }
// }


// Path: src/test/java/HttpEventCollector_Test.java
import org.slf4j.*;
import ch.qos.logback.core.joran.spi.JoranException;
import com.splunk.logging.HttpEventCollectorErrorHandler;
import com.splunk.logging.HttpEventCollectorEventInfo;
import org.junit.Assert;
import org.junit.Test;
import java.io.*;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.*;
import java.lang.reflect.*;
import com.splunk.*;

        private String threadName;
        public int eventsGenerated = 0, testDurationInSecs = 300;
        java.util.logging.Logger logger;

        public DataSender(String threadName, int testDurationInSecs, java.util.logging.Logger logger) {
            this.threadName = threadName;
            this.testDurationInSecs = testDurationInSecs;
            this.logger = logger;
        }

        public void run() {
            Date dCurrent = new Date();
            Date dEnd = new Date();
            dEnd.setTime(dCurrent.getTime() + testDurationInSecs * 1000);
            while (dCurrent.before(dEnd)) {
                this.logger.info(String.format("javautil thread: %s, event: %d", this.threadName, eventsGenerated++));
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                dCurrent = new Date();
            }
        }
    }

    @Test
    public  void ResendDataToSplunk() throws  Exception
    {
        HttpEventCollectorErrorHandler.onError(new HttpEventCollectorErrorHandler.ErrorCallback() {
            public void error(final List<HttpEventCollectorEventInfo> data, final Exception ex) {