diff --git a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/SnapshotFetcher.java b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/SnapshotFetcher.java new file mode 100644 index 0000000000..bfb28b4031 --- /dev/null +++ b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/SnapshotFetcher.java @@ -0,0 +1,122 @@ +package uk.ac.ic.wlgitbridge.writelatex; + +import uk.ac.ic.wlgitbridge.writelatex.api.request.getdoc.SnapshotGetDocRequest; +import uk.ac.ic.wlgitbridge.writelatex.api.request.getforversion.SnapshotData; +import uk.ac.ic.wlgitbridge.writelatex.api.request.getforversion.SnapshotGetForVersionRequest; +import uk.ac.ic.wlgitbridge.writelatex.api.request.getforversion.SnapshotGetForVersionResult; +import uk.ac.ic.wlgitbridge.writelatex.api.request.getsavedvers.SnapshotGetSavedVersRequest; +import uk.ac.ic.wlgitbridge.writelatex.api.request.getsavedvers.SnapshotInfo; +import uk.ac.ic.wlgitbridge.writelatex.model.Snapshot; + +import java.util.*; + +/** + * Created by Winston on 07/11/14. + */ +public class SnapshotFetcher { + + private final String projectName; + private final Map snapshots; + private final SortedSet versions; + + public SnapshotFetcher(String projectName, Map snapshots) { + this.projectName = projectName; + this.snapshots = snapshots; + versions = new TreeSet(); + } + + public List fetchNewSnapshots() throws Throwable { + List newSnapshots = new LinkedList(); + while (getNew(newSnapshots)); + return newSnapshots; + } + + private boolean getNew(List newSnapshots) throws Throwable { + SnapshotGetDocRequest getDoc = new SnapshotGetDocRequest(projectName); + SnapshotGetSavedVersRequest getSavedVers = new SnapshotGetSavedVersRequest(projectName); + + getDoc.request(); + getSavedVers.request(); + + Set fetchedIDs = new HashSet(); + Map fetchedSnapshotInfos = new HashMap(); + + int latestVersionID = putLatestDoc(getDoc, fetchedIDs, fetchedSnapshotInfos); + + putSavedVers(getSavedVers, fetchedIDs, fetchedSnapshotInfos); + + List idsToUpdate = getIDsToUpdate(fetchedIDs); + + versions.addAll(fetchedIDs); + versions.add(latestVersionID); + + return updateIDs(idsToUpdate, fetchedSnapshotInfos, newSnapshots); + } + + private void putFetchedResult(SnapshotInfo snapshotInfo, Set ids, Map snapshotInfos) { + int versionID = snapshotInfo.getVersionId(); + snapshotInfos.put(versionID, snapshotInfo); + ids.add(versionID); + } + + private int putLatestDoc(SnapshotGetDocRequest getDoc, Set fetchedIDs, Map fetchedSnapshotInfos) throws Throwable { + int latestVersionID = getDoc.getResult().getVersionID(); + putFetchedResult(new SnapshotInfo(latestVersionID), fetchedIDs, fetchedSnapshotInfos); + return latestVersionID; + } + + private void putSavedVers(SnapshotGetSavedVersRequest getSavedVers, Set fetchedIDs, Map fetchedSnapshotInfos) throws Throwable { + for (SnapshotInfo snapshotInfo : getSavedVers.getResult().getSavedVers()) { + putFetchedResult(snapshotInfo, fetchedIDs, fetchedSnapshotInfos); + } + } + + private List getIDsToUpdate(Set fetchedIDs) { + List idsToUpdate = new LinkedList(); + for (Integer id : fetchedIDs) { + if (!versions.contains(id)) { + idsToUpdate.add(id); + } + } + return idsToUpdate; + } + + private boolean updateIDs(List idsToUpdate, Map fetchedSnapshotInfos, List newSnapshots) throws Throwable { + if (idsToUpdate.isEmpty()) { + return false; + } + System.out.println("Fetching versions: " + idsToUpdate); + fetchVersions(idsToUpdate, fetchedSnapshotInfos, newSnapshots); + return true; + } + + private void fetchVersions(List idsToUpdate, Map fetchedSnapshotInfos, List newSnapshots) throws Throwable { + List requests = createFiredRequests(idsToUpdate); + processResults(fetchedSnapshotInfos, newSnapshots, requests); + } + + private List createFiredRequests(List idsToUpdate) { + List requests = new LinkedList(); + for (int id : idsToUpdate) { + SnapshotGetForVersionRequest request = new SnapshotGetForVersionRequest(projectName, id); + requests.add(request); + request.request(); + } + return requests; + } + + private void processResults(Map fetchedSnapshotInfos, List newSnapshots, List requests) throws Throwable { + for (SnapshotGetForVersionRequest request : requests) { + processResult(fetchedSnapshotInfos, newSnapshots, request); + } + } + + private void processResult(Map fetchedSnapshotInfos, List newSnapshots, SnapshotGetForVersionRequest request) throws Throwable { + SnapshotGetForVersionResult result = request.getResult(); + SnapshotData data = result.getSnapshotData(); + Snapshot snapshot = new Snapshot(fetchedSnapshotInfos.get(request.getVersionID()), data); + snapshots.put(request.getVersionID(), snapshot); + newSnapshots.add(snapshot); + } + +} diff --git a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/getsavedvers/SnapshotInfo.java b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/getsavedvers/SnapshotInfo.java index 8102ea17be..fe3d739942 100644 --- a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/getsavedvers/SnapshotInfo.java +++ b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/api/request/getsavedvers/SnapshotInfo.java @@ -14,6 +14,7 @@ public class SnapshotInfo { private String createdAt; public SnapshotInfo(int versionID) { + this.versionId = versionID; comment = "Update on WriteLatex.com."; user = new WLUser(); } diff --git a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/model/WLDataModel.java b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/model/WLDataModel.java index 6f4e791997..0df250b4bd 100644 --- a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/model/WLDataModel.java +++ b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/model/WLDataModel.java @@ -1,13 +1,10 @@ package uk.ac.ic.wlgitbridge.writelatex.model; -import org.eclipse.jgit.lib.Repository; import uk.ac.ic.wlgitbridge.writelatex.api.SnapshotDBAPI; -import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.ExecutionException; /** * Created by Winston on 06/11/14. @@ -24,11 +21,11 @@ public class WLDataModel implements SnapshotDBAPI { projects = new HashMap(); } - private void updateProjectWithName(String name) throws Throwable { + private List updateProjectWithName(String name) throws Throwable { if (!projects.containsKey(name)) { projects.put(name, new WLProject(name)); } - projects.get(name).update(); + return projects.get(name).fetchNewSnapshots(); } @Override @@ -41,8 +38,7 @@ public class WLDataModel implements SnapshotDBAPI { @Override public List getSnapshotsToAddToProject(String name) throws Throwable { - updateProjectWithName(name); - return projects.get(name).getSnapshotsToAdd(); + return updateProjectWithName(name); } } diff --git a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/model/WLProject.java b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/model/WLProject.java index 3dc5c6d432..038fb82b4d 100644 --- a/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/model/WLProject.java +++ b/services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/model/WLProject.java @@ -1,18 +1,14 @@ package uk.ac.ic.wlgitbridge.writelatex.model; -import com.google.gson.JsonElement; -import uk.ac.ic.wlgitbridge.writelatex.api.request.base.Request; +import uk.ac.ic.wlgitbridge.writelatex.SnapshotFetcher; import uk.ac.ic.wlgitbridge.writelatex.api.request.getdoc.SnapshotGetDocRequest; -import uk.ac.ic.wlgitbridge.writelatex.api.request.getdoc.SnapshotGetDocResult; import uk.ac.ic.wlgitbridge.writelatex.api.request.getforversion.SnapshotData; import uk.ac.ic.wlgitbridge.writelatex.api.request.getforversion.SnapshotGetForVersionRequest; import uk.ac.ic.wlgitbridge.writelatex.api.request.getforversion.SnapshotGetForVersionResult; import uk.ac.ic.wlgitbridge.writelatex.api.request.getsavedvers.SnapshotGetSavedVersRequest; import uk.ac.ic.wlgitbridge.writelatex.api.request.getsavedvers.SnapshotInfo; -import java.io.IOException; import java.util.*; -import java.util.concurrent.ExecutionException; /** * Created by Winston on 06/11/14. @@ -21,82 +17,16 @@ public class WLProject { private final String name; private final Map snapshots; - private final SortedSet versions; - private List snapshotsToAdd; + private final SnapshotFetcher snapshotFetcher; public WLProject(String name) { this.name = name; snapshots = new HashMap(); - versions = new TreeSet(); + snapshotFetcher = new SnapshotFetcher(name, snapshots); } - public void update() throws Throwable { - getNew(); - } - - private boolean getNew() throws Throwable { - SnapshotGetDocRequest getDoc = new SnapshotGetDocRequest(name); - SnapshotGetSavedVersRequest getSavedVers = new SnapshotGetSavedVersRequest(name); - - getDoc.request(); - getSavedVers.request(); - - Set fetchedIDs = new HashSet(); - Map fetchedSnapshotInfos = new HashMap(); - - int latestVersionID = getDoc.getResult().getVersionID(); - fetchedSnapshotInfos.put(latestVersionID, new SnapshotInfo(latestVersionID)); - fetchedIDs.add(latestVersionID); - - for (SnapshotInfo snapshotInfo : getSavedVers.getResult().getSavedVers()) { - int versionId = snapshotInfo.getVersionId(); - fetchedSnapshotInfos.put(versionId, snapshotInfo); - fetchedIDs.add(versionId); - } - - boolean result = false; - - List idsToUpdate = new LinkedList(); - - boolean hasNew = false; - for (Integer id : fetchedIDs) { - boolean contains = versions.contains(id); - result = result || contains; - if (!contains) { - idsToUpdate.add(id); - } - } - - versions.addAll(fetchedIDs); - versions.add(latestVersionID); - - updateIDs(idsToUpdate, fetchedSnapshotInfos); - - return result; - } - - private void updateIDs(List idsToUpdate, Map fetchedSnapshotInfos) throws Throwable { - System.out.println(idsToUpdate); - List requests = new LinkedList(); - for (int id : idsToUpdate) { - SnapshotGetForVersionRequest request = new SnapshotGetForVersionRequest(name, id); - requests.add(request); - request.request(); - } - for (SnapshotGetForVersionRequest request : requests) { - SnapshotGetForVersionResult result = request.getResult(); - SnapshotData data = result.getSnapshotData(); - Snapshot snapshot = new Snapshot(fetchedSnapshotInfos.get(request.getVersionID()), data); - snapshots.put(request.getVersionID(), snapshot); - } - snapshotsToAdd = new LinkedList(); - for (int id : idsToUpdate) { - snapshotsToAdd.add(snapshots.get(id)); - } - } - - public List getSnapshotsToAdd() { - return snapshotsToAdd; + public List fetchNewSnapshots() throws Throwable { + return snapshotFetcher.fetchNewSnapshots(); } } diff --git a/services/git-bridge/test/uk/ac/ic/wlgitbridge/test/writelatex/model/WLProjectTests.java b/services/git-bridge/test/uk/ac/ic/wlgitbridge/test/writelatex/model/WLProjectTests.java index 5105462b8d..228eb0b4d8 100644 --- a/services/git-bridge/test/uk/ac/ic/wlgitbridge/test/writelatex/model/WLProjectTests.java +++ b/services/git-bridge/test/uk/ac/ic/wlgitbridge/test/writelatex/model/WLProjectTests.java @@ -15,7 +15,7 @@ public class WLProjectTests { public void nothingToTest() { WLProject project = new WLProject("1826rqgsdb"); try { - project.update(); + project.fetchNewSnapshots(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) {