You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2010/09/01 17:18:11 UTC

svn commit: r991569 - in /subversion/trunk/subversion/bindings/javahl: native/ src/org/apache/subversion/javahl/

Author: hwright
Date: Wed Sep  1 15:18:10 2010
New Revision: 991569

URL: http://svn.apache.org/viewvc?rev=991569&view=rev
Log:
JavaHL: First part of an effort to simplify the commit message callback
handling.  In C++-land, don't hold a global reference to a commit message
callback, but instead require each commit-y API to provide a commit message
callback.

* subversion/bindings/javahl/native/CommitMessage.h
  (makeCCommitMessage): Remove.
  (callback): New.
  (getCommitMessage): Make protected.
  (CommitMessage): Make public.

* subversion/bindings/javahl/native/SVNClient.h
  (doImport, mkdir, commit, remove, move, copy): Replace the message param
    with the commit callback.

* subversion/bindings/javahl/native/SVNClient.cpp
  (remove, commit, copy, move, doImport, mkdir): Same.

* subversion/bindings/javahl/native/CommitMessage.cpp
  (~CommitMessage): Don't destory the reference (no need).
  (callback): New.
  (makeCCommitMessage): Remove.
  (getCommitMessage): Return the log message through output params.

* subversion/bindings/javahl/native/ClientContext.h
  (m_commitMessage, getCommitMessage, getCommitMessageBaton): Remove.
  (getContext): Accept a commit message handler, rather than a message.
  (commitMessageHandler): Remove.
 
* subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
  (Java_org_apache_subversion_javahl_SVNClient_commitMessageHandler): Remove.
  (Java_org_apache_subversion_javahl_SVNClient_remove,
   Java_org_apache_subversion_javahl_SVNClient_commit,
   Java_org_apache_subversion_javahl_SVNClient_copy,
   Java_org_apache_subversion_javahl_SVNClient_move,
   Java_org_apache_subversion_javahl_SVNClient_mkdir,
   Java_org_apache_subversion_javahl_SVNClient_doImport):
    Convert to use an explicit commit message handler, rather than just a
    commit message.

* subversion/bindings/javahl/native/ClientContext.cpp
  (ClientContext): Don't initialize the global commit message value,
    but do initialize the log message func.
  (~ClientContext): Don't destroy the global commit message value.
  (getContext): Set the log message baton as the provided message handler.
  (getCommitMessage, getCommitMessageBaton, commitMessageHandler): Remove.

* subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
  (commitMessageHandler): Add a native implementation.
  (remove, commit, copy, move, mkdir, doImport): Implement the public API as
    wrappers around the update C++ APIs.
  (ConstMsg): New helper class to implement the above wrappers.

Modified:
    subversion/trunk/subversion/bindings/javahl/native/ClientContext.cpp
    subversion/trunk/subversion/bindings/javahl/native/ClientContext.h
    subversion/trunk/subversion/bindings/javahl/native/CommitMessage.cpp
    subversion/trunk/subversion/bindings/javahl/native/CommitMessage.h
    subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp
    subversion/trunk/subversion/bindings/javahl/native/SVNClient.h
    subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
    subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java

Modified: subversion/trunk/subversion/bindings/javahl/native/ClientContext.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/ClientContext.cpp?rev=991569&r1=991568&r2=991569&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/ClientContext.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/ClientContext.cpp Wed Sep  1 15:18:10 2010
@@ -44,8 +44,7 @@ struct log_msg_baton
 };
 
 ClientContext::ClientContext(jobject jsvnclient)
-    : m_prompter(NULL),
-      m_commitMessage(NULL)
+    : m_prompter(NULL)
 {
     JNIEnv *env = JNIUtil::getEnv();
     JNICriticalSection criticalSection(*JNIUtil::getGlobalPoolMutex());
@@ -85,7 +84,7 @@ ClientContext::ClientContext(jobject jsv
        this object. */
     persistentCtx->notify_func = NULL;
     persistentCtx->notify_baton = NULL;
-    persistentCtx->log_msg_func3 = getCommitMessage;
+    persistentCtx->log_msg_func3 = CommitMessage::callback;
     persistentCtx->cancel_func = checkCancel;
     persistentCtx->cancel_baton = this;
     persistentCtx->notify_func2= notify;
@@ -99,14 +98,13 @@ ClientContext::ClientContext(jobject jsv
 ClientContext::~ClientContext()
 {
     delete m_prompter;
-    delete m_commitMessage;
 
     JNIEnv *env = JNIUtil::getEnv();
     env->DeleteGlobalRef(m_jctx);
 }
 
 svn_client_ctx_t *
-ClientContext::getContext(const char *message)
+ClientContext::getContext(CommitMessage *message)
 {
     SVN::Pool *requestPool = JNIUtil::getRequestPool();
     apr_pool_t *pool = requestPool->pool();
@@ -211,58 +209,12 @@ ClientContext::getContext(const char *me
                                m_passWord.c_str());
 
     ctx->auth_baton = ab;
-    ctx->log_msg_baton3 = getCommitMessageBaton(message);
+    ctx->log_msg_baton3 = message;
     m_cancelOperation = false;
 
     return ctx;
 }
 
-svn_error_t *
-ClientContext::getCommitMessage(const char **log_msg,
-                                const char **tmp_file,
-                                const apr_array_header_t *commit_items,
-                                void *baton,
-                                apr_pool_t *pool)
-{
-    *log_msg = NULL;
-    *tmp_file = NULL;
-    log_msg_baton *lmb = (log_msg_baton *) baton;
-
-    if (lmb && lmb->messageHandler)
-    {
-        jstring jmsg = lmb->messageHandler->getCommitMessage(commit_items);
-        if (jmsg != NULL)
-        {
-            JNIStringHolder msg(jmsg);
-            *log_msg = apr_pstrdup(pool, msg);
-        }
-        return SVN_NO_ERROR;
-    }
-    else if (lmb && lmb->message)
-    {
-        *log_msg = apr_pstrdup(pool, lmb->message);
-        return SVN_NO_ERROR;
-    }
-
-    return SVN_NO_ERROR;
-}
-
-void *
-ClientContext::getCommitMessageBaton(const char *message)
-{
-    if (message != NULL || m_commitMessage)
-    {
-        log_msg_baton *baton = (log_msg_baton *)
-            apr_palloc(JNIUtil::getRequestPool()->pool(), sizeof(*baton));
-
-        baton->message = message;
-        baton->messageHandler = m_commitMessage;
-
-        return baton;
-    }
-    return NULL;
-}
-
 void
 ClientContext::username(const char *pi_username)
 {
@@ -300,13 +252,6 @@ ClientContext::getConfigDirectory()
 }
 
 void
-ClientContext::commitMessageHandler(CommitMessage *commitMessage)
-{
-    delete m_commitMessage;
-    m_commitMessage = commitMessage;
-}
-
-void
 ClientContext::cancelOperation()
 {
     m_cancelOperation = true;

Modified: subversion/trunk/subversion/bindings/javahl/native/ClientContext.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/ClientContext.h?rev=991569&r1=991568&r2=991569&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/ClientContext.h (original)
+++ subversion/trunk/subversion/bindings/javahl/native/ClientContext.h Wed Sep  1 15:18:10 2010
@@ -56,22 +56,6 @@ class ClientContext
   Prompter *m_prompter;
   bool m_cancelOperation;
 
-  CommitMessage *m_commitMessage;
-
-  /**
-   * Implements the svn_client_get_commit_log3_t API.
-   */
-  static svn_error_t *getCommitMessage(const char **log_msg,
-                                       const char **tmp_file,
-                                       const apr_array_header_t *
-                                       commit_items,
-                                       void *baton,
-                                       apr_pool_t *pool);
-  /**
-   * Produce a baton for the getCommitMessage() callback.
-   */
-  void *getCommitMessageBaton(const char *message);
- 
  protected:
   static void notify(void *baton, const svn_wc_notify_t *notify,
                      apr_pool_t *pool);
@@ -90,12 +74,11 @@ class ClientContext
 
   static svn_error_t *checkCancel(void *cancelBaton);
 
-  svn_client_ctx_t *getContext(const char *message);
+  svn_client_ctx_t *getContext(CommitMessage *message);
 
   void username(const char *pi_username);
   void password(const char *pi_password);
   void setPrompt(Prompter *prompter);
-  void commitMessageHandler(CommitMessage *commitMessage);
   void cancelOperation();
   const char *getConfigDirectory();
 

Modified: subversion/trunk/subversion/bindings/javahl/native/CommitMessage.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/CommitMessage.cpp?rev=991569&r1=991568&r2=991569&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/CommitMessage.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/CommitMessage.cpp Wed Sep  1 15:18:10 2010
@@ -28,6 +28,8 @@
 #include "CreateJ.h"
 #include "EnumMapper.h"
 #include "JNIUtil.h"
+#include "JNIStringHolder.h"
+
 #include <apr_tables.h>
 #include "svn_client.h"
 
@@ -38,61 +40,33 @@ CommitMessage::CommitMessage(jobject jco
 
 CommitMessage::~CommitMessage()
 {
-  // Since the m_jcommitMessage is a global reference, it has to be
-  // deleted to allow the Java garbage collector to reclaim the
-  // object.
-  if (m_jcommitMessage!= NULL)
-    {
-      JNIEnv *env = JNIUtil::getEnv();
-      env->DeleteGlobalRef(m_jcommitMessage);
-    }
+  // No need to delete the local reference
 }
 
-CommitMessage *CommitMessage::makeCCommitMessage(jobject jcommitMessage)
+svn_error_t *
+CommitMessage::callback(const char **log_msg,
+                        const char **tmp_file,
+                        const apr_array_header_t *commit_items,
+                        void *baton,
+                        apr_pool_t *pool)
 {
-  // If there is no object passed into this method, there is no need
-  // for a C++ holding object.
-  if (jcommitMessage == NULL)
-    return NULL;
-
-  // Sanity check, that the passed Java object implements the right
-  // interface.
-  JNIEnv *env = JNIUtil::getEnv();
-  jclass clazz = env->FindClass(JAVA_PACKAGE"/CommitMessage");
-  if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-
-  if (!env->IsInstanceOf(jcommitMessage, clazz))
-    {
-      env->DeleteLocalRef(clazz);
-      return NULL;
-    }
-  env->DeleteLocalRef(clazz);
-
-  // Since the reference is longer needed then the duration of the
-  // SVNClient.commtMessage, the local reference has to be converted
-  // to a global reference.
-  jobject myCommitMessage = env->NewGlobalRef(jcommitMessage);
-  if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-
-  // create & return the holding object
-  return new CommitMessage(myCommitMessage);
+  if (baton && ((CommitMessage *)baton)->m_jcommitMessage)
+    return ((CommitMessage *)baton)->getCommitMessage(log_msg, tmp_file,
+                                                      commit_items, pool);
+
+  *log_msg = NULL;
+  *tmp_file = NULL;
+  return SVN_NO_ERROR;
 }
 
-/**
- * Call the Java callback method to retrieve the commit message
- * @param commit_items  the array of the items of this commit
- * @returns the commit message
- */
-jstring
-CommitMessage::getCommitMessage(const apr_array_header_t *commit_items)
+svn_error_t *
+CommitMessage::getCommitMessage(const char **log_msg,
+                                const char **tmp_file,
+                                const apr_array_header_t *commit_items,
+                                apr_pool_t *pool)
 {
+  *tmp_file = NULL;
   JNIEnv *env = JNIUtil::getEnv();
-  // create an Java array for the commit items
-
-  // Java method ids will not change during the time this library is
-  // loaded, so they can be cached.
 
   // get the method if for the CommitMessage callback method
   static jmethodID midCallback = 0;
@@ -100,12 +74,12 @@ CommitMessage::getCommitMessage(const ap
     {
       jclass clazz2 = env->FindClass(JAVA_PACKAGE"/CommitMessage");
       if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+        return SVN_NO_ERROR;
 
       midCallback = env->GetMethodID(clazz2, "getLogMessage",
                                      "(Ljava/util/Set;)Ljava/lang/String;");
       if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+        return SVN_NO_ERROR;
 
       env->DeleteLocalRef(clazz2);
     }
@@ -128,7 +102,15 @@ CommitMessage::getCommitMessage(const ap
                                                     midCallback,
                                                     CreateJ::Set(jitems));
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    return SVN_NO_ERROR;
+
+  if (jmessage != NULL)
+    {
+      JNIStringHolder msg(jmessage);
+      *log_msg = apr_pstrdup(pool, msg);
+    }
+  else
+    *log_msg = NULL;
 
-  return jmessage;
+  return SVN_NO_ERROR;
 }

Modified: subversion/trunk/subversion/bindings/javahl/native/CommitMessage.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/CommitMessage.h?rev=991569&r1=991568&r2=991569&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/CommitMessage.h (original)
+++ subversion/trunk/subversion/bindings/javahl/native/CommitMessage.h Wed Sep  1 15:18:10 2010
@@ -28,7 +28,8 @@
 #define COMMITMESSAGE_H
 
 #include <jni.h>
-struct apr_array_header_t;
+
+#include "svn_client.h"
 
 /**
  * This class stores a Java object implementing the CommitMessage
@@ -37,36 +38,25 @@ struct apr_array_header_t;
 class CommitMessage
 {
  public:
-  /**
-   * Deletes the global reference to m_jcommitMessage.
-   */
+  CommitMessage(jobject jcommitMessage);
   ~CommitMessage();
 
-  jstring getCommitMessage(const apr_array_header_t *commit_items);
-
-  /**
-   * Create a C++ holding object for the Java object passed into the
-   * native code.
-   *
-   * @param jcommitMessage The local reference to a
-   * org.tigris.subversion.javahl.CommitMessage Java commit message
-   * object.
-   */
-  static CommitMessage *makeCCommitMessage(jobject jcommitMessage);
+  static svn_error_t *callback(const char **log_msg,
+                               const char **tmp_file,
+                               const apr_array_header_t *commit_items,
+                               void *baton,
+                               apr_pool_t *pool);
+
+ protected:
+  svn_error_t *getCommitMessage(const char **log_msg,
+                                const char **tmp_file,
+                                const apr_array_header_t *commit_items,
+                                apr_pool_t *pool);
 
  private:
-  /**
-   * A global reference to the Java object, because the reference
-   * must be valid longer than the SVNClient.commitMessage call.
-   */
+  /* A local reference. */
   jobject m_jcommitMessage;
 
-  /**
-   * Create a commit message object.
-   *
-   * @param jcommitMessage The Java object to receive the callback.
-   */
-  CommitMessage(jobject jcommitMessage);
 };
 
 #endif  // COMMITMESSAGE_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=991569&r1=991568&r2=991569&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp Wed Sep  1 15:18:10 2010
@@ -263,7 +263,7 @@ jlong SVNClient::checkout(const char *mo
     return rev;
 }
 
-void SVNClient::remove(Targets &targets, const char *message, bool force,
+void SVNClient::remove(Targets &targets, CommitMessage *message, bool force,
                        bool keep_local, RevpropTable &revprops,
                        CommitCallback *callback)
 {
@@ -359,7 +359,7 @@ jlongArray SVNClient::update(Targets &ta
     return jrevs;
 }
 
-void SVNClient::commit(Targets &targets, const char *message,
+void SVNClient::commit(Targets &targets, CommitMessage *message,
                        svn_depth_t depth, bool noUnlock, bool keepChangelist,
                        StringArray &changelists, RevpropTable &revprops,
                        CommitCallback *callback)
@@ -381,9 +381,9 @@ void SVNClient::commit(Targets &targets,
 }
 
 void SVNClient::copy(CopySources &copySources, const char *destPath,
-                     const char *message, bool copyAsChild, bool makeParents,
-                     bool ignoreExternals, RevpropTable &revprops,
-                     CommitCallback *callback)
+                     CommitMessage *message, bool copyAsChild,
+                     bool makeParents, bool ignoreExternals,
+                     RevpropTable &revprops, CommitCallback *callback)
 {
     SVN::Pool requestPool;
 
@@ -410,7 +410,7 @@ void SVNClient::copy(CopySources &copySo
 }
 
 void SVNClient::move(Targets &srcPaths, const char *destPath,
-                     const char *message, bool force, bool moveAsChild,
+                     CommitMessage *message, bool force, bool moveAsChild,
                      bool makeParents, RevpropTable &revprops,
                      CommitCallback *callback)
 {
@@ -433,8 +433,9 @@ void SVNClient::move(Targets &srcPaths, 
                                  requestPool.pool()), );
 }
 
-void SVNClient::mkdir(Targets &targets, const char *message, bool makeParents,
-                      RevpropTable &revprops, CommitCallback *callback)
+void SVNClient::mkdir(Targets &targets, CommitMessage *message,
+                      bool makeParents, RevpropTable &revprops,
+                      CommitCallback *callback)
 {
     SVN::Pool requestPool;
     svn_client_ctx_t *ctx = context.getContext(message);
@@ -545,7 +546,7 @@ jlong SVNClient::doSwitch(const char *pa
 }
 
 void SVNClient::doImport(const char *path, const char *url,
-                         const char *message, svn_depth_t depth,
+                         CommitMessage *message, svn_depth_t depth,
                          bool noIgnore, bool ignoreUnknownNodeTypes,
                          RevpropTable &revprops, CommitCallback *callback)
 {

Modified: subversion/trunk/subversion/bindings/javahl/native/SVNClient.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/SVNClient.h?rev=991569&r1=991568&r2=991569&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/SVNClient.h (original)
+++ subversion/trunk/subversion/bindings/javahl/native/SVNClient.h Wed Sep  1 15:18:10 2010
@@ -103,7 +103,7 @@ class SVNClient :public SVNBase
              bool ignoreAncestry, bool dryRun, bool recordOnly);
   void mergeReintegrate(const char *path, Revision &pegRevision,
                         const char *localPath, bool dryRun);
-  void doImport(const char *path, const char *url, const char *message,
+  void doImport(const char *path, const char *url, CommitMessage *message,
                 svn_depth_t depth, bool noIgnore, bool ignoreUnknownNodeTypes,
                 RevpropTable &revprops, CommitCallback *callback);
   jlong doSwitch(const char *path, const char *url, Revision &revision,
@@ -117,16 +117,16 @@ class SVNClient :public SVNBase
   void resolve(const char *path, svn_depth_t depth,
                svn_wc_conflict_choice_t choice);
   void cleanup(const char *path);
-  void mkdir(Targets &targets, const char *message, bool makeParents,
+  void mkdir(Targets &targets, CommitMessage *message, bool makeParents,
              RevpropTable &revprops, CommitCallback *callback);
   void move(Targets &srcPaths, const char *destPath,
-            const char *message, bool force, bool moveAsChild,
+            CommitMessage *message, bool force, bool moveAsChild,
             bool makeParents, RevpropTable &revprops, CommitCallback *callback);
   void copy(CopySources &copySources, const char *destPath,
-            const char *message, bool copyAsChild, bool makeParents,
+            CommitMessage *message, bool copyAsChild, bool makeParents,
             bool ignoreExternals, RevpropTable &revprops,
             CommitCallback *callback);
-  void commit(Targets &targets, const char *message, svn_depth_t depth,
+  void commit(Targets &targets, CommitMessage *message, svn_depth_t depth,
               bool noUnlock, bool keepChangelist,
               StringArray &changelists, RevpropTable &revprops,
               CommitCallback *callback);
@@ -136,7 +136,7 @@ class SVNClient :public SVNBase
   void add(const char *path, svn_depth_t depth, bool force, bool no_ignore,
            bool add_parents);
   void revert(const char *path, svn_depth_t depth, StringArray &changelists);
-  void remove(Targets &targets, const char *message, bool force,
+  void remove(Targets &targets, CommitMessage *message, bool force,
               bool keep_local, RevpropTable &revprops,
               CommitCallback *callback);
   jlong checkout(const char *moduleName, const char *destPath,

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=991569&r1=991568&r2=991569&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 Wed Sep  1 15:18:10 2010
@@ -343,28 +343,10 @@ Java_org_apache_subversion_javahl_SVNCli
 }
 
 JNIEXPORT void JNICALL
-Java_org_apache_subversion_javahl_SVNClient_commitMessageHandler
-(JNIEnv *env, jobject jthis, jobject jcommitMessage)
-{
-  JNIEntry(SVNClient, commitMessageHandler);
-  SVNClient *cl = SVNClient::getCppObject(jthis);
-  if (cl == NULL)
-    {
-      JNIUtil::throwError("bad C++ this");
-      return;
-    }
-  CommitMessage *commitMessage =
-    CommitMessage::makeCCommitMessage(jcommitMessage);
-  if (JNIUtil::isExceptionThrown())
-    return;
-
-  cl->getClientContext().commitMessageHandler(commitMessage);
-}
-
-JNIEXPORT void JNICALL
 Java_org_apache_subversion_javahl_SVNClient_remove
-(JNIEnv *env, jobject jthis, jobject jtargets, jstring jmessage,
- jboolean jforce, jboolean keepLocal, jobject jrevpropTable, jobject jcallback)
+(JNIEnv *env, jobject jthis, jobject jtargets, jboolean jforce,
+ jboolean keepLocal, jobject jrevpropTable, jobject jmessage,
+ jobject jcallback)
 {
   JNIEntry(SVNClient, remove);
   SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -375,7 +357,10 @@ Java_org_apache_subversion_javahl_SVNCli
     }
   StringArray targetsArr(jtargets);
   Targets targets(targetsArr);
-  JNIStringHolder message(jmessage);
+  if (JNIUtil::isExceptionThrown())
+    return;
+
+  CommitMessage message(jmessage);
   if (JNIUtil::isExceptionThrown())
     return;
 
@@ -384,7 +369,7 @@ Java_org_apache_subversion_javahl_SVNCli
     return;
 
   CommitCallback callback(jcallback);
-  cl->remove(targets, message, jforce ? true : false,
+  cl->remove(targets, &message, jforce ? true : false,
              keepLocal ? true : false, revprops, jcallback ? &callback : NULL);
 }
 
@@ -461,9 +446,9 @@ Java_org_apache_subversion_javahl_SVNCli
 
 JNIEXPORT void JNICALL
 Java_org_apache_subversion_javahl_SVNClient_commit
-(JNIEnv *env, jobject jthis, jobject jtargets, jstring jmessage, jobject jdepth,
+(JNIEnv *env, jobject jthis, jobject jtargets, jobject jdepth,
  jboolean jnoUnlock, jboolean jkeepChangelist, jobject jchangelists,
- jobject jrevpropTable, jobject jcallback)
+ jobject jrevpropTable, jobject jmessage, jobject jcallback)
 {
   JNIEntry(SVNClient, commit);
   SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -474,7 +459,10 @@ Java_org_apache_subversion_javahl_SVNCli
     }
   StringArray targetsArr(jtargets);
   Targets targets(targetsArr);
-  JNIStringHolder message(jmessage);
+  if (JNIUtil::isExceptionThrown())
+    return;
+
+  CommitMessage message(jmessage);
   if (JNIUtil::isExceptionThrown())
     return;
 
@@ -488,7 +476,7 @@ Java_org_apache_subversion_javahl_SVNCli
     return;
 
   CommitCallback callback(jcallback);
-  cl->commit(targets, message, EnumMapper::toDepth(jdepth),
+  cl->commit(targets, &message, EnumMapper::toDepth(jdepth),
              jnoUnlock ? true : false, jkeepChangelist ? true : false,
              changelists, revprops,
              jcallback ? &callback : NULL);
@@ -497,8 +485,8 @@ Java_org_apache_subversion_javahl_SVNCli
 JNIEXPORT void JNICALL
 Java_org_apache_subversion_javahl_SVNClient_copy
 (JNIEnv *env, jobject jthis, jobject jcopySources, jstring jdestPath,
- jstring jmessage, jboolean jcopyAsChild, jboolean jmakeParents,
- jboolean jignoreExternals, jobject jrevpropTable, jobject jcallback)
+ jboolean jcopyAsChild, jboolean jmakeParents, jboolean jignoreExternals,
+ jobject jrevpropTable, jobject jmessage, jobject jcallback)
 {
   JNIEntry(SVNClient, copy);
 
@@ -520,7 +508,7 @@ Java_org_apache_subversion_javahl_SVNCli
   if (JNIUtil::isExceptionThrown())
     return;
 
-JNIStringHolder message(jmessage);
+  CommitMessage message(jmessage);
   if (JNIUtil::isExceptionThrown())
     return;
 
@@ -529,7 +517,7 @@ JNIStringHolder message(jmessage);
     return;
 
   CommitCallback callback(jcallback);
-  cl->copy(copySources, destPath, message, jcopyAsChild ? true : false,
+  cl->copy(copySources, destPath, &message, jcopyAsChild ? true : false,
            jmakeParents ? true : false, jignoreExternals ? true : false,
            revprops, jcallback ? &callback : NULL);
 }
@@ -537,8 +525,8 @@ JNIStringHolder message(jmessage);
 JNIEXPORT void JNICALL
 Java_org_apache_subversion_javahl_SVNClient_move
 (JNIEnv *env, jobject jthis, jobject jsrcPaths, jstring jdestPath,
- jstring jmessage, jboolean jforce, jboolean jmoveAsChild,
- jboolean jmakeParents, jobject jrevpropTable, jobject jcallback)
+ jboolean jforce, jboolean jmoveAsChild, jboolean jmakeParents,
+ jobject jrevpropTable, jobject jmessage, jobject jcallback)
 {
   JNIEntry(SVNClient, move);
 
@@ -555,7 +543,8 @@ Java_org_apache_subversion_javahl_SVNCli
   JNIStringHolder destPath(jdestPath);
   if (JNIUtil::isExceptionThrown())
     return;
-  JNIStringHolder message(jmessage);
+
+  CommitMessage message(jmessage);
   if (JNIUtil::isExceptionThrown())
     return;
 
@@ -564,15 +553,15 @@ Java_org_apache_subversion_javahl_SVNCli
     return;
 
   CommitCallback callback(jcallback);
-  cl->move(srcPaths, destPath, message, jforce ? true : false,
+  cl->move(srcPaths, destPath, &message, jforce ? true : false,
            jmoveAsChild ? true : false, jmakeParents ? true : false,
            revprops, jcallback ? &callback : NULL);
 }
 
 JNIEXPORT void JNICALL
 Java_org_apache_subversion_javahl_SVNClient_mkdir
-(JNIEnv *env, jobject jthis, jobject jtargets, jstring jmessage,
- jboolean jmakeParents, jobject jrevpropTable, jobject jcallback)
+(JNIEnv *env, jobject jthis, jobject jtargets, jboolean jmakeParents,
+ jobject jrevpropTable, jobject jmessage, jobject jcallback)
 {
   JNIEntry(SVNClient, mkdir);
   SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -583,7 +572,10 @@ Java_org_apache_subversion_javahl_SVNCli
     }
   StringArray targetsArr(jtargets);
   Targets targets(targetsArr);
-  JNIStringHolder message(jmessage);
+  if (JNIUtil::isExceptionThrown())
+    return;
+
+  CommitMessage message(jmessage);
   if (JNIUtil::isExceptionThrown())
     return;
 
@@ -592,7 +584,7 @@ Java_org_apache_subversion_javahl_SVNCli
     return;
 
   CommitCallback callback(jcallback);
-  cl->mkdir(targets, message, jmakeParents ? true : false, revprops,
+  cl->mkdir(targets, &message, jmakeParents ? true : false, revprops,
             jcallback ? &callback : NULL);
 }
 
@@ -709,9 +701,9 @@ Java_org_apache_subversion_javahl_SVNCli
 
 JNIEXPORT void JNICALL
 Java_org_apache_subversion_javahl_SVNClient_doImport
-(JNIEnv *env, jobject jthis, jstring jpath, jstring jurl, jstring jmessage,
- jobject jdepth, jboolean jnoIgnore, jboolean jignoreUnknownNodeTypes,
- jobject jrevpropTable, jobject jcallback)
+(JNIEnv *env, jobject jthis, jstring jpath, jstring jurl, jobject jdepth,
+ jboolean jnoIgnore, jboolean jignoreUnknownNodeTypes, jobject jrevpropTable,
+ jobject jmessage, jobject jcallback)
 {
   JNIEntry(SVNClient, doImport);
   SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -728,7 +720,7 @@ Java_org_apache_subversion_javahl_SVNCli
   if (JNIUtil::isExceptionThrown())
     return;
 
-  JNIStringHolder message(jmessage);
+  CommitMessage message(jmessage);
   if (JNIUtil::isExceptionThrown())
     return;
 
@@ -737,7 +729,7 @@ Java_org_apache_subversion_javahl_SVNCli
     return;
 
   CommitCallback callback(jcallback);
-  cl->doImport(path, url, message, EnumMapper::toDepth(jdepth),
+  cl->doImport(path, url, &message, EnumMapper::toDepth(jdepth),
                jnoIgnore ? true : false,
                jignoreUnknownNodeTypes ? true : false, revprops,
                jcallback ? &callback : NULL);

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=991569&r1=991568&r2=991569&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 Wed Sep  1 15:18:10 2010
@@ -200,15 +200,31 @@ public class SVNClient implements ISVNCl
     /**
      * @since 1.0
      */
-    public native void commitMessageHandler(CommitMessage messageHandler);
+    public void commitMessageHandler(CommitMessage messageHandler)
+    {
+        this.messageHandler = messageHandler;
+    }
+
+    private CommitMessage messageHandler = null;
 
     /**
      * @since 1.5
      */
-    public native void remove(Set<String> paths, String message, boolean force,
-                              boolean keepLocal,
-                              Map<String, String> revpropTable,
-                              CommitCallback callback)
+    public void remove(Set<String> paths, String message, boolean force,
+                       boolean keepLocal,
+                       Map<String, String> revpropTable,
+                       CommitCallback callback)
+            throws ClientException
+    {
+        remove(paths, force, keepLocal, revpropTable, new ConstMsg(message),
+               callback);
+    }
+
+    private native void remove(Set<String> paths, boolean force,
+                               boolean keepLocal,
+                               Map<String, String> revpropTable,
+                               CommitMessage handler,
+                               CommitCallback callback)
             throws ClientException;
 
     /**
@@ -237,40 +253,87 @@ public class SVNClient implements ISVNCl
     /**
      * @since 1.5
      */
-    public native void commit(Set<String> paths, String message, Depth depth,
-                              boolean noUnlock, boolean keepChangelist,
-                              Collection<String> changelists,
-                              Map<String, String> revpropTable,
-                              CommitCallback callback)
+    public void commit(Set<String> paths, String message, Depth depth,
+                       boolean noUnlock, boolean keepChangelist,
+                       Collection<String> changelists,
+                       Map<String, String> revpropTable,
+                       CommitCallback callback)
+            throws ClientException
+    {
+        commit(paths, depth, noUnlock, keepChangelist, changelists,
+               revpropTable, new ConstMsg(message), callback);
+    }
+
+    private native void commit(Set<String> paths, Depth depth,
+                               boolean noUnlock, boolean keepChangelist,
+                               Collection<String> changelists,
+                               Map<String, String> revpropTable,
+                               CommitMessage handler,
+                               CommitCallback callback)
             throws ClientException;
 
     /**
      * @since 1.7
      */
-    public native void copy(List<CopySource> sources, String destPath,
-                            String message, boolean copyAsChild,
-                            boolean makeParents, boolean ignoreExternals,
-                            Map<String, String> revpropTable,
-                            CommitCallback callback)
+    public void copy(List<CopySource> sources, String destPath,
+                     String message, boolean copyAsChild,
+                     boolean makeParents, boolean ignoreExternals,
+                     Map<String, String> revpropTable,
+                     CommitCallback callback)
+            throws ClientException
+    {
+        copy(sources, destPath, copyAsChild, makeParents, ignoreExternals,
+             revpropTable, new ConstMsg(message), callback);
+    }
+
+    private native void copy(List<CopySource> sources, String destPath,
+                             boolean copyAsChild,
+                             boolean makeParents, boolean ignoreExternals,
+                             Map<String, String> revpropTable,
+                             CommitMessage handler,
+                             CommitCallback callback)
             throws ClientException;
 
     /**
      * @since 1.5
      */
-    public native void move(Set<String> srcPaths, String destPath,
-                            String message, boolean force, boolean moveAsChild,
-                            boolean makeParents,
-                            Map<String, String> revpropTable,
-                            CommitCallback callback)
+    public void move(Set<String> srcPaths, String destPath,
+                     String message, boolean force, boolean moveAsChild,
+                     boolean makeParents,
+                     Map<String, String> revpropTable,
+                     CommitCallback callback)
+            throws ClientException
+    {
+        move(srcPaths, destPath, force, moveAsChild, makeParents,
+             revpropTable, new ConstMsg(message), callback);
+    }
+
+    private native void move(Set<String> srcPaths, String destPath,
+                             boolean force, boolean moveAsChild,
+                             boolean makeParents,
+                             Map<String, String> revpropTable,
+                             CommitMessage handler,
+                             CommitCallback callback)
             throws ClientException;
 
     /**
      * @since 1.5
      */
-    public native void mkdir(Set<String> paths, String message,
-                             boolean makeParents,
-                             Map<String, String> revpropTable,
-                             CommitCallback callback)
+    public void mkdir(Set<String> paths, String message,
+                      boolean makeParents,
+                      Map<String, String> revpropTable,
+                      CommitCallback callback)
+            throws ClientException
+    {
+        mkdir(paths, makeParents, revpropTable, new ConstMsg(message),
+              callback);
+    }
+
+    private native void mkdir(Set<String> paths,
+                              boolean makeParents,
+                              Map<String, String> revpropTable,
+                              CommitMessage handler,
+                              CommitCallback callback)
             throws ClientException;
 
     /**
@@ -307,11 +370,23 @@ public class SVNClient implements ISVNCl
     /**
      * @since 1.5
      */
-    public native void doImport(String path, String url, String message,
-                                Depth depth, boolean noIgnore,
-                                boolean ignoreUnknownNodeTypes,
-                                Map<String, String> revpropTable,
-                                CommitCallback callback)
+    public void doImport(String path, String url, String message,
+                         Depth depth, boolean noIgnore,
+                         boolean ignoreUnknownNodeTypes,
+                         Map<String, String> revpropTable,
+                         CommitCallback callback)
+            throws ClientException
+    {
+        doImport(path, url, depth, noIgnore, ignoreUnknownNodeTypes,
+                 revpropTable, new ConstMsg(message), callback);
+    }
+
+    private native void doImport(String path, String url,
+                                 Depth depth, boolean noIgnore,
+                                 boolean ignoreUnknownNodeTypes,
+                                 Map<String, String> revpropTable,
+                                 CommitMessage handler,
+                                 CommitCallback callback)
             throws ClientException;
 
     /**
@@ -682,4 +757,25 @@ public class SVNClient implements ISVNCl
                                           null);
         }
     }
+
+    private class ConstMsg
+        implements CommitMessage
+    {
+        private String message;
+
+        public ConstMsg(String message)
+        {
+            this.message = message;
+        }
+
+        public String getLogMessage(Set<CommitItem> items)
+        {
+            if (message != null)
+                return message;
+            else if (messageHandler != null)
+                return messageHandler.getLogMessage(items);
+            else
+                return null;
+        }
+    }
 }