WriteLatexAPI.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package uk.ac.ic.wlgitbridge.writelatex;
  2. import uk.ac.ic.wlgitbridge.bridge.CandidateSnapshot;
  3. import uk.ac.ic.wlgitbridge.bridge.RawDirectoryContents;
  4. import uk.ac.ic.wlgitbridge.bridge.WritableRepositoryContents;
  5. import uk.ac.ic.wlgitbridge.bridge.WriteLatexDataSource;
  6. import uk.ac.ic.wlgitbridge.writelatex.api.request.exception.FailedConnectionException;
  7. import uk.ac.ic.wlgitbridge.writelatex.api.request.getdoc.SnapshotGetDocRequest;
  8. import uk.ac.ic.wlgitbridge.writelatex.api.request.getdoc.exception.InvalidProjectException;
  9. import uk.ac.ic.wlgitbridge.writelatex.api.request.push.PostbackManager;
  10. import uk.ac.ic.wlgitbridge.writelatex.api.request.push.SnapshotPushRequest;
  11. import uk.ac.ic.wlgitbridge.writelatex.api.request.push.SnapshotPushRequestResult;
  12. import uk.ac.ic.wlgitbridge.writelatex.api.request.push.UnexpectedPostbackException;
  13. import uk.ac.ic.wlgitbridge.writelatex.api.request.push.exception.OutOfDateException;
  14. import uk.ac.ic.wlgitbridge.writelatex.api.request.push.exception.SnapshotPostException;
  15. import uk.ac.ic.wlgitbridge.writelatex.model.WLDataModel;
  16. import java.io.IOException;
  17. import java.util.List;
  18. /**
  19. * Created by Winston on 16/11/14.
  20. */
  21. public class WriteLatexAPI implements WriteLatexDataSource {
  22. private final WLDataModel dataModel;
  23. private final PostbackManager postbackManager;
  24. private final ProjectLock mainProjectLock;
  25. public WriteLatexAPI(WLDataModel dataModel) {
  26. this.dataModel = dataModel;
  27. postbackManager = new PostbackManager();
  28. mainProjectLock = new ProjectLock();
  29. }
  30. @Override
  31. public void lockForProject(String projectName) {
  32. mainProjectLock.lockForProject(projectName);
  33. }
  34. @Override
  35. public void unlockForProject(String projectName) {
  36. mainProjectLock.unlockForProject(projectName);
  37. }
  38. @Override
  39. public boolean repositoryExists(String projectName) throws FailedConnectionException {
  40. lockForProject(projectName);
  41. SnapshotGetDocRequest snapshotGetDocRequest = new SnapshotGetDocRequest(projectName);
  42. snapshotGetDocRequest.request();
  43. try {
  44. snapshotGetDocRequest.getResult().getVersionID();
  45. } catch (InvalidProjectException e) {
  46. return false;
  47. } catch (FailedConnectionException e) {
  48. throw e;
  49. } finally {
  50. unlockForProject(projectName);
  51. }
  52. return true;
  53. }
  54. @Override
  55. public List<WritableRepositoryContents> getWritableRepositories(String projectName) throws FailedConnectionException, InvalidProjectException {
  56. System.out.println("Fetching project: " + projectName);
  57. List<WritableRepositoryContents> writableRepositoryContents = dataModel.updateProjectWithName(projectName);
  58. return writableRepositoryContents;
  59. }
  60. @Override
  61. public void putDirectoryContentsToProjectWithName(String projectName, RawDirectoryContents directoryContents, String hostname) throws SnapshotPostException, IOException, FailedConnectionException {
  62. mainProjectLock.lockForProject(projectName);
  63. try {
  64. System.out.println("Pushing project: " + projectName);
  65. String postbackKey = postbackManager.makeKeyForProject(projectName);
  66. CandidateSnapshot candidate = dataModel.createCandidateSnapshotFromProjectWithContents(projectName, directoryContents, hostname, postbackKey);
  67. SnapshotPushRequest snapshotPushRequest = new SnapshotPushRequest(candidate);
  68. snapshotPushRequest.request();
  69. SnapshotPushRequestResult result = snapshotPushRequest.getResult();
  70. if (result.wasSuccessful()) {
  71. candidate.approveWithVersionID(postbackManager.getVersionID(projectName));
  72. } else {
  73. throw new OutOfDateException();
  74. }
  75. } catch (SnapshotPostException e) {
  76. throw e;
  77. } catch (IOException e) {
  78. throw e;
  79. } catch (FailedConnectionException e) {
  80. throw e;
  81. } finally {
  82. mainProjectLock.unlockForProject(projectName);
  83. }
  84. }
  85. /* Called by postback thread. */
  86. @Override
  87. public void postbackReceivedSuccessfully(String projectName, String postbackKey, int versionID) throws UnexpectedPostbackException {
  88. postbackManager.postVersionIDForProject(projectName, versionID, postbackKey);
  89. }
  90. @Override
  91. public void postbackReceivedWithException(String projectName, String postbackKey, SnapshotPostException exception) throws UnexpectedPostbackException {
  92. postbackManager.postExceptionForProject(projectName, exception, postbackKey);
  93. }
  94. }