All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.moaxcp.graphs.greenrobot.AbstractEventGraph Maven / Gradle / Ivy

package com.github.moaxcp.graphs.greenrobot;

import static java.util.Objects.requireNonNull;
import com.github.moaxcp.graphs.*;
import com.github.moaxcp.graphs.events.*;
import java.util.Map;
import org.greenrobot.eventbus.EventBus;

public abstract class AbstractEventGraph extends AbstractGraph implements EventGraph {

    public class EventEdge extends SimpleEdge {
        protected EventEdge(ID from, ID to, Map inherited) {
            super(from, to, inherited);
        }

        @Override
        public void setId(ID id) {
            var oldId = getId();
            if(id == null && !oldId.isPresent()) {
                return;
            }
            super.setId(id);
            if(id == null) {
                bus.post(new EdgeIdRemoved.Builder()
                    .graphId(AbstractEventGraph.this.getId().orElse(null))
                    .edgeId(oldId.orElse(null))
                    .from(getFrom())
                    .to(getTo())
                    .build());
                return;
            }
            if(oldId.isPresent()) {
                bus.post(new EdgeIdUpdated.Builder()
                    .graphId(AbstractEventGraph.this.getId().orElse(null))
                    .edgeId(id)
                    .oldEdgeId(oldId.orElse(null))
                    .from(getFrom())
                    .to(getTo())
                    .build());
            } else {
                bus.post(new EdgeIdAdded.Builder()
                    .graphId(AbstractEventGraph.this.getId().orElse(null))
                    .edgeId(id)
                    .from(getFrom())
                    .to(getTo())
                    .build());
            }
        }

        @Override
        public void setProperty(String name, Object value) {
            var oldValue = getProperty(name);
            super.setProperty(name, value);
            if(oldValue.isPresent()) {
                bus.post(new EdgePropertyUpdated.Builder()
                    .graphId(AbstractEventGraph.this.getId().orElse(null))
                    .edgeId(getId().orElse(null))
                    .from(getFrom())
                    .to(getTo())
                    .name(name)
                    .value(value)
                    .oldValue(oldValue.orElse(null))
                    .build());
            } else {
                bus.post(new EdgePropertyAdded.Builder()
                    .graphId(AbstractEventGraph.this.getId().orElse(null))
                    .edgeId(getId().orElse(null))
                    .from(getFrom())
                    .to(getTo())
                    .name(name)
                    .value(value)
                    .build());
            }
        }

        @Override
        public Edge removeProperty(String name) {
            var value = getProperty(name);
            var edge = super.removeProperty(name);
            bus.post(new EdgePropertyRemoved.Builder()
                .graphId(AbstractEventGraph.this.getId().orElse(null))
                .edgeId(getId().orElse(null))
                .from(getFrom())
                .to(getTo())
                .name(name)
                .value(value)
                .build());
            return edge;
        }
    }

    public class EventVertex extends SimpleVertex {
        protected EventVertex(ID id, Map inherited) {
            super(id, inherited);
        }

        @Override
        public void setId(ID id) {
            ID oldId = getId();
            super.setId(id);
            bus.post(new VertexIdUpdated.Builder()
                .graphId(AbstractEventGraph.this.getId().orElse(null))
                .oldVertexId(oldId)
                .vertexId(id)
                .build());
        }

        @Override
        public void setProperty(String name, Object value) {
            var oldValue = getProperty(name);
            super.setProperty(name, value);
            if(oldValue.isPresent()) {
                bus.post(new VertexPropertyUpdated.Builder()
                    .graphId(AbstractEventGraph.this.getId().orElse(null))
                    .vertexId(getId())
                    .name(name)
                    .value(value)
                    .oldValue(oldValue.orElse(null))
                    .build());
            } else {
                bus.post(new VertexPropertyAdded.Builder()
                    .graphId(AbstractEventGraph.this.getId().orElse(null))
                    .vertexId(getId())
                    .name(name)
                    .value(value)
                    .build());
            }
        }

        @Override
        public Vertex removeProperty(String name) {
            var value = getProperty(name);
            var vertex = super.removeProperty(name);
            bus.post(new VertexPropertyRemoved.Builder()
                .graphId(AbstractEventGraph.this.getId().orElse(null))
                .vertexId(getId())
                .name(name)
                .value(value)
                .build());
            return vertex;
        }
    }

    private EventBus bus;

    public AbstractEventGraph(EventBus bus) {
        this.bus = requireNonNull(bus, "bus must not be null.");
    }

    public AbstractEventGraph(ID id, EventBus bus) {
        super(id);
        this.bus = requireNonNull(bus, "bus must not be null.");
    }

    public EventBus getBus() {
        return bus;
    }

    @Override
    public void setId(ID id) {
        var oldId = getId();
        super.setId(id);
        if(id == null && !oldId.isPresent()) {
            return;
        }
        if(id == null) {
            bus.post(new GraphIdRemoved.Builder()
                .graphId(oldId.orElse(null))
                .build());
            return;
        }
        if(oldId.isPresent()) {
            bus.post(new GraphIdUpdated.Builder()
                .graphId(id)
                .oldGraphId(oldId.orElse(null))
                .build());
        } else {
            bus.post(new GraphIdAdded.Builder()
                .graphId(id)
                .build());
        }
    }

    @Override
    public void setProperty(String name, Object value) {
        var oldValue = getProperty(name);
        super.setProperty(name, value);
        if(oldValue.isPresent()) {
            bus.post(new GraphPropertyUpdated.Builder()
                .graphId(getId().orElse(null))
                .name(name).value(value)
                .oldValue(oldValue.orElse(null))
                .build());
        } else {
            bus.post(new GraphPropertyAdded.Builder()
                .graphId(getId().orElse(null))
                .name(name)
                .value(value)
                .build());
        }
    }

    @Override
    public Graph removeProperty(String name) {
        var value = getProperty(name);
        super.removeProperty(name);
        bus.post(new GraphPropertyRemoved.Builder()
            .graphId(getId().orElse(null))
            .name(name)
            .value(value)
            .build());
        return this;
    }

    @Override
    protected Vertex newVertex(ID id, Map inherited) {
        return new EventVertex(id, inherited);
    }

    @Override
    protected Edge newEdge(ID from, ID to, Map inherited) {
        return new EventEdge(from, to, inherited);
    }

    @Override
    protected Edge addEdge(ID from, ID to) {
        var edge = super.addEdge(from, to);
        bus.post(new EdgeCreated.Builder()
            .graphId(getId().orElse(null))
            .from(from)
            .to(to)
            .build());
        return edge;
    }

    @Override
    public void removeEdge(ID from, ID to) {
        var optional = findEdge(from, to);
        super.removeEdge(from, to);
        optional.ifPresent(edge -> bus.post(
            new EdgeRemoved.Builder()
                .graphId(getId().orElse(null))
                .edgeId(edge.getId().orElse(null))
                .from(edge.getFrom())
                .to(edge.getTo())
                .build()));
    }

    @Override
    protected Vertex addVertex(ID id) {
        var vertex = super.addVertex(id);
        bus.post(new VertexCreated.Builder()
            .graphId(getId().orElse(null))
            .vertexId(id)
            .build());
        return vertex;
    }

    @Override
    public void removeVertex(ID id) {
        var optional = findVertex(id);
        super.removeVertex(id);
        optional.ifPresent(vertex -> bus.post(new VertexRemoved.Builder()
            .graphId(getId().orElse(null))
            .vertexId(id)
            .build()));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy