diff options
author | Kjetil Ørbekk <kjetil.orbekk@gmail.com> | 2012-01-10 22:24:01 +0100 |
---|---|---|
committer | Kjetil Ørbekk <kjetil.orbekk@gmail.com> | 2012-01-10 22:33:00 +0100 |
commit | fc7ef2ba156db641e1d193cc2e3f1352eaa74bd8 (patch) | |
tree | b020dbcee136476eaf1cf6c8c22a7530789887d1 /jsonrpc/src/main/java/com/orbekk/same/SameState.java | |
parent | 3fd156ef2cd87e0b70dc5906aad7071ab908cedf (diff) |
Add SameState class to manage the state of a client.
The SameState class manages a view of the 'Same' network. Some
functionality was moved from SameServiceImpl to SameState.
Diffstat (limited to 'jsonrpc/src/main/java/com/orbekk/same/SameState.java')
-rw-r--r-- | jsonrpc/src/main/java/com/orbekk/same/SameState.java | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/jsonrpc/src/main/java/com/orbekk/same/SameState.java b/jsonrpc/src/main/java/com/orbekk/same/SameState.java new file mode 100644 index 0000000..b2518c2 --- /dev/null +++ b/jsonrpc/src/main/java/com/orbekk/same/SameState.java @@ -0,0 +1,78 @@ +package com.orbekk.same; + +import java.util.List; +import java.util.LinkedList; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The implementation of a 'Same' state. + * + * This class manages the current state of the Same protocol. + */ +public class SameState extends Thread { + private Logger logger = LoggerFactory.getLogger(getClass()); + private List<String> participants = new LinkedList<String>(); + private String currentState = ""; + private String networkName; + private boolean stopped = false; + + /** + * Queue for pending participants. + */ + private List<String> pendingParticipants = new LinkedList<String>(); + + public SameState(String networkName) { + this.networkName = networkName; + } + + public synchronized List<String> getParticipants() { + return participants; + } + + public String getNetworkName() { + return networkName; + } + + public String getCurrentState() { + return currentState; + } + + public synchronized void addParticipant(String url) { + synchronized(this) { + logger.info("Add pending participant: {}", url); + pendingParticipants.add(url); + notifyAll(); + } + } + + private synchronized void handleNewParticipants() { + for (String url : pendingParticipants) { + logger.info("New participant: {}", url); + participants.add(url); + } + pendingParticipants.clear(); + } + + public synchronized void run() { + while (!stopped) { + handleNewParticipants(); + try { + wait(1000); + } catch (InterruptedException e) { + // Ignore interrupt in wait loop. + } + } + } + + public synchronized void stopSame() { + try { + stopped = true; + notifyAll(); + this.join(); + } catch (InterruptedException e) { + logger.warn("Got InterruptedException while waiting for SameState " + + "to finish. Ignoring."); + } + } +} |