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/10 20:06:33 UTC

svn commit: r984153 [5/39] - in /subversion/branches/ignore-mergeinfo: ./ build/ build/ac-macros/ build/generator/ build/generator/templates/ build/hudson/ build/hudson/jobs/subversion-1.6.x-solaris/ build/hudson/jobs/subversion-1.6.x-ubuntu/ build/hud...

Modified: subversion/branches/ignore-mergeinfo/notes/obliterate/hooks/post-obliterate.tmpl
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/notes/obliterate/hooks/post-obliterate.tmpl?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/notes/obliterate/hooks/post-obliterate.tmpl (original)
+++ subversion/branches/ignore-mergeinfo/notes/obliterate/hooks/post-obliterate.tmpl Tue Aug 10 18:06:17 2010
@@ -39,8 +39,8 @@
 # Here is an example hook script, for a Unix /bin/sh interpreter.
 # For more examples and pre-written hooks, see those in
 # the Subversion repository at
-# http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/ and
-# http://svn.collab.net/repos/svn/trunk/contrib/hook-scripts/
+# http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/ and
+# http://svn.apache.org/repos/asf/subversion/trunk/contrib/hook-scripts/
 
 
 REPOS="$1"

Modified: subversion/branches/ignore-mergeinfo/notes/obliterate/hooks/pre-obliterate.tmpl
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/notes/obliterate/hooks/pre-obliterate.tmpl?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/notes/obliterate/hooks/pre-obliterate.tmpl (original)
+++ subversion/branches/ignore-mergeinfo/notes/obliterate/hooks/pre-obliterate.tmpl Tue Aug 10 18:06:17 2010
@@ -52,8 +52,8 @@
 # Here is an example hook script, for a Unix /bin/sh interpreter.
 # For more examples and pre-written hooks, see those in
 # the Subversion repository at
-# http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/ and
-# http://svn.collab.net/repos/svn/trunk/contrib/hook-scripts/
+# http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/ and
+# http://svn.apache.org/repos/asf/subversion/trunk/contrib/hook-scripts/
 
 
 REPOS="$1"

Modified: subversion/branches/ignore-mergeinfo/notes/obliterate/plan-milestones.html
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/notes/obliterate/plan-milestones.html?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/notes/obliterate/plan-milestones.html (original)
+++ subversion/branches/ignore-mergeinfo/notes/obliterate/plan-milestones.html Tue Aug 10 18:06:17 2010
@@ -66,7 +66,8 @@
       <th>November 2009</th>
       <th>Milestone 1</th>
       <th>Milestone 2</th>
-      <th>Milestone 3</th>
+      <th>Milestone 3a</th>
+      <th>Milestone 3b</th>
       <th>Not planned</th>
     </tr>
     <tr>
@@ -82,6 +83,9 @@
         Obliteration of any node-rev. Some user docs.
       </td>
       <td>
+        Support FSFS.
+      </td>
+      <td>
         Support for large-scale deployment.
       </td>
       <td>
@@ -94,6 +98,9 @@
       <td class="done">
         <p>single node (PATH@REV)</p>
       </td>
+      <td class="done">
+        <p></p>
+      </td>
       <td>
         <p></p>
       </td>
@@ -107,6 +114,7 @@
       <td>
         <p>GUI</p>
         <p>find all copies of the specified nodes</p>
+        <p>dry-run mode</p>
       </td>
     </tr>
     <tr>
@@ -115,7 +123,7 @@
         <p>pre-oblit hook designed</p>
         <p>pre-oblit hook template generated on repository creation</p>
       </td>
-      <td>
+      <td class="done">
         <p>call the pre-oblit hook</p>
       </td>
       <td>
@@ -127,6 +135,9 @@
       <td>
         <p></p>
       </td>
+      <td>
+        <p></p>
+      </td>
     </tr>
     <tr>
       <th>CORE (history change)<br/><a href="design-repos.html#history"
@@ -136,20 +147,23 @@
         <p>skeleton of txn-replacement functions created (doesn't work)</p>
       </td>
       <td>
-        <p>in FSFS: oblit the last revision of a node's history</p>
+        <p class="done">oblit the last revision of a node's history (in BDB)</p>
         <p>(to do: understand &amp; doc the DAG node-copy-ids)</p>
-        <p>(to design: refine <a href="design-repos.html"
+        <p class="done">(to design: refine <a href="design-repos.html"
           >oblit txn replacement</a>)</p>
-        <p>(to design: FSFS rev-file replacement: offset mapping)</p>
       </td>
       <td>
         <p>oblit any rev of a node's history</p>
         <p>(to design: adjusting of back-refs)</p>
         <p>(to design: forward-refs for efficient searching - see <a href=
-        "http://svn.collab.net/repos/svn/branches/fs-successor-ids/BRANCH-README"
+        "http://svn.apache.org/repos/asf/subversion/branches/fs-successor-ids/BRANCH-README"
         >fs-successor-ids</a> branch for BDB)</p>
       </td>
       <td>
+        <p>FSFS implementation</p>
+        <p>(to design: FSFS rev-file replacement: offset mapping)</p>
+      </td>
+      <td>
         <p>forward-refs for efficient searching</p>
         <p>efficient revision-range support (foo@1:500000)
         </p>
@@ -164,6 +178,9 @@
       <td class="done">
         <p></p>
       </td>
+      <td class="done">
+        <p></p>
+      </td>
       <td>
         <p></p>
       </td>
@@ -171,7 +188,7 @@
         <p></p>
       </td>
       <td>
-        <p>space recovery</p>
+        <p>space recovery (FSFS)</p>
       </td>
       <td>
         <p></p>
@@ -183,13 +200,16 @@
         <p>post-oblit hook designed</p>
         <p>post-oblit hook template generated on repository creation</p>
       </td>
-      <td>
+      <td class="done">
         <p></p>
       </td>
       <td>
         <p>call post-oblit hook</p>
       </td>
       <td>
+        <p></p>
+      </td>
+      <td>
         <p>server log file</p>
       </td>
       <td>
@@ -201,13 +221,16 @@
       <td class="done">
         <p></p>
       </td>
-      <td>
+      <td class="done">
         <p></p>
       </td>
       <td>
         <p>discover &amp; doc the WC behaviour &amp; how to survive it</p>
       </td>
       <td>
+        <p></p>
+      </td>
+      <td>
         <p>design WC behaviour improvements</p>
         <p>obliteration discovery protocol</p>
       </td>
@@ -220,13 +243,16 @@
       <td class="done">
         <p>skeleton of one automated test (doesn't work)</p>
       </td>
-      <td>
+      <td class="done">
         <p>some automated tests</p>
       </td>
       <td>
         <p>automated tests for most parts</p>
       </td>
       <td>
+        <p></p>
+      </td>
+      <td>
         <p>complete automated tests</p>
         <p>stress test (manually checked)</p>
       </td>
@@ -248,6 +274,9 @@
         <p>some user docs</p>
       </td>
       <td>
+        <p></p>
+      </td>
+      <td>
         <p>user documentation</p>
       </td>
       <td>

Modified: subversion/branches/ignore-mergeinfo/notes/subversion-design.html
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/notes/subversion-design.html?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/notes/subversion-design.html (original)
+++ subversion/branches/ignore-mergeinfo/notes/subversion-design.html Tue Aug 10 18:06:17 2010
@@ -2255,7 +2255,7 @@ write/Makefile:6
 
     <p>For a detailed description of exactly how Greg Stein
       <em class="email">gstein@lyra.org</em> is mapping the WebDAV DeltaV spec to
-      Subversion, see his paper: <a href="http://svn.collab.net/repos/svn/trunk/www/webdav-usage.html">http://svn.collab.net/repos/svn/trunk/www/webdav-usage.html</a>
+      Subversion, see his paper: <a href="http://svn.apache.org/repos/asf/subversion/trunk/www/webdav-usage.html">http://svn.apache.org/repos/asf/subversion/trunk/www/webdav-usage.html</a>
     </p>
 
     <p>For more information on WebDAV and the DeltaV extensions, see
@@ -2273,7 +2273,7 @@ write/Makefile:6
 
     <p>The client library <tt class="literal">libsvn_ra_svn</tt> and standalone
       server program <tt class="literal">svnserve</tt> implement a custom protocol
-      over TCP.  This protocol is documented at <a href="http://svn.collab.net/repos/svn/trunk/subversion/libsvn_ra_svn/protocol">http://svn.collab.net/repos/svn/trunk/subversion/libsvn_ra_svn/protocol</a>.</p>
+      over TCP.  This protocol is documented at <a href="http://svn.apache.org/repos/asf/subversion/trunk/subversion/libsvn_ra_svn/protocol">http://svn.apache.org/repos/asf/subversion/trunk/subversion/libsvn_ra_svn/protocol</a>.</p>
   </div> <!-- protocol.svn (h3) -->
 </div> <!-- protocol (h2) -->
 

Modified: subversion/branches/ignore-mergeinfo/notes/wc-ng/design
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/notes/wc-ng/design?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/notes/wc-ng/design (original)
+++ subversion/branches/ignore-mergeinfo/notes/wc-ng/design Tue Aug 10 18:06:17 2010
@@ -56,6 +56,11 @@ defined.  When explicitly considering wh
 working copy at one time or another, the following trees can be
 found:
 
+  ###
+  ### WARNING: the following descriptions don't correspond to either
+  ###   the WC-NG DB concepts or the command-line user concepts.
+  ###
+
  * BASE: The tree of nodes from the repository, against which local changes
      are made.  Also known as "pristine".  Each node is as it was in the
      repository at a particular revision and URL, as recorded per node in

Modified: subversion/branches/ignore-mergeinfo/packages/python-windows/setup.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/packages/python-windows/setup.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/packages/python-windows/setup.py (original)
+++ subversion/branches/ignore-mergeinfo/packages/python-windows/setup.py Tue Aug 10 18:06:17 2010
@@ -27,8 +27,8 @@ from svn.core import SVN_VER_NUMBER
 
 setup (name = "svn-python",
        description = "Subversion Python Bindings",
-       maintainer = "Subversion Developers <de...@subversion.tigris.org>",
-       url = "http://subversion.tigris.org",
+       maintainer = "Subversion Developers <de...@subversion.apache.org>",
+       url = "http://subversion.apache.org",
        version = SVN_VER_NUMBER,
        packages = ["libsvn", "svn"],
        package_data = {"libsvn": ["*.dll", "*.pyd"]})

Modified: subversion/branches/ignore-mergeinfo/packages/solaris/pkginfo.in
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/packages/solaris/pkginfo.in?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/packages/solaris/pkginfo.in (original)
+++ subversion/branches/ignore-mergeinfo/packages/solaris/pkginfo.in Tue Aug 10 18:06:17 2010
@@ -4,8 +4,8 @@ ARCH="@target_cpu@"
 VERSION=@PACKAGE_VERSION@
 CATEGORY="application"
 VENDOR="Subversion Project"
-EMAIL="dev@subversion.tigris.org"
-PSTAMP="dev@subversion.tigris.org"
+EMAIL="dev@subversion.apache.org"
+PSTAMP="dev@subversion.apache.org"
 BASEDIR="@prefix@"
 CLASSES="none"
 

Modified: subversion/branches/ignore-mergeinfo/packages/windows-WiX/BuildSubversion/WixDialog/loc/en-us/Pre.rtf
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/packages/windows-WiX/BuildSubversion/WixDialog/loc/en-us/Pre.rtf?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
Binary files - no diff available.

Modified: subversion/branches/ignore-mergeinfo/packages/windows-innosetup/Pre.rtf
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/packages/windows-innosetup/Pre.rtf?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/packages/windows-innosetup/Pre.rtf (original)
+++ subversion/branches/ignore-mergeinfo/packages/windows-innosetup/Pre.rtf Tue Aug 10 18:06:17 2010
@@ -12,7 +12,7 @@ Subversion is a compelling replacement f
 \
 See:\
   http://subversion.tigris.org/ and\
-  http://svn.collab.net/repos/svn/trunk/CHANGES for more info.\
+  http://svn.apache.org/repos/asf/subversion/trunk/CHANGES for more info.\
 \
 Subversion is using some external programs and libraries included in this package.\
 The proper licenses are in the licenses folder in the application path created after this installation.\

Modified: subversion/branches/ignore-mergeinfo/subversion/bindings/ctypes-python/csvn/core/functions.py.in
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/bindings/ctypes-python/csvn/core/functions.py.in?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/bindings/ctypes-python/csvn/core/functions.py.in (original)
+++ subversion/branches/ignore-mergeinfo/subversion/bindings/ctypes-python/csvn/core/functions.py.in Tue Aug 10 18:06:17 2010
@@ -65,6 +65,11 @@ def SVN_ERR(ret):
         raise SubversionException(err)
     return ret
 
+# If a error is returned from a Subversion function,
+# raise an exception
+def _svn_errcheck(result, func, args):
+    return SVN_ERR(result)
+
 # As of ctypes 1.0, ctypes does not support custom error-checking
 # functions on callbacks, nor does it support custom datatypes on
 # callbacks, so ctypesgen sets the return values for callbacks

Modified: subversion/branches/ignore-mergeinfo/subversion/bindings/ctypes-python/setup.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/bindings/ctypes-python/setup.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/bindings/ctypes-python/setup.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/bindings/ctypes-python/setup.py Tue Aug 10 18:06:17 2010
@@ -254,10 +254,10 @@ class build(_build):
           sys.exit(2)
 
     if not self.dry_run:
+      r = re.compile(r"(\s+\w+)\.restype = POINTER\(svn_error_t\)")
       out = open("svn_all2.py", "w")
       for line in open("svn_all.py"):
-        line = line.replace("restype = POINTER(svn_error_t)",
-                            "restype = SVN_ERR")
+        line = r.sub("\\1.restype = POINTER(svn_error_t)\n\\1.errcheck = _svn_errcheck", line)
 
         if not line.startswith("FILE ="):
           out.write(line)
@@ -470,8 +470,8 @@ setup(cmdclass={'build': build, 'clean':
       version='0.1',
       description='Python bindings for the Subversion version control system.',
       author='The Subversion Team',
-      author_email='dev@subversion.tigris.org',
-      url='http://subversion.tigris.org',
+      author_email='dev@subversion.apache.org',
+      url='http://subversion.apache.org',
       packages=['csvn', 'csvn.core', 'csvn.ext'],
       license='Apache License, Version 2.0',
      )

Modified: subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/BlameCallback.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/BlameCallback.cpp?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/BlameCallback.cpp (original)
+++ subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/BlameCallback.cpp Tue Aug 10 18:06:17 2010
@@ -25,7 +25,7 @@
  */
 
 #include "BlameCallback.h"
-#include "ProplistCallback.h"
+#include "CreateJ.h"
 #include "JNIUtil.h"
 #include "svn_time.h"
 /**
@@ -79,69 +79,54 @@ BlameCallback::singleLine(apr_int64_t li
 {
   JNIEnv *env = JNIUtil::getEnv();
 
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
+    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(JAVA_PACKAGE"/BlameCallback3");
+      jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/BlameCallback");
       if (JNIUtil::isJavaExceptionThrown())
-        return SVN_NO_ERROR;
+        POP_AND_RETURN(SVN_NO_ERROR);
 
       mid = env->GetMethodID(clazz, "singleLine",
                              "(JJLjava/util/Map;JLjava/util/Map;"
                              "Ljava/lang/String;Ljava/lang/String;Z)V");
       if (JNIUtil::isJavaExceptionThrown() || mid == 0)
-        return SVN_NO_ERROR;
-
-      env->DeleteLocalRef(clazz);
-      if (JNIUtil::isJavaExceptionThrown())
-        return SVN_NO_ERROR;
+        POP_AND_RETURN(SVN_NO_ERROR);
     }
 
   // convert the parameters to their Java relatives
-  jobject jrevProps = ProplistCallback::makeMapFromHash(revProps, pool);
+  jobject jrevProps = CreateJ::PropertyMap(revProps, pool);
   if (JNIUtil::isJavaExceptionThrown())
-    return SVN_NO_ERROR;
+    POP_AND_RETURN(SVN_NO_ERROR);
 
   jobject jmergedRevProps = NULL;
   if (mergedRevProps != NULL)
     {
-      jmergedRevProps = ProplistCallback::makeMapFromHash(mergedRevProps, pool);
+      jmergedRevProps = CreateJ::PropertyMap(mergedRevProps, pool);
       if (JNIUtil::isJavaExceptionThrown())
-        return SVN_NO_ERROR;
+        POP_AND_RETURN(SVN_NO_ERROR);
     }
 
   jstring jmergedPath = JNIUtil::makeJString(mergedPath);
   if (JNIUtil::isJavaExceptionThrown())
-    return SVN_NO_ERROR;
+    POP_AND_RETURN(SVN_NO_ERROR);
 
   jstring jline = JNIUtil::makeJString(line);
   if (JNIUtil::isJavaExceptionThrown())
-    return SVN_NO_ERROR;
+    POP_AND_RETURN(SVN_NO_ERROR);
 
   // call the Java method
   env->CallVoidMethod(m_callback, mid, (jlong)line_no, (jlong)revision,
                       jrevProps, (jlong)mergedRevision, jmergedRevProps,
                       jmergedPath, jline, (jboolean)localChange);
-  if (JNIUtil::isJavaExceptionThrown())
-    return SVN_NO_ERROR;
-
-  // cleanup the temporary Java objects
-  env->DeleteLocalRef(jrevProps);
-  if (JNIUtil::isJavaExceptionThrown())
-    return SVN_NO_ERROR;
-
-  env->DeleteLocalRef(jmergedRevProps);
-  if (JNIUtil::isJavaExceptionThrown())
-    return SVN_NO_ERROR;
-
-  env->DeleteLocalRef(jmergedPath);
-  if (JNIUtil::isJavaExceptionThrown())
-    return SVN_NO_ERROR;
-
-  env->DeleteLocalRef(jline);
   // No need to check for an exception here, because we return anyway.
 
+  env->PopLocalFrame(NULL);
   return SVN_NO_ERROR;
 }

Modified: subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/ChangelistCallback.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/ChangelistCallback.cpp?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/ChangelistCallback.cpp (original)
+++ subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/ChangelistCallback.cpp Tue Aug 10 18:06:17 2010
@@ -72,7 +72,7 @@ ChangelistCallback::doChangelist(const c
   // it can be cached.
   if (mid == 0)
     {
-      jclass clazz = env->FindClass(JAVA_PACKAGE"/ChangelistCallback");
+      jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/ChangelistCallback");
       if (JNIUtil::isJavaExceptionThrown())
         return;
 

Modified: subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CommitMessage.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CommitMessage.cpp?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CommitMessage.cpp (original)
+++ subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CommitMessage.cpp Tue Aug 10 18:06:17 2010
@@ -25,10 +25,12 @@
  */
 
 #include "CommitMessage.h"
+#include "CreateJ.h"
+#include "EnumMapper.h"
 #include "JNIUtil.h"
 #include <apr_tables.h>
 #include "svn_client.h"
-#include "../include/org_tigris_subversion_javahl_CommitItemStateFlags.h"
+#include "../include/org_apache_subversion_javahl_CommitItemStateFlags.h"
 
 CommitMessage::CommitMessage(jobject jcommitMessage)
 {
@@ -95,11 +97,6 @@ CommitMessage::getCommitMessage(const ap
   if (JNIUtil::isExceptionThrown())
     return NULL;
 
-  int count = commit_items->nelts;
-  jobjectArray jitems = env->NewObjectArray(count, clazz, NULL);
-  if (JNIUtil::isExceptionThrown())
-    return NULL;
-
   // Java method ids will not change during the time this library is
   // loaded, so they can be cached.
 
@@ -109,7 +106,8 @@ CommitMessage::getCommitMessage(const ap
     {
       midConstructor = env->GetMethodID(clazz, "<init>",
                                         "(Ljava/lang/String;"
-                                        "IILjava/lang/String;"
+                                        "L"JAVA_PACKAGE"/NodeKind;"
+                                        "ILjava/lang/String;"
                                         "Ljava/lang/String;J)V");
       if (JNIUtil::isExceptionThrown())
         return NULL;
@@ -124,8 +122,7 @@ CommitMessage::getCommitMessage(const ap
         return NULL;
 
       midCallback = env->GetMethodID(clazz2, "getLogMessage",
-                                     "([L"JAVA_PACKAGE"/CommitItem;)"
-                                     "Ljava/lang/String;");
+                                     "(Ljava/util/Set;)Ljava/lang/String;");
       if (JNIUtil::isJavaExceptionThrown())
         return NULL;
 
@@ -135,7 +132,8 @@ CommitMessage::getCommitMessage(const ap
     }
 
   // create a Java CommitItem for each of the passed in commit items
-  for (int i = 0; i < count; ++i)
+  std::vector<jobject> jitems;
+  for (int i = 0; i < commit_items->nelts; ++i)
     {
       svn_client_commit_item3_t *item =
         APR_ARRAY_IDX(commit_items, i, svn_client_commit_item3_t *);
@@ -143,28 +141,34 @@ CommitMessage::getCommitMessage(const ap
       // convert the commit item members to the match Java members
       jstring jpath = JNIUtil::makeJString(item->path);
 
-      jint jnodeKind = item->kind;
+      jobject jnodeKind = EnumMapper::mapNodeKind(item->kind);
+      if (JNIUtil::isJavaExceptionThrown())
+        return NULL;
 
       jint jstateFlags = 0;
       if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_ADD)
         jstateFlags |=
-          org_tigris_subversion_javahl_CommitItemStateFlags_Add;
+          org_apache_subversion_javahl_CommitItemStateFlags_Add;
       if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE)
         jstateFlags |=
-          org_tigris_subversion_javahl_CommitItemStateFlags_Delete;
+          org_apache_subversion_javahl_CommitItemStateFlags_Delete;
       if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_TEXT_MODS)
         jstateFlags |=
-          org_tigris_subversion_javahl_CommitItemStateFlags_TextMods;
+          org_apache_subversion_javahl_CommitItemStateFlags_TextMods;
       if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_PROP_MODS)
         jstateFlags |=
-          org_tigris_subversion_javahl_CommitItemStateFlags_PropMods;
+          org_apache_subversion_javahl_CommitItemStateFlags_PropMods;
       if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_IS_COPY)
         jstateFlags |=
-          org_tigris_subversion_javahl_CommitItemStateFlags_IsCopy;
+          org_apache_subversion_javahl_CommitItemStateFlags_IsCopy;
 
       jstring jurl = JNIUtil::makeJString(item->url);
+      if (JNIUtil::isJavaExceptionThrown())
+        return NULL;
 
       jstring jcopyUrl = JNIUtil::makeJString(item->copyfrom_url);
+      if (JNIUtil::isJavaExceptionThrown())
+        return NULL;
 
       jlong jcopyRevision = item->revision;
 
@@ -180,6 +184,9 @@ CommitMessage::getCommitMessage(const ap
       if (JNIUtil::isJavaExceptionThrown())
         return NULL;
 
+      env->DeleteLocalRef(jnodeKind);
+      if (JNIUtil::isJavaExceptionThrown())
+        return NULL;
 
       env->DeleteLocalRef(jurl);
       if (JNIUtil::isJavaExceptionThrown())
@@ -190,10 +197,9 @@ CommitMessage::getCommitMessage(const ap
         return NULL;
 
       // store the Java object into the array
-      env->SetObjectArrayElement(jitems, i, jitem);
-      if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+      jitems.push_back(jitem);
     }
+
   env->DeleteLocalRef(clazz);
   if (JNIUtil::isJavaExceptionThrown())
     return NULL;
@@ -201,12 +207,7 @@ CommitMessage::getCommitMessage(const ap
   // call the Java callback method
   jstring jmessage = (jstring)env->CallObjectMethod(m_jcommitMessage,
                                                     midCallback,
-                                                    jitems);
-  if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-
-  // release the Java object array
-  env->DeleteLocalRef(jitems);
+                                                    CreateJ::Set(jitems));
   if (JNIUtil::isJavaExceptionThrown())
     return NULL;
 

Modified: subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/ConflictResolverCallback.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/ConflictResolverCallback.cpp?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/ConflictResolverCallback.cpp (original)
+++ subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/ConflictResolverCallback.cpp Tue Aug 10 18:06:17 2010
@@ -26,7 +26,6 @@
 
 #include "svn_error.h"
 
-#include "../include/org_tigris_subversion_javahl_ConflictResult.h"
 #include "JNIUtil.h"
 #include "JNIStringHolder.h"
 #include "EnumMapper.h"
@@ -57,7 +56,7 @@ ConflictResolverCallback::makeCConflictR
 
   // Sanity check that the object implements the ConflictResolverCallback
   // Java interface.
-  jclass clazz = env->FindClass(JAVA_PACKAGE "/ConflictResolverCallback");
+  jclass clazz = env->FindClass(JAVA_PACKAGE "/callback/ConflictResolverCallback");
   if (JNIUtil::isJavaExceptionThrown())
     return NULL;
 
@@ -99,31 +98,32 @@ ConflictResolverCallback::resolve(svn_wc
 {
   JNIEnv *env = JNIUtil::getEnv();
 
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
+    return SVN_NO_ERROR;
+
   // As Java method IDs will not change during the time this library
   // is loaded, they can be cached.
   static jmethodID mid = 0;
   if (mid == 0)
     {
       // Initialize the callback method ID.
-      jclass clazz = env->FindClass(JAVA_PACKAGE "/ConflictResolverCallback");
+      jclass clazz = env->FindClass(JAVA_PACKAGE "/callback/ConflictResolverCallback");
       if (JNIUtil::isJavaExceptionThrown())
-        return SVN_NO_ERROR;
+        POP_AND_RETURN(SVN_NO_ERROR);
 
       mid = env->GetMethodID(clazz, "resolve",
                              "(L" JAVA_PACKAGE "/ConflictDescriptor;)"
                              "L" JAVA_PACKAGE "/ConflictResult;");
       if (JNIUtil::isJavaExceptionThrown() || mid == 0)
-        return SVN_NO_ERROR;
-
-      env->DeleteLocalRef(clazz);
-      if (JNIUtil::isJavaExceptionThrown())
-        return SVN_NO_ERROR;
+        POP_AND_RETURN(SVN_NO_ERROR);
     }
 
   // Create an instance of the conflict descriptor.
   jobject jdesc = CreateJ::ConflictDescriptor(desc);
   if (JNIUtil::isJavaExceptionThrown())
-    return SVN_NO_ERROR;
+    POP_AND_RETURN(SVN_NO_ERROR);
 
   // Invoke the Java conflict resolver callback method using the descriptor.
   jobject jresult = env->CallObjectMethod(m_conflictResolver, mid, jdesc);
@@ -132,17 +132,20 @@ ConflictResolverCallback::resolve(svn_wc
       // If an exception is thrown by our conflict resolver, remove it
       // from the JNI env, and convert it into a Subversion error.
       const char *msg = JNIUtil::thrownExceptionToCString();
-      return svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL, msg);
+      svn_error_t *err = svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
+                                          NULL, msg);
+      env->PopLocalFrame(NULL);
+      return err;
     }
   *result = javaResultToC(jresult, pool);
   if (*result == NULL)
-    // Unable to convert the result into a C representation.
-    return svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL, NULL);
-
-  env->DeleteLocalRef(jdesc);
-  if (JNIUtil::isJavaExceptionThrown())
-    return SVN_NO_ERROR;
+    {
+      // Unable to convert the result into a C representation.
+      env->PopLocalFrame(NULL);
+      return svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL, NULL);
+    }
 
+  env->PopLocalFrame(NULL);
   return SVN_NO_ERROR;
 }
 
@@ -150,6 +153,12 @@ svn_wc_conflict_result_t *
 ConflictResolverCallback::javaResultToC(jobject jresult, apr_pool_t *pool)
 {
   JNIEnv *env = JNIUtil::getEnv();
+
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
+    return SVN_NO_ERROR;
+
   static jmethodID getChoice = 0;
   static jmethodID getMergedPath = 0;
 
@@ -158,63 +167,41 @@ ConflictResolverCallback::javaResultToC(
     {
       clazz = env->FindClass(JAVA_PACKAGE "/ConflictResult");
       if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+        POP_AND_RETURN_NULL;
     }
 
   if (getChoice == 0)
     {
-      getChoice = env->GetMethodID(clazz, "getChoice", "()I");
+      getChoice = env->GetMethodID(clazz, "getChoice",
+                                   "()L"JAVA_PACKAGE"/ConflictResult$Choice;");
       if (JNIUtil::isJavaExceptionThrown() || getChoice == 0)
-        return NULL;
+        POP_AND_RETURN_NULL;
     }
   if (getMergedPath == 0)
     {
       getMergedPath = env->GetMethodID(clazz, "getMergedPath",
                                        "()Ljava/lang/String;");
       if (JNIUtil::isJavaExceptionThrown() || getMergedPath == 0)
-        return NULL;
+        POP_AND_RETURN_NULL;
     }
 
-  if (clazz)
-    {
-      env->DeleteLocalRef(clazz);
-      if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    }
-
-  jint jchoice = env->CallIntMethod(jresult, getChoice);
+  jobject jchoice = env->CallObjectMethod(jresult, getChoice);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
 
-  jstring jmergedPath =
-    (jstring) env->CallObjectMethod(jresult, getMergedPath);
+  jstring jmergedPath = (jstring) env->CallObjectMethod(jresult, getMergedPath);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
+
   JNIStringHolder mergedPath(jmergedPath);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
 
-  return svn_wc_create_conflict_result(javaChoiceToC(jchoice),
+  svn_wc_conflict_result_t *result =
+         svn_wc_create_conflict_result(EnumMapper::toConflictChoice(jchoice),
                                        mergedPath.pstrdup(pool),
                                        pool);
-}
 
-svn_wc_conflict_choice_t ConflictResolverCallback::javaChoiceToC(jint jchoice)
-{
-  switch (jchoice)
-    {
-    case org_tigris_subversion_javahl_ConflictResult_postpone:
-    default:
-      return svn_wc_conflict_choose_postpone;
-    case org_tigris_subversion_javahl_ConflictResult_chooseBase:
-      return svn_wc_conflict_choose_base;
-    case org_tigris_subversion_javahl_ConflictResult_chooseTheirsFull:
-      return svn_wc_conflict_choose_theirs_full;
-    case org_tigris_subversion_javahl_ConflictResult_chooseMineFull:
-      return svn_wc_conflict_choose_mine_full;
-    case org_tigris_subversion_javahl_ConflictResult_chooseTheirsConflict:
-      return svn_wc_conflict_choose_theirs_conflict;
-    case org_tigris_subversion_javahl_ConflictResult_chooseMineConflict:
-      return svn_wc_conflict_choose_mine_conflict;
-    case org_tigris_subversion_javahl_ConflictResult_chooseMerged:
-      return svn_wc_conflict_choose_merged;
-    }
+  env->PopLocalFrame(NULL);
+  return result;
 }

Modified: subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/ConflictResolverCallback.h
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/ConflictResolverCallback.h?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/ConflictResolverCallback.h (original)
+++ subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/ConflictResolverCallback.h Tue Aug 10 18:06:17 2010
@@ -91,12 +91,6 @@ class ConflictResolverCallback
    */
   static svn_wc_conflict_result_t * javaResultToC(jobject result,
                                                   apr_pool_t *pool);
-
-  /**
-   * Convert the Java conflict resolution @a choice into the
-   * appropriate C enum value.
-   */
-  static svn_wc_conflict_choice_t javaChoiceToC(jint choice);
 };
 
 #endif  // CONFLICTRESOLVERCALLBACK_H

Modified: subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CopySources.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CopySources.cpp?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CopySources.cpp (original)
+++ subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CopySources.cpp Tue Aug 10 18:06:17 2010
@@ -33,16 +33,13 @@
 #include "Revision.h"
 #include "CopySources.h"
 
-CopySources::CopySources(jobjectArray jcopySources)
+CopySources::CopySources(Array &copySources)
+    : m_copySources(copySources)
 {
-  m_copySources = jcopySources;
 }
 
 CopySources::~CopySources()
 {
-  // m_copySources does not need to be destroyed, because it is a
-  // parameter to the Java SVNClient.copy() method, and thus not
-  // explicitly managed.
 }
 
 jobject
@@ -50,17 +47,22 @@ CopySources::makeJCopySource(const char 
 {
   JNIEnv *env = JNIUtil::getEnv();
 
-  jobject jpath = JNIUtil::makeJString(path);
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
   if (JNIUtil::isJavaExceptionThrown())
     return NULL;
 
+  jobject jpath = JNIUtil::makeJString(path);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
   jobject jrevision = Revision::makeJRevision(rev);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
 
   jclass clazz = env->FindClass(JAVA_PACKAGE "/CopySource");
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
 
   static jmethodID ctor = 0;
   if (ctor == 0)
@@ -70,129 +72,107 @@ CopySources::makeJCopySource(const char 
                               "L" JAVA_PACKAGE "/Revision;"
                               "L" JAVA_PACKAGE "/Revision;)V");
       if (JNIUtil::isExceptionThrown())
-        return NULL;
+        POP_AND_RETURN_NULL;
     }
 
   jobject jcopySource = env->NewObject(clazz, ctor, jpath, jrevision, NULL);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-
-  env->DeleteLocalRef(jpath);
-  if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
 
-  env->DeleteLocalRef(jrevision);
-  if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-
-  return jcopySource;
+  return env->PopLocalFrame(jcopySource);
 }
 
 apr_array_header_t *
 CopySources::array(SVN::Pool &pool)
 {
   apr_pool_t *p = pool.pool();
-  if (m_copySources == NULL)
-    return apr_array_make(p, 0, sizeof(svn_client_copy_source_t *));
 
   JNIEnv *env = JNIUtil::getEnv();
-  jint nbrSources = env->GetArrayLength(m_copySources);
-  if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-
   jclass clazz = env->FindClass(JAVA_PACKAGE "/CopySource");
   if (JNIUtil::isJavaExceptionThrown())
     return NULL;
 
+  std::vector<jobject> sources = m_copySources.vector();
+
   apr_array_header_t *copySources =
-    apr_array_make(p, nbrSources, sizeof(svn_client_copy_source_t *));
-  for (int i = 0; i < nbrSources; ++i)
+    apr_array_make(p, sources.size(), sizeof(svn_client_copy_source_t *));
+  for (std::vector<jobject>::const_iterator it = sources.begin();
+        it < sources.end(); ++it)
     {
-      jobject copySource = env->GetObjectArrayElement(m_copySources, i);
-      if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+      svn_client_copy_source_t *src =
+        (svn_client_copy_source_t *) apr_palloc(p, sizeof(*src));
 
-      if (env->IsInstanceOf(copySource, clazz))
+      // Extract the path or URL from the copy source.
+      static jmethodID getPath = 0;
+      if (getPath == 0)
         {
-          svn_client_copy_source_t *src =
-            (svn_client_copy_source_t *) apr_palloc(p, sizeof(*src));
-
-          // Extract the path or URL from the copy source.
-          static jmethodID getPath = 0;
-          if (getPath == 0)
-            {
-              getPath = env->GetMethodID(clazz, "getPath",
-                                         "()Ljava/lang/String;");
-              if (JNIUtil::isJavaExceptionThrown() || getPath == 0)
-                return NULL;
-            }
-          jstring jpath = (jstring)
-            env->CallObjectMethod(copySource, getPath);
-          if (JNIUtil::isJavaExceptionThrown())
-            return NULL;
-
-          JNIStringHolder path(jpath);
-          if (JNIUtil::isJavaExceptionThrown())
+          getPath = env->GetMethodID(clazz, "getPath",
+                                     "()Ljava/lang/String;");
+          if (JNIUtil::isJavaExceptionThrown() || getPath == 0)
             return NULL;
+        }
+      jstring jpath = (jstring)
+        env->CallObjectMethod(*it, getPath);
+      if (JNIUtil::isJavaExceptionThrown())
+        return NULL;
 
-          src->path = apr_pstrdup(p, (const char *) path);
-          SVN_JNI_ERR(JNIUtil::preprocessPath(src->path, pool.pool()),
-                      NULL);
-          env->DeleteLocalRef(jpath);
-          if (JNIUtil::isJavaExceptionThrown())
-            return NULL;
+      JNIStringHolder path(jpath);
+      if (JNIUtil::isJavaExceptionThrown())
+        return NULL;
 
-          // Extract source revision from the copy source.
-          static jmethodID getRevision = 0;
-          if (getRevision == 0)
-            {
-              getRevision = env->GetMethodID(clazz, "getRevision",
-                                             "()L"JAVA_PACKAGE"/Revision;");
-              if (JNIUtil::isJavaExceptionThrown() || getRevision == 0)
-                return NULL;
-            }
-          jobject jrev = env->CallObjectMethod(copySource, getRevision);
-          if (JNIUtil::isJavaExceptionThrown())
-            return NULL;
+      src->path = apr_pstrdup(p, (const char *) path);
+      SVN_JNI_ERR(JNIUtil::preprocessPath(src->path, pool.pool()),
+                  NULL);
+      env->DeleteLocalRef(jpath);
+      if (JNIUtil::isJavaExceptionThrown())
+        return NULL;
 
-          // TODO: Default this to svn_opt_revision_undefined (or HEAD)
-          Revision rev(jrev);
-          src->revision = (const svn_opt_revision_t *)
-            apr_palloc(p, sizeof(*src->revision));
-          memcpy((void *) src->revision, rev.revision(),
-                 sizeof(*src->revision));
-          env->DeleteLocalRef(jrev);
-          if (JNIUtil::isJavaExceptionThrown())
+      // Extract source revision from the copy source.
+      static jmethodID getRevision = 0;
+      if (getRevision == 0)
+        {
+          getRevision = env->GetMethodID(clazz, "getRevision",
+                                         "()L"JAVA_PACKAGE"/Revision;");
+          if (JNIUtil::isJavaExceptionThrown() || getRevision == 0)
             return NULL;
+        }
+      jobject jrev = env->CallObjectMethod(*it, getRevision);
+      if (JNIUtil::isJavaExceptionThrown())
+        return NULL;
 
-          // Extract pegRevision from the copy source.
-          static jmethodID getPegRevision = 0;
-          if (getPegRevision == 0)
-            {
-              getPegRevision = env->GetMethodID(clazz, "getPegRevision",
-                                                "()L"JAVA_PACKAGE"/Revision;");
-              if (JNIUtil::isJavaExceptionThrown() || getPegRevision == 0)
-                return NULL;
-            }
-          jobject jPegRev = env->CallObjectMethod(copySource,
-                                                  getPegRevision);
-          if (JNIUtil::isJavaExceptionThrown())
-            return NULL;
+      // TODO: Default this to svn_opt_revision_undefined (or HEAD)
+      Revision rev(jrev);
+      src->revision = (const svn_opt_revision_t *)
+        apr_palloc(p, sizeof(*src->revision));
+      memcpy((void *) src->revision, rev.revision(),
+             sizeof(*src->revision));
+      env->DeleteLocalRef(jrev);
+      if (JNIUtil::isJavaExceptionThrown())
+        return NULL;
 
-          Revision pegRev(jPegRev, true);
-          src->peg_revision = (const svn_opt_revision_t *)
-            apr_palloc(p, sizeof(*src->peg_revision));
-          memcpy((void *) src->peg_revision, pegRev.revision(),
-                 sizeof(*src->peg_revision));
-          env->DeleteLocalRef(jPegRev);
-          if (JNIUtil::isJavaExceptionThrown())
+      // Extract pegRevision from the copy source.
+      static jmethodID getPegRevision = 0;
+      if (getPegRevision == 0)
+        {
+          getPegRevision = env->GetMethodID(clazz, "getPegRevision",
+                                            "()L"JAVA_PACKAGE"/Revision;");
+          if (JNIUtil::isJavaExceptionThrown() || getPegRevision == 0)
             return NULL;
-
-          APR_ARRAY_PUSH(copySources, svn_client_copy_source_t *) = src;
         }
-      env->DeleteLocalRef(copySource);
+      jobject jPegRev = env->CallObjectMethod(*it, getPegRevision);
       if (JNIUtil::isJavaExceptionThrown())
         return NULL;
+
+      Revision pegRev(jPegRev, true);
+      src->peg_revision = (const svn_opt_revision_t *)
+        apr_palloc(p, sizeof(*src->peg_revision));
+      memcpy((void *) src->peg_revision, pegRev.revision(),
+             sizeof(*src->peg_revision));
+      env->DeleteLocalRef(jPegRev);
+      if (JNIUtil::isJavaExceptionThrown())
+        return NULL;
+
+      APR_ARRAY_PUSH(copySources, svn_client_copy_source_t *) = src;
     }
 
   env->DeleteLocalRef(clazz);

Modified: subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CopySources.h
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CopySources.h?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CopySources.h (original)
+++ subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CopySources.h Tue Aug 10 18:06:17 2010
@@ -30,7 +30,8 @@
 #include <jni.h>
 #include <apr_tables.h>
 
-class SVN::Pool;
+#include "Pool.h"
+#include "Array.h"
 
 /**
  * A container for our copy sources, which can convert them into an
@@ -43,7 +44,7 @@ class CopySources
    * Create a CopySources object.
    * @param jobjectArray An array of CopySource Java objects.
    */
-  CopySources(jobjectArray copySources);
+  CopySources(Array &copySources);
 
   /**
    * Destroy a CopySources object
@@ -69,7 +70,7 @@ class CopySources
   /**
    * A local reference to the Java CopySources peer.
    */
-  jobjectArray m_copySources;
+  Array &m_copySources;
 };
 
 #endif  /* COPY_SOURCES_H */

Modified: subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CreateJ.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CreateJ.cpp?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CreateJ.cpp (original)
+++ subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CreateJ.cpp Tue Aug 10 18:06:17 2010
@@ -31,6 +31,7 @@
 #include "EnumMapper.h"
 #include "RevisionRange.h"
 #include "CreateJ.h"
+#include "../include/org_apache_subversion_javahl_Revision.h"
 
 jobject
 CreateJ::ConflictDescriptor(const svn_wc_conflict_description_t *desc)
@@ -40,405 +41,852 @@ CreateJ::ConflictDescriptor(const svn_wc
   if (desc == NULL)
     return NULL;
 
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
+    return NULL;
+
   // Create an instance of the conflict descriptor.
-  static jmethodID ctor = 0;
   jclass clazz = env->FindClass(JAVA_PACKAGE "/ConflictDescriptor");
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
 
+  static jmethodID ctor = 0;
   if (ctor == 0)
     {
-      ctor = env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;II"
-                              "Ljava/lang/String;ZLjava/lang/String;III"
+      ctor = env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;"
+                              "L"JAVA_PACKAGE"/ConflictDescriptor$Kind;"
+                              "L"JAVA_PACKAGE"/NodeKind;"
+                              "Ljava/lang/String;ZLjava/lang/String;"
+                              "L"JAVA_PACKAGE"/ConflictDescriptor$Action;"
+                              "L"JAVA_PACKAGE"/ConflictDescriptor$Reason;"
+                              "L"JAVA_PACKAGE"/ConflictDescriptor$Operation;"
                               "Ljava/lang/String;Ljava/lang/String;"
                               "Ljava/lang/String;Ljava/lang/String;"
                               "L"JAVA_PACKAGE"/ConflictVersion;"
                               "L"JAVA_PACKAGE"/ConflictVersion;)V");
       if (JNIUtil::isJavaExceptionThrown() || ctor == 0)
-        return NULL;
+        POP_AND_RETURN_NULL;
     }
 
   jstring jpath = JNIUtil::makeJString(desc->path);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
   jstring jpropertyName = JNIUtil::makeJString(desc->property_name);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
   jstring jmimeType = JNIUtil::makeJString(desc->mime_type);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
   jstring jbasePath = JNIUtil::makeJString(desc->base_file);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
   jstring jreposPath = JNIUtil::makeJString(desc->their_file);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
   jstring juserPath = JNIUtil::makeJString(desc->my_file);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
   jstring jmergedPath = JNIUtil::makeJString(desc->merged_file);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
   jobject jsrcLeft = CreateJ::ConflictVersion(desc->src_left_version);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
   jobject jsrcRight = ConflictVersion(desc->src_right_version);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
+  jobject jnodeKind = EnumMapper::mapNodeKind(desc->node_kind);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jobject jconflictKind = EnumMapper::mapConflictKind(desc->kind);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jobject jconflictAction = EnumMapper::mapConflictAction(desc->action);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jobject jconflictReason = EnumMapper::mapConflictReason(desc->reason);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jobject joperation = EnumMapper::mapOperation(desc->operation);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
 
   // Instantiate the conflict descriptor.
-  jobject jdesc = env->NewObject(clazz, ctor, jpath,
-                                 EnumMapper::mapConflictKind(desc->kind),
-                                 EnumMapper::mapNodeKind(desc->node_kind),
-                                 jpropertyName,
+  jobject jdesc = env->NewObject(clazz, ctor, jpath, jconflictKind,
+                                 jnodeKind, jpropertyName,
                                  (jboolean) desc->is_binary, jmimeType,
-                                 EnumMapper::mapConflictAction(desc->action),
-                                 EnumMapper::mapConflictReason(desc->reason),
-                                 EnumMapper::mapOperation(desc->operation),
+                                 jconflictAction, jconflictReason, joperation,
                                  jbasePath, jreposPath, juserPath,
                                  jmergedPath, jsrcLeft, jsrcRight);
   if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  return env->PopLocalFrame(jdesc);
+}
+
+jobject
+CreateJ::ConflictVersion(const svn_wc_conflict_version_t *version)
+{
+  JNIEnv *env = JNIUtil::getEnv();
+
+  if (version == NULL)
     return NULL;
 
-  env->DeleteLocalRef(clazz);
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
   if (JNIUtil::isJavaExceptionThrown())
     return NULL;
 
-  env->DeleteLocalRef(jpath);
+  // Create an instance of the conflict version.
+  jclass clazz = env->FindClass(JAVA_PACKAGE "/ConflictVersion");
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-  env->DeleteLocalRef(jpropertyName);
+    POP_AND_RETURN_NULL;
+
+  static jmethodID ctor = 0;
+  if (ctor == 0)
+    {
+      ctor = env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;J"
+                                               "Ljava/lang/String;"
+                                               "L"JAVA_PACKAGE"/NodeKind;)V");
+      if (JNIUtil::isJavaExceptionThrown() || ctor == 0)
+        POP_AND_RETURN_NULL;
+    }
+
+  jstring jreposURL = JNIUtil::makeJString(version->repos_url);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-  env->DeleteLocalRef(jmimeType);
+    POP_AND_RETURN_NULL;
+  jstring jpathInRepos = JNIUtil::makeJString(version->path_in_repos);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-  env->DeleteLocalRef(jbasePath);
+    POP_AND_RETURN_NULL;
+  jobject jnodeKind = EnumMapper::mapNodeKind(version->node_kind);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-  env->DeleteLocalRef(jreposPath);
+    POP_AND_RETURN_NULL;
+
+  jobject jversion = env->NewObject(clazz, ctor, jreposURL,
+                                    (jlong)version->peg_rev, jpathInRepos,
+                                    jnodeKind);
   if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  return env->PopLocalFrame(jversion);
+}
+
+jobject
+CreateJ::Info(const svn_wc_entry_t *entry)
+{
+  if (entry == NULL)
     return NULL;
-  env->DeleteLocalRef(juserPath);
+
+  JNIEnv *env = JNIUtil::getEnv();
+
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
   if (JNIUtil::isJavaExceptionThrown())
     return NULL;
-  env->DeleteLocalRef(jmergedPath);
+
+  jclass clazz = env->FindClass(JAVA_PACKAGE"/Info");
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-  env->DeleteLocalRef(jsrcRight);
+    POP_AND_RETURN_NULL;
+
+  static jmethodID mid = 0;
+  if (mid == 0)
+    {
+        mid = env->GetMethodID(clazz, "<init>",
+                               "(Ljava/lang/String;Ljava/lang/String;"
+                               "Ljava/lang/String;Ljava/lang/String;"
+                               "L"JAVA_PACKAGE"/Info2$ScheduleKind;"
+                               "L"JAVA_PACKAGE"/NodeKind;"
+                               "Ljava/lang/String;JJLjava/util/Date;"
+                               "Ljava/util/Date;Ljava/util/Date;"
+                               "ZZZZJLjava/lang/String;)V");
+        if (JNIUtil::isJavaExceptionThrown())
+          POP_AND_RETURN_NULL;
+    }
+
+  jstring jName = JNIUtil::makeJString(entry->name);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-  env->DeleteLocalRef(jsrcLeft);
+    POP_AND_RETURN_NULL;
+  jstring jUrl = JNIUtil::makeJString(entry->url);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
+  jstring jUuid = JNIUtil::makeJString(entry->uuid);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jstring jRepository = JNIUtil::makeJString(entry->repos);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jobject jSchedule = EnumMapper::mapScheduleKind(entry->schedule);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jobject jNodeKind = EnumMapper::mapNodeKind(entry->kind);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jstring jAuthor = JNIUtil::makeJString(entry->cmt_author);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jlong jRevision = entry->revision;
+  jlong jLastChangedRevision = entry->cmt_rev;
+  jobject jLastChangedDate = JNIUtil::createDate(entry->cmt_date);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jobject jLastDateTextUpdate = JNIUtil::createDate(entry->text_time);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jobject jLastDatePropsUpdate = JNIUtil::createDate(entry->prop_time);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jboolean jCopied = entry->copied ? JNI_TRUE : JNI_FALSE;
+  jboolean jDeleted = entry->deleted ? JNI_TRUE : JNI_FALSE;
+  jboolean jAbsent = entry->absent ? JNI_TRUE : JNI_FALSE;
+  jboolean jIncomplete = entry->incomplete ? JNI_TRUE : JNI_FALSE;
+  jlong jCopyRev = entry->copyfrom_rev;
+  jstring jCopyUrl = JNIUtil::makeJString(entry->copyfrom_url);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
 
-  return jdesc;
+  jobject jinfo = env->NewObject(clazz, mid, jName, jUrl, jUuid, jRepository,
+                                 jSchedule, jNodeKind, jAuthor, jRevision,
+                                 jLastChangedRevision, jLastChangedDate,
+                                 jLastDateTextUpdate, jLastDatePropsUpdate,
+                                 jCopied, jDeleted, jAbsent, jIncomplete,
+                                 jCopyRev, jCopyUrl);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  return env->PopLocalFrame(jinfo);
 }
 
 jobject
-CreateJ::ConflictVersion(const svn_wc_conflict_version_t *version)
+CreateJ::Info2(const char *path, const svn_info_t *info)
 {
   JNIEnv *env = JNIUtil::getEnv();
 
-  if (version == NULL)
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
     return NULL;
 
-  // Create an instance of the conflict version.
-  static jmethodID ctor = 0;
-  jclass clazz = env->FindClass(JAVA_PACKAGE "/ConflictVersion");
+  jclass clazz = env->FindClass(JAVA_PACKAGE "/Info2");
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
 
-  if (ctor == 0)
+  static jmethodID mid = 0;
+  if (mid == 0)
     {
-      ctor = env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;J"
-                                               "Ljava/lang/String;I)V");
-      if (JNIUtil::isJavaExceptionThrown() || ctor == 0)
-        return NULL;
+      mid = env->GetMethodID(clazz, "<init>",
+                             "(Ljava/lang/String;Ljava/lang/String;J"
+                             "L"JAVA_PACKAGE"/NodeKind;"
+                             "Ljava/lang/String;Ljava/lang/String;"
+                             "JJLjava/lang/String;"
+                             "L"JAVA_PACKAGE"/Lock;Z"
+                             "L"JAVA_PACKAGE"/Info2$ScheduleKind;"
+                             "Ljava/lang/String;JJJ"
+                             "Ljava/lang/String;Ljava/lang/String;"
+                             "Ljava/lang/String;Ljava/lang/String;"
+                             "Ljava/lang/String;Ljava/lang/String;JJ"
+                             "L"JAVA_PACKAGE"/Depth;"
+                             "L"JAVA_PACKAGE"/ConflictDescriptor;)V");
+      if (mid == 0 || JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
     }
 
-  jstring jreposURL = JNIUtil::makeJString(version->repos_url);
+  jstring jpath = JNIUtil::makeJString(path);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-  jstring jpathInRepos = JNIUtil::makeJString(version->path_in_repos);
+    POP_AND_RETURN_NULL;
+
+  jstring jurl = JNIUtil::makeJString(info->URL);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
 
-  jobject jversion = env->NewObject(clazz, ctor, jreposURL,
-                                 (jlong)version->peg_rev, jpathInRepos,
-                                 EnumMapper::mapNodeKind(version->node_kind));
+  jstring jreposRootUrl = JNIUtil::makeJString(info->repos_root_URL);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
 
-  env->DeleteLocalRef(clazz);
+  jstring jreportUUID = JNIUtil::makeJString(info->repos_UUID);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
 
-  env->DeleteLocalRef(jreposURL);
+  jstring jlastChangedAuthor =
+    JNIUtil::makeJString(info->last_changed_author);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-  env->DeleteLocalRef(jpathInRepos);
+    POP_AND_RETURN_NULL;
+
+  jobject jlock = CreateJ::Lock(info->lock);
   if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
+    POP_AND_RETURN_NULL;
+
+  jstring jcopyFromUrl = JNIUtil::makeJString(info->copyfrom_url);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jstring jchecksum = JNIUtil::makeJString(info->checksum);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jstring jconflictOld = JNIUtil::makeJString(info->conflict_old);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jstring jconflictNew = JNIUtil::makeJString(info->conflict_new);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
 
-  return jversion;
+  jstring jconflictWrk = JNIUtil::makeJString(info->conflict_wrk);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jstring jprejfile = JNIUtil::makeJString(info->prejfile);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jstring jchangelist = JNIUtil::makeJString(info->changelist);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jobject jdesc = CreateJ::ConflictDescriptor(info->tree_conflict);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jobject jnodeKind = EnumMapper::mapNodeKind(info->kind);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jobject jscheduleKind = EnumMapper::mapScheduleKind(info->schedule);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jlong jworkingSize = info->working_size == SVN_INFO_SIZE_UNKNOWN
+    ? -1 : (jlong) info->working_size;
+  jlong jreposSize = info->size == SVN_INFO_SIZE_UNKNOWN
+    ? -1 : (jlong) info->size;
+
+  jobject jinfo2 = env->NewObject(clazz, mid, jpath, jurl, (jlong) info->rev,
+                                  jnodeKind, jreposRootUrl, jreportUUID,
+                                  (jlong) info->last_changed_rev,
+                                  (jlong) info->last_changed_date,
+                                  jlastChangedAuthor, jlock,
+                                  info->has_wc_info ? JNI_TRUE : JNI_FALSE,
+                                  jscheduleKind, jcopyFromUrl,
+                                  (jlong) info->copyfrom_rev,
+                                  (jlong) info->text_time,
+                                  (jlong) info->prop_time, jchecksum,
+                                  jconflictOld, jconflictNew, jconflictWrk,
+                                  jprejfile, jchangelist,
+                                  jworkingSize, jreposSize,
+                                  EnumMapper::mapDepth(info->depth), jdesc);
+
+  return env->PopLocalFrame(jinfo2);
 }
 
 jobject
-CreateJ::Info(const svn_wc_entry_t *entry)
+CreateJ::Lock(const svn_lock_t *lock)
 {
-    if (entry == NULL)
-        return NULL;
+  if (lock == NULL)
+    return NULL;
 
-    JNIEnv *env = JNIUtil::getEnv();
+  JNIEnv *env = JNIUtil::getEnv();
 
-    jclass clazz = env->FindClass(JAVA_PACKAGE"/Info");
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
+    return NULL;
+
+  jclass clazz = env->FindClass(JAVA_PACKAGE"/Lock");
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
 
-    static jmethodID mid = 0;
-    if (mid == 0)
+  static jmethodID mid = 0;
+  if (mid == 0)
     {
-        mid = env->GetMethodID(clazz, "<init>",
-                               "(Ljava/lang/String;Ljava/lang/String;"
-                               "Ljava/lang/String;Ljava/lang/String;"
-                               "IILjava/lang/String;JJLjava/util/Date;"
-                               "Ljava/util/Date;Ljava/util/Date;"
-                               "ZZZZJLjava/lang/String;)V");
-        if (JNIUtil::isJavaExceptionThrown())
-            return NULL;
+      mid = env->GetMethodID(clazz, "<init>",
+                             "(Ljava/lang/String;Ljava/lang/String;"
+                             "Ljava/lang/String;"
+                             "Ljava/lang/String;JJ)V");
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
     }
 
-    jstring jName = JNIUtil::makeJString(entry->name);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    jstring jUrl = JNIUtil::makeJString(entry->url);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    jstring jUuid = JNIUtil::makeJString(entry->uuid);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    jstring jRepository = JNIUtil::makeJString(entry->repos);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    jint jSchedule = EnumMapper::mapScheduleKind(entry->schedule);
-    jint jNodeKind = EnumMapper::mapNodeKind(entry->kind);
-    jstring jAuthor = JNIUtil::makeJString(entry->cmt_author);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    jlong jRevision = entry->revision;
-    jlong jLastChangedRevision = entry->cmt_rev;
-    jobject jLastChangedDate = JNIUtil::createDate(entry->cmt_date);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    jobject jLastDateTextUpdate = JNIUtil::createDate(entry->text_time);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    jobject jLastDatePropsUpdate = JNIUtil::createDate(entry->prop_time);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    jboolean jCopied = entry->copied ? JNI_TRUE : JNI_FALSE;
-    jboolean jDeleted = entry->deleted ? JNI_TRUE : JNI_FALSE;
-    jboolean jAbsent = entry->absent ? JNI_TRUE : JNI_FALSE;
-    jboolean jIncomplete = entry->incomplete ? JNI_TRUE : JNI_FALSE;
-    jlong jCopyRev = entry->copyfrom_rev;
-    jstring jCopyUrl = JNIUtil::makeJString(entry->copyfrom_url);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+  jstring jOwner = JNIUtil::makeJString(lock->owner);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jstring jPath = JNIUtil::makeJString(lock->path);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jstring jToken = JNIUtil::makeJString(lock->token);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+  jstring jComment = JNIUtil::makeJString(lock->comment);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
 
-    jobject jinfo = env->NewObject(clazz, mid, jName, jUrl, jUuid, jRepository,
-                                   jSchedule, jNodeKind, jAuthor, jRevision,
-                                   jLastChangedRevision, jLastChangedDate,
-                                   jLastDateTextUpdate, jLastDatePropsUpdate,
-                                   jCopied, jDeleted, jAbsent, jIncomplete,
-                                   jCopyRev, jCopyUrl);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+  jlong jCreationDate = lock->creation_date;
+  jlong jExpirationDate = lock->expiration_date;
+  jobject jlock = env->NewObject(clazz, mid, jOwner, jPath, jToken, jComment,
+                                 jCreationDate, jExpirationDate);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
 
-    env->DeleteLocalRef(clazz);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+  return env->PopLocalFrame(jlock);
+}
 
-    env->DeleteLocalRef(jName);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jUrl);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jUuid);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jRepository);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jAuthor);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jLastChangedDate);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jLastDateTextUpdate);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jLastDatePropsUpdate);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jCopyUrl);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+jobject
+CreateJ::Status(const char *local_abspath, const svn_wc_status2_t *status)
+{
+  JNIEnv *env = JNIUtil::getEnv();
 
-    return jinfo;
-}
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
+    return NULL;
+
+  jclass clazz = env->FindClass(JAVA_PACKAGE"/Status");
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  static jmethodID mid = 0;
+  if (mid == 0)
+    {
+      mid = env->GetMethodID(clazz, "<init>",
+                             "(Ljava/lang/String;Ljava/lang/String;"
+                             "L"JAVA_PACKAGE"/NodeKind;"
+                             "JJJLjava/lang/String;"
+                             "L"JAVA_PACKAGE"/Status$Kind;"
+                             "L"JAVA_PACKAGE"/Status$Kind;"
+                             "L"JAVA_PACKAGE"/Status$Kind;"
+                             "L"JAVA_PACKAGE"/Status$Kind;"
+                             "ZZZL"JAVA_PACKAGE"/ConflictDescriptor;"
+                             "Ljava/lang/String;Ljava/lang/String;"
+                             "Ljava/lang/String;Ljava/lang/String;"
+                             "JZZLjava/lang/String;Ljava/lang/String;"
+                             "Ljava/lang/String;"
+                             "JL"JAVA_PACKAGE"/Lock;"
+                             "JJL"JAVA_PACKAGE"/NodeKind;"
+                             "Ljava/lang/String;Ljava/lang/String;)V");
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+    }
+  jstring jPath = JNIUtil::makeJString(local_abspath);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
 
+  jstring jUrl = NULL;
+  jobject jNodeKind = NULL;
+  jlong jRevision = org_apache_subversion_javahl_Revision_SVN_INVALID_REVNUM;
+  jlong jLastChangedRevision =
+    org_apache_subversion_javahl_Revision_SVN_INVALID_REVNUM;
+  jlong jLastChangedDate = 0;
+  jstring jLastCommitAuthor = NULL;
+  jobject jTextType = NULL;
+  jobject jPropType = NULL;
+  jobject jRepositoryTextType = NULL;
+  jobject jRepositoryPropType = NULL;
+  jboolean jIsLocked = JNI_FALSE;
+  jboolean jIsCopied = JNI_FALSE;
+  jboolean jIsSwitched = JNI_FALSE;
+  jboolean jIsFileExternal = JNI_FALSE;
+  jboolean jIsTreeConflicted = JNI_FALSE;
+  jobject jConflictDescription = NULL;
+  jstring jConflictOld = NULL;
+  jstring jConflictNew = NULL;
+  jstring jConflictWorking = NULL;
+  jstring jURLCopiedFrom = NULL;
+  jlong jRevisionCopiedFrom =
+    org_apache_subversion_javahl_Revision_SVN_INVALID_REVNUM;
+  jstring jLockToken = NULL;
+  jstring jLockComment = NULL;
+  jstring jLockOwner = NULL;
+  jlong jLockCreationDate = 0;
+  jobject jLock = NULL;
+  jlong jOODLastCmtRevision =
+    org_apache_subversion_javahl_Revision_SVN_INVALID_REVNUM;
+  jlong jOODLastCmtDate = 0;
+  jobject jOODKind = NULL;
+  jstring jOODLastCmtAuthor = NULL;
+  jstring jChangelist = NULL;
+  if (status != NULL)
+    {
+      jTextType = EnumMapper::mapStatusKind(status->text_status);
+      jPropType = EnumMapper::mapStatusKind(status->prop_status);
+      jRepositoryTextType = EnumMapper::mapStatusKind(
+                                                      status->repos_text_status);
+      jRepositoryPropType = EnumMapper::mapStatusKind(
+                                                      status->repos_prop_status);
+      jIsCopied = (status->copied == 1) ? JNI_TRUE: JNI_FALSE;
+      jIsLocked = (status->locked == 1) ? JNI_TRUE: JNI_FALSE;
+      jIsSwitched = (status->switched == 1) ? JNI_TRUE: JNI_FALSE;
+      jIsFileExternal = (status->file_external == 1) ? JNI_TRUE: JNI_FALSE;
+      jConflictDescription = CreateJ::ConflictDescriptor(status->tree_conflict);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+
+      jIsTreeConflicted = (status->tree_conflict != NULL)
+                             ? JNI_TRUE: JNI_FALSE;
+      jLock = CreateJ::Lock(status->repos_lock);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+
+      jUrl = JNIUtil::makeJString(status->url);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+
+      jOODLastCmtRevision = status->ood_last_cmt_rev;
+      jOODLastCmtDate = status->ood_last_cmt_date;
+      jOODKind = EnumMapper::mapNodeKind(status->ood_kind);
+      jOODLastCmtAuthor = JNIUtil::makeJString(status->ood_last_cmt_author);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+
+      const svn_wc_entry_t *entry = status->entry;
+      if (entry != NULL)
+        {
+          jNodeKind = EnumMapper::mapNodeKind(entry->kind);
+          jRevision = entry->revision;
+          jLastChangedRevision = entry->cmt_rev;
+          jLastChangedDate = entry->cmt_date;
+          jLastCommitAuthor = JNIUtil::makeJString(entry->cmt_author);
+          if (JNIUtil::isJavaExceptionThrown())
+            POP_AND_RETURN_NULL;
+
+          jConflictNew = JNIUtil::makeJString(entry->conflict_new);
+          if (JNIUtil::isJavaExceptionThrown())
+            POP_AND_RETURN_NULL;
+
+          jConflictOld = JNIUtil::makeJString(entry->conflict_old);
+          if (JNIUtil::isJavaExceptionThrown())
+            POP_AND_RETURN_NULL;
+
+          jConflictWorking= JNIUtil::makeJString(entry->conflict_wrk);
+          if (JNIUtil::isJavaExceptionThrown())
+            POP_AND_RETURN_NULL;
+
+          jURLCopiedFrom = JNIUtil::makeJString(entry->copyfrom_url);
+          if (JNIUtil::isJavaExceptionThrown())
+            POP_AND_RETURN_NULL;
+
+          jRevisionCopiedFrom = entry->copyfrom_rev;
+          jLockToken = JNIUtil::makeJString(entry->lock_token);
+          if (JNIUtil::isJavaExceptionThrown())
+            POP_AND_RETURN_NULL;
+
+          jLockComment = JNIUtil::makeJString(entry->lock_comment);
+          if (JNIUtil::isJavaExceptionThrown())
+            POP_AND_RETURN_NULL;
+
+          jLockOwner = JNIUtil::makeJString(entry->lock_owner);
+          if (JNIUtil::isJavaExceptionThrown())
+            POP_AND_RETURN_NULL;
+
+          jLockCreationDate = entry->lock_creation_date;
+
+          jChangelist = JNIUtil::makeJString(entry->changelist);
+          if (JNIUtil::isJavaExceptionThrown())
+            POP_AND_RETURN_NULL;
+        }
+    }
+
+  jobject ret = env->NewObject(clazz, mid, jPath, jUrl, jNodeKind, jRevision,
+                               jLastChangedRevision, jLastChangedDate,
+                               jLastCommitAuthor, jTextType, jPropType,
+                               jRepositoryTextType, jRepositoryPropType,
+                               jIsLocked, jIsCopied, jIsTreeConflicted,
+                               jConflictDescription, jConflictOld, jConflictNew,
+                               jConflictWorking, jURLCopiedFrom,
+                               jRevisionCopiedFrom, jIsSwitched, jIsFileExternal,
+                               jLockToken, jLockOwner,
+                               jLockComment, jLockCreationDate, jLock,
+                               jOODLastCmtRevision, jOODLastCmtDate,
+                               jOODKind, jOODLastCmtAuthor, jChangelist);
+
+  return env->PopLocalFrame(ret);
+}
 
 jobject
-CreateJ::Lock(const svn_lock_t *lock)
+CreateJ::NotifyInformation(const svn_wc_notify_t *wcNotify)
 {
-    if (lock == NULL)
-        return NULL;
-    JNIEnv *env = JNIUtil::getEnv();
+  JNIEnv *env = JNIUtil::getEnv();
 
-    jclass clazz = env->FindClass(JAVA_PACKAGE"/Lock");
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
+    return NULL;
 
-    static jmethodID mid = 0;
-    if (mid == 0)
+  static jmethodID midCT = 0;
+  jclass clazz = env->FindClass(JAVA_PACKAGE"/NotifyInformation");
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  if (midCT == 0)
     {
-        mid = env->GetMethodID(clazz, "<init>",
-                               "(Ljava/lang/String;Ljava/lang/String;"
+      midCT = env->GetMethodID(clazz, "<init>",
+                               "(Ljava/lang/String;"
+                               "L"JAVA_PACKAGE"/NotifyInformation$Action;"
+                               "L"JAVA_PACKAGE"/NodeKind;Ljava/lang/String;"
+                               "L"JAVA_PACKAGE"/Lock;"
                                "Ljava/lang/String;"
-                               "Ljava/lang/String;JJ)V");
-        if (JNIUtil::isJavaExceptionThrown())
-            return NULL;
+                               "L"JAVA_PACKAGE"/NotifyInformation$Status;"
+                               "L"JAVA_PACKAGE"/NotifyInformation$Status;"
+                               "L"JAVA_PACKAGE"/NotifyInformation$LockStatus;"
+                               "JLjava/lang/String;"
+                               "L"JAVA_PACKAGE"/RevisionRange;"
+                               "Ljava/lang/String;)V");
+      if (JNIUtil::isJavaExceptionThrown() || midCT == 0)
+        POP_AND_RETURN_NULL;
     }
 
-    jstring jOwner = JNIUtil::makeJString(lock->owner);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    jstring jPath = JNIUtil::makeJString(lock->path);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    jstring jToken = JNIUtil::makeJString(lock->token);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    jstring jComment = JNIUtil::makeJString(lock->comment);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+  // convert the parameter to their Java relatives
+  jstring jPath = JNIUtil::makeJString(wcNotify->path);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
 
-    jlong jCreationDate = lock->creation_date;
-    jlong jExpirationDate = lock->expiration_date;
-    jobject jlock = env->NewObject(clazz, mid, jOwner, jPath, jToken, jComment,
-                                   jCreationDate, jExpirationDate);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+  jobject jAction = EnumMapper::mapNotifyAction(wcNotify->action);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
 
-    env->DeleteLocalRef(clazz);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+  jobject jKind = EnumMapper::mapNodeKind(wcNotify->kind);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
 
-    env->DeleteLocalRef(jOwner);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jPath);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jToken);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jComment);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+  jstring jMimeType = JNIUtil::makeJString(wcNotify->mime_type);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jobject jLock = CreateJ::Lock(wcNotify->lock);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jstring jErr = JNIUtil::makeSVNErrorMessage(wcNotify->err);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jobject jContentState = EnumMapper::mapNotifyState(wcNotify->content_state);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jobject jPropState = EnumMapper::mapNotifyState(wcNotify->prop_state);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jobject jLockState = EnumMapper::mapNotifyLockState(wcNotify->lock_state);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jstring jChangelistName = JNIUtil::makeJString(wcNotify->changelist_name);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jobject jMergeRange = NULL;
+  if (wcNotify->merge_range)
+    {
+      jMergeRange = RevisionRange::makeJRevisionRange(wcNotify->merge_range);
+      if (jMergeRange == NULL)
+        POP_AND_RETURN_NULL;
+    }
+
+  jstring jpathPrefix = JNIUtil::makeJString(wcNotify->path_prefix);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  // call the Java method
+  jobject jInfo = env->NewObject(clazz, midCT, jPath, jAction,
+                                 jKind, jMimeType, jLock, jErr,
+                                 jContentState, jPropState, jLockState,
+                                 (jlong) wcNotify->revision, jChangelistName,
+                                 jMergeRange, jpathPrefix);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
 
-    return jlock;
+  return env->PopLocalFrame(jInfo);
 }
 
 jobject
-CreateJ::Property(jobject jthis, const char *path, const char *name,
-                  svn_string_t *value)
+CreateJ::RevisionRangeList(apr_array_header_t *ranges)
 {
-    JNIEnv *env = JNIUtil::getEnv();
-    jclass clazz = env->FindClass(JAVA_PACKAGE"/PropertyData");
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+  JNIEnv *env = JNIUtil::getEnv();
 
-    static jmethodID mid = 0;
-    if (mid == 0)
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
+    return NULL;
+
+  jclass clazz = env->FindClass("java/util/ArrayList");
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  static jmethodID init_mid = 0;
+  if (init_mid == 0)
     {
-        mid = env->GetMethodID(clazz, "<init>",
-                               "(L"JAVA_PACKAGE"/SVNClient;Ljava/lang/String;"
-                               "Ljava/lang/String;Ljava/lang/String;[B)V");
-        if (JNIUtil::isJavaExceptionThrown())
-            return NULL;
+      init_mid = env->GetMethodID(clazz, "<init>", "()V");
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
     }
 
-    jstring jPath = JNIUtil::makeJString(path);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    jstring jName = JNIUtil::makeJString(name);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    jstring jValue = JNIUtil::makeJString(value->data);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    jbyteArray jData = JNIUtil::makeJByteArray((const signed char *)value->data,
-                                               value->len);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+  static jmethodID add_mid = 0;
+  if (add_mid == 0)
+    {
+      add_mid = env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z");
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+    }
 
-    jobject jprop = env->NewObject(clazz, mid, jthis, jPath, jName, jValue,
-                                  jData);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+  jobject jranges = env->NewObject(clazz, init_mid);
 
-    env->DeleteLocalRef(clazz);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jPath);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jName);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jValue);
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    env->DeleteLocalRef(jData);
-    if (JNIUtil::isJavaExceptionThrown())
+  for (int i = 0; i < ranges->nelts; ++i)
+    {
+      // Convert svn_merge_range_t *'s to Java RevisionRange objects.
+      svn_merge_range_t *range =
+          APR_ARRAY_IDX(ranges, i, svn_merge_range_t *);
+
+      jobject jrange = RevisionRange::makeJRevisionRange(range);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+
+      env->CallObjectMethod(jranges, add_mid, jrange);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+
+      env->DeleteLocalRef(jrange);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+    }
+
+  return env->PopLocalFrame(jranges);
+}
+
+jobject
+CreateJ::StringSet(apr_array_header_t *strings)
+{
+  JNIEnv *env = JNIUtil::getEnv();
+  std::vector<jobject> jstrs;
+
+  for (int i = 0; i < strings->nelts; ++i)
+    {
+      const char *str = APR_ARRAY_IDX(strings, i, const char *);
+      jstring jstr = JNIUtil::makeJString(str);
+      if (JNIUtil::isJavaExceptionThrown())
         return NULL;
 
-    return jprop;
+      jstrs.push_back(jstr);
+    }
+
+  return CreateJ::Set(jstrs);
 }
 
+jobject CreateJ::PropertyMap(apr_hash_t *prop_hash, apr_pool_t *pool)
+{
+  JNIEnv *env = JNIUtil::getEnv();
+
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
+    return NULL;
+
+  jclass clazz = env->FindClass("java/util/HashMap");
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  static jmethodID init_mid = 0;
+  if (init_mid == 0)
+    {
+      init_mid = env->GetMethodID(clazz, "<init>", "()V");
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+    }
+
+  static jmethodID put_mid = 0;
+  if (put_mid == 0)
+    {
+      put_mid = env->GetMethodID(clazz, "put",
+                                 "(Ljava/lang/Object;Ljava/lang/Object;)"
+                                 "Ljava/lang/Object;");
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+    }
+
+  jobject map = env->NewObject(clazz, init_mid);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  apr_hash_index_t *hi;
+  int i = 0;
+  for (hi = apr_hash_first(pool, prop_hash); hi; hi = apr_hash_next(hi), ++i)
+    {
+      const char *key;
+      svn_string_t *val;
+
+      apr_hash_this(hi, (const void **)&key, NULL, (void **)&val);
 
-jobjectArray
-CreateJ::RevisionRangeArray(apr_array_header_t *ranges)
+      jstring jpropName = JNIUtil::makeJString(key);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+
+      jbyteArray jpropVal = JNIUtil::makeJByteArray(
+                                    (const signed char *)val->data, val->len);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+
+      env->CallObjectMethod(map, put_mid, jpropName, jpropVal);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+
+      env->DeleteLocalRef(jpropName);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+
+      env->DeleteLocalRef(jpropVal);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+    }
+
+  return env->PopLocalFrame(map);
+}
+
+jobject CreateJ::Set(std::vector<jobject> &objects)
 {
-    JNIEnv *env = JNIUtil::getEnv();
+  JNIEnv *env = JNIUtil::getEnv();
 
-    jclass clazz = env->FindClass(JAVA_PACKAGE "/RevisionRange");
-    if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
+    return NULL;
+
+  jclass clazz = env->FindClass("java/util/HashSet");
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
 
-    jobjectArray jranges = env->NewObjectArray(ranges->nelts, clazz, NULL);
+  static jmethodID init_mid = 0;
+  if (init_mid == 0)
+    {
+      init_mid = env->GetMethodID(clazz, "<init>", "()V");
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+    }
 
-    for (int i = 0; i < ranges->nelts; ++i)
+  static jmethodID add_mid = 0;
+  if (add_mid == 0)
     {
-        // Convert svn_merge_range_t *'s to Java RevisionRange objects.
-        svn_merge_range_t *range =
-            APR_ARRAY_IDX(ranges, i, svn_merge_range_t *);
-        jobject jrange = RevisionRange::makeJRevisionRange(range);
-        if (jrange == NULL)
-            return NULL;
+      add_mid = env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z");
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+    }
 
-        env->SetObjectArrayElement(jranges, i, jrange);
-        if (JNIUtil::isJavaExceptionThrown())
-            return NULL;
+  jobject set = env->NewObject(clazz, init_mid);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
 
-        env->DeleteLocalRef(jrange);
-        if (JNIUtil::isJavaExceptionThrown())
-            return NULL;
+  std::vector<jobject>::const_iterator it;
+  for (it = objects.begin(); it < objects.end(); ++it)
+    {
+      jobject jthing = *it;
+
+      env->CallObjectMethod(set, add_mid, jthing);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+
+      env->DeleteLocalRef(jthing);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
     }
 
-    return jranges;
+  return env->PopLocalFrame(set);
 }

Modified: subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CreateJ.h
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CreateJ.h?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CreateJ.h (original)
+++ subversion/branches/ignore-mergeinfo/subversion/bindings/javahl/native/CreateJ.h Tue Aug 10 18:06:17 2010
@@ -29,6 +29,9 @@
 
 #include <jni.h>
 #include "svn_wc.h"
+#include "svn_client.h"
+
+#include <vector>
 
 /**
  * This class passes centralizes the creating of Java objects from
@@ -45,18 +48,37 @@ class CreateJ
   Info(const svn_wc_entry_t *entry);
 
   static jobject
+  Info2(const char *path, const svn_info_t *info);
+
+  static jobject
   Lock(const svn_lock_t *lock);
 
   static jobject
-  Property(jobject jthis, const char *path, const char *name,
-           svn_string_t *value);
+  Status(const char *local_abspath, const svn_wc_status2_t *status);
+
+  static jobject
+  NotifyInformation(const svn_wc_notify_t *notify);
+
+  static jobject
+  RevisionRangeList(apr_array_header_t *ranges);
 
-  static jobjectArray
-  RevisionRangeArray(apr_array_header_t *ranges);
+  static jobject
+  StringSet(apr_array_header_t *strings);
+
+  static jobject
+  PropertyMap(apr_hash_t *prop_hash, apr_pool_t *pool);
+
+  /* This creates a set of Objects.  It derefs the members of the vector
+   * after putting them in the set, so they caller doesn't need to. */
+  static jobject
+  Set(std::vector<jobject> &objects);
 
  protected:
   static jobject
   ConflictVersion(const svn_wc_conflict_version_t *version);
+
+  static jobject
+  Collection(std::vector<jobject> &object, const char *className);
 };
 
 #endif  // CREATEJ_H