TraceElement.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 java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.commons.lang.StringUtils;
public class TraceElement {
private AtomicLong elapsedTime = new AtomicLong(0);
private final String traceName;
private final LogWatch logWatch;
private TraceElement parent;
private List<TraceElement> children;
private TraceElement(String traceName) {
logWatch = new LogWatch(traceName);
this.traceName = traceName;
}
public List<TraceElement> getChildren() {
if (children == null) {
children = new ArrayList<TraceElement>();
}
return children;
}
public static TraceElement getInstance(String traceName) {
return new TraceElement(traceName);
}
public TraceElement addChild(String traceName) {
TraceElement child = getInstance(traceName);
child.setParrent(this);
//
getChildren().add(child);
//
return child;
}
public void start() {
logWatch.start();
}
public void end() {
this.elapsedTime.set(logWatch.elapsedTime());
}
public long getElapsedTime() {
return this.elapsedTime.get();
}
public TraceElement getParent() {
return parent;
}
public boolean hasParent() {
return this.parent != null;
}
public void setParrent(TraceElement parent) {
this.parent = parent;
}
public String getName() {
return this.traceName;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof TraceElement)) {
return false;
}
TraceElement element = (TraceElement) o;
if (traceName != element.traceName) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (traceName != null ? traceName.hashCode() : 0);
return result;
}
@Override
public String toString() {
return String.format("%s - %s ", this.traceName, logWatch.toString(getElapsedTime(), TimeUnit.MILLISECONDS));
}
public String toReport() {
StringBuffer out = new StringBuffer();
if (getChildren().size() > 0) {
out.append("{");
int len = getChildren().size();
int index = 0;
for(TraceElement e : getChildren()) {
if (++index > 1) out.append("{space}");
out.append(e.toString());
if (index < len) out.append("\n");
elapsedTime.addAndGet(e.getElapsedTime());
}
out.append("}");
}
String head = String.format("%s - %s ", this.traceName, logWatch.toString(getElapsedTime(), TimeUnit.MILLISECONDS));
String tail = StringUtils.replace(out.toString(), "{space}", StringUtils.repeat(" ", head.length() + 1));
return head + tail;
}
}