From 05d222ab008b58a284e90425ead1c4b42c3cfdbc Mon Sep 17 00:00:00 2001 From: Winston Li Date: Sun, 16 Nov 2014 18:56:00 +0000 Subject: [PATCH] Added POST support to Request class. --- .../wlgitbridge/bridge/CandidateSnapshot.java | 2 + .../bridge/CandidateSnapshotCallback.java | 10 ++++ .../bridge/WriteLatexDataSource.java | 5 ++ .../writelatex/WLDirectoryNodeSnapshot.java | 51 ++++++++++++++++ .../wlgitbridge/writelatex/WriteLatexAPI.java | 27 ++++++++- .../api/request/base/HTTPMethod.java | 11 ++++ .../writelatex/api/request/base/Request.java | 58 ++++++++++++++----- .../request/getdoc/SnapshotGetDocRequest.java | 6 ++ .../SnapshotGetForVersionRequest.java | 6 ++ .../SnapshotGetSavedVersRequest.java | 6 ++ .../filestore/store/WLFileStore.java | 2 +- .../writelatex/model/WLDataModel.java | 29 ++++------ 12 files changed, 178 insertions(+), 35 deletions(-) create mode 100644 services/git-bridge/src/uk/ac/ic/wlgitbridge/bridge/CandidateSnapshotCallback.java create mode 100644 services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/WLDirectoryNodeSnapshot.java create mode 100644 services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/base/HTTPMethod.java diff --git a/services/git-bridge/src/uk/ac/ic/wlgitbridge/bridge/CandidateSnapshot.java b/services/git-bridge/src/uk/ac/ic/wlgitbridge/bridge/CandidateSnapshot.java index 22f492fe20..21c053a9d2 100644 --- a/services/git-bridge/src/uk/ac/ic/wlgitbridge/bridge/CandidateSnapshot.java +++ b/services/git-bridge/src/uk/ac/ic/wlgitbridge/bridge/CandidateSnapshot.java @@ -9,7 +9,9 @@ import uk.ac.ic.wlgitbridge.writelatex.filestore.node.WLDirectoryNode; public interface CandidateSnapshot { public JsonElement getJsonRepresentation(); + public int getPreviousVersionID(); public void approveWithVersionID(int versionID); + public String getProjectName(); public WLDirectoryNode getDirectoryNode(); } diff --git a/services/git-bridge/src/uk/ac/ic/wlgitbridge/bridge/CandidateSnapshotCallback.java b/services/git-bridge/src/uk/ac/ic/wlgitbridge/bridge/CandidateSnapshotCallback.java new file mode 100644 index 0000000000..9db45f19bc --- /dev/null +++ b/services/git-bridge/src/uk/ac/ic/wlgitbridge/bridge/CandidateSnapshotCallback.java @@ -0,0 +1,10 @@ +package uk.ac.ic.wlgitbridge.bridge; + +/** + * Created by Winston on 16/11/14. + */ +public interface CandidateSnapshotCallback { + + public void approveSnapshot(int versionID, CandidateSnapshot candidateSnapshot); + +} diff --git a/services/git-bridge/src/uk/ac/ic/wlgitbridge/bridge/WriteLatexDataSource.java b/services/git-bridge/src/uk/ac/ic/wlgitbridge/bridge/WriteLatexDataSource.java index 3a53fb42b9..740e6c21fb 100644 --- a/services/git-bridge/src/uk/ac/ic/wlgitbridge/bridge/WriteLatexDataSource.java +++ b/services/git-bridge/src/uk/ac/ic/wlgitbridge/bridge/WriteLatexDataSource.java @@ -11,8 +11,13 @@ import java.util.List; */ public interface WriteLatexDataSource { + /* Called by request thread. */ public boolean repositoryExists(String projectName) throws FailedConnectionException; public List getWritableRepositories(String projectName) throws FailedConnectionException, InvalidProjectException; public void putDirectoryContentsToProjectWithName(String projectName, RawDirectoryContents directoryContents) throws SnapshotPostException; + public void expectPostback(String projectName); + + /* Called by postback thread. */ + public void postbackReceived(String projectName); } diff --git a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/WLDirectoryNodeSnapshot.java b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/WLDirectoryNodeSnapshot.java new file mode 100644 index 0000000000..1a6005cc42 --- /dev/null +++ b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/WLDirectoryNodeSnapshot.java @@ -0,0 +1,51 @@ +package uk.ac.ic.wlgitbridge.writelatex; + +import com.google.gson.JsonElement; +import uk.ac.ic.wlgitbridge.bridge.CandidateSnapshot; +import uk.ac.ic.wlgitbridge.bridge.CandidateSnapshotCallback; +import uk.ac.ic.wlgitbridge.writelatex.filestore.node.WLDirectoryNode; +import uk.ac.ic.wlgitbridge.writelatex.model.WLProject; + +/** + * Created by Winston on 16/11/14. + */ +public class WLDirectoryNodeSnapshot implements CandidateSnapshot { + + private final int previousVersionID; + private final String projectName; + private final WLDirectoryNode directoryNode; + private final CandidateSnapshotCallback callback; + + public WLDirectoryNodeSnapshot(WLProject project, WLDirectoryNode directoryNode, CandidateSnapshotCallback callback) { + previousVersionID = project.getLatestSnapshot().getVersionID(); + projectName = project.getName(); + this.directoryNode = directoryNode; + this.callback = callback; + } + + @Override + public JsonElement getJsonRepresentation() { + return null; + } + + @Override + public int getPreviousVersionID() { + return previousVersionID; + } + + @Override + public void approveWithVersionID(int versionID) { + callback.approveSnapshot(versionID, this); + } + + @Override + public String getProjectName() { + return projectName; + } + + @Override + public WLDirectoryNode getDirectoryNode() { + return directoryNode; + } + +} diff --git a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/WriteLatexAPI.java b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/WriteLatexAPI.java index 99aca2147d..554f24d9fb 100644 --- a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/WriteLatexAPI.java +++ b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/WriteLatexAPI.java @@ -1,5 +1,6 @@ package uk.ac.ic.wlgitbridge.writelatex; +import uk.ac.ic.wlgitbridge.bridge.CandidateSnapshot; import uk.ac.ic.wlgitbridge.bridge.RawDirectoryContents; import uk.ac.ic.wlgitbridge.bridge.WritableRepositoryContents; import uk.ac.ic.wlgitbridge.bridge.WriteLatexDataSource; @@ -8,6 +9,7 @@ import uk.ac.ic.wlgitbridge.writelatex.api.request.getdoc.SnapshotGetDocRequest; import uk.ac.ic.wlgitbridge.writelatex.api.request.getdoc.exception.InvalidProjectException; import uk.ac.ic.wlgitbridge.writelatex.model.WLDataModel; +import java.util.Arrays; import java.util.List; /** @@ -40,7 +42,30 @@ public class WriteLatexAPI implements WriteLatexDataSource { @Override public void putDirectoryContentsToProjectWithName(String projectName, RawDirectoryContents directoryContents) throws SnapshotPostException { - dataModel.put(projectName, directoryContents); + CandidateSnapshot candidate = dataModel.createCandidateSnapshotFromProjectWithContents(projectName, directoryContents); + throw new SnapshotPostException() { + + @Override + public String getMessage() { + return "unimplemented"; + } + + @Override + public List getDescriptionLines() { + return Arrays.asList("Currently implemented"); + } + }; + } + + @Override + public void expectPostback(String projectName) { + + } + + /* Called by postback thread. */ + @Override + public void postbackReceived(String projectName) { + } } diff --git a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/base/HTTPMethod.java b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/base/HTTPMethod.java new file mode 100644 index 0000000000..893661b1a7 --- /dev/null +++ b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/base/HTTPMethod.java @@ -0,0 +1,11 @@ +package uk.ac.ic.wlgitbridge.writelatex.api.request.base; + +/** + * Created by Winston on 16/11/14. + */ +public enum HTTPMethod { + + POST, + GET + +} diff --git a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/base/Request.java b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/base/Request.java index 5ec0e3c268..e0088a293f 100644 --- a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/base/Request.java +++ b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/base/Request.java @@ -4,6 +4,7 @@ import com.google.gson.Gson; import com.google.gson.JsonElement; import com.ning.http.client.AsyncCompletionHandler; import com.ning.http.client.AsyncHttpClient; +import com.ning.http.client.AsyncHttpClient.BoundRequestBuilder; import com.ning.http.client.Realm; import com.ning.http.client.Response; import uk.ac.ic.wlgitbridge.writelatex.api.request.exception.FailedConnectionException; @@ -27,13 +28,51 @@ public abstract class Request { error = false; } + public void request() { + switch (httpMethod()) { + case GET: + performGetRequest(); + break; + case POST: + performPostRequest(); + break; + default: + break; + } + } + + public T getResult() throws FailedConnectionException { + if (error) { + throw new FailedConnectionException(); + } + try { + return future.get(); + } catch (InterruptedException e) { + throw new FailedConnectionException(); + } catch (ExecutionException e) { + throw new FailedConnectionException(); + } + } + + protected abstract HTTPMethod httpMethod(); protected abstract Realm buildRequestRealm(); protected abstract T parseResponse(JsonElement json) throws FailedConnectionException; - public void request() { - AsyncHttpClient client = new AsyncHttpClient(); + protected String getPostBody() { + return ""; + } + + private void performGetRequest() { + request(new AsyncHttpClient().prepareGet(url)); + } + + private void performPostRequest() { + request(new AsyncHttpClient().preparePost(url).setBody(getPostBody())); + } + + private void request(BoundRequestBuilder boundRequestBuilder) { try { - future = client.prepareGet(url).setRealm(buildRequestRealm()).execute(new AsyncCompletionHandler() { + future = boundRequestBuilder.setRealm(buildRequestRealm()).execute(new AsyncCompletionHandler() { @Override public T onCompleted(Response response) throws Exception { @@ -51,17 +90,4 @@ public abstract class Request { } } - public T getResult() throws FailedConnectionException { - if (error) { - throw new FailedConnectionException(); - } - try { - return future.get(); - } catch (InterruptedException e) { - throw new FailedConnectionException(); - } catch (ExecutionException e) { - throw new FailedConnectionException(); - } - } - } diff --git a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/getdoc/SnapshotGetDocRequest.java b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/getdoc/SnapshotGetDocRequest.java index 6290a86488..81cd4937d6 100644 --- a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/getdoc/SnapshotGetDocRequest.java +++ b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/getdoc/SnapshotGetDocRequest.java @@ -1,6 +1,7 @@ package uk.ac.ic.wlgitbridge.writelatex.api.request.getdoc; import com.google.gson.JsonElement; +import uk.ac.ic.wlgitbridge.writelatex.api.request.base.HTTPMethod; import uk.ac.ic.wlgitbridge.writelatex.api.request.base.SnapshotAPIRequest; import uk.ac.ic.wlgitbridge.writelatex.api.request.exception.FailedConnectionException; @@ -15,6 +16,11 @@ public class SnapshotGetDocRequest extends SnapshotAPIRequest projects; private final WLFileStore fileStore; @@ -41,22 +42,16 @@ public class WLDataModel { return project; } - public void put(String projectName, RawDirectoryContents directoryContents) throws SnapshotPostException { - WLDirectoryNode dn = fileStore.createCandidateDirectoryNodeForProjectWithContents(getProjectWithName(projectName), directoryContents); - System.out.println("Pushing project with name: " + projectName); - System.out.println(dn); - throw new SnapshotPostException() { + public CandidateSnapshot createCandidateSnapshotFromProjectWithContents(String projectName, RawDirectoryContents directoryContents) throws SnapshotPostException { + return new WLDirectoryNodeSnapshot(getProjectWithName(projectName), + fileStore.createNextDirectoryNodeInProjectFromContents(getProjectWithName(projectName), + directoryContents), + this); + } - @Override - public String getMessage() { - return "unimplemented"; - } + @Override + public void approveSnapshot(int versionID, CandidateSnapshot candidateSnapshot) { - @Override - public List getDescriptionLines() { - return Arrays.asList("Not currently implemented"); - } - }; } }