WriteLatexAPI.java 4.7 KB

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