package uk.ac.ic.wlgitbridge.snapshot.push; import com.google.common.base.Preconditions; import uk.ac.ic.wlgitbridge.snapshot.push.exception.InvalidPostbackKeyException; import uk.ac.ic.wlgitbridge.snapshot.push.exception.SnapshotPostException; import uk.ac.ic.wlgitbridge.snapshot.push.exception.UnexpectedPostbackException; import java.math.BigInteger; import java.security.SecureRandom; import java.util.Collections; import java.util.HashMap; import java.util.Map; /** * Created by Winston on 17/11/14. */ public class PostbackManager { private final SecureRandom random; final Map<String, PostbackPromise> postbackContentsTable; PostbackManager(SecureRandom random) { this.random = random; postbackContentsTable = Collections.synchronizedMap( new HashMap<String, PostbackPromise>() ); } public PostbackManager() { this(new SecureRandom()); } public int waitForVersionIdOrThrow(String projectName) throws SnapshotPostException { try { PostbackPromise postbackPromise = postbackContentsTable.get(projectName); Preconditions.checkNotNull(postbackPromise); return postbackPromise.waitForPostback(); } finally { postbackContentsTable.remove(projectName); } } public void postVersionIDForProject(String projectName, int versionID, String postbackKey) throws UnexpectedPostbackException { getPostbackForProject( projectName ).receivedVersionID(versionID, postbackKey); } public void postExceptionForProject(String projectName, SnapshotPostException exception, String postbackKey) throws UnexpectedPostbackException { getPostbackForProject( projectName ).receivedException(exception, postbackKey); } private PostbackPromise getPostbackForProject(String projectName) throws UnexpectedPostbackException { PostbackPromise contents = postbackContentsTable.get(projectName); if (contents == null) { throw new UnexpectedPostbackException(); } return contents; } public String makeKeyForProject(String projectName) { String key = System.currentTimeMillis() + randomString(); PostbackPromise contents = new PostbackPromise(key); postbackContentsTable.put(projectName, contents); return key; } public void checkPostbackKey(String projectName, String postbackKey) throws InvalidPostbackKeyException { PostbackPromise postbackPromise = postbackContentsTable.get(projectName); if (postbackPromise == null) { throw new InvalidPostbackKeyException(); // project not found; can't check key } else { postbackPromise.checkPostbackKey(postbackKey); } } private String randomString() { return new BigInteger(130, random).toString(32); } }