// Path: src/main/java/de/wellnerbou/chronic/replay/LogLineData.java
// public class LogLineData {
// 	private long time;
// 	private String clientip;
// 	private String requestMethod;
// 	private String request;
// 	private long duration;
// 	private String statusCode;
// 	private String userAgent;
// 	private String referrer;
// 	private String host;
// 	private String scheme;
// 
// 	public long getTime() {
// 		return time;
// 	}
// 
// 	public void setTime(final long time) {
// 		this.time = time;
// 	}
// 
// 	public String getRequestMethod() {
// 		return requestMethod;
// 	}
// 
// 	public void setRequestMethod(final String requestMethod) {
// 		this.requestMethod = requestMethod;
// 	}
// 
// 	public String getRequest() {
// 		return request;
// 	}
// 
// 	public void setRequest(final String request) {
// 		this.request = request;
// 	}
// 
// 	public long getDuration() {
// 		return duration;
// 	}
// 
// 	public void setDuration(final long duration) {
// 		this.duration = duration;
// 	}
// 
// 	public String getStatusCode() {
// 		return statusCode;
// 	}
// 
// 	public void setStatusCode(final String statusCode) {
// 		this.statusCode = statusCode;
// 	}
// 
// 	public String getUserAgent() {
// 		return userAgent;
// 	}
// 
// 	public void setUserAgent(String userAgent) {
// 		this.userAgent = userAgent;
// 	}
// 
// 	public void setReferrer(final String referrer) {
// 		this.referrer = referrer;
// 	}
// 
// 	public void setHost(String host) {
// 		this.host = host;
// 	}
// 
// 	public String getHost() {
// 		return host;
// 	}
// 
// 	public String getClientip() {
// 		return clientip;
// 	}
// 
// 	public void setClientip(final String clientip) {
// 		this.clientip = clientip;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "LogLineData{" +
// 				"time=" + time +
// 				", clientip='" + clientip + '\'' +
// 				", requestMethod='" + requestMethod + '\'' +
// 				", request='" + request + '\'' +
// 				", duration=" + duration +
// 				", statusCode='" + statusCode + '\'' +
// 				", userAgent='" + userAgent + '\'' +
// 				", referrer='" + referrer + '\'' +
// 				", host='" + host + '\'' +
// 				", scheme='" + scheme + '\'' +
// 				'}';
// 	}
// 
// 	public String getScheme() {
// 		return scheme;
// 	}
// 
// 	public void setScheme(final String scheme) {
// 		this.scheme = scheme;
// 	}
// }


import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import de.wellnerbou.chronic.replay.LogLineData;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.io.IOException;
package de.wellnerbou.chronic.logparser;



/**
 * Implementation of LogLineParser supporting elasticsearch json responses of logstash systems.
 * See src/test/resources/elasticsearch-example.json.
 *
 * @author Paul Wellner Bou <paul@wellnerbou.de>
 */
public class ElasticSearchJsonLogLineParser implements LogLineParser {

	// 2016-04-12T04:43:34+0200
	static final DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");

	@Override
	public LogLineData parseLine(final Object logLine) {
		final JsonReader jsonReader = castOrThrowException(logLine);

		try {
			if(!jsonReader.getPath().contains("hits")) {
				searchHitsJsonNodeUpToBeginArray(jsonReader);
			}
			if(jsonReader.peek().equals(JsonToken.BEGIN_ARRAY)) {
				jsonReader.beginArray();
			}

			if(jsonReader.peek().equals(JsonToken.BEGIN_OBJECT)) {
				jsonReader.beginObject();
				searchNext(jsonReader, "_source");
				jsonReader.beginObject();
// Path: src/main/java/de/wellnerbou/chronic/replay/LogLineData.java
// public class LogLineData {
// 	private long time;
// 	private String clientip;
// 	private String requestMethod;
// 	private String request;
// 	private long duration;
// 	private String statusCode;
// 	private String userAgent;
// 	private String referrer;
// 	private String host;
// 	private String scheme;
// 
// 	public long getTime() {
// 		return time;
// 	}
// 
// 	public void setTime(final long time) {
// 		this.time = time;
// 	}
// 
// 	public String getRequestMethod() {
// 		return requestMethod;
// 	}
// 
// 	public void setRequestMethod(final String requestMethod) {
// 		this.requestMethod = requestMethod;
// 	}
// 
// 	public String getRequest() {
// 		return request;
// 	}
// 
// 	public void setRequest(final String request) {
// 		this.request = request;
// 	}
// 
// 	public long getDuration() {
// 		return duration;
// 	}
// 
// 	public void setDuration(final long duration) {
// 		this.duration = duration;
// 	}
// 
// 	public String getStatusCode() {
// 		return statusCode;
// 	}
// 
// 	public void setStatusCode(final String statusCode) {
// 		this.statusCode = statusCode;
// 	}
// 
// 	public String getUserAgent() {
// 		return userAgent;
// 	}
// 
// 	public void setUserAgent(String userAgent) {
// 		this.userAgent = userAgent;
// 	}
// 
// 	public void setReferrer(final String referrer) {
// 		this.referrer = referrer;
// 	}
// 
// 	public void setHost(String host) {
// 		this.host = host;
// 	}
// 
// 	public String getHost() {
// 		return host;
// 	}
// 
// 	public String getClientip() {
// 		return clientip;
// 	}
// 
// 	public void setClientip(final String clientip) {
// 		this.clientip = clientip;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "LogLineData{" +
// 				"time=" + time +
// 				", clientip='" + clientip + '\'' +
// 				", requestMethod='" + requestMethod + '\'' +
// 				", request='" + request + '\'' +
// 				", duration=" + duration +
// 				", statusCode='" + statusCode + '\'' +
// 				", userAgent='" + userAgent + '\'' +
// 				", referrer='" + referrer + '\'' +
// 				", host='" + host + '\'' +
// 				", scheme='" + scheme + '\'' +
// 				'}';
// 	}
// 
// 	public String getScheme() {
// 		return scheme;
// 	}
// 
// 	public void setScheme(final String scheme) {
// 		this.scheme = scheme;
// 	}
// }


// Path: src/main/java/de/wellnerbou/chronic/logparser/ElasticSearchJsonLogLineParser.java
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import de.wellnerbou.chronic.replay.LogLineData;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.io.IOException;

package de.wellnerbou.chronic.logparser;



/**
 * Implementation of LogLineParser supporting elasticsearch json responses of logstash systems.
 * See src/test/resources/elasticsearch-example.json.
 *
 * @author Paul Wellner Bou <paul@wellnerbou.de>
 */
public class ElasticSearchJsonLogLineParser implements LogLineParser {

	// 2016-04-12T04:43:34+0200
	static final DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");

	@Override
	public LogLineData parseLine(final Object logLine) {
		final JsonReader jsonReader = castOrThrowException(logLine);

		try {
			if(!jsonReader.getPath().contains("hits")) {
				searchHitsJsonNodeUpToBeginArray(jsonReader);
			}
			if(jsonReader.peek().equals(JsonToken.BEGIN_ARRAY)) {
				jsonReader.beginArray();
			}

			if(jsonReader.peek().equals(JsonToken.BEGIN_OBJECT)) {
				jsonReader.beginObject();
				searchNext(jsonReader, "_source");
				jsonReader.beginObject();
				final LogLineData logLineData = new LogLineData();