package sk.stuba.fiit.perconik.activity.listeners.refactor;
import com.google.common.base.Optional;
import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
import org.eclipse.ltk.core.refactoring.RefactoringDescriptorProxy;
import org.eclipse.ltk.core.refactoring.history.IRefactoringHistoryService;
import sk.stuba.fiit.perconik.activity.events.LocalEvent;
import sk.stuba.fiit.perconik.activity.listeners.ActivityListener;
import sk.stuba.fiit.perconik.activity.serializers.refactor.RefactoringDescriptorProxySerializer;
import sk.stuba.fiit.perconik.activity.serializers.refactor.RefactoringDescriptorSerializer;
import sk.stuba.fiit.perconik.data.content.StructuredContent;
import sk.stuba.fiit.perconik.data.events.Event;
import sk.stuba.fiit.perconik.eclipse.ltk.core.refactoring.history.RefactoringEventProxy;
import static com.google.common.base.Throwables.propagate;
import static sk.stuba.fiit.perconik.activity.serializers.Serializations.identifyObject;
import static sk.stuba.fiit.perconik.data.content.StructuredContents.key;
/**
* TODO
*
* @author Pavol Zbell
* @since 1.0
*/
abstract class AbstractRefactoringListener extends ActivityListener {
AbstractRefactoringListener() {}
static final void put(final StructuredContent content, final RefactoringEventProxy<?> event) {
content.put(key("type"), event.getType().toString().toLowerCase());
content.put(key("service"), identifyObject(event.getHistoryService()));
RefactoringDescriptorProxy proxy = event.getDescriptor();
RefactoringDescriptor descriptor = proxy.requestDescriptor(null);
if (descriptor != null) {
content.put(key("refactoring"), new RefactoringDescriptorSerializer().serialize(descriptor));
}
content.put(key("refactoring", "proxy"), new RefactoringDescriptorProxySerializer().serialize(proxy));
}
static final Event build(final long time, final Action action, final RefactoringEventProxy<?> event) {
Event data = LocalEvent.of(time, action.getName());
put(data, event);
return data;
}
abstract Optional<? extends Action> resolve(RefactoringEventProxy<?> event);
final void process(final long time, final RefactoringEventProxy<?> event) {
Optional<? extends Action> option = this.resolve(event);
if (option.isPresent()) {
Action action = option.get();
this.send(action.getPath(), build(time, action, event));
}
}
final void execute(final long time, final RefactoringEventProxy<?> event) {
this.execute(new Runnable() {
public void run() {
final IRefactoringHistoryService service = event.getHistoryService();
service.connect();
try {
process(time, event);
} catch (Exception failure) {
propagate(failure);
} finally {
service.disconnect();
}
}
});
}
}