LogWatch.java
/*
* Copyright (C) 2003-2013 eXo Platform SAS.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.exoplatform.social.common.service.utils;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
import java.util.concurrent.TimeUnit;
public class LogWatch implements Cloneable {
private static final long NANOS_IN_A_MILLI = 1000000L;
private long startTime;
private long nanoStartTime;
private long elapsedTime;
private String process;
private String message;
public LogWatch() {
this("", null);
}
public LogWatch(String tag) {
this(tag, null);
}
public LogWatch(String tag, String message) {
this(System.currentTimeMillis(), -1L, tag, message);
}
public LogWatch(long startTime, long elapsedTime, String process, String message) {
this.startTime = startTime;
this.nanoStartTime = (elapsedTime == -1L) ? System.nanoTime() : -1L;
this.elapsedTime = elapsedTime;
this.process = process;
this.message = message;
}
public void start() {
startTime = System.currentTimeMillis();
nanoStartTime = System.nanoTime();
elapsedTime = -1L;
}
public long getStartTime() {
return startTime;
}
public long elapsedTime() {
elapsedTime = (elapsedTime == -1L) ? (System.nanoTime() - nanoStartTime) / NANOS_IN_A_MILLI : elapsedTime;
return elapsedTime;
}
public long getElapsedTime() {
return elapsedTime;
}
public long elapsedTime(TimeUnit timeUnit) {
return timeUnit.convert(getElapsedTime(), NANOSECONDS);
}
public String stop() {
elapsedTime = elapsedTime();
return this.toString();
}
public String getMessage() {
return message;
}
public String toString() {
String message = getMessage();
return "start[" + getStartTime() + "] time[" + elapsedTime() + "] process[" + getProcess()
+ ((message == null) ? "]" : "] message[" + message + "]");
}
private String getProcess() {
return process;
}
public LogWatch clone() {
try {
return (LogWatch) super.clone();
} catch (CloneNotSupportedException cnse) {
throw new Error("Unexpected CloneNotSupportedException");
}
}
public String toString(long value, TimeUnit timeUnit) {
return String.format("%s %s", value, abbreviate(timeUnit));
}
private static String abbreviate(TimeUnit unit) {
switch (unit) {
case NANOSECONDS:
return "ns";
case MILLISECONDS:
return "ms";
case SECONDS:
return "sec";
default:
throw new AssertionError();
}
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof LogWatch)) {
return false;
}
LogWatch stopWatch = (LogWatch) o;
if (elapsedTime != stopWatch.elapsedTime) {
return false;
}
if (startTime != stopWatch.startTime) {
return false;
}
if (nanoStartTime != stopWatch.nanoStartTime) {
return false;
}
if (message != null ? !message.equals(stopWatch.message) : stopWatch.message != null) {
return false;
}
if (process != null ? !process.equals(stopWatch.process) : stopWatch.process != null) {
return false;
}
return true;
}
public int hashCode() {
int result = (int) (startTime ^ (startTime >>> 32));
result = 31 * result + (int) (nanoStartTime ^ (nanoStartTime >>> 32));
result = 31 * result + (int) (elapsedTime ^ (elapsedTime >>> 32));
result = 31 * result + (process != null ? process.hashCode() : 0);
result = 31 * result + (message != null ? message.hashCode() : 0);
return result;
}
}