package sk.stuba.fiit.perconik.activity.listeners.java.dom;
import java.net.URI;
import java.util.List;
import java.util.Set;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.cache.CacheLoader;
import com.google.common.collect.ImmutableSet;
import org.eclipse.jdt.core.ElementChangedEvent;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.CompilationUnit;
import sk.stuba.fiit.perconik.activity.listeners.ActivityListener;
import sk.stuba.fiit.perconik.core.annotations.Experimental;
import sk.stuba.fiit.perconik.core.annotations.Unsupported;
import sk.stuba.fiit.perconik.core.annotations.Version;
import sk.stuba.fiit.perconik.core.java.JavaElements;
import sk.stuba.fiit.perconik.core.java.dom.CompilationUnits;
import sk.stuba.fiit.perconik.core.java.dom.difference.NodeDeltaSet;
import sk.stuba.fiit.perconik.eclipse.core.resources.Resources;
import sk.stuba.fiit.perconik.eclipse.jdt.core.JavaElementEventType;
import sk.stuba.fiit.perconik.utilities.function.ListCollector;
import static java.util.Arrays.asList;
import static com.google.common.base.Optional.fromNullable;
import static com.google.common.cache.CacheBuilder.newBuilder;
import static sk.stuba.fiit.perconik.activity.listeners.java.dom.AbstractCachingNodeListener.KeyerFailureBehavior.RAISE;
import static sk.stuba.fiit.perconik.eclipse.jdt.core.JavaElementEventType.POST_CHANGE;
import static sk.stuba.fiit.perconik.eclipse.jdt.core.JavaElementEventType.POST_RECONCILE;
/**
* TODO
*
* @author Pavol Zbell
* @since 1.0
*/
@Version("0.0.0.alpha")
@Experimental
@Unsupported
public final class CompilationUnitDifferenceListener extends AbstractNodeDifferenceListener<URI, CompilationUnit, ASTNode> {
static final Set<JavaElementEventType> javaElementEventTypes = ImmutableSet.of(POST_CHANGE, POST_RECONCILE);
public CompilationUnitDifferenceListener() {
super(configuration());
}
private static DifferenceConfiguration<URI, CompilationUnit, ASTNode> configuration() {
DifferenceConfiguration<URI, CompilationUnit, ASTNode> configuration = new DifferenceConfiguration<>();
configuration.collector(IdentityCollector.instance);
configuration.keyer(UriKeyer.instance);
configuration.behavior(RAISE);
configuration.builder(newBuilder().weakValues());
configuration.loader(UriLoader.instance);
configuration.differencer(new CompilationUnitDifferencer<>(new RelevantNodeCollector()));
return configuration;
}
private enum IdentityCollector implements ListCollector<CompilationUnit, CompilationUnit> {
instance;
public List<CompilationUnit> apply(final CompilationUnit unit) {
return asList(unit);
}
}
private enum UriKeyer implements Function<CompilationUnit, Optional<URI>> {
instance;
public Optional<URI> apply(final CompilationUnit unit) {
return fromNullable(Resources.getLocationUri(JavaElements.resource(CompilationUnits.element(unit))));
}
}
private static final class UriLoader extends CacheLoader<URI, CompilationUnit> {
static final UriLoader instance = new UriLoader();
private UriLoader() {}
@Override
public CompilationUnit load(final URI key) throws Exception {
// TODO see what happens
throw new UnsupportedOperationException("YOLO");
//return (CompilationUnit) TreeParsers.parse(Paths.get(key));
}
}
enum Action implements ActivityListener.Action {
;
private final String name;
private final String path;
private Action() {
this.name = actionName("eclipse", "TODO", this);
this.path = actionPath(this.name);
}
public String getName() {
return this.name;
}
public String getPath() {
return this.path;
}
}
@Override
void process(final long time, final ElementChangedEvent event, final URI key, final CompilationUnit original, final CompilationUnit revised, final NodeDeltaSet<ASTNode> difference) {
// TODO serialize only stuff that can not be recomputed from supplied arguments later
}
@Override
public Set<JavaElementEventType> getEventTypes() {
return javaElementEventTypes;
}
}