blob: 42915138588616393e656e73f3570406d035c8d9 [file] [log] [blame]
package org.eclipse.emf.refactor.metrics.runtime.managers;
import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.refactor.metrics.managers.XMLManager;
import org.eclipse.emf.refactor.metrics.runtime.core.Result;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class XMLResultsManager extends XMLManager {
private static final String RESULTS_TAG = "results";
public static void saveResults(String path, List<Result> results){
final DocumentBuilder builder = createDocumentBuilder();
if (builder != null) {
final Document doc = builder.newDocument();
final Element root = doc.createElement(RESULTS_TAG);
doc.appendChild(root);
createAllContextElements(root, doc, results);
final Transformer transformer = createTransformer();
final DOMSource source = new DOMSource(doc);
final StreamResult result = new StreamResult(path);
try {
transformer.transform(source, result);
} catch (final TransformerException e) {
e.printStackTrace();
}
}
}
private static void createAllContextElements(Element root, Document doc, List<Result> results) {
List<List<EObject>> allContexts = new LinkedList<List<EObject>>();
for(Result result : results)
if(!allContexts.contains(result.getContext()))
allContexts.add(result.getContext());
for(List<EObject> context : allContexts)
root.appendChild(createContextElement(doc, context, filterResults(results, context)));
}
private static Element createContextElement(Document doc, List<EObject> cont, List<Result> results){
final Element context = doc.createElement("context");
final Element contextType = doc.createElement("contextType");
contextType.setTextContent(cont.get(0).eClass().getName());
context.appendChild(contextType);
final Element contextValue = doc.createElement("contextValue");
contextValue.setTextContent(getContextValue(cont.get(0)));
context.appendChild(contextValue);
for (Object rawResult : results){
Result result = (Result) rawResult;
Element resultEntry = doc.createElement("metricResult");
Element dateStamp = doc.createElement("date");
dateStamp.setTextContent(result.getTimeStamp());
resultEntry.appendChild(dateStamp);
Element metricName = doc.createElement("metricName");
metricName.setTextContent(result.getMetric().getName());
resultEntry.appendChild(metricName);
Element metricDescription = doc.createElement("metricDescription");
metricDescription.setTextContent(result.getMetric().getDescription());
resultEntry.appendChild(metricDescription);
Element resultValue = doc.createElement("resultValue");
DecimalFormat df = new DecimalFormat( "0.00" );
String valueStr = "";
Double value = result.getResultValue();
if (value.equals(Double.NaN)) {
valueStr = "NaN";
} else {
valueStr = df.format(result.getResultValue());
}
resultValue.setTextContent(valueStr);
resultEntry.appendChild(resultValue);
context.appendChild(resultEntry);
}
return context;
}
private static String getContextValue(EObject eObject) {
String ret = "";
for(EAttribute attribute : eObject.eClass().getEAllAttributes()){
if (attribute.getName().equalsIgnoreCase("name")) {
ret = (String) eObject.eGet(attribute);
break;
}
}
if (! ret.isEmpty()) return ret;
return eObject.toString();
}
private static List<Result> filterResults(List<Result> results, List<EObject> context){
List<Result> filteredResults = new LinkedList<Result>();
for(Result result : results)
if(result.getContext().equals(context))
filteredResults.add(result);
return filteredResults;
}
}