diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/BrowserStreamingOutput.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/BrowserStreamingOutput.java new file mode 100644 index 0000000000..c9f9f5f680 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/BrowserStreamingOutput.java @@ -0,0 +1,140 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.api.rest.resources; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.repository.PathNotFoundException; +import sonia.scm.repository.RepositoryBrowser; +import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RevisionNotFoundException; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; +import java.io.OutputStream; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.StreamingOutput; + +/** + * + * @author Sebastian Sdorra + */ +public class BrowserStreamingOutput implements StreamingOutput +{ + + /** the logger for BrowserStreamingOutput */ + private static final Logger logger = + LoggerFactory.getLogger(BrowserStreamingOutput.class); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param browser + * @param revision + * @param path + */ + public BrowserStreamingOutput(RepositoryBrowser browser, String revision, + String path) + { + this.browser = browser; + this.revision = revision; + this.path = path; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param output + * + * @throws IOException + * @throws WebApplicationException + */ + @Override + public void write(OutputStream output) + throws IOException, WebApplicationException + { + try + { + browser.getContent(revision, path, output); + } + catch (PathNotFoundException ex) + { + if (logger.isWarnEnabled()) + { + logger.warn("could not find path {}", ex.getPath()); + } + + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + catch (RevisionNotFoundException ex) + { + if (logger.isWarnEnabled()) + { + logger.warn("could not find revision {}", ex.getRevision()); + } + + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + catch (RepositoryException ex) + { + logger.error("could not write content to page", ex); + + throw new WebApplicationException(ex, + Response.Status.INTERNAL_SERVER_ERROR); + } + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private RepositoryBrowser browser; + + /** Field description */ + private String path; + + /** Field description */ + private String revision; +} diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/DiffStreamingOutput.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/DiffStreamingOutput.java new file mode 100644 index 0000000000..b21a2676c9 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/DiffStreamingOutput.java @@ -0,0 +1,140 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.api.rest.resources; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.repository.DiffViewer; +import sonia.scm.repository.PathNotFoundException; +import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RevisionNotFoundException; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; +import java.io.OutputStream; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.StreamingOutput; + +/** + * + * @author Sebastian Sdorra + */ +public class DiffStreamingOutput implements StreamingOutput +{ + + /** the logger for DiffStreamingOutput */ + private static final Logger logger = + LoggerFactory.getLogger(DiffStreamingOutput.class); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param diffViewer + * @param revision + * @param path + */ + public DiffStreamingOutput(DiffViewer diffViewer, String revision, + String path) + { + this.diffViewer = diffViewer; + this.revision = revision; + this.path = path; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param output + * + * @throws IOException + * @throws WebApplicationException + */ + @Override + public void write(OutputStream output) + throws IOException, WebApplicationException + { + try + { + diffViewer.getDiff(revision, path, output); + } + catch (PathNotFoundException ex) + { + if (logger.isWarnEnabled()) + { + logger.warn("could not find path {}", ex.getPath()); + } + + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + catch (RevisionNotFoundException ex) + { + if (logger.isWarnEnabled()) + { + logger.warn("could not find revision {}", ex.getRevision()); + } + + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + catch (RepositoryException ex) + { + logger.error("could not write content to page", ex); + + throw new WebApplicationException(ex, + Response.Status.INTERNAL_SERVER_ERROR); + } + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private DiffViewer diffViewer; + + /** Field description */ + private String path; + + /** Field description */ + private String revision; +} 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 f8118eab97..50800ae533 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 @@ -49,7 +49,7 @@ import sonia.scm.repository.BlameViewerUtil; import sonia.scm.repository.BrowserResult; import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.ChangesetViewerUtil; -import sonia.scm.repository.PathNotFoundException; +import sonia.scm.repository.DiffViewer; import sonia.scm.repository.Permission; import sonia.scm.repository.PermissionType; import sonia.scm.repository.PermissionUtil; @@ -60,7 +60,6 @@ import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryHandler; import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryNotFoundException; -import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.util.AssertUtil; import sonia.scm.util.HttpUtil; import sonia.scm.web.security.WebSecurityContext; @@ -68,7 +67,6 @@ import sonia.scm.web.security.WebSecurityContext; //~--- JDK imports ------------------------------------------------------------ import java.io.IOException; -import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; @@ -79,7 +77,6 @@ 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; @@ -340,6 +337,58 @@ public class RepositoryResource return response; } + /** + * Method description + * + * + * @param id + * @param revision + * @param path + * + * @return + * + * @throws IOException + * @throws RepositoryException + */ + @GET + @Path("{id}/diff") + public Response getDiff(@PathParam("id") String id, + @QueryParam("revision") String revision, + @QueryParam("path") String path) + throws RepositoryException, IOException + { + AssertUtil.assertIsNotEmpty(id); + AssertUtil.assertIsNotEmpty(revision); + + Response response = null; + + try + { + Repository repository = repositoryManager.get(id); + + if (repository != null) + { + DiffViewer diffViewer = repositoryManager.getDiffViewer(repository); + + if (diffViewer != null) + { + response = Response.ok(new DiffStreamingOutput(diffViewer, revision, + path)).build(); + } + else + { + response = Response.status(Response.Status.NOT_FOUND).build(); + } + } + } + catch (RepositoryNotFoundException ex) + { + response = Response.status(Response.Status.NOT_FOUND).build(); + } + + return response; + } + //~--- methods -------------------------------------------------------------- /** @@ -505,93 +554,6 @@ public class RepositoryResource PermissionType.OWNER); } - //~--- inner classes -------------------------------------------------------- - - /** - * Class description - * - * - * @version Enter version here..., 11/06/18 - * @author Enter your name here... - */ - private static class BrowserStreamingOutput implements StreamingOutput - { - - /** - * Constructs ... - * - * - * @param browser - * @param revision - * @param path - */ - public BrowserStreamingOutput(RepositoryBrowser browser, String revision, - String path) - { - this.browser = browser; - this.revision = revision; - this.path = path; - } - - //~--- methods ------------------------------------------------------------ - - /** - * Method description - * - * - * @param output - * - * @throws IOException - * @throws WebApplicationException - */ - @Override - public void write(OutputStream output) - throws IOException, WebApplicationException - { - try - { - browser.getContent(revision, path, output); - } - catch (PathNotFoundException ex) - { - if (logger.isWarnEnabled()) - { - logger.warn("could not find path {}", ex.getPath()); - } - - throw new WebApplicationException(Response.Status.NOT_FOUND); - } - catch (RevisionNotFoundException ex) - { - if (logger.isWarnEnabled()) - { - logger.warn("could not find revision {}", ex.getRevision()); - } - - throw new WebApplicationException(Response.Status.NOT_FOUND); - } - catch (RepositoryException ex) - { - logger.error("could not write content to page", ex); - - throw new WebApplicationException( - ex, Response.Status.INTERNAL_SERVER_ERROR); - } - } - - //~--- fields ------------------------------------------------------------- - - /** Field description */ - private RepositoryBrowser browser; - - /** Field description */ - private String path; - - /** Field description */ - private String revision; - } - - //~--- fields --------------------------------------------------------------- /** Field description */