diff --git a/scm-clients/scm-client-api/src/main/java/sonia/scm/client/ClientRepositoryBrowser.java b/scm-clients/scm-client-api/src/main/java/sonia/scm/client/ClientRepositoryBrowser.java index fabf35eed8..5c1f753e63 100644 --- a/scm-clients/scm-client-api/src/main/java/sonia/scm/client/ClientRepositoryBrowser.java +++ b/scm-clients/scm-client-api/src/main/java/sonia/scm/client/ClientRepositoryBrowser.java @@ -33,6 +33,10 @@ package sonia.scm.client; +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.repository.BlameLine; + //~--- JDK imports ------------------------------------------------------------ import java.io.IOException; @@ -48,6 +52,17 @@ import java.util.List; public interface ClientRepositoryBrowser { + /** + * Method description + * + * + * @param revision + * @param path + * + * @return + */ + public List getBlameLines(String revision, String path); + /** * Method description * diff --git a/scm-clients/scm-client-api/src/main/java/sonia/scm/client/FileObjectWrapper.java b/scm-clients/scm-client-api/src/main/java/sonia/scm/client/FileObjectWrapper.java index 2f987d4a9e..1c6c0aaeda 100644 --- a/scm-clients/scm-client-api/src/main/java/sonia/scm/client/FileObjectWrapper.java +++ b/scm-clients/scm-client-api/src/main/java/sonia/scm/client/FileObjectWrapper.java @@ -35,6 +35,7 @@ package sonia.scm.client; //~--- non-JDK imports -------------------------------------------------------- +import sonia.scm.repository.BlameLine; import sonia.scm.repository.FileObject; //~--- JDK imports ------------------------------------------------------------ @@ -70,6 +71,17 @@ public class FileObjectWrapper //~--- get methods ---------------------------------------------------------- + /** + * Method description + * + * + * @return + */ + public List getBlameLines() + { + return repositoryBrowser.getBlameLines(revision, getPath()); + } + /** * Method description * diff --git a/scm-clients/scm-client-api/src/main/java/sonia/scm/client/ScmUrlProvider.java b/scm-clients/scm-client-api/src/main/java/sonia/scm/client/ScmUrlProvider.java index 89c726a24a..1382a0325e 100644 --- a/scm-clients/scm-client-api/src/main/java/sonia/scm/client/ScmUrlProvider.java +++ b/scm-clients/scm-client-api/src/main/java/sonia/scm/client/ScmUrlProvider.java @@ -79,6 +79,9 @@ public class ScmUrlProvider /** Field description */ public static final String URLPART_USERS = "users"; + /** Field description */ + public static final String URLPATTERN_BLAME = "repositories/{0}/blame"; + /** Field description */ public static final String URLPATTERN_BROWSE = "repositories/{0}/browse"; @@ -153,6 +156,24 @@ public class ScmUrlProvider return baseUrl; } + /** + * Method description + * + * + * @param repositoryId + * @param path + * @param revision + * + * @return + */ + public String getBlameUrl(String repositoryId, String path, String revision) + { + String url = MessageFormat.format(getResourceUrl(URLPATTERN_BLAME), + repositoryId); + + return appendParameter(url, path, revision); + } + /** * Method description * @@ -215,20 +236,8 @@ public class ScmUrlProvider { String url = MessageFormat.format(getResourceUrl(URLPATTERN_BROWSE), repositoryId); - String s = "?"; - if (Util.isNotEmpty(path)) - { - url = url.concat(s).concat("path=").concat(path); - s = "&"; - } - - if (Util.isNotEmpty(revision)) - { - url = url.concat(s).concat("revision=").concat(revision); - } - - return url; + return appendParameter(url, path, revision); } /** @@ -391,6 +400,36 @@ public class ScmUrlProvider this.extension = extension; } + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param url + * @param path + * @param revision + * + * @return + */ + private String appendParameter(String url, String path, String revision) + { + String s = "?"; + + if (Util.isNotEmpty(path)) + { + url = url.concat(s).concat("path=").concat(path); + s = "&"; + } + + if (Util.isNotEmpty(revision)) + { + url = url.concat(s).concat("revision=").concat(revision); + } + + return url; + } + //~--- fields --------------------------------------------------------------- /** Field description */ diff --git a/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientRepositoryBrowser.java b/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientRepositoryBrowser.java index bbdb9333de..985748f0ab 100644 --- a/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientRepositoryBrowser.java +++ b/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientRepositoryBrowser.java @@ -35,6 +35,8 @@ package sonia.scm.client; //~--- non-JDK imports -------------------------------------------------------- +import sonia.scm.repository.BlameLine; +import sonia.scm.repository.BlameResult; import sonia.scm.repository.BrowserResult; import sonia.scm.repository.FileObject; import sonia.scm.repository.Repository; @@ -75,6 +77,47 @@ public class JerseyClientRepositoryBrowser implements ClientRepositoryBrowser //~--- get methods ---------------------------------------------------------- + /** + * Method description + * + * + * @param revision + * @param path + * + * @return + */ + @Override + public List getBlameLines(String revision, String path) + { + List blameLines = null; + String url = + session.getUrlProvider().getBlameUrl(repository.getId(), path, + revision); + WebResource resource = session.getClient().resource(url); + ClientResponse response = null; + + try + { + response = resource.get(ClientResponse.class); + + if (response.getStatus() != ScmClientException.SC_NOTFOUND) + { + ClientUtil.checkResponse(response, 200); + + BlameResult result = response.getEntity(BlameResult.class); + + AssertUtil.assertIsNotNull(result); + blameLines = result.getBlameLines(); + } + } + finally + { + ClientUtil.close(response); + } + + return blameLines; + } + /** * Method description * @@ -91,8 +134,8 @@ public class JerseyClientRepositoryBrowser implements ClientRepositoryBrowser { InputStream input = null; String url = - session.getUrlProvider().getRepositoryContentUrl(repository.getId(), path, - revision); + session.getUrlProvider().getRepositoryContentUrl(repository.getId(), + path, revision); WebResource resource = session.getClient().resource(url); ClientResponse response = null;