package ch.unibe.scg.cc;
import java.io.IOException;
import java.util.Collection;
import ch.unibe.scg.cc.Protos.Clone;
import ch.unibe.scg.cc.Protos.Function;
import ch.unibe.scg.cc.lines.StringOfLinesFactory;
import ch.unibe.scg.cells.LookupTable;
import ch.unibe.scg.cells.Mapper;
import ch.unibe.scg.cells.OneShotIterable;
import ch.unibe.scg.cells.Sink;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
/** Expand clones and filter clones down to the clones that aren't spam. */
class Function2FineCloner implements Mapper<Clone, Clone> {
private static final long serialVersionUID = 1L;
final private CloneExpander cloneExpander;
final private LookupTable<Str<Function>> cloneLoader;
final private SpamDetector spamDetector;
final private StringOfLinesFactory stringOfLinesFactory;
@Inject
Function2FineCloner(StringOfLinesFactory stringOfLinesFactory, CloneExpander cloneExpander,
@Annotations.Populator LookupTable<Str<Function>> cloneLoader, SpamDetector spamDetector) {
this.stringOfLinesFactory = stringOfLinesFactory;
this.cloneExpander = cloneExpander;
this.cloneLoader = cloneLoader;
this.spamDetector = spamDetector;
}
@Override
public void map(Clone first, OneShotIterable<Clone> row, Sink<Clone> sink) throws IOException, InterruptedException {
first.getThisSnippet().getFunction();
Collection<Clone> clones = cloneExpander.expandClones(row);
for (Clone c : clones) {
// TODO: Counters are missing.
if (spamDetector.isSpamByParameters(spamDetector.extractFeatureVector(
stringOfLinesFactory.make(
Iterables.getOnlyElement(cloneLoader.readRow(c.getThisSnippet().getFunction())).contents, '\n')
.getLines(c.getThisSnippet().getPosition(), c.getThisSnippet().getLength()),
stringOfLinesFactory.make(
Iterables.getOnlyElement(cloneLoader.readRow(c.getThatSnippet().getFunction())).contents, '\n')
.getLines(c.getThatSnippet().getPosition(), c.getThatSnippet().getLength())))) {
return;
}
sink.write(c);
}
}
@Override
public void close() throws IOException {
if (cloneLoader != null) {
cloneLoader.close();
}
}
}