From 229ed1c09d05b1c2903653e11d3f6cefced3d5cb Mon Sep 17 00:00:00 2001 From: Marc Egea i Sala Date: Fri, 20 Nov 2015 15:15:42 +0000 Subject: [PATCH] Try to download file if it's not in the git tree --- services/git-bridge/pom.xml | 5 + .../ic/wlgitbridge/data/model/DataStore.java | 3 +- .../data/model/ResourceFetcher.java | 10 +- .../data/model/db/PersistentStore.java | 68 ++------------ .../data/model/db/SqlitePersistentStore.java | 78 ++++++++++++++++ .../data/model/ResourceFetcherTest.java | 91 +++++++++++++++++++ services/git-bridge/writelatex-git-bridge.iml | 38 ++++++++ 7 files changed, 230 insertions(+), 63 deletions(-) create mode 100644 services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/db/SqlitePersistentStore.java create mode 100644 services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcherTest.java diff --git a/services/git-bridge/pom.xml b/services/git-bridge/pom.xml index 9377b85d79..56cd2d96a4 100644 --- a/services/git-bridge/pom.xml +++ b/services/git-bridge/pom.xml @@ -102,6 +102,11 @@ joda-time 2.7 + + org.mock-server + mockserver-netty + 3.10.1 + \ No newline at end of file diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/DataStore.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/DataStore.java index f81b4ddfdb..f9f217dd7d 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/DataStore.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/DataStore.java @@ -10,6 +10,7 @@ import uk.ac.ic.wlgitbridge.data.filestore.GitDirectoryContents; import uk.ac.ic.wlgitbridge.data.filestore.RawDirectory; import uk.ac.ic.wlgitbridge.data.filestore.RawFile; import uk.ac.ic.wlgitbridge.data.model.db.PersistentStore; +import uk.ac.ic.wlgitbridge.data.model.db.SqlitePersistentStore; import uk.ac.ic.wlgitbridge.snapshot.exception.FailedConnectionException; import uk.ac.ic.wlgitbridge.snapshot.getforversion.SnapshotAttachment; import uk.ac.ic.wlgitbridge.snapshot.push.exception.SnapshotPostException; @@ -31,7 +32,7 @@ public class DataStore { public DataStore(String rootGitDirectoryPath) { rootGitDirectory = initRootGitDirectory(rootGitDirectoryPath); - persistentStore = new PersistentStore(rootGitDirectory); + persistentStore = new SqlitePersistentStore(rootGitDirectory); List excludedFromDeletion = persistentStore.getProjectNames(); excludedFromDeletion.add(".wlgb"); Util.deleteInDirectoryApartFrom(rootGitDirectory, excludedFromDeletion.toArray(new String[] {})); diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcher.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcher.java index 4bc0c277d9..6e31ac9de8 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcher.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcher.java @@ -42,9 +42,15 @@ public class ResourceFetcher { if (contents == null) { RawFile rawFile = new RepositoryObjectTreeWalker(repository).getDirectoryContents().getFileTable().get(path); if (rawFile == null) { - throw new IllegalStateException("file was not in the current commit, or the git tree, yet path was not null"); + Util.sout( + "WARNING: " + + "File " + path + " was not in the current commit, or the git tree, yet path was not null. " + + "File url is: " + url + ); + contents = fetch(projectName, url, path); + } else { + contents = rawFile.getContents(); } - contents = rawFile.getContents(); } } return new RepositoryFile(newPath, contents); diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/db/PersistentStore.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/db/PersistentStore.java index 310a75f099..59cf8103c2 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/db/PersistentStore.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/db/PersistentStore.java @@ -1,72 +1,20 @@ package uk.ac.ic.wlgitbridge.data.model.db; -import uk.ac.ic.wlgitbridge.data.model.db.sql.SQLiteWLDatabase; - -import java.io.File; -import java.sql.SQLException; import java.util.List; /** - * Created by Winston on 19/11/14. + * Created by m on 20/11/15. */ -public class PersistentStore { +public interface PersistentStore { + List getProjectNames(); - private final SQLiteWLDatabase database; + void setLatestVersionForProject(String project, int versionID); - public PersistentStore(File rootGitDirectory) { - try { - database = new SQLiteWLDatabase(rootGitDirectory); - } catch (SQLException e) { - throw new RuntimeException(e); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } + int getLatestVersionForProject(String project); - public List getProjectNames() { - try { - return database.getProjectNames(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - public void setLatestVersionForProject(String project, int versionID) { - try { - database.setVersionIDForProject(project, versionID); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } + void addURLIndexForProject(String projectName, String url, String path); - public int getLatestVersionForProject(String project) { - try { - return database.getVersionIDForProjectName(project); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - - public void addURLIndexForProject(String projectName, String url, String path) { - try { - database.addURLIndex(projectName, url, path); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - - public void deleteFilesForProject(String project, String... files) { - try { - database.deleteFilesForProject(project, files); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - public String getPathForURLInProject(String projectName, String url) { - try { - return database.getPathForURLInProject(projectName, url); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } + void deleteFilesForProject(String project, String... files); + String getPathForURLInProject(String projectName, String url); } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/db/SqlitePersistentStore.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/db/SqlitePersistentStore.java new file mode 100644 index 0000000000..7a56d6111f --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/db/SqlitePersistentStore.java @@ -0,0 +1,78 @@ +package uk.ac.ic.wlgitbridge.data.model.db; + +import uk.ac.ic.wlgitbridge.data.model.db.sql.SQLiteWLDatabase; + +import java.io.File; +import java.sql.SQLException; +import java.util.List; + +/** + * Created by Winston on 19/11/14. + */ +public class SqlitePersistentStore implements PersistentStore { + + private final SQLiteWLDatabase database; + + public SqlitePersistentStore(File rootGitDirectory) { + try { + database = new SQLiteWLDatabase(rootGitDirectory); + } catch (SQLException e) { + throw new RuntimeException(e); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public List getProjectNames() { + try { + return database.getProjectNames(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + @Override + public void setLatestVersionForProject(String project, int versionID) { + try { + database.setVersionIDForProject(project, versionID); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + public int getLatestVersionForProject(String project) { + try { + return database.getVersionIDForProjectName(project); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + public void addURLIndexForProject(String projectName, String url, String path) { + try { + database.addURLIndex(projectName, url, path); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + public void deleteFilesForProject(String project, String... files) { + try { + database.deleteFilesForProject(project, files); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + @Override + public String getPathForURLInProject(String projectName, String url) { + try { + return database.getPathForURLInProject(projectName, url); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcherTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcherTest.java new file mode 100644 index 0000000000..c88cc3712b --- /dev/null +++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcherTest.java @@ -0,0 +1,91 @@ +package uk.ac.ic.wlgitbridge.data.model; + +import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.mockserver.model.HttpRequest.request; +import static org.mockserver.model.HttpResponse.response; + +import org.eclipse.jgit.lib.*; +import org.eclipse.jgit.storage.file.FileRepositoryBuilder; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.mockserver.client.server.MockServerClient; +import org.mockserver.junit.MockServerRule; +import uk.ac.ic.wlgitbridge.data.model.db.PersistentStore; + + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by m on 20/11/15. + */ +public class ResourceFetcherTest { + @Rule + public MockServerRule mockServerRule = new MockServerRule(this); + + private MockServerClient mockServerClient; + + @Test + public void fetchesFilesThatAreMissingFromUrlStoreCache() throws IOException { + final String testProjectName = "123abc"; + final String testUrl = "http://localhost:" + mockServerRule.getHttpPort() + "/123abc"; + + mockServerClient.when( + request() + .withMethod("GET") + .withPath("/123abc") + ) + .respond( + response() + .withStatusCode(200) + .withBody("content") + ); + + final PersistentStore persistentStore = new PersistentStore() { + @Override + public List getProjectNames() { + return null; + } + + @Override + public void setLatestVersionForProject(String project, int versionID) { + + } + + @Override + public int getLatestVersionForProject(String project) { + return 0; + } + + @Override + public void addURLIndexForProject(String projectName, String url, String path) { + + } + + @Override + public void deleteFilesForProject(String project, String... files) { + + } + + @Override + public String getPathForURLInProject(String projectName, String url) { + assertEquals(testProjectName, projectName); + assertEquals(testUrl, url); + return "missingPath"; + } + }; + + ResourceFetcher resourceFetcher = new ResourceFetcher(persistentStore); + TemporaryFolder repositoryFolder = new TemporaryFolder(); + repositoryFolder.create(); + Repository repository = new FileRepositoryBuilder().setWorkTree(repositoryFolder.getRoot()).build(); + Map fetchedUrls = new HashMap(); + resourceFetcher.get(testProjectName, testUrl, "testPath", repository, fetchedUrls); + // public RawFile get(String projectName, String url, String newPath, Repository repository, Map fetchedUrls) throws IOException { + + } +} \ No newline at end of file diff --git a/services/git-bridge/writelatex-git-bridge.iml b/services/git-bridge/writelatex-git-bridge.iml index 2b9d1d4a93..9352c43918 100644 --- a/services/git-bridge/writelatex-git-bridge.iml +++ b/services/git-bridge/writelatex-git-bridge.iml @@ -44,5 +44,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file