Basic implementation of postback key.

This commit is contained in:
Winston Li 2014-12-04 21:27:52 +00:00
parent 3887e5025f
commit c3ef49b17c
6 changed files with 42 additions and 27 deletions

View file

@ -23,7 +23,7 @@ public interface WriteLatexDataSource {
public void putDirectoryContentsToProjectWithName(String projectName, RawDirectoryContents directoryContents, String hostname) throws SnapshotPostException, IOException, FailedConnectionException;
/* Called by postback thread. */
public void postbackReceivedSuccessfully(String projectName, int versionID) throws UnexpectedPostbackException;
public void postbackReceivedWithException(String projectName, SnapshotPostException exception) throws UnexpectedPostbackException;
public void postbackReceivedSuccessfully(String projectName, String postbackKey, int versionID) throws UnexpectedPostbackException;
public void postbackReceivedWithException(String projectName, String postbackKey, SnapshotPostException exception) throws UnexpectedPostbackException;
}

View file

@ -18,13 +18,15 @@ public class WLDirectoryNodeSnapshot implements CandidateSnapshot {
private final String projectName;
private final String projectURL;
private final WLDirectoryNode directoryNode;
private final String postbackKey;
private final CandidateSnapshotCallback callback;
public WLDirectoryNodeSnapshot(WLProject project, WLDirectoryNode directoryNode, String hostname, CandidateSnapshotCallback callback) {
public WLDirectoryNodeSnapshot(WLProject project, WLDirectoryNode directoryNode, String hostname, String postbackKey, CandidateSnapshotCallback callback) {
previousVersionID = project.getLatestSnapshotID();
projectName = project.getName();
projectURL = "http://" + hostname + "/" + projectName;
this.directoryNode = directoryNode;
this.postbackKey = postbackKey;
this.callback = callback;
}
@ -33,7 +35,7 @@ public class WLDirectoryNodeSnapshot implements CandidateSnapshot {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("latestVerId", previousVersionID);
jsonObject.add("files", getFilesAsJson());
jsonObject.addProperty("postbackUrl", projectURL + "/postback");
jsonObject.addProperty("postbackUrl", projectURL + "/" + postbackKey);
System.out.println(jsonObject);
return jsonObject;
}

View file

@ -36,7 +36,6 @@ public class WriteLatexAPI implements WriteLatexDataSource {
postbackManager = new PostbackManager();
projectLocks = new HashMap<String, Lock>();
mainProjectLock = new ProjectLock();
// postbackLock = new ProjectLock();
}
@Override
@ -78,7 +77,8 @@ public class WriteLatexAPI implements WriteLatexDataSource {
mainProjectLock.lockForProject(projectName);
try {
System.out.println("Pushing project: " + projectName);
CandidateSnapshot candidate = dataModel.createCandidateSnapshotFromProjectWithContents(projectName, directoryContents, hostname);
String postbackKey = postbackManager.makeKeyForProject(projectName);
CandidateSnapshot candidate = dataModel.createCandidateSnapshotFromProjectWithContents(projectName, directoryContents, hostname, postbackKey);
SnapshotPushRequest snapshotPushRequest = new SnapshotPushRequest(candidate);
snapshotPushRequest.request();
SnapshotPushRequestResult result = snapshotPushRequest.getResult();
@ -100,13 +100,13 @@ public class WriteLatexAPI implements WriteLatexDataSource {
/* Called by postback thread. */
@Override
public void postbackReceivedSuccessfully(String projectName, int versionID) throws UnexpectedPostbackException {
postbackManager.postVersionIDForProject(projectName, versionID);
public void postbackReceivedSuccessfully(String projectName, String postbackKey, int versionID) throws UnexpectedPostbackException {
postbackManager.postVersionIDForProject(projectName, versionID, postbackKey);
}
@Override
public void postbackReceivedWithException(String projectName, SnapshotPostException exception) throws UnexpectedPostbackException {
postbackManager.postExceptionForProject(projectName, exception);
public void postbackReceivedWithException(String projectName, String postbackKey, SnapshotPostException exception) throws UnexpectedPostbackException {
postbackManager.postExceptionForProject(projectName, exception, postbackKey);
}
}

View file

@ -7,11 +7,14 @@ import uk.ac.ic.wlgitbridge.writelatex.api.request.push.exception.SnapshotPostEx
*/
public class PostbackContents {
private final String postbackKey;
private boolean received;
private int versionID;
private SnapshotPostException exception;
public PostbackContents() {
public PostbackContents(String postbackKey) {
this.postbackKey = postbackKey;
received = false;
exception = null;
}
@ -30,16 +33,20 @@ public class PostbackContents {
return versionID;
}
public synchronized void receivedVersionID(int versionID) {
this.versionID = versionID;
received = true;
notifyAll();
public synchronized void receivedVersionID(int versionID, String postbackKey) {
if (postbackKey.equals(this.postbackKey)) {
this.versionID = versionID;
received = true;
notifyAll();
}
}
public synchronized void receivedException(SnapshotPostException exception) {
this.exception = exception;
received = true;
notifyAll();
public synchronized void receivedException(SnapshotPostException exception, String postbackKey) {
if (postbackKey.equals(this.postbackKey)) {
this.exception = exception;
received = true;
notifyAll();
}
}
}

View file

@ -17,19 +17,17 @@ public class PostbackManager {
}
public int getVersionID(String projectName) throws SnapshotPostException {
PostbackContents contents = new PostbackContents();
postbackContentsTable.put(projectName, contents);
int versionID = contents.waitForPostback();
int versionID = postbackContentsTable.get(projectName).waitForPostback();
postbackContentsTable.remove(projectName);
return versionID;
}
public void postVersionIDForProject(String projectName, int versionID) throws UnexpectedPostbackException {
getPostbackForProject(projectName).receivedVersionID(versionID);
public void postVersionIDForProject(String projectName, int versionID, String postbackKey) throws UnexpectedPostbackException {
getPostbackForProject(projectName).receivedVersionID(versionID, postbackKey);
}
public void postExceptionForProject(String projectName, SnapshotPostException exception) throws UnexpectedPostbackException {
getPostbackForProject(projectName).receivedException(exception);
public void postExceptionForProject(String projectName, SnapshotPostException exception, String postbackKey) throws UnexpectedPostbackException {
getPostbackForProject(projectName).receivedException(exception, postbackKey);
}
private PostbackContents getPostbackForProject(String projectName) throws UnexpectedPostbackException {
@ -40,4 +38,11 @@ public class PostbackManager {
return contents;
}
public String makeKeyForProject(String projectName) {
String key = "postback";
PostbackContents contents = new PostbackContents(key);
postbackContentsTable.put(projectName, contents);
return key;
}
}

View file

@ -45,11 +45,12 @@ public class WLDataModel implements CandidateSnapshotCallback {
return projectStore.getProjectWithName(name);
}
public CandidateSnapshot createCandidateSnapshotFromProjectWithContents(String projectName, RawDirectoryContents directoryContents, String hostname) throws SnapshotPostException, IOException, FailedConnectionException {
public CandidateSnapshot createCandidateSnapshotFromProjectWithContents(String projectName, RawDirectoryContents directoryContents, String hostname, String postbackKey) throws SnapshotPostException, IOException, FailedConnectionException {
return new WLDirectoryNodeSnapshot(getProjectWithName(projectName),
fileStore.createNextDirectoryNodeInProjectFromContents(getProjectWithName(projectName),
directoryContents),
hostname,
postbackKey,
this);
}