SnapshotFetcher.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package uk.ac.ic.wlgitbridge.writelatex;
  2. import uk.ac.ic.wlgitbridge.writelatex.api.request.exception.FailedConnectionException;
  3. import uk.ac.ic.wlgitbridge.writelatex.api.request.getdoc.SnapshotGetDocRequest;
  4. import uk.ac.ic.wlgitbridge.writelatex.api.request.getdoc.exception.InvalidProjectException;
  5. import uk.ac.ic.wlgitbridge.writelatex.api.request.getforversion.SnapshotData;
  6. import uk.ac.ic.wlgitbridge.writelatex.api.request.getforversion.SnapshotGetForVersionRequest;
  7. import uk.ac.ic.wlgitbridge.writelatex.api.request.getforversion.SnapshotGetForVersionResult;
  8. import uk.ac.ic.wlgitbridge.writelatex.api.request.getsavedvers.SnapshotGetSavedVersRequest;
  9. import uk.ac.ic.wlgitbridge.writelatex.api.request.getsavedvers.SnapshotInfo;
  10. import uk.ac.ic.wlgitbridge.writelatex.model.Snapshot;
  11. import java.util.*;
  12. /**
  13. * Created by Winston on 07/11/14.
  14. */
  15. public class SnapshotFetcher {
  16. private final String projectName;
  17. private final Map<Integer, Snapshot> snapshots;
  18. private final SortedSet<Integer> versions;
  19. public SnapshotFetcher(String projectName, Map<Integer, Snapshot> snapshots) {
  20. this.projectName = projectName;
  21. this.snapshots = snapshots;
  22. versions = new TreeSet<Integer>();
  23. }
  24. public SortedSet<Snapshot> fetchNewSnapshots() throws FailedConnectionException, InvalidProjectException {
  25. SortedSet<Snapshot> newSnapshots = new TreeSet<Snapshot>();
  26. while (getNew(newSnapshots));
  27. System.out.println("Snapshots fetched: " + newSnapshots);
  28. return newSnapshots;
  29. }
  30. public Snapshot getLatestSnapshot() {
  31. return snapshots.get(versions.last());
  32. }
  33. private boolean getNew(SortedSet<Snapshot> newSnapshots) throws FailedConnectionException, InvalidProjectException {
  34. SnapshotGetDocRequest getDoc = new SnapshotGetDocRequest(projectName);
  35. SnapshotGetSavedVersRequest getSavedVers = new SnapshotGetSavedVersRequest(projectName);
  36. getDoc.request();
  37. getSavedVers.request();
  38. Set<Integer> fetchedIDs = new HashSet<Integer>();
  39. Map<Integer, SnapshotInfo> fetchedSnapshotInfos = new HashMap<Integer, SnapshotInfo>();
  40. int latestVersionID = putLatestDoc(getDoc, fetchedIDs, fetchedSnapshotInfos);
  41. putSavedVers(getSavedVers, fetchedIDs, fetchedSnapshotInfos);
  42. List<Integer> idsToUpdate = getIDsToUpdate(fetchedIDs);
  43. versions.addAll(fetchedIDs);
  44. versions.add(latestVersionID);
  45. return updateIDs(idsToUpdate, fetchedSnapshotInfos, newSnapshots);
  46. }
  47. private void putFetchedResult(SnapshotInfo snapshotInfo, Set<Integer> ids, Map<Integer, SnapshotInfo> snapshotInfos) {
  48. int versionID = snapshotInfo.getVersionId();
  49. snapshotInfos.put(versionID, snapshotInfo);
  50. ids.add(versionID);
  51. }
  52. private int putLatestDoc(SnapshotGetDocRequest getDoc, Set<Integer> fetchedIDs, Map<Integer, SnapshotInfo> fetchedSnapshotInfos) throws FailedConnectionException, InvalidProjectException {
  53. int latestVersionID = getDoc.getResult().getVersionID();
  54. putFetchedResult(new SnapshotInfo(latestVersionID), fetchedIDs, fetchedSnapshotInfos);
  55. return latestVersionID;
  56. }
  57. private void putSavedVers(SnapshotGetSavedVersRequest getSavedVers, Set<Integer> fetchedIDs, Map<Integer, SnapshotInfo> fetchedSnapshotInfos) throws FailedConnectionException {
  58. for (SnapshotInfo snapshotInfo : getSavedVers.getResult().getSavedVers()) {
  59. putFetchedResult(snapshotInfo, fetchedIDs, fetchedSnapshotInfos);
  60. }
  61. }
  62. private List<Integer> getIDsToUpdate(Set<Integer> fetchedIDs) {
  63. List<Integer> idsToUpdate = new LinkedList<Integer>();
  64. for (Integer id : fetchedIDs) {
  65. if (!versions.contains(id)) {
  66. idsToUpdate.add(id);
  67. }
  68. }
  69. return idsToUpdate;
  70. }
  71. private boolean updateIDs(List<Integer> idsToUpdate, Map<Integer, SnapshotInfo> fetchedSnapshotInfos, SortedSet<Snapshot> newSnapshots) throws FailedConnectionException {
  72. if (idsToUpdate.isEmpty()) {
  73. return false;
  74. }
  75. fetchVersions(idsToUpdate, fetchedSnapshotInfos, newSnapshots);
  76. return true;
  77. }
  78. private void fetchVersions(List<Integer> idsToUpdate, Map<Integer, SnapshotInfo> fetchedSnapshotInfos, SortedSet<Snapshot> newSnapshots) throws FailedConnectionException {
  79. List<SnapshotGetForVersionRequest> requests = createFiredRequests(idsToUpdate);
  80. processResults(fetchedSnapshotInfos, newSnapshots, requests);
  81. }
  82. private List<SnapshotGetForVersionRequest> createFiredRequests(List<Integer> idsToUpdate) {
  83. List<SnapshotGetForVersionRequest> requests = new LinkedList<SnapshotGetForVersionRequest>();
  84. for (int id : idsToUpdate) {
  85. SnapshotGetForVersionRequest request = new SnapshotGetForVersionRequest(projectName, id);
  86. requests.add(request);
  87. request.request();
  88. }
  89. return requests;
  90. }
  91. private void processResults(Map<Integer, SnapshotInfo> fetchedSnapshotInfos, SortedSet<Snapshot> newSnapshots, List<SnapshotGetForVersionRequest> requests) throws FailedConnectionException {
  92. for (SnapshotGetForVersionRequest request : requests) {
  93. processResult(fetchedSnapshotInfos, newSnapshots, request);
  94. }
  95. }
  96. private void processResult(Map<Integer, SnapshotInfo> fetchedSnapshotInfos, SortedSet<Snapshot> newSnapshots, SnapshotGetForVersionRequest request) throws FailedConnectionException {
  97. SnapshotGetForVersionResult result = request.getResult();
  98. SnapshotData data = result.getSnapshotData();
  99. Snapshot snapshot = new Snapshot(fetchedSnapshotInfos.get(request.getVersionID()), data);
  100. snapshots.put(request.getVersionID(), snapshot);
  101. newSnapshots.add(snapshot);
  102. }
  103. }