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/08/31 00:03:32 UTC

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

Author: hwright
Date: Mon Aug 30 22:03:31 2010
New Revision: 990956

URL: http://svn.apache.org/viewvc?rev=990956&view=rev
Log:
JavaHL: Move more complexity out of C++ and into Java-land.  (See r990952)

* subversion/bindings/javahl/native/ProgressListener.h:
  Remove.

* subversion/bindings/javahl/native/SVNClient.h:
  Remove some obsolete forward class declarations.

* subversion/bindings/javahl/native/SVNClient.cpp:
  Remove obsolete included header reference.

* subversion/bindings/javahl/native/ClientContext.h:
  Remove obsolete forward class declarations.
  (m_progressListener): Remove.
  (setProgressListener): Remove.
  (progress): New.

* subversion/bindings/javahl/native/ProgressListener.cpp:
  Remove.

* subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
  (Java_org_apache_subversion_javahl_SVNClient_setProgressCallback): Remove.

* subversion/bindings/javahl/native/ClientContext.cpp
  (ClientContext): Initialize the baton, but no the listener member object.
  (~ClientContext): Don't bother deleting the member listener object.
  (getContext): Don't set the progress baton here.
  (setProgressListener): Remove.
  (progress): New.

* subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
  (setProgressCallback): Implement as a Java method.
  (ClientContext): Add a progress listener member and method.

Removed:
    subversion/trunk/subversion/bindings/javahl/native/ProgressListener.cpp
    subversion/trunk/subversion/bindings/javahl/native/ProgressListener.h
Modified:
    subversion/trunk/subversion/bindings/javahl/native/ClientContext.cpp
    subversion/trunk/subversion/bindings/javahl/native/ClientContext.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=990956&r1=990955&r2=990956&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/ClientContext.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/ClientContext.cpp Mon Aug 30 22:03:31 2010
@@ -33,7 +33,6 @@
 
 #include "Prompter.h"
 #include "CreateJ.h"
-#include "ProgressListener.h"
 #include "CommitMessage.h"
 #include "ConflictResolverCallback.h"
 
@@ -45,8 +44,7 @@ struct log_msg_baton
 };
 
 ClientContext::ClientContext(jobject jsvnclient)
-    : m_progressListener(NULL),
-      m_prompter(NULL),
+    : m_prompter(NULL),
       m_commitMessage(NULL),
       m_conflictResolver(NULL)
 {
@@ -93,12 +91,12 @@ ClientContext::ClientContext(jobject jsv
     persistentCtx->cancel_baton = this;
     persistentCtx->notify_func2= notify;
     persistentCtx->notify_baton2 = m_jctx;
-    persistentCtx->progress_func = ProgressListener::progress;
+    persistentCtx->progress_func = progress;
+    persistentCtx->progress_baton = m_jctx;
 }
 
 ClientContext::~ClientContext()
 {
-    delete m_progressListener;
     delete m_prompter;
     delete m_commitMessage;
     delete m_conflictResolver;
@@ -216,8 +214,6 @@ ClientContext::getContext(const char *me
     ctx->log_msg_baton3 = getCommitMessageBaton(message);
     m_cancelOperation = false;
 
-    ctx->progress_baton = m_progressListener;
-
     if (m_conflictResolver)
     {
         ctx->conflict_func = ConflictResolverCallback::resolveConflict;
@@ -300,13 +296,6 @@ ClientContext::setConflictResolver(Confl
 }
 
 void
-ClientContext::setProgressListener(ProgressListener *listener)
-{
-    delete m_progressListener;
-    m_progressListener = listener;
-}
-
-void
 ClientContext::setConfigDirectory(const char *configDir)
 {
     // A change to the config directory may necessitate creation of
@@ -380,3 +369,51 @@ ClientContext::notify(void *baton,
 
   env->DeleteLocalRef(jInfo);
 }
+
+void
+ClientContext::progress(apr_off_t progressVal, apr_off_t total,
+                        void *baton, apr_pool_t *pool)
+{
+  jobject jctx = (jobject) baton;
+  JNIEnv *env = JNIUtil::getEnv();
+
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
+    return;
+
+  static jmethodID mid = 0;
+  if (mid == 0)
+    {
+      jclass clazz = env->GetObjectClass(jctx);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NOTHING();
+
+      mid = env->GetMethodID(clazz, "onProgress",
+                             "(L"JAVA_PACKAGE"/ProgressEvent;)V");
+      if (JNIUtil::isJavaExceptionThrown() || mid == 0)
+        POP_AND_RETURN_NOTHING();
+    }
+
+  static jmethodID midCT = 0;
+  jclass clazz = env->FindClass(JAVA_PACKAGE"/ProgressEvent");
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NOTHING();
+
+  if (midCT == 0)
+    {
+      midCT = env->GetMethodID(clazz, "<init>", "(JJ)V");
+      if (JNIUtil::isJavaExceptionThrown() || midCT == 0)
+        POP_AND_RETURN_NOTHING();
+    }
+
+  // Call the Java method.
+  jobject jevent = env->NewObject(clazz, midCT,
+                                  (jlong) progressVal, (jlong) total);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NOTHING();
+
+  env->CallVoidMethod(jctx, mid, jevent);
+  
+  POP_AND_RETURN_NOTHING();
+}

Modified: subversion/trunk/subversion/bindings/javahl/native/ClientContext.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/ClientContext.h?rev=990956&r1=990955&r2=990956&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/ClientContext.h (original)
+++ subversion/trunk/subversion/bindings/javahl/native/ClientContext.h Mon Aug 30 22:03:31 2010
@@ -37,9 +37,7 @@
 #include "JNIStringHolder.h"
 
 class Prompter;
-class ClientNotifyCallback;
 class ConflictResolverCallback;
-class ProgressListener;
 class CommitMessage;
 
 /**
@@ -58,7 +56,6 @@ class ClientContext
 
   Prompter *m_prompter;
   ConflictResolverCallback *m_conflictResolver;
-  ProgressListener *m_progressListener;
   bool m_cancelOperation;
 
   CommitMessage *m_commitMessage;
@@ -88,7 +85,6 @@ class ClientContext
   void password(const char *pi_password);
   void setPrompt(Prompter *prompter);
   void setConflictResolver(ConflictResolverCallback *conflictResolver);
-  void setProgressListener(ProgressListener *listener);
   void commitMessageHandler(CommitMessage *commitMessage);
   void cancelOperation();
   const char *getConfigDirectory();
@@ -102,6 +98,8 @@ class ClientContext
 
   static void notify(void *baton, const svn_wc_notify_t *notify,
                      apr_pool_t *pool);
+  static void progress(apr_off_t progressVal, apr_off_t total,
+                       void *baton, apr_pool_t *pool);
 };
 
 #endif // CLIENTCONTEXT_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=990956&r1=990955&r2=990956&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp Mon Aug 30 22:03:31 2010
@@ -30,7 +30,6 @@
 #include "DiffSummaryReceiver.h"
 #include "ConflictResolverCallback.h"
 #include "ClientContext.h"
-#include "ProgressListener.h"
 #include "Prompter.h"
 #include "Pool.h"
 #include "Targets.h"

Modified: subversion/trunk/subversion/bindings/javahl/native/SVNClient.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/SVNClient.h?rev=990956&r1=990955&r2=990956&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/SVNClient.h (original)
+++ subversion/trunk/subversion/bindings/javahl/native/SVNClient.h Mon Aug 30 22:03:31 2010
@@ -35,9 +35,7 @@
 
 class Revision;
 class RevisionRange;
-class ClientNotifyCallback;
 class ConflictResolverCallback;
-class ProgressListener;
 class Targets;
 class JNIByteArray;
 class Prompter;

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=990956&r1=990955&r2=990956&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 Mon Aug 30 22:03:31 2010
@@ -34,7 +34,6 @@
 #include "RevisionRange.h"
 #include "EnumMapper.h"
 #include "ConflictResolverCallback.h"
-#include "ProgressListener.h"
 #include "CommitMessage.h"
 #include "Prompter.h"
 #include "Targets.h"
@@ -364,25 +363,6 @@ Java_org_apache_subversion_javahl_SVNCli
 }
 
 JNIEXPORT void JNICALL
-Java_org_apache_subversion_javahl_SVNClient_setProgressCallback
-(JNIEnv *env, jobject jthis, jobject jprogressListener)
-{
-  JNIEntry(SVNClient, setProgressCallback);
-  SVNClient *cl = SVNClient::getCppObject(jthis);
-  if (cl == NULL)
-    {
-      JNIUtil::throwError(_("bad C++ this"));
-      return;
-    }
-  ProgressListener *listener =
-    ProgressListener::makeCProgressListener(jprogressListener);
-  if (JNIUtil::isExceptionThrown())
-    return;
-
-  cl->getClientContext().setProgressListener(listener);
-}
-
-JNIEXPORT void JNICALL
 Java_org_apache_subversion_javahl_SVNClient_commitMessageHandler
 (JNIEnv *env, jobject jthis, jobject jcommitMessage)
 {

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=990956&r1=990955&r2=990956&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 Mon Aug 30 22:03:31 2010
@@ -189,7 +189,10 @@ public class SVNClient implements ISVNCl
     /**
      * @since 1.5
      */
-    public native void setProgressCallback(ProgressCallback listener);
+    public void setProgressCallback(ProgressCallback listener)
+    {
+        clientContext.listener = listener;
+    }
 
     /**
      * @since 1.0
@@ -647,14 +650,21 @@ public class SVNClient implements ISVNCl
      * persist in this object, such as notification handlers.
      */
     private class ClientContext
-        implements ClientNotifyCallback
+        implements ClientNotifyCallback, ProgressCallback
     {
         public ClientNotifyCallback notify = null;
+        public ProgressCallback listener = null;
 
         public void onNotify(ClientNotifyInformation notifyInfo)
         {
             if (notify != null)
                 notify.onNotify(notifyInfo);
         }
+
+        public void onProgress(ProgressEvent event)
+        {
+            if (listener != null)
+                listener.onProgress(event);
+        }
     }
 }