package com.abilityapi.sequenceapi; import com.abilityapi.sequenceapi.action.Action; import com.abilityapi.sequenceapi.action.ActionBuilder; import com.abilityapi.sequenceapi.action.type.after.AfterAction; import com.abilityapi.sequenceapi.action.type.after.AfterActionBuilder; import com.abilityapi.sequenceapi.action.type.observe.ObserverAction; import com.abilityapi.sequenceapi.action.type.observe.ObserverActionBlueprint; import com.abilityapi.sequenceapi.action.type.observe.ObserverActionBuilder; import com.abilityapi.sequenceapi.action.type.schedule.ScheduleAction; import com.abilityapi.sequenceapi.action.type.schedule.ScheduleActionBuilder; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; public class SequenceBuilder implements ActionBuilder { private final List actions = new ArrayList<>(); @Override public ObserverActionBuilder observe(final Class event) { return this.observe(new ObserverAction<>(event)); } @Override public ObserverActionBuilder observe(final ObserverActionBlueprint actionBlueprint) { return this.observe(actionBlueprint.create()); } @Override public ObserverActionBuilder observe(final ObserverAction action) { this.actions.add(action); return new ObserverActionBuilder<>(this, action); } @Override public AfterActionBuilder after() { return this.after(new AfterAction()); } @Override public AfterActionBuilder after(AfterAction action) { this.actions.add(action); return new AfterActionBuilder<>(this, action); } @Override public ScheduleActionBuilder schedule() { return this.schedule(new ScheduleAction()); } @Override public ScheduleActionBuilder schedule(final ScheduleAction action) { this.actions.add(action); return new ScheduleActionBuilder<>(this, action); } @Override public SequenceBlueprint build(final SequenceContext buildContext) { return new SequenceBlueprint() { @Override public final Sequence create(final T rootEvent, final SequenceContext createSequenceContext) { final SequenceContext createContext = SequenceContext.from(createSequenceContext) .custom("_triggerClass", this.getTrigger()) .custom("_triggerInstance", rootEvent) .merge(buildContext).build(); return new Sequence<>(rootEvent, SequenceBuilder.this.actions, createContext, this, Sequence.getComparatorEqual()); } @Override public final Class getTrigger() { if (SequenceBuilder.this.actions.isEmpty()) throw new NoSuchElementException("Sequence could not be established without an initial observer action."); if (SequenceBuilder.this.actions.get(0) instanceof ObserverAction) { return ((ObserverAction) SequenceBuilder.this.actions.get(0)).getEventClass(); } else throw new ClassCastException("Sequence could not be established without an initial observer action."); } @Override public SequenceContext getContext() { return buildContext; } }; } }