package cz.cuni.mff.d3s.been.web.services; import java.util.Collection; import com.hazelcast.core.EntryEvent; import com.hazelcast.core.EntryListener; import cz.cuni.mff.d3s.been.api.BeenApiException; import org.apache.tapestry5.ioc.Invokable; import org.apache.tapestry5.ioc.services.ParallelExecutor; import org.lazan.t5.cometd.services.PushManager; import cz.cuni.mff.d3s.been.api.BeenApi; import cz.cuni.mff.d3s.been.core.ri.RuntimeInfo; import cz.cuni.mff.d3s.been.core.task.TaskEntry; /** * @author Kuba Brecka */ public class LiveFeedServiceImpl implements LiveFeedService { private final PushManager pushManager; private final ParallelExecutor executor; private final BeenApiService api; public LiveFeedServiceImpl(PushManager pushManager, ParallelExecutor executor, BeenApiService api) { this.pushManager = pushManager; this.executor = executor; this.api = api; executor.invoke(new LogFeedWorker()); } private class LogFeedWorker implements Invokable<Object> { private synchronized void broadcast(String topic, Object object) { pushManager.broadcast(topic, object); } @Override public Object invoke() { while (true) { while (!api.isConnected()) { try { Thread.sleep(1000); } catch (InterruptedException e) {} } try { EntryListener<String, String> logsListener = new EntryListener<String, String>() { @Override public void entryAdded(EntryEvent<String, String> event) { broadcast("/logs", event.getValue()); } @Override public void entryRemoved(EntryEvent<String, String> event) { } @Override public void entryUpdated(EntryEvent<String, String> event) { broadcast("/logs", event.getValue()); } @Override public void entryEvicted(EntryEvent<String, String> event) { } }; api.getApi().addLogListener(logsListener); } catch (BeenApiException e) { e.printStackTrace(); } while (true) { try { if (!api.isConnected()) { break; } Collection<RuntimeInfo> runtimeInfoCollection = api.getApi().getRuntimes(); broadcast("/runtimes", runtimeInfoCollection); Collection<TaskEntry> taskEntries = api.getApi().getTasks(); broadcast("/tasks", taskEntries); } catch (Exception e) { e.printStackTrace(); } try { Thread.sleep(1000); } catch (InterruptedException e) {} } } } } }