package org.erlide.cover.views.model;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
/**
* The content provider class is responsible for providing objects to the view.
* It can wrap existing objects in adapters or simply return objects as-is.
* These objects may be sensitive to the current input of the view, or ignore it
* and always show the same content (like Task List, for example).
*
* @author Aleksandra Lipiec <aleksandra.lipiec@erlang.solutions.com>
*/
public class StatsTreeObject implements ICoverageObject {
private static final long serialVersionUID = 1L;
private final ObjectType type;
private String label; // name
private int all; // total line number
private int covered; // covered line number
private String htmlPath; // name of html file
private String relativePath; // relative HTML path
private ICoverageObject parent;
private final Map<String, ICoverageObject> children;
public StatsTreeObject(final ObjectType type) {
this.type = type;
children = new HashMap<>();
}
public StatsTreeObject(final ICoverageObject parent, final ObjectType type) {
this(type);
this.parent = parent;
}
public StatsTreeObject(final String label, final int all, final int covered,
final ObjectType type) {
this(type);
this.label = label;
this.all = all;
this.covered = covered;
}
@Override
public ObjectType getType() {
return type;
}
@Override
public String getLabel() {
return label;
}
@Override
public String toString() {
final StringBuffer bf = new StringBuffer();
bf.append(label).append(" ").append(all).append(" ").append(covered).append(" ")
.append(getPercentage()).append('\n');
for (final ICoverageObject child : children.values()) {
bf.append('\t').append(child.toString()).append('\n');
}
return bf.toString();
}
public Object getAdapter(@SuppressWarnings("rawtypes") final Class key) {
return null;
}
@Override
public void setParent(final ICoverageObject parent) {
this.parent = parent;
}
@Override
public ICoverageObject getParent() {
return parent;
}
@Override
public void addChild(final String name, final ICoverageObject child) {
children.put(name, child);
child.setParent(this);
}
@Override
public void removeChild(final String name) {
children.remove(name);
}
@Override
public ICoverageObject[] getChildren() {
return children.values().toArray(new ICoverageObject[0]);
}
@Override
public boolean hasChildren() {
return !children.isEmpty();
}
@Override
public void setLabel(final String label) {
this.label = label;
}
@Override
public int getLinesCount() {
return all;
}
@Override
public void setLiniesCount(final int count) {
all = count;
}
@Override
public int getCoverCount() {
return covered;
}
@Override
public void setCoverCount(final int count) {
covered = count;
}
@Override
public double getPercentage() {
if (all > 0) {
return covered / (double) all * 100;
}
return 0;
}
@Override
public void removeAllChildren() {
children.clear();
}
@Override
public String[] getStringArray() {
return new String[] { label, Integer.toString(all), Integer.toString(covered),
String.format("%.2f", getPercentage()) };
}
@Override
public String getHtmlPath() {
return htmlPath;
}
@Override
public void setHtmlPath(final String htmlPath) {
this.htmlPath = htmlPath;
}
@Override
public ICoverageObject findChild(final String name) {
return children.get(name);
}
/**
* Returns sibbling name to the name given
*/
@Override
public ICoverageObject getPrevSiblingTo(final String name) {
final List<String> l = new LinkedList<>(children.keySet());
final ListIterator<String> it = l.listIterator(l.indexOf(name));
if (it.hasPrevious()) {
return children.get(it.previous());
}
return null;
}
@Override
public ICoverageObject getNextSiblingTo(final String name) {
final List<String> l = new LinkedList<>(children.keySet());
final ListIterator<String> it = l.listIterator(l.indexOf(name));
it.next();
if (it.hasNext()) {
return children.get(it.next());
}
return null;
}
@Override
public ICoverageObject treeSearch(final String name) {
if (label.equals(name)) {
return this;
}
ICoverageObject res = null;
for (final ICoverageObject child : children.values()) {
res = child.treeSearch(name);
if (res != null) {
break;
}
}
return res;
}
@Override
public Collection<ICoverageObject> getModules() {
final Collection<ICoverageObject> col = new HashSet<>();
if (type.equals(ObjectType.MODULE)) {
col.add(this);
} else if (hasChildren()) {
for (final ICoverageObject child : children.values()) {
col.addAll(child.getModules());
}
}
return col;
}
@Override
public String getPercentageStringified() {
return String.format("%.2f ", getPercentage()) + "%";
}
@Override
public String getRelativePath() {
return relativePath;
}
@Override
public void setRelativePath(final String path) {
relativePath = path;
}
}