From 56c4e1b0b9ba12df20f620d507a30e416e6aac27 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Mon, 13 Jun 2011 15:46:28 +0200 Subject: [PATCH] added getContent api --- .../scm/repository/HgRepositoryBrowser.java | 42 ++++++++++ .../scm/repository/RepositoryBrowser.java | 16 ++++ .../rest/resources/RepositoryResource.java | 80 +++++++++++++++++++ 3 files changed, 138 insertions(+) diff --git a/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryBrowser.java b/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryBrowser.java index 094619c799..342d25da5a 100644 --- a/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryBrowser.java +++ b/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryBrowser.java @@ -43,6 +43,7 @@ import sonia.scm.util.Util; //~--- JDK imports ------------------------------------------------------------ +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -102,6 +103,47 @@ public class HgRepositoryBrowser implements RepositoryBrowser //~--- get methods ---------------------------------------------------------- + /** + * Method description + * + * + * @param revision + * @param path + * + * @return + * + * @throws IOException + * @throws RepositoryException + */ + @Override + public InputStream getContent(String revision, String path) + throws IOException, RepositoryException + { + if (Util.isEmpty(revision)) + { + revision = DEFAULT_REVISION; + } + + File directory = handler.getDirectory(repository); + ProcessBuilder builder = + new ProcessBuilder(handler.getConfig().getHgBinary(), "cat", "-r", + revision, Util.nonNull(path)); + + if (logger.isDebugEnabled()) + { + StringBuilder msg = new StringBuilder(); + + for (String param : builder.command()) + { + msg.append(param).append(" "); + } + + logger.debug(msg.toString()); + } + + return builder.directory(directory).start().getInputStream(); + } + /** * Method description * diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryBrowser.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryBrowser.java index b10460f507..e3d9efbefd 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryBrowser.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryBrowser.java @@ -36,6 +36,7 @@ package sonia.scm.repository; //~--- JDK imports ------------------------------------------------------------ import java.io.IOException; +import java.io.InputStream; /** * @@ -45,6 +46,21 @@ import java.io.IOException; public interface RepositoryBrowser { + /** + * Method description + * + * + * @param revision + * @param path + * + * @return + * + * @throws IOException + * @throws RepositoryException + */ + public InputStream getContent(String revision, String path) + throws IOException, RepositoryException;; + /** * Method description * diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java index e0c5928c3d..06aaedbb26 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java @@ -59,11 +59,16 @@ import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryHandler; import sonia.scm.repository.RepositoryManager; import sonia.scm.util.HttpUtil; +import sonia.scm.util.IOUtil; import sonia.scm.util.Util; import sonia.scm.web.security.WebSecurityContext; //~--- JDK imports ------------------------------------------------------------ +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -78,9 +83,11 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.GenericEntity; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import javax.ws.rs.core.StreamingOutput; /** * @@ -239,6 +246,79 @@ public class RepositoryResource return response; } + /** + * Method description + * + * + * @param id + * @param revision + * @param path + * + * @return + */ + @GET + @Path("{id}/content") + @Produces({ MediaType.APPLICATION_OCTET_STREAM }) + public StreamingOutput getContent(@PathParam("id") String id, + @QueryParam("revision") String revision, + @QueryParam("path") String path) + { + StreamingOutput output = null; + Repository repository = repositoryManager.get(id); + + if (repository != null) + { + try + { + RepositoryBrowser browser = + repositoryManager.getRepositoryBrowser(repository); + + if (browser != null) + { + final InputStream content = browser.getContent(revision, path); + + if (content != null) + { + output = new StreamingOutput() + { + @Override + public void write(OutputStream output) + throws IOException, WebApplicationException + { + try + { + IOUtil.copy(content, output); + } + finally + { + IOUtil.close(content); + } + } + }; + } + else if (logger.isWarnEnabled()) + { + logger.warn( + "could not find content, repository: {}, path: {}, revision: {}", + new Object[] { repository.getId(), + path, revision }); + } + } + else if (logger.isWarnEnabled()) + { + logger.warn("could not find repository browser for respository {}", + repository.getId()); + } + } + catch (Exception ex) + { + logger.error("could not retrive content", ex); + } + } + + return output; + } + //~--- methods -------------------------------------------------------------- /**