Author: brane
Date: Thu Jan 17 14:50:52 2019
New Revision: 1851536

URL: http://svn.apache.org/viewvc?rev=1851536&view=rev
Log:
Expose the output arguments of svn_client_blame6 in JavaHL.

[in subversion/bindings/javahl/src/org/apache/subversion]
* callback/BlameRangeCallback.java: New callback for ISVNClient.blame.
* callback/BlameLineCallback.java: Remove unused import.
* ISVNClient.java
  (ISVNClient.blame): Add range callback parameter. Update docstring.
* SVNClient.java
  (SVNClient.blame): Update wrapper and native method declaration.

[in subversion/bindings/javahl/native]
* BlameCallback.h
  (BlameCallback::BlameCallback): Change constructor signature.
  (BlameCallback::get_start_revnum_p, BlameCallback::get_end_revnum_p): New.
  (BlameCallback::setRange): New.
  (BlameCallback::m_start_revnum, BlameCallback::m_start_revnum,
   BlameCallback::m_range_callback_invoked, BlameCallback::m_range_callback): 
New.
  (BlameCallback::m_line_callback): Renamed from m_callback.
* BlameCallback.cpp: Include svn_private_config.h.
  (BlameCallback::BlameCallback): Update constructor implementation.
  (BlameCallback::callback): Update static callback implementation.
  (BlameCallback::setRange): Implement.
  (BlameCallback::singleLine): Notice changed member variable name.
* SVNClient.cpp
  (SVNClient::blame): Set blame output arguments from the callback.
* org_apache_subversion_javahl_SVNClient.cpp
  (Java_org_apache_subversion_javahl_SVNClient_blame): Update native method.

[in subversion/bindings/javahl/tests/org/apache/subversion/javahl]
* BasicTests.java
  (BlameRangeCallbackImpl): New helper class.
  (testBinaryBlame): Also test the returned revision range.
* ExceptionTests.java
  (testBlameCallback): Check that a null range callback doesn't cause 
exceptions.

Added:
    
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameRangeCallback.java
   (with props)
Modified:
    subversion/trunk/subversion/bindings/javahl/native/BlameCallback.cpp
    subversion/trunk/subversion/bindings/javahl/native/BlameCallback.h
    subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp
    
subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
    
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
    
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
    
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameLineCallback.java
    
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
    
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java

Modified: subversion/trunk/subversion/bindings/javahl/native/BlameCallback.cpp
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/BlameCallback.cpp?rev=1851536&r1=1851535&r2=1851536&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/BlameCallback.cpp 
(original)
+++ subversion/trunk/subversion/bindings/javahl/native/BlameCallback.cpp Thu 
Jan 17 14:50:52 2019
@@ -28,14 +28,20 @@
 #include "CreateJ.h"
 #include "JNIUtil.h"
 #include "svn_time.h"
+
+#include "svn_private_config.h"
+
 /**
  * Create a BlameCallback object
  * @param jcallback the Java callback object.
  */
-BlameCallback::BlameCallback(jobject jcallback)
-{
-  m_callback = jcallback;
-}
+BlameCallback::BlameCallback(jobject jrangeCallback, jobject jlineCallback)
+  : m_start_revnum(SVN_INVALID_REVNUM),
+    m_end_revnum(SVN_INVALID_REVNUM),
+    m_range_callback_invoked(false),
+    m_range_callback(jrangeCallback),
+    m_line_callback(jlineCallback)
+{}
 /**
  * Destroy a BlameCallback object
  */
@@ -58,14 +64,65 @@ BlameCallback::callback(void *baton,
                         svn_boolean_t local_change,
                         apr_pool_t *pool)
 {
-  if (baton)
-    return static_cast<BlameCallback *>(baton)->singleLine(
-        line_no, revision, rev_props, merged_revision,
-        merged_rev_props, merged_path, line, local_change, pool);
+  BlameCallback *const self = static_cast<BlameCallback *>(baton);
+  svn_error_t *err = SVN_NO_ERROR;
+
+  if (self)
+    {
+      if (self->m_range_callback && !self->m_range_callback_invoked)
+        {
+          self->m_range_callback_invoked = true;
+          err = self->setRange();
+        }
+
+      if (self->m_line_callback && err == SVN_NO_ERROR)
+        {
+          err = self->singleLine(
+              line_no, revision, rev_props, merged_revision,
+              merged_rev_props, merged_path, line, local_change, pool);
+        }
+    }
+
+  return err;
+}
+
+svn_error_t *
+BlameCallback::setRange()
+{
+  if (m_start_revnum == SVN_INVALID_REVNUM
+      || m_end_revnum == SVN_INVALID_REVNUM)
+    return svn_error_create(SVN_ERR_CLIENT_BAD_REVISION, NULL,
+                            _("Blame revision range was not resolved"));
+
+  JNIEnv *env = JNIUtil::getEnv();
+
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
+    return SVN_NO_ERROR;
 
-  return SVN_NO_ERROR;
+  // The method id will not change during the time this library is
+  // loaded, so it can be cached.
+  static jmethodID mid = 0;
+  if (mid == 0)
+    {
+      jclass clazz = 
env->FindClass(JAVAHL_CLASS("/callback/BlameRangeCallback"));
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN(SVN_NO_ERROR);
+
+      mid = env->GetMethodID(clazz, "setRange", "(JJ)V");
+      if (JNIUtil::isJavaExceptionThrown() || mid == 0)
+        POP_AND_RETURN(SVN_NO_ERROR);
+    }
+
+  // call the Java method
+  env->CallVoidMethod(m_range_callback, mid,
+                      (jlong)m_start_revnum, (jlong)m_end_revnum);
+
+  POP_AND_RETURN_EXCEPTION_AS_SVNERROR();
 }
 
+
 /**
  * Callback called for a single line in the file, for which the blame
  * information was requested.  See the Java-doc for more information.
@@ -122,7 +179,7 @@ BlameCallback::singleLine(apr_int64_t li
     POP_AND_RETURN(SVN_NO_ERROR);
 
   // call the Java method
-  env->CallVoidMethod(m_callback, mid, (jlong)line_no, (jlong)revision,
+  env->CallVoidMethod(m_line_callback, mid, (jlong)line_no, (jlong)revision,
                       jrevProps, (jlong)mergedRevision, jmergedRevProps,
                       jmergedPath, (jboolean)localChange, jline);
 

Modified: subversion/trunk/subversion/bindings/javahl/native/BlameCallback.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/BlameCallback.h?rev=1851536&r1=1851535&r2=1851536&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/BlameCallback.h 
(original)
+++ subversion/trunk/subversion/bindings/javahl/native/BlameCallback.h Thu Jan 
17 14:50:52 2019
@@ -37,7 +37,7 @@
 class BlameCallback
 {
  public:
-  BlameCallback(jobject jcallback);
+  BlameCallback(jobject jrangeCallback, jobject jlineCallback);
   ~BlameCallback();
 
   static svn_error_t *callback(void *baton,
@@ -51,7 +51,11 @@ class BlameCallback
                                svn_boolean_t local_change,
                                apr_pool_t *pool);
 
+  svn_revnum_t *get_start_revnum_p() { return &m_start_revnum; }
+  svn_revnum_t *get_end_revnum_p()   { return &m_end_revnum; }
+
  protected:
+  svn_error_t *setRange();
   svn_error_t *singleLine(apr_int64_t line_no,
                           svn_revnum_t revision,
                           apr_hash_t *rev_props,
@@ -63,10 +67,14 @@ class BlameCallback
                           apr_pool_t *pool);
 
  private:
-  /**
-   * This a local reference to the Java object.
-   */
-  jobject m_callback;
+  // Arguments for svn_client_blame6
+  svn_revnum_t m_start_revnum;
+  svn_revnum_t m_end_revnum;
+  bool m_range_callback_invoked;
+
+  // These are local references to the Java objects.
+  jobject m_range_callback;
+  jobject m_line_callback;
 };
 
 #endif  // BLAMECALLBACK_H

Modified: subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp?rev=1851536&r1=1851535&r2=1851536&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp Thu Jan 17 
14:50:52 2019
@@ -1285,7 +1285,8 @@ void SVNClient::blame(const char *path,
         return;
 
     SVN_JNI_ERR(svn_client_blame6(
-          NULL, NULL,           // TODO: start and end revision numbers
+          callback->get_start_revnum_p(),
+          callback->get_end_revnum_p(),
           intPath.c_str(), pegRevision.revision(), revisionStart.revision(),
           revisionEnd.revision(),
           options.fileOptions(subPool), ignoreMimeType,

Modified: 
subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp?rev=1851536&r1=1851535&r2=1851536&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
 (original)
+++ 
subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
 Thu Jan 17 14:50:52 2019
@@ -1656,10 +1656,11 @@ Java_org_apache_subversion_javahl_SVNCli
 
 JNIEXPORT void JNICALL
 Java_org_apache_subversion_javahl_SVNClient_blame
-(JNIEnv *env, jobject jthis, jstring jpath, jobject jpegRevision,
+(JNIEnv *env, jobject jthis,
+ jstring jpath, jobject jpegRevision,
  jobject jrevisionStart, jobject jrevisionEnd, jboolean jignoreMimeType,
  jboolean jincludeMergedRevisions, jobject jdiffOptions,
- jobject jblameCallback)
+ jobject jrangeCallback, jobject jlineCallback)
 {
   JNIEntry(SVNClient, blame);
   SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -1688,7 +1689,7 @@ Java_org_apache_subversion_javahl_SVNCli
   if (JNIUtil::isExceptionThrown())
     return;
 
-  BlameCallback callback(jblameCallback);
+  BlameCallback callback(jrangeCallback, jlineCallback);
   cl->blame(path, pegRevision, revisionStart, revisionEnd,
             jignoreMimeType ? true : false,
             jincludeMergedRevisions ? true : false, &callback,

Modified: 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java?rev=1851536&r1=1851535&r2=1851536&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
 (original)
+++ 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
 Thu Jan 17 14:50:52 2019
@@ -1386,7 +1386,7 @@ public interface ISVNClient
 
     /**
      * Retrieve the content together with the author, the revision and the date
-     * of the last change of each line
+     * of the last change of each line.
      * @param path          the path
      * @param pegRevision   the revision to interpret the path
      * @param revisionStart the first revision to show
@@ -1395,15 +1395,18 @@ public interface ISVNClient
      * @param includeMergedRevisions whether or not to include extra merge
      *                      information
      * @param options       additional options for controlling the output
-     * @param callback      callback to receive the file content and the other
-     *                      information
+     * @param rangeCallback receives the resolved revision range; called
+     *                      exactly once before #lineCallback
+     * @param lineCallback  callback to receive the file content and the other
+     *                      information for every line in the file
      * @throws ClientException
      * @since 1.12
      */
     void blame(String path, Revision pegRevision, Revision revisionStart,
                Revision revisionEnd, boolean ignoreMimeType,
-               boolean includeMergedRevisions,
-               DiffOptions options, BlameLineCallback callback)
+               boolean includeMergedRevisions, DiffOptions options,
+               BlameRangeCallback rangeCallback,
+               BlameLineCallback lineCallback)
         throws ClientException;
 
     /**

Modified: 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java?rev=1851536&r1=1851535&r2=1851536&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
 (original)
+++ 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
 Thu Jan 17 14:50:52 2019
@@ -729,7 +729,7 @@ public class SVNClient implements ISVNCl
     {
         blame(path, pegRevision, revisionStart, revisionEnd,
               ignoreMimeType, includeMergedRevisions, options,
-              new BlameCallbackAdapter(callback));
+              null, new BlameCallbackAdapter(callback));
     }
 
     public native void blame(String path, Revision pegRevision,
@@ -737,7 +737,8 @@ public class SVNClient implements ISVNCl
                              Revision revisionEnd, boolean ignoreMimeType,
                              boolean includeMergedRevisions,
                              DiffOptions options,
-                             BlameLineCallback callback)
+                             BlameRangeCallback rangeCallback,
+                             BlameLineCallback lineCallback)
         throws ClientException;
 
     public native void setConfigDirectory(String configDir)

Modified: 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameLineCallback.java
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameLineCallback.java?rev=1851536&r1=1851535&r2=1851536&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameLineCallback.java
 (original)
+++ 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameLineCallback.java
 Thu Jan 17 14:50:52 2019
@@ -26,7 +26,6 @@ package org.apache.subversion.javahl.cal
 import org.apache.subversion.javahl.ClientException;
 
 import java.util.Map;
-import org.apache.subversion.javahl.ISVNClient;
 
 /**
  * This interface is used to receive every single line for a file on a

Added: 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameRangeCallback.java
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameRangeCallback.java?rev=1851536&view=auto
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameRangeCallback.java
 (added)
+++ 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameRangeCallback.java
 Thu Jan 17 14:50:52 2019
@@ -0,0 +1,43 @@
+/**
+ * @copyright
+ * ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one
+ *    or more contributor license agreements.  See the NOTICE file
+ *    distributed with this work for additional information
+ *    regarding copyright ownership.  The ASF licenses this file
+ *    to you under the Apache License, Version 2.0 (the
+ *    "License"); you may not use this file except in compliance
+ *    with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing,
+ *    software distributed under the License is distributed on an
+ *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *    KIND, either express or implied.  See the License for the
+ *    specific language governing permissions and limitations
+ *    under the License.
+ * ====================================================================
+ * @endcopyright
+ */
+
+package org.apache.subversion.javahl.callback;
+
+import org.apache.subversion.javahl.ClientException;
+
+/**
+ * This interface is used to the resolved revision range
+ * the {@link ISVNClient#blame} call.
+ * @since 1.12
+ */
+public interface BlameRangeCallback
+{
+    /**
+     * This method will be called once before #{BlameLineCallback.singleLine}
+     * is called for the first time.
+     * @param startRevision     the resolved start of the blame range.
+     * @param endRevision       the resolved end of the blame range.
+     */
+    public void setRange(long startRevision, long endRevision)
+        throws ClientException;
+}

Propchange: 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameRangeCallback.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java?rev=1851536&r1=1851535&r2=1851536&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
 (original)
+++ 
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
 Thu Jan 17 14:50:52 2019
@@ -4185,13 +4185,16 @@ public class BasicTests extends SVNTests
         }
 
         // Test the current interface
-        BlameLineCallbackImpl callback = new BlameLineCallbackImpl();
+        BlameRangeCallbackImpl rangeCallback = new BlameRangeCallbackImpl();
+        BlameLineCallbackImpl lineCallback = new BlameLineCallbackImpl();
         client.blame(thisTest.getWCPath() + "/iota", Revision.HEAD,
                      Revision.getInstance(0), Revision.HEAD,
-                     false, false, null, callback);
-        assertEquals(1, callback.numberOfLines());
+                     false, false, null, rangeCallback, lineCallback);
+        assertEquals(0, rangeCallback.startRevnum);
+        assertEquals(2, rangeCallback.endRevnum);
+        assertEquals(1, lineCallback.numberOfLines());
 
-        BlameLineCallbackImpl.BlameLine line = callback.getBlameLine(0);
+        BlameLineCallbackImpl.BlameLine line = lineCallback.getBlameLine(0);
         assertNotNull(line);
         assertEquals(2, line.getRevision());
         assertEquals("rayjandom", line.getAuthor());
@@ -5025,7 +5028,19 @@ public class BasicTests extends SVNTests
         }
     }
 
-    /* A blame callback implementation. */
+    /* A blame range callback implementation. */
+    protected class BlameRangeCallbackImpl implements BlameRangeCallback
+    {
+        public long startRevnum = -1;
+        public long endRevnum = -1;
+        public void setRange(long start, long end)
+        {
+            startRevnum = start;
+            endRevnum = end;
+        }
+    }
+
+    /* A blame line callback implementation. */
     protected class BlameLineCallbackImpl implements BlameLineCallback
     {
 

Modified: 
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java?rev=1851536&r1=1851535&r2=1851536&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java
 (original)
+++ 
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java
 Thu Jan 17 14:50:52 2019
@@ -206,7 +206,7 @@ public class ExceptionTests extends SVNT
         {
             client.blame(thisTest.getWorkingCopy() + "/iota",
                          Revision.getInstance(1), Revision.getInstance(1),
-                         Revision.getInstance(1), false, false, null,
+                         Revision.getInstance(1), false, false, null, null,
                          new BlameLineCallback() {
                              public void singleLine(long lineNum, long 
revision,
                                                     Map<String, byte[]> 
revProps, long mergedRevision,


Reply via email to