package sk.stuba.fiit.perconik.activity.listeners.java.dom;
import com.google.common.base.Optional;
import org.eclipse.jdt.core.ElementChangedEvent;
import org.eclipse.jdt.core.dom.ASTNode;
import sk.stuba.fiit.perconik.core.java.dom.difference.NodeDeltaSet;
import sk.stuba.fiit.perconik.core.java.dom.difference.NodeDifferencer;
import static com.google.common.base.Preconditions.checkNotNull;
abstract class AbstractNodeDifferenceListener<T, N extends ASTNode, R extends ASTNode> extends AbstractCachingNodeListener<T, N> {
final NodeDifferencer<? super N, R> differencer;
AbstractNodeDifferenceListener(final DifferenceConfiguration<T, N, R> configuration) {
super(configuration);
this.differencer = checkNotNull(configuration.differencer);
}
static class DifferenceConfiguration<T, N extends ASTNode, R extends ASTNode> extends CachingConfiguration<T, N> {
NodeDifferencer<? super N, R> differencer;
DifferenceConfiguration() {}
final void differencer(final NodeDifferencer<? super N, R> differencer) {
this.differencer = checkNotNull(differencer);
}
}
@Override
final void process(final long time, final ElementChangedEvent event, final T key, final Optional<N> original, final N revised) {
if (original.isPresent()) {
N raw = original.get();
NodeDeltaSet<R> difference = this.differencer.difference(raw, revised);
this.process(time, event, key, raw, revised, difference);
}
}
abstract void process(long time, ElementChangedEvent event, T key, N original, N revised, NodeDeltaSet<R> difference);
}