package edu.usc.enl.dynamicmeasurement.algorithms.tasks.changedetection;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.Task2;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.TaskUser;
import edu.usc.enl.dynamicmeasurement.data.ConfigReader;
import edu.usc.enl.dynamicmeasurement.data.DataPacket;
import edu.usc.enl.dynamicmeasurement.data.FinishPacket;
import edu.usc.enl.dynamicmeasurement.model.WildcardPattern;
import edu.usc.enl.dynamicmeasurement.util.ControlledBufferWriter;
import edu.usc.enl.dynamicmeasurement.util.Util;
import org.w3c.dom.Element;
import java.io.FileNotFoundException;
import java.util.Collection;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 1/10/14
* Time: 7:13 PM <br/>
* This class implements change detection task and uses a ChangeDetectionAlgorithm.
* <p>
* <p>The XML constructor requires a Property tag with name attribute as "Algorithm"
* and with value attribute pointing to a class that implements ChangeDetectionAlgorithm.</p>
*
* @see ChangeDetectionAlgorithm
*/
public class ChangeDetectionTaskUser extends TaskUser {
private ChangeDetectionAlgorithm algorithm;
/**
* The writer for the reports
*/
private ControlledBufferWriter reportPrintWriter;
public ChangeDetectionTaskUser(Element element) throws Exception {
super(element);
Element algorithmElement = Util.getChildrenProperties(element, "Property").get("Algorithm");
this.algorithm = (ChangeDetectionAlgorithm) Class.forName(algorithmElement.getAttribute(ConfigReader.PROPERTY_VALUE)).getConstructor(Element.class).newInstance(algorithmElement);
}
@Override
public void setFolder(String folder) {
algorithm.setFolder(folder);
try {
if (reportPrintWriter != null) {
reportPrintWriter.close();
}
reportPrintWriter = Util.getNewWriter(folder + "/hhh.csv");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
@Override
public Task2.TaskImplementation getImplementation() {
return algorithm;
}
@Override
public void report(int step) {
// Collection<WildcardPattern> bigChanges = algorithm.findBigChanges();
// for (WildcardPattern bigChange : bigChanges) {
// reportPrintWriter.println(step + "," + bigChange);
// }
Collection<WildcardPattern> bigChanges = algorithm.findBigChanges(step);
for (WildcardPattern bigChange : bigChanges) {
reportPrintWriter.println(step + "," + bigChange.toStringNoWeight() + "," + bigChange.getWeight());
}
}
@Override
public void update(int step) {
algorithm.update(step);
algorithm.reset();
}
@Override
public void process2(DataPacket p) {
algorithm.match(p.getSrcIP(), p.getSize());
}
@Override
public void finish(FinishPacket p) {
algorithm.finish(p);
reportPrintWriter.close();
}
}