package org.stagemonitor.core;
import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.ANY;
import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
import static org.stagemonitor.util.StringUtils.replaceWhitespacesWithDash;
import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;
import java.util.UUID;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.stagemonitor.util.StringUtils;
@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = ANY, setterVisibility = NONE)
public class MeasurementSession {
private final String id;
private final String applicationName;
private final String hostName;
private final String instanceName;
private final long startTimestamp;
private long endTimestamp;
@JsonIgnore
private final String stringRepresentation;
public MeasurementSession(
String applicationName,
String hostName,
String instanceName) {
this(UUID.randomUUID().toString(), applicationName, hostName, instanceName);
}
@JsonCreator
public MeasurementSession(@JsonProperty("id") String id,
@JsonProperty("applicationName") String applicationName,
@JsonProperty("hostName") String hostName,
@JsonProperty("instanceName") String instanceName) {
this.applicationName = replaceWhitespacesWithDash(applicationName);
this.hostName = replaceWhitespacesWithDash(hostName);
this.instanceName = replaceWhitespacesWithDash(instanceName);
this.id = id;
stringRepresentation = "[application=" + applicationName + "] [instance=" + instanceName + "] [host=" + hostName + "]";
startTimestamp = System.currentTimeMillis();
}
public String getId() {
return id;
}
public String getApplicationName() {
return applicationName;
}
public String getHostName() {
return hostName;
}
public String getInstanceName() {
return instanceName;
}
@JsonIgnore
public boolean isInitialized() {
return applicationName != null && instanceName != null && hostName != null;
}
public String getStart() {
return StringUtils.timestampAsIsoString(startTimestamp);
}
@JsonProperty("@timestamp")
public long getStartTimestamp() {
return startTimestamp;
}
public String getEnd() {
if (endTimestamp > 0) {
return StringUtils.timestampAsIsoString(endTimestamp);
}
return null;
}
public Long getEndTimestamp() {
if (endTimestamp > 0) {
return endTimestamp;
}
return null;
}
public void setEndTimestamp(long endTimestamp) {
this.endTimestamp = endTimestamp;
}
@JsonIgnore
public boolean isNull() {
return applicationName == null && instanceName == null && hostName == null;
}
@JsonIgnore
public Map<String, String> asMap() {
final TreeMap<String, String> result = new TreeMap<String, String>();
result.put("measurement_start", Long.toString(startTimestamp));
result.put("application", applicationName);
result.put("host", hostName);
result.put("instance", instanceName);
return Collections.unmodifiableMap(result);
}
@Override
public String toString() {
return stringRepresentation;
}
}