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/03/09 20:04:08 UTC

svn commit: r921058 - in /subversion/trunk/subversion/bindings/javahl: native/StringArray.cpp native/StringArray.h native/org_apache_subversion_javahl_SVNClient.cpp src/org/apache/subversion/javahl/SVNClient.java

Author: hwright
Date: Tue Mar  9 19:04:08 2010
New Revision: 921058

URL: http://svn.apache.org/viewvc?rev=921058&view=rev
Log:
JavaHL: Convert String collections to native string vectors in the JNI
code, eliminating the need to do so in the SVNClient Java class.

[ in subversion/bindings/javahl/ ]
* native/StringArray.h,
  native/StringArray.cpp
  (StringArray): New constructor which takes a collection of strings.
  (~StringArray): Properly destroy the referenced collection.

* native/org_apache_subversion_javahl_SVNClient.cpp
  (Java_org_apache_subversion_javahl_SVNClient_getChangelists):
    Update function parameter list.

* src/org/apache/subversion/javahl/SVNClient.java
  (getChangelists): Remove wrapper around the native method, since the native
    version can now handle String collections.

Modified:
    subversion/trunk/subversion/bindings/javahl/native/StringArray.cpp
    subversion/trunk/subversion/bindings/javahl/native/StringArray.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/StringArray.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/StringArray.cpp?rev=921058&r1=921057&r2=921058&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/StringArray.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/StringArray.cpp Tue Mar  9 19:04:08 2010
@@ -36,6 +36,8 @@ StringArray::~StringArray()
 {
   if (m_stringArray != NULL)
     JNIUtil::getEnv()->DeleteLocalRef(m_stringArray);
+  if (m_stringCollection != NULL)
+    JNIUtil::getEnv()->DeleteLocalRef(m_stringCollection);
 }
 
 const apr_array_header_t *StringArray::array(const SVN::Pool &pool)
@@ -57,6 +59,7 @@ const apr_array_header_t *StringArray::a
 StringArray::StringArray(jobjectArray jstrings)
 {
   m_stringArray = jstrings;
+  m_stringCollection = NULL;
 
   if (jstrings != NULL)
     {
@@ -79,3 +82,53 @@ StringArray::StringArray(jobjectArray js
         }
     }
 }
+
+StringArray::StringArray(jobject jstringCollection)
+{
+  m_stringArray = NULL;
+  m_stringCollection = jstringCollection;
+
+  if (jstringCollection != NULL)
+    {
+      JNIEnv *env = JNIUtil::getEnv();
+
+      jclass clazz = env->FindClass("java/util/Collection");
+
+      static jmethodID mid_toArray = 0;
+      if (mid_toArray == 0)
+        {
+          mid_toArray = env->GetMethodID(clazz, "toArray",
+                                         "()[Ljava/lang/Object;");
+          if (JNIUtil::isExceptionThrown())
+            return;
+        }
+
+      jobjectArray jstrings = (jobjectArray) env->CallObjectMethod(
+                                               jstringCollection, mid_toArray);
+
+      jint arraySize = env->GetArrayLength(jstrings);
+      if (JNIUtil::isExceptionThrown())
+        return;
+
+      for (int i = 0; i < arraySize; ++i)
+        {
+          jobject jstr = env->GetObjectArrayElement(jstrings, i);
+          if (JNIUtil::isExceptionThrown())
+            return;
+
+          JNIStringHolder str((jstring)jstr);
+          if (JNIUtil::isExceptionThrown())
+            return;
+
+          m_strings.push_back(std::string((const char *)str));
+        }
+
+      JNIUtil::getEnv()->DeleteLocalRef(clazz);
+      if (JNIUtil::isExceptionThrown())
+        return;
+
+      JNIUtil::getEnv()->DeleteLocalRef(jstrings);
+      if (JNIUtil::isExceptionThrown())
+        return;
+    }
+}

Modified: subversion/trunk/subversion/bindings/javahl/native/StringArray.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/StringArray.h?rev=921058&r1=921057&r2=921058&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/StringArray.h (original)
+++ subversion/trunk/subversion/bindings/javahl/native/StringArray.h Tue Mar  9 19:04:08 2010
@@ -43,8 +43,10 @@ class StringArray
  private:
   std::vector<std::string> m_strings;
   jobjectArray m_stringArray;
+  jobject m_stringCollection;
  public:
   StringArray(jobjectArray jstrings);
+  StringArray(jobject jstringCollection);
   ~StringArray();
   const apr_array_header_t *array(const SVN::Pool &pool);
 };

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=921058&r1=921057&r2=921058&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 Tue Mar  9 19:04:08 2010
@@ -1712,7 +1712,7 @@ Java_org_apache_subversion_javahl_SVNCli
 
 JNIEXPORT void JNICALL
 Java_org_apache_subversion_javahl_SVNClient_getChangelists
-(JNIEnv *env, jobject jthis, jstring jroot_path, jobjectArray jchangelists,
+(JNIEnv *env, jobject jthis, jstring jroot_path, jobject jchangelists,
  jint jdepth, jobject jchangelistCallback)
 {
   JNIEntry(SVNClient, getChangelist);

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=921058&r1=921057&r2=921058&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 Tue Mar  9 19:04:08 2010
@@ -776,18 +776,9 @@ public class SVNClient implements ISVNCl
     /**
      * @since 1.5
      */
-    public void getChangelists(String rootPath, Collection<String> changelists,
-                               int depth, ChangelistCallback callback)
-            throws ClientException
-    {
-        this.getChangelists(rootPath,
-                    changelists == null ? null :
-                      changelists.toArray(new String[changelists.size()]),
-                    depth, callback);
-    }
-
-    private native void getChangelists(String rootPath, String[] changelists,
-                                       int depth, ChangelistCallback callback)
+    public native void getChangelists(String rootPath,
+                                      Collection<String> changelists,
+                                      int depth, ChangelistCallback callback)
             throws ClientException;
 
     /**