WriteLatexAPI.java 4.5 KB

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