package sk.stuba.fiit.perconik.activity.listeners.command;
import com.google.common.base.Optional;
import org.eclipse.core.commands.operations.OperationHistoryEvent;
import sk.stuba.fiit.perconik.data.events.Event;
import sk.stuba.fiit.perconik.activity.events.LocalEvent;
import sk.stuba.fiit.perconik.activity.listeners.ActivityListener;
import sk.stuba.fiit.perconik.activity.serializers.command.UndoableOperationSerializer;
import sk.stuba.fiit.perconik.activity.serializers.runtime.StatusSerializer;
import sk.stuba.fiit.perconik.core.listeners.OperationHistoryListener;
import sk.stuba.fiit.perconik.data.content.StructuredContent;
import sk.stuba.fiit.perconik.eclipse.core.commands.operations.OperationHistoryEventType;
import static sk.stuba.fiit.perconik.activity.serializers.ConfigurableSerializer.StandardOption.TREE;
import static sk.stuba.fiit.perconik.data.content.StructuredContents.key;
/**
* TODO
*
* @author Pavol Zbell
* @since 1.0
*/
abstract class AbstractUndoableListener extends ActivityListener implements OperationHistoryListener {
AbstractUndoableListener() {}
static final void put(final StructuredContent content, final OperationHistoryEvent event) {
content.put(key("type"), OperationHistoryEventType.valueOf(event.getEventType()).toString().toLowerCase());
content.put(key("status"), new StatusSerializer(TREE).serialize(event.getStatus()));
content.put(key("operation"), new UndoableOperationSerializer(TREE).serialize(event.getOperation()));
}
static final Event build(final long time, final Action action, final OperationHistoryEvent event) {
Event data = LocalEvent.of(time, action.getName());
put(data, event);
return data;
}
abstract Optional<? extends Action> resolve(OperationHistoryEvent event);
final void process(final long time, final OperationHistoryEvent event) {
Optional<? extends Action> option = this.resolve(event);
if (option.isPresent()) {
Action action = option.get();
this.send(action.getPath(), build(time, action, event));
}
}
public final void historyNotification(final OperationHistoryEvent event) {
final long time = this.currentTime();
this.execute(new Runnable() {
public void run() {
process(time, event);
}
});
}
}