package nl.fontys.sofa.limo.domain.component; import com.google.gson.annotations.Expose; import java.beans.PropertyChangeEvent; import java.util.ArrayList; import java.util.List; import javax.persistence.Embedded; import nl.fontys.sofa.limo.domain.BaseEntity; import nl.fontys.sofa.limo.domain.component.event.Event; import nl.fontys.sofa.limo.domain.component.procedure.Procedure; /** * Base class for all main components of a supply chain: hubs, legs and events. * * @author Dominik Kaisers {@literal <d.kaisers@student.fontys.nl>} */ public abstract class Component extends BaseEntity { private static final long serialVersionUID = 7595293546266887990L; @Embedded @Expose protected List<Procedure> procedures; @Embedded @Expose protected List<Event> events; public Component(String name, String description) { super(name, description); this.procedures = new ArrayList<>(); this.events = new ArrayList<>(); } public Component(Component component) { this(component.getName(), component.getDescription()); this.procedures = component.getProcedures(); this.events = component.getEvents(); } public Component() { super(); this.procedures = new ArrayList<>(); this.events = new ArrayList<>(); } public List<Procedure> getProcedures() { if (procedures == null) { procedures = new ArrayList<>(); } return new ArrayList<>(procedures); } public void setProcedures(List<Procedure> procedures) { procedures.stream().filter((p) -> (!this.procedures.contains(p))).forEach((p) -> { fireAddProcedure(p); }); this.procedures.stream().filter((p) -> (!procedures.contains(p))).forEach((p) -> { fireRemoveProcedure(p); }); this.procedures = procedures; } public List<Event> getEvents() { if (events == null) { events = new ArrayList<>(); } return new ArrayList<>(events); } public void setEvents(List<Event> events) { events.stream().filter((e) -> (!this.events.contains(e))).forEach((e) -> { fireAddEvent(e); }); this.events.stream().filter((e) -> (!events.contains(e))).forEach((e) -> { fireRemoveEvent(e); }); this.events = new ArrayList<>(events); } private void fireAddEvent(Event event) { PropertyChangeEvent e = new PropertyChangeEvent(this, "ADD_EVENT", null, event); listeners.stream().forEach((listern) -> { listern.propertyChange(e); }); } private void fireRemoveEvent(Event event) { PropertyChangeEvent e = new PropertyChangeEvent(this, "REMOVE_EVENT", event, null); listeners.stream().forEach((listern) -> { listern.propertyChange(e); }); } private void fireAddProcedure(Procedure procedure) { PropertyChangeEvent e = new PropertyChangeEvent(this, "ADD_PROCEDURE", null, procedure); listeners.stream().forEach((listern) -> { listern.propertyChange(e); }); } private void fireRemoveProcedure(Procedure procedure) { PropertyChangeEvent e = new PropertyChangeEvent(this, "REMOVE_PROCEDURE", procedure, null); listeners.stream().forEach((listern) -> { listern.propertyChange(e); }); } }