package io.ebeaninternal.server.profile;
import io.ebean.ProfileLocation;
class DProfileLocation implements ProfileLocation {
private static final String IO_EBEAN = "io.ebean";
private static final String UNKNOWN = "unknown";
private String location;
private String shortDescription;
private String label;
private final int lineNumber;
DProfileLocation() {
this(0);
}
DProfileLocation(int lineNumber) {
this.lineNumber = lineNumber;
}
@Override
public String toString() {
return "location: " + location;
}
@Override
public void add(long executionTime) {
}
@Override
public String obtain() {
if (location == null) {
final String loc = create();
shortDescription = shortDesc(loc);
label = UtilLocation.label(shortDescription);
location = loc;
}
return location;
}
@Override
public String label() {
return label;
}
@Override
public String shortDescription() {
return shortDescription;
}
private String create() {
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
for (int i = 3; i < trace.length; i++) {
if (!trace[i].getClassName().startsWith(IO_EBEAN)) {
return withLineNumber(trace[i].toString());
}
}
return UNKNOWN;
}
private String withLineNumber(String traceLine) {
if (lineNumber == 0) {
return traceLine;
} else if (traceLine.endsWith(":1)")) {
return traceLine.substring(0, traceLine.length() - 3) + ":" + lineNumber + ")";
} else if (traceLine.contains(":")) {
return traceLine;
} else {
return traceLine.substring(0, traceLine.length() - 1) + ":" + lineNumber + ")";
}
}
private String shortDesc(String location) {
int pos = location.lastIndexOf('(');
if (pos == -1) {
pos = location.length();
}
pos = location.lastIndexOf('.', pos);
if (pos > -1) {
pos = location.lastIndexOf('.', pos - 1);
if (pos > -1) {
return location.substring(pos + 1);
}
}
return location;
}
}