package com.neverwinterdp.scribengin.event; import static com.neverwinterdp.scribengin.event.ScribenginEvent.*; import com.neverwinterdp.registry.DataChangeNodeWatcher; import com.neverwinterdp.registry.Node; import com.neverwinterdp.registry.event.NodeEvent; import com.neverwinterdp.registry.Registry; import com.neverwinterdp.registry.RegistryException; import com.neverwinterdp.scribengin.dataflow.DataflowDescriptor; import com.neverwinterdp.scribengin.dataflow.DataflowLifecycleStatus; import com.neverwinterdp.scribengin.service.ScribenginService; import com.neverwinterdp.vm.event.VMWaitingEventListener; public class ScribenginWaitingEventListener extends VMWaitingEventListener { public ScribenginWaitingEventListener(Registry registry) throws RegistryException { super(registry); registryListener.watch(ScribenginService.LEADER_PATH, new VMLeaderElectedNodeWatcher(registry), true); } public void waitScribenginMaster(String desc, String vmName) throws Exception { add(new VMMasterElectionEventListener(desc, vmName)); } public void waitDataflowLeader(String desc, String dataflowName, String vmName) throws Exception { add(new VMMasterElectionEventListener(desc, vmName)); String dataflowLeaderPath = ScribenginService.getDataflowLeaderPath(dataflowName); registryListener.watch(dataflowLeaderPath, new VMLeaderElectedNodeWatcher(registry)); } public void waitDataflowStatus(String desc, String dataflowName, DataflowLifecycleStatus status) throws Exception { add(new DataflowStatusEventListener(desc, dataflowName, status)); String dataflowStatusPath = ScribenginService.getDataflowStatusPath(dataflowName); DataChangeNodeWatcher<DataflowLifecycleStatus> dataflowStatusWatcher = new DataChangeNodeWatcher<DataflowLifecycleStatus>(registry, DataflowLifecycleStatus.class) { @Override public void onChange(NodeEvent event, DataflowLifecycleStatus data) { try { ScribenginEvent sEvent = new ScribenginEvent(DATAFLOW_STATUS, event); Node statusNode = new Node(registry, event.getPath()); Node dataflowNode = statusNode.getParentNode(); DataflowDescriptor dfDescriptor = dataflowNode.getDataAs(DataflowDescriptor.class); sEvent.attr(DataflowAttr.status, data); sEvent.attr(DataflowAttr.descriptor, dfDescriptor); ScribenginWaitingEventListener.this.process(sEvent); } catch(Exception ex) { ex.printStackTrace(); } } }; registryListener.watch(dataflowStatusPath, dataflowStatusWatcher, true); } static public class DataflowStatusEventListener extends ScribenginEventListener { String dataflowName; DataflowLifecycleStatus status; public DataflowStatusEventListener(String desc, String dataflowName, DataflowLifecycleStatus status) { super(desc); this.dataflowName = dataflowName; this.status = status; } @Override public boolean process(ScribenginEvent event) { if(!DATAFLOW_STATUS.equals(event.getName())) return false; DataflowDescriptor descriptor = event.attr(DataflowAttr.descriptor) ; if(descriptor == null) return false; if(!dataflowName.equals(descriptor.getName())) return false; DataflowLifecycleStatus status = event.attr(DataflowAttr.status) ; if(!this.status.equals(status)) return false; return true; } } }