package ru.yandex.market.graphouse.search.tree;
import ru.yandex.market.graphouse.MetricUtil;
import ru.yandex.market.graphouse.search.MetricStatus;
import java.io.DataOutput;
import java.io.IOException;
/**
* @author Dmitry Andreev <a href="mailto:AndreevDm@yandex-team.ru"></a>
* @date 25/01/2017
*/
public abstract class MetricBase implements MetricDescription {
protected final MetricDir parent;
protected final String name;
private volatile long updateTimeMillis = System.currentTimeMillis();
private volatile MetricStatus status = MetricStatus.SIMPLE;
MetricBase(MetricDir parent, String name, MetricStatus status) {
this.parent = parent;
this.name = name;
this.status = status;
}
public boolean visible() {
return status.visible();
}
public boolean isRoot() {
return parent == null;
}
@Override
public void writeName(DataOutput out) throws IOException {
if (!parent.isRoot()) {
parent.writeName(out);
}
out.write(name.getBytes());
if (isDir()) {
out.write(MetricUtil.LEVEL_SPLITTER);
}
}
@Override
public int getNameLength() {
int length = name.length();
if (isDir()) {
length++;
}
if (!parent.isRoot()) {
length += parent.getNameLength();
}
return length;
}
@Override
public MetricStatus getStatus() {
return status;
}
public void setStatus(MetricStatus newStatus) {
newStatus = MetricTree.selectStatus(status, newStatus);
if (status != newStatus) {
MetricStatus oldStatus = status;
status = newStatus;
updateTimeMillis = System.currentTimeMillis();
parent.notifyChildStatusChange(this, oldStatus);
}
}
public int getLevel() {
int level = 0;
MetricBase metricBase = this;
while (!metricBase.isRoot()) {
level++;
metricBase = metricBase.getParent();
}
return level;
}
@Override
public String toString() {
return getName();
}
@Override
public long getUpdateTimeMillis() {
return updateTimeMillis;
}
@Override
public MetricDir getParent() {
return parent;
}
}