// Path: harahachibu/src/main/java/uk/co/flax/harahachibu/services/DiskSpaceCheckerException.java
// public class DiskSpaceCheckerException extends Exception {
// 
// 	public DiskSpaceCheckerException() {
// 		super();
// 	}
// 
// 	public DiskSpaceCheckerException(String message) {
// 		super(message);
// 	}
// 
// 	public DiskSpaceCheckerException(String message, Throwable cause) {
// 		super(message, cause);
// 	}
// 
// 	public DiskSpaceCheckerException(Throwable cause) {
// 		super(cause);
// 	}
// 
// }
// 
// Path: harahachibu/src/main/java/uk/co/flax/harahachibu/services/data/ElasticsearchClusterStats.java
// @JsonIgnoreProperties(ignoreUnknown = true)
// public class ElasticsearchClusterStats {
// 
// 	@JsonProperty("timestamp")
// 	private final long timestamp;
// 
// 	@JsonProperty("cluster_name")
// 	private final String clusterName;
// 
// 	@JsonProperty("status")
// 	private final String status;
// 
// 	@JsonProperty(value = "nodes")
// 	private final ElasticsearchClusterNodes nodes;
// 
// 	public ElasticsearchClusterStats(@JsonProperty("timestamp") long timestamp,
// 									 @JsonProperty("cluster_name") String clusterName,
// 									 @JsonProperty("status") String status,
// 									 @JsonProperty("nodes") ElasticsearchClusterNodes nodes) {
// 		this.timestamp = timestamp;
// 		this.clusterName = clusterName;
// 		this.status = status;
// 		this.nodes = nodes;
// 	}
// 
// 	public long getTimestamp() {
// 		return timestamp;
// 	}
// 
// 	public String getClusterName() {
// 		return clusterName;
// 	}
// 
// 	public String getStatus() {
// 		return status;
// 	}
// 
// 	public ElasticsearchClusterNodes getNodes() {
// 		return nodes;
// 	}
// 
// 	public long getFilesystemFreeBytes() {
// 		ElasticsearchClusterFilesystem fs = getFilesystem();
// 		if (fs != null) {
// 			return fs.getFreeBytes();
// 		}
// 		return 0;
// 	}
// 
// 	public long getFilesystemAvailableBytes() {
// 		ElasticsearchClusterFilesystem fs = getFilesystem();
// 		if (fs != null) {
// 			return fs.getAvailableBytes();
// 		}
// 		return 0;
// 	}
// 
// 	public long getFilesystemTotalBytes() {
// 		ElasticsearchClusterFilesystem fs = getFilesystem();
// 		if (fs != null) {
// 			return fs.getTotalBytes();
// 		}
// 		return 0;
// 	}
// 
// 	private ElasticsearchClusterFilesystem getFilesystem() {
// 		if (nodes != null) {
// 			return nodes.getFileSystem();
// 		}
// 		return null;
// 	}
// 
// }


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.co.flax.harahachibu.services.DiskSpaceCheckerException;
import uk.co.flax.harahachibu.services.data.ElasticsearchClusterStats;
import javax.ws.rs.client.Client;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
		this.baseUrl = baseUrl;
		this.cacheMs = cacheMs;
	}

	public ElasticsearchClusterStats getClusterStats() throws DiskSpaceCheckerException {
		final ElasticsearchClusterStats stats;

		if (cacheUpToDate()) {
			stats = latestStats;
		} else {
			stats = getRemoteClusterStats();
			synchronized (statsLock) {
				this.latestStats = stats;
				this.lastUpdate = System.currentTimeMillis();
			}
		}

		return stats;
	}

	private boolean cacheUpToDate() {
		return latestStats != null && lastUpdate > (System.currentTimeMillis() - cacheMs);
	}

	private ElasticsearchClusterStats getRemoteClusterStats() throws DiskSpaceCheckerException {
		try {
			LOGGER.debug("Retrieving stats from cluster");
			return client.target(baseUrl + CLUSTER_STATS_ENDPOINT)
					.request(MediaType.APPLICATION_JSON)
					.buildGet()
// Path: harahachibu/src/main/java/uk/co/flax/harahachibu/services/DiskSpaceCheckerException.java
// public class DiskSpaceCheckerException extends Exception {
// 
// 	public DiskSpaceCheckerException() {
// 		super();
// 	}
// 
// 	public DiskSpaceCheckerException(String message) {
// 		super(message);
// 	}
// 
// 	public DiskSpaceCheckerException(String message, Throwable cause) {
// 		super(message, cause);
// 	}
// 
// 	public DiskSpaceCheckerException(Throwable cause) {
// 		super(cause);
// 	}
// 
// }
// 
// Path: harahachibu/src/main/java/uk/co/flax/harahachibu/services/data/ElasticsearchClusterStats.java
// @JsonIgnoreProperties(ignoreUnknown = true)
// public class ElasticsearchClusterStats {
// 
// 	@JsonProperty("timestamp")
// 	private final long timestamp;
// 
// 	@JsonProperty("cluster_name")
// 	private final String clusterName;
// 
// 	@JsonProperty("status")
// 	private final String status;
// 
// 	@JsonProperty(value = "nodes")
// 	private final ElasticsearchClusterNodes nodes;
// 
// 	public ElasticsearchClusterStats(@JsonProperty("timestamp") long timestamp,
// 									 @JsonProperty("cluster_name") String clusterName,
// 									 @JsonProperty("status") String status,
// 									 @JsonProperty("nodes") ElasticsearchClusterNodes nodes) {
// 		this.timestamp = timestamp;
// 		this.clusterName = clusterName;
// 		this.status = status;
// 		this.nodes = nodes;
// 	}
// 
// 	public long getTimestamp() {
// 		return timestamp;
// 	}
// 
// 	public String getClusterName() {
// 		return clusterName;
// 	}
// 
// 	public String getStatus() {
// 		return status;
// 	}
// 
// 	public ElasticsearchClusterNodes getNodes() {
// 		return nodes;
// 	}
// 
// 	public long getFilesystemFreeBytes() {
// 		ElasticsearchClusterFilesystem fs = getFilesystem();
// 		if (fs != null) {
// 			return fs.getFreeBytes();
// 		}
// 		return 0;
// 	}
// 
// 	public long getFilesystemAvailableBytes() {
// 		ElasticsearchClusterFilesystem fs = getFilesystem();
// 		if (fs != null) {
// 			return fs.getAvailableBytes();
// 		}
// 		return 0;
// 	}
// 
// 	public long getFilesystemTotalBytes() {
// 		ElasticsearchClusterFilesystem fs = getFilesystem();
// 		if (fs != null) {
// 			return fs.getTotalBytes();
// 		}
// 		return 0;
// 	}
// 
// 	private ElasticsearchClusterFilesystem getFilesystem() {
// 		if (nodes != null) {
// 			return nodes.getFileSystem();
// 		}
// 		return null;
// 	}
// 
// }


// Path: harahachibu/src/main/java/uk/co/flax/harahachibu/services/impl/ElasticsearchClient.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.co.flax.harahachibu.services.DiskSpaceCheckerException;
import uk.co.flax.harahachibu.services.data.ElasticsearchClusterStats;
import javax.ws.rs.client.Client;
import javax.ws.rs.core.MediaType;
import java.io.IOException;

		this.baseUrl = baseUrl;
		this.cacheMs = cacheMs;
	}

	public ElasticsearchClusterStats getClusterStats() throws DiskSpaceCheckerException {
		final ElasticsearchClusterStats stats;

		if (cacheUpToDate()) {
			stats = latestStats;
		} else {
			stats = getRemoteClusterStats();
			synchronized (statsLock) {
				this.latestStats = stats;
				this.lastUpdate = System.currentTimeMillis();
			}
		}

		return stats;
	}

	private boolean cacheUpToDate() {
		return latestStats != null && lastUpdate > (System.currentTimeMillis() - cacheMs);
	}

	private ElasticsearchClusterStats getRemoteClusterStats() throws DiskSpaceCheckerException {
		try {
			LOGGER.debug("Retrieving stats from cluster");
			return client.target(baseUrl + CLUSTER_STATS_ENDPOINT)
					.request(MediaType.APPLICATION_JSON)
					.buildGet()
					.invoke(ElasticsearchClusterStats.class);