package com.ikokoon.serenity.hudson.modeller;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import com.ikokoon.serenity.model.Class;
import com.ikokoon.serenity.model.Composite;
import com.ikokoon.serenity.model.Package;
import com.ikokoon.serenity.model.Project;
import com.ikokoon.toolkit.Toolkit;
/**
* This class takes the composites and generates the data arrays for the Highcharts model, and makes a big string that can be inserted into the
* Highcharts object on the front end.
*
* @author Michael Couck
* @since 01.01.10
* @version 01.00
*/
public class HighchartsModeller implements IModeller {
private Logger logger = Logger.getLogger(this.getClass());
private String model;
private String modelName;
private Integer[] buildNumbers;
private Map<String, IConstructor> constructors = new HashMap<String, IConstructor>();
/**
* Constructor takes the name of the model file, either the floating box model which is smaller or the graph model.
*
* @param modelName
* the name of the model file
* @param buildNumbers
* the numbers that should be on the x-axis
*/
public HighchartsModeller(String modelName, Integer... buildNumbers) {
this.modelName = modelName;
this.buildNumbers = buildNumbers;
addConstructors();
}
/**
* {@inheritDoc}
*/
public String getModel() {
return model;
}
/**
* Visits the composites and generates a model string for the Highcharts javaScript graph.<br>
*
* coverageData = [49.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]<br>
* complexityData - [1016, 1016, 1015.9, 1015.5, 1012.3, 1009.5, 1009.6, 1010.2, 1013.1, 1016.9, 1018.2, 1016.7]<br>
* stabilityData - [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]<br>
* categoryData - ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']<br>
*/
public void visit(java.lang.Class<?> klass, Composite<?, ?>... composites) {
InputStream inputStream = null;
if (modelName != null) {
inputStream = this.getClass().getResourceAsStream(modelName);
} else {
inputStream = this.getClass().getResourceAsStream(klass.getSimpleName());
}
model = Toolkit.getContents(inputStream).toString();
String compositeName = getName(composites);
model = Toolkit.replaceAll(model, "compositeName", compositeName);
for (String dataName : constructors.keySet()) {
String data = getData(constructors.get(dataName), composites);
logger.debug("Data : " + data);
model = Toolkit.replaceAll(model, dataName, data);
}
}
@SuppressWarnings("unchecked")
private String getName(Composite<?, ?>... composites) {
for (Composite<?, ?> composite : composites) {
if (composite instanceof Project) {
return ((Project<?, ?>) composite).getName();
} else if (composite instanceof Package) {
return ((Package<?, ?>) composite).getName();
} else if (composite instanceof Class) {
return ((Class<?, ?>) composite).getName();
} else {
return "What am I";
}
}
return "";
}
public interface IConstructor {
public void construct(StringBuilder builder, Composite<?, ?> composite);
}
private String getData(IConstructor constructor, Composite<?, ?>... composites) {
StringBuilder builder = new StringBuilder("[0.0,");
for (int i = 0; i < composites.length; i++) {
Composite<?, ?> composite = composites[i];
constructor.construct(builder, composite);
if (i + 1 < composites.length) {
builder.append(",");
}
}
builder.append("]");
return builder.toString();
}
@SuppressWarnings("unchecked")
private void addConstructors() {
constructors.put("coverageData", new IConstructor() {
public void construct(StringBuilder builder, Composite<?, ?> composite) {
if (composite instanceof Class) {
builder.append(((Class<?, ?>) composite).getCoverage());
} else if (composite instanceof Package) {
builder.append(((Package<?, ?>) composite).getCoverage());
} else if (composite instanceof Project) {
builder.append(((Project<?, ?>) composite).getCoverage());
}
}
});
constructors.put("complexityData", new IConstructor() {
public void construct(StringBuilder builder, Composite<?, ?> composite) {
if (composite instanceof Class) {
builder.append(((Class<?, ?>) composite).getComplexity());
} else if (composite instanceof Package) {
builder.append(((Package<?, ?>) composite).getComplexity());
} else if (composite instanceof Project) {
builder.append(((Project<?, ?>) composite).getComplexity());
}
}
});
constructors.put("stabilityData", new IConstructor() {
public void construct(StringBuilder builder, Composite<?, ?> composite) {
if (composite instanceof Class) {
builder.append(((Class<?, ?>) composite).getStability());
} else if (composite instanceof Package) {
builder.append(((Package<?, ?>) composite).getStability());
} else if (composite instanceof Project) {
builder.append(((Project<?, ?>) composite).getStability());
}
}
});
constructors.put("abstractnessData", new IConstructor() {
public void construct(StringBuilder builder, Composite<?, ?> composite) {
if (composite instanceof Package) {
builder.append(((Package<?, ?>) composite).getAbstractness());
} else if (composite instanceof Project) {
builder.append(((Project<?, ?>) composite).getAbstractness());
} else {
builder.append("0.0");
}
}
});
constructors.put("distanceData", new IConstructor() {
public void construct(StringBuilder builder, Composite<?, ?> composite) {
if (composite instanceof Package) {
builder.append(((Package<?, ?>) composite).getDistance());
} else if (composite instanceof Project) {
builder.append(((Project<?, ?>) composite).getDistance());
} else {
builder.append("0.0");
}
}
});
constructors.put("categoryData", new IConstructor() {
int i = 0;
public void construct(StringBuilder builder, Composite<?, ?> composite) {
builder.append("'");
builder.append(buildNumbers[i++]);
builder.append("'");
}
});
constructors.put("interfacesData", new IConstructor() {
public void construct(StringBuilder builder, Composite<?, ?> composite) {
if (composite instanceof Package) {
builder.append(((Package<?, ?>) composite).getInterfaces());
} else {
builder.append("0.0");
}
}
});
constructors.put("implementationsData", new IConstructor() {
public void construct(StringBuilder builder, Composite<?, ?> composite) {
if (composite instanceof Package) {
builder.append(((Package<?, ?>) composite).getImplementations());
} else {
builder.append("0.0");
}
}
});
constructors.put("linesData", new IConstructor() {
public void construct(StringBuilder builder, Composite<?, ?> composite) {
if (composite instanceof Package) {
builder.append(((Package<?, ?>) composite).getLines());
} else {
builder.append("0.0");
}
}
});
}
}