You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by br...@apache.org on 2013/11/25 11:25:06 UTC

svn commit: r1545212 [1/2] - in /subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl: ./ native/ native/jniwrapper/ src/org/apache/subversion/javahl/ src/org/apache/subversion/javahl/types/ tests/org/apache/subversion/javahl/ tests/org...

Author: brane
Date: Mon Nov 25 10:25:05 2013
New Revision: 1545212

URL: http://svn.apache.org/r1545212
Log:
On the javahl-1.8-extensions branch: Sync JavaHL with trunk to r1545207.

Modified:
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/   (props changed)
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/CommitEditor.cpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/ExternalItem.cpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/ExternalItem.hpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/JNIUtil.cpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientException.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientNotifyInformation.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitInfo.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitItem.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/DiffSummary.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNConfig.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNEditor.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIError.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeException.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ProgressEvent.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ReposNotifyInformation.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ChangePath.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Checksum.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/CopySource.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/DirEntry.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ExternalItem.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Info.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Lock.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Revision.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRange.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Status.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java

Propchange: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/
------------------------------------------------------------------------------
  Merged /subversion/trunk/subversion/bindings/javahl:r1544139-1545207

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/CommitEditor.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/CommitEditor.cpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/CommitEditor.cpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/CommitEditor.cpp Mon Nov 25 10:25:05 2013
@@ -488,7 +488,8 @@ CommitEditor::provide_props_cb(apr_hash_
 
   // FIXME: Getting properties from the youngest revision is in fact
   // not such a bright idea, as the path may have been moved or
-  // deleted in the path.
+  // deleted in the repository. On the other hand, if that happens,
+  // the commit would fail due to a conflict anyway.
   if (kind == svn_node_file)
     return svn_ra_get_file(editor->m_callback_session,
                            repos_relpath, SVN_INVALID_REVNUM,

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/ExternalItem.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/ExternalItem.cpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/ExternalItem.cpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/ExternalItem.cpp Mon Nov 25 10:25:05 2013
@@ -31,39 +31,53 @@ namespace JavaHL {
 const char* const ExternalItem::m_class_name =
   JAVA_PACKAGE"/types/ExternalItem";
 
+::Java::MethodID ExternalItem::m_mid_ctor;
+::Java::FieldID ExternalItem::m_fid_target_dir;
+::Java::FieldID ExternalItem::m_fid_url;
+::Java::FieldID ExternalItem::m_fid_revision;
+::Java::FieldID ExternalItem::m_fid_peg_revision;
+
+void ExternalItem::static_init(::Java::Env env)
+{
+  const jclass cls = ::Java::ClassCache::get_external_item();
+  m_mid_ctor =
+    env.GetMethodID(cls, "<init>",
+                    "(ZLjava/lang/String;Ljava/lang/String;"
+                    "L"JAVA_PACKAGE"/types/Revision;"
+                    "L"JAVA_PACKAGE"/types/Revision;)V");
+  m_fid_target_dir = env.GetFieldID(cls, "targetDir", "Ljava/lang/String;");
+  m_fid_url = env.GetFieldID(cls, "url", "Ljava/lang/String;");
+  m_fid_revision = env.GetFieldID(cls, "revision",
+                                  "L"JAVA_PACKAGE"/types/Revision;");
+  m_fid_peg_revision = env.GetFieldID(cls, "pegRevision",
+                                      "L"JAVA_PACKAGE"/types/Revision;");
+}
+
 namespace {
-jstring get_string_field(::Java::Env env, jclass cls, jobject jthis,
-                         const char* field_name)
+inline jstring
+get_string_field(::Java::Env env, jobject jthis,
+                 const ::Java::FieldID& fid)
 {
-  return jstring(
-      env.GetObjectField(
-          jthis, env.GetFieldID(cls, field_name, "Ljava/lang/String;")));
+  return jstring(env.GetObjectField(jthis, fid));
 }
 
-svn_opt_revision_t get_revision_field(::Java::Env env,
-                                      jclass cls, jobject jthis,
-                                      const char* field_name)
+inline svn_opt_revision_t
+get_revision_field(::Java::Env env, jobject jthis,
+                   const ::Java::FieldID& fid)
 {
-  const jobject rev =  env.GetObjectField(
-      jthis, env.GetFieldID(cls, field_name,
-                            "L"JAVA_PACKAGE"/types/Revision;"));
+  const jobject rev =  env.GetObjectField(jthis, fid);
   return *Revision(rev).revision();
 }
 
-jobject make_external_item(::Java::Env env,
-                           const char* class_name,
-                           const char* target_dir,
-                           const char* url,
-                           const svn_opt_revision_t* revision,
-                           const svn_opt_revision_t* peg_revision)
+inline jobject
+make_external_item(::Java::Env env, const ::Java::MethodID& mid_ctor,
+                   const char* target_dir,
+                   const char* url,
+                   const svn_opt_revision_t* revision,
+                   const svn_opt_revision_t* peg_revision)
 {
-  const jclass cls = env.FindClass(class_name);
-  const jmethodID mid_ctor =
-    env.GetMethodID(cls, "<init>",
-                    "(ZLjava/lang/String;Ljava/lang/String;"
-                    "L"JAVA_PACKAGE"/types/Revision;"
-                    "L"JAVA_PACKAGE"/types/Revision;)V");
-  return env.NewObject(cls, mid_ctor, JNI_FALSE,
+  return env.NewObject(::Java::ClassCache::get_external_item(), mid_ctor,
+                       JNI_FALSE,
                        env.NewStringUTF(target_dir),
                        env.NewStringUTF(url),
                        Revision::makeJRevision(*revision),
@@ -72,11 +86,11 @@ jobject make_external_item(::Java::Env e
 } // anonymous namespace
 
 ExternalItem::ExternalItem(::Java::Env env, jobject jthis)
-  : Object(env, m_class_name, jthis),
-    m_target_dir(env, get_string_field(env, m_class, jthis, "targetDir")),
-    m_url(env, get_string_field(env, m_class, jthis, "url")),
-    m_revision(get_revision_field(env, m_class, jthis, "revision")),
-    m_peg_revision(get_revision_field(env, m_class, jthis, "pegRevision"))
+  : Object(env, ::Java::ClassCache::get_external_item(), jthis),
+    m_target_dir(env, get_string_field(env, jthis, m_fid_target_dir)),
+    m_url(env, get_string_field(env, jthis, m_fid_url)),
+    m_revision(get_revision_field(env, jthis, m_fid_revision)),
+    m_peg_revision(get_revision_field(env, jthis, m_fid_peg_revision))
 {}
 
 ExternalItem::ExternalItem(::Java::Env env,
@@ -84,8 +98,8 @@ ExternalItem::ExternalItem(::Java::Env e
                            const char* url,
                            const svn_opt_revision_t* revision,
                            const svn_opt_revision_t* peg_revision)
-  : Object(env, m_class_name,
-           make_external_item(env, m_class_name, target_dir, url,
+  : Object(env, ::Java::ClassCache::get_external_item(),
+           make_external_item(env, m_mid_ctor, target_dir, url,
                               revision, peg_revision)),
     m_target_dir(env, target_dir),
     m_url(env, url),

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/ExternalItem.hpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/ExternalItem.hpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/ExternalItem.hpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/ExternalItem.hpp Mon Nov 25 10:25:05 2013
@@ -100,7 +100,14 @@ public:
   svn_wc_external_item2_t* get_external_item(SVN::Pool& pool) const;
 
 private:
+  friend class ::Java::ClassCache;
   static const char* const m_class_name;
+  static void static_init(::Java::Env env);
+  static ::Java::MethodID m_mid_ctor;
+  static ::Java::FieldID m_fid_target_dir;
+  static ::Java::FieldID m_fid_url;
+  static ::Java::FieldID m_fid_revision;
+  static ::Java::FieldID m_fid_peg_revision;
 
   ::Java::String m_target_dir;
   ::Java::String m_url;

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/JNIUtil.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/JNIUtil.cpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/JNIUtil.cpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/JNIUtil.cpp Mon Nov 25 10:25:05 2013
@@ -225,24 +225,6 @@ bool JNIUtil::JNIGlobalInit(JNIEnv *env)
   g_initEnv = env;
 
   svn_error_t *err;
-  apr_status_t status;
-
-
-  /* Initialize the APR subsystem, and register an atexit() function
-   * to Uninitialize that subsystem at program exit. */
-  status = apr_initialize();
-  if (status)
-    {
-      if (stderr)
-        {
-          char buf[1024];
-          apr_strerror(status, buf, sizeof(buf) - 1);
-          fprintf(stderr,
-                  "%s: error: cannot initialize APR: %s\n",
-                  "svnjavahl", buf);
-        }
-      return FALSE;
-    }
 
   /* This has to happen before any pools are created. */
   if ((err = svn_dso_initialize2()))
@@ -254,16 +236,8 @@ bool JNIUtil::JNIGlobalInit(JNIEnv *env)
       return FALSE;
     }
 
-  if (0 > atexit(apr_terminate))
-    {
-      if (stderr)
-        fprintf(stderr,
-                "%s: error: atexit registration failed\n",
-                "svnjavahl");
-      return FALSE;
-    }
-
-  /* Create our top-level pool. */
+  /* Create our top-level pool.
+     N.B.: APR was initialized by JNI_OnLoad. */
   g_pool = svn_pool_create(NULL);
 
   apr_allocator_t* allocator = apr_pool_allocator_get(g_pool);

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp Mon Nov 25 10:25:05 2013
@@ -21,6 +21,9 @@
  * @endcopyright
  */
 
+#include <cstring>
+#include <apr.h>
+
 #include "jni_env.hpp"
 #include "jni_globalref.hpp"
 #include "jni_exception.hpp"
@@ -42,7 +45,19 @@ JNIEXPORT jint JNICALL
 JNI_OnLoad(JavaVM* jvm, void*)
 {
   ::Java::Env::static_init(jvm);
-  ::Java::ClassCache::create();
+
+  const apr_status_t status = apr_initialize();
+  if (!status)
+    ::Java::ClassCache::create();
+  else
+    {
+      char buf[2048];
+      std::strcpy(buf, "Could not initialize APR: ");
+      const std::size_t offset = std::strlen(buf);
+      apr_strerror(status, buf + offset, sizeof(buf) - offset - 1);
+      const ::Java::Env env;
+      env.ThrowNew(env.FindClass("java/lang/Error"), buf);
+    }
   return JNI_VERSION_1_2;
 }
 
@@ -54,6 +69,7 @@ JNIEXPORT void JNICALL
 JNI_OnUnload(JavaVM*, void*)
 {
   ::Java::ClassCache::destroy();
+  apr_terminate();
 }
 
 

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp Mon Nov 25 10:25:05 2013
@@ -23,6 +23,7 @@
 
 #include <stdexcept>
 
+#include "jni_object.hpp"
 #include "jni_array.hpp"
 #include "jni_channel.hpp"
 
@@ -32,79 +33,60 @@ namespace Java {
 
 namespace {
 // Get the ByteBuffer's internal array.
-jbyteArray get_array(Env env, jclass cls, jobject buffer,
-                     MethodID& mid_has_array, MethodID& mid_get_array)
+jbyteArray get_array(Env env, jobject buffer,
+                     const MethodID& mid_has_array,
+                     const MethodID& mid_get_array)
 {
-  if (!mid_has_array)
-    mid_has_array = env.GetMethodID(cls, "hasArray", "()Z");
   if (!env.CallBooleanMethod(buffer, mid_has_array))
     return NULL;
-
-  if (!mid_get_array)
-    mid_get_array = env.GetMethodID(cls, "array", "()[B");
   return jbyteArray(env.CallObjectMethod(buffer, mid_get_array));
 }
 
 // Get the offset in the ByteBuffer's array. NEVER call this function
 // unless the buffer actually has an accessible array.
-jint get_array_offset(Env env, jclass cls, jobject buffer,
-                      MethodID& mid_get_array_offset)
+jint get_array_offset(Env env, jobject buffer,
+                      const MethodID& mid_get_array_offset)
 {
-  if (!mid_get_array_offset)
-    mid_get_array_offset = env.GetMethodID(cls, "arrayOffset", "()I");
   return env.CallIntMethod(buffer, mid_get_array_offset);
 }
 
 // Get the remaining space in a ByteBuffer.
-jint get_remaining(Env env, jclass cls, jobject buffer,
-                   MethodID& mid_get_remaining)
+jint get_remaining(Env env, jobject buffer,
+                   const MethodID& mid_get_remaining)
 {
-  if (!mid_get_remaining)
-    mid_get_remaining = env.GetMethodID(cls, "remaining", "()I");
   return env.CallIntMethod(buffer, mid_get_remaining);
 }
 
 // Get the current position of a ByteBuffer.
-jint get_position(Env env, jclass cls, jobject buffer,
-                  MethodID& mid_get_position)
+jint get_position(Env env, jobject buffer,
+                  const MethodID& mid_get_position)
 {
-  if (!mid_get_position)
-    mid_get_position = env.GetMethodID(cls, "position", "()I");
   return env.CallIntMethod(buffer, mid_get_position);
 }
 
 // Set the new position of a ByteBuffer.
-void set_position(Env env, jclass cls, jobject buffer,
-                  MethodID& mid_set_position,
+void set_position(Env env, jobject buffer,
+                  const MethodID& mid_set_position,
                   jint new_position)
 {
-  if (!mid_set_position)
-    mid_set_position = env.GetMethodID(cls,  "position",
-                                       "(I)Ljava/nio/Buffer;");
   env.CallObjectMethod(buffer, mid_set_position, new_position);
 }
 
 // Get byte array contents from a ByteBuffer.
-void get_bytearray(Env env, jclass cls, jobject buffer,
-                   MethodID& mid_get_bytearray,
+void get_bytearray(Env env, jobject buffer,
+                   const MethodID& mid_get_bytearray,
                    ByteArray& array, jint length = -1, jint offset = 0)
 {
-  if (!mid_get_bytearray)
-    mid_get_bytearray = env.GetMethodID(cls, "get",
-                                        "([BII)Ljava/nio/ByteBuffer;");
   env.CallObjectMethod(
       buffer, mid_get_bytearray, array.get(), offset,
       (length >= 0 ? length : (array.length() - offset)));
 }
 
 // Put byte array contents into a ByteBuffer.
-void put_bytearray(Env env, jclass cls, jobject buffer,
-                   MethodID& mid_put_bytearray,
+void put_bytearray(Env env, jobject buffer,
+                   const MethodID& mid_put_bytearray,
                    ByteArray& array, jint length = -1, jint offset = 0)
 {
-  if (!mid_put_bytearray)
-    mid_put_bytearray = env.GetMethodID(cls, "put",
-                                        "([BII)Ljava/nio/ByteBuffer;");
   env.CallObjectMethod(buffer, mid_put_bytearray,
                        array.get(), offset,
                        (length >= 0 ? length : (array.length() - offset)));
@@ -131,21 +113,47 @@ struct BadReaderWriter : public ChannelR
 ChannelReader& ByteChannel::m_null_reader = bad_reader_writer;
 ChannelWriter& ByteChannel::m_null_writer = bad_reader_writer;
 
-const char* const ByteChannel::m_byte_buffer_class_name =
+const char* const ByteChannel::ByteBuffer::m_class_name =
   "java/nio/ByteBuffer";
 
+MethodID ByteChannel::ByteBuffer::m_mid_has_array;
+MethodID ByteChannel::ByteBuffer::m_mid_get_array;
+MethodID ByteChannel::ByteBuffer::m_mid_get_array_offset;
+MethodID ByteChannel::ByteBuffer::m_mid_get_remaining;
+MethodID ByteChannel::ByteBuffer::m_mid_get_position;
+MethodID ByteChannel::ByteBuffer::m_mid_set_position;
+MethodID ByteChannel::ByteBuffer::m_mid_get_bytearray;
+MethodID ByteChannel::ByteBuffer::m_mid_put_bytearray;
+
+void ByteChannel::ByteBuffer::static_init(Env env)
+{
+  const jclass cls = ClassCache::get_byte_buffer();
+  m_mid_has_array = env.GetMethodID(cls, "hasArray", "()Z");
+  m_mid_get_array = env.GetMethodID(cls, "array", "()[B");
+  m_mid_get_array_offset = env.GetMethodID(cls, "arrayOffset", "()I");
+  m_mid_get_remaining = env.GetMethodID(cls, "remaining", "()I");
+  m_mid_get_position = env.GetMethodID(cls, "position", "()I");
+  m_mid_set_position = env.GetMethodID(cls,  "position",
+                                       "(I)Ljava/nio/Buffer;");
+  m_mid_get_bytearray = env.GetMethodID(cls, "get",
+                                        "([BII)Ljava/nio/ByteBuffer;");
+  m_mid_put_bytearray = env.GetMethodID(cls, "put",
+                                        "([BII)Ljava/nio/ByteBuffer;");
+}
+
+
 jint ByteChannel::read(jobject destination)
 {
-  const jint remaining = get_remaining(m_env, m_cls_byte_buffer, destination,
-                                       m_mid_byte_buffer_get_remaining);
+  const jint remaining = get_remaining(m_env, destination,
+                                       ByteBuffer::m_mid_get_remaining);
   if (!remaining)
     {
       // No space in the buffer; don't try to read anything.
       return 0;
     }
 
-  const jint position = get_position(m_env, m_cls_byte_buffer, destination,
-                                     m_mid_byte_buffer_get_position);
+  const jint position = get_position(m_env, destination,
+                                     ByteBuffer::m_mid_get_position);
 
   jint bytes_read = 0;
   void* data = m_env.GetDirectBufferAddress(destination);
@@ -157,14 +165,14 @@ jint ByteChannel::read(jobject destinati
   else
     {
       // It was not a direct buffer ... see if it has an array.
-      jbyteArray raw_array = get_array(m_env, m_cls_byte_buffer, destination,
-                                       m_mid_byte_buffer_has_array,
-                                       m_mid_byte_buffer_get_array);
+      jbyteArray raw_array = get_array(m_env, destination,
+                                       ByteBuffer::m_mid_has_array,
+                                       ByteBuffer::m_mid_get_array);
       if (raw_array)
         {
           const jint array_offset = get_array_offset(
-              m_env, m_cls_byte_buffer, destination,
-              m_mid_byte_buffer_get_array_offset);
+              m_env, destination,
+              ByteBuffer::m_mid_get_array_offset);
           ByteArray array(m_env, raw_array);
           ByteArray::MutableContents contents(array);
           data = contents.data();
@@ -175,8 +183,8 @@ jint ByteChannel::read(jobject destinati
   if (data)
     {
       if (bytes_read > 0)
-        set_position(m_env, m_cls_byte_buffer, destination,
-                     m_mid_byte_buffer_set_position,
+        set_position(m_env, destination,
+                     ByteBuffer::m_mid_set_position,
                      position + bytes_read);
       return bytes_read;
     }
@@ -187,24 +195,24 @@ jint ByteChannel::read(jobject destinati
   ByteArray::MutableContents contents(array);
   bytes_read = m_reader(m_env, contents.data(), contents.length());
   if (bytes_read > 0)
-    put_bytearray(m_env, m_cls_byte_buffer, destination,
-                  m_mid_byte_buffer_put_bytearray,
+    put_bytearray(m_env, destination,
+                  ByteBuffer::m_mid_put_bytearray,
                   array, bytes_read);
   return bytes_read;
 }
 
 jint ByteChannel::write(jobject source)
 {
-  const jint remaining = get_remaining(m_env, m_cls_byte_buffer, source,
-                                       m_mid_byte_buffer_get_remaining);
+  const jint remaining = get_remaining(m_env, source,
+                                       ByteBuffer::m_mid_get_remaining);
   if (!remaining)
     {
       // No data in the buffer; don't try to write anything.
       return 0;
     }
 
-  const jint position = get_position(m_env, m_cls_byte_buffer, source,
-                                     m_mid_byte_buffer_get_position);
+  const jint position = get_position(m_env, source,
+                                     ByteBuffer::m_mid_get_position);
 
   jint bytes_written = 0;
   const void* data = m_env.GetDirectBufferAddress(source);
@@ -216,14 +224,14 @@ jint ByteChannel::write(jobject source)
   else
     {
       // It was not a direct buffer ... see if it has an array.
-      jbyteArray raw_array = get_array(m_env, m_cls_byte_buffer, source,
-                                       m_mid_byte_buffer_has_array,
-                                       m_mid_byte_buffer_get_array);
+      jbyteArray raw_array = get_array(m_env, source,
+                                       ByteBuffer::m_mid_has_array,
+                                       ByteBuffer::m_mid_get_array);
       if (raw_array)
         {
           const jint array_offset = get_array_offset(
-              m_env, m_cls_byte_buffer, source,
-              m_mid_byte_buffer_get_array_offset);
+              m_env, source,
+              ByteBuffer::m_mid_get_array_offset);
           const ByteArray array(m_env, raw_array);
           ByteArray::Contents contents(array);
           data = contents.data();
@@ -234,8 +242,8 @@ jint ByteChannel::write(jobject source)
   if (data)
     {
       if (bytes_written > 0)
-        set_position(m_env, m_cls_byte_buffer, source,
-                     m_mid_byte_buffer_set_position,
+        set_position(m_env, source,
+                     ByteBuffer::m_mid_set_position,
                      position + bytes_written);
       return bytes_written;
     }
@@ -243,8 +251,8 @@ jint ByteChannel::write(jobject source)
   // No accessible array, either. Oh well. Get an array from the
   // buffer and read data from that.
   ByteArray array(m_env, remaining);
-  get_bytearray(m_env, m_cls_byte_buffer, source,
-                m_mid_byte_buffer_get_bytearray,
+  get_bytearray(m_env, source,
+                ByteBuffer::m_mid_get_bytearray,
                 array);
   ByteArray::Contents contents(array);
   bytes_written = m_writer(m_env, contents.data(), contents.length());

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp Mon Nov 25 10:25:05 2013
@@ -81,8 +81,7 @@ public:
   explicit ByteChannel(Env env, ChannelReader& reader, ChannelWriter& writer)
     : m_env(env),
       m_reader(reader),
-      m_writer(writer),
-      m_cls_byte_buffer(env.FindClass(m_byte_buffer_class_name))
+      m_writer(writer)
     {}
 
   /**
@@ -106,8 +105,7 @@ protected:
   explicit ByteChannel(Env env, ChannelReader& reader)
     : m_env(env),
       m_reader(reader),
-      m_writer(m_null_writer),
-      m_cls_byte_buffer(env.FindClass(m_byte_buffer_class_name))
+      m_writer(m_null_writer)
     {}
 
   /**
@@ -116,8 +114,7 @@ protected:
   explicit ByteChannel(Env env, ChannelWriter& writer)
     : m_env(env),
       m_reader(m_null_reader),
-      m_writer(writer),
-      m_cls_byte_buffer(env.FindClass(m_byte_buffer_class_name))
+      m_writer(writer)
     {}
 
 private:
@@ -129,16 +126,20 @@ private:
   static ChannelWriter& m_null_writer;
 
   // Private references for the java.nio.ByteBuffer class.
-  static const char* const m_byte_buffer_class_name;
-  const jclass m_cls_byte_buffer;
-  MethodID m_mid_byte_buffer_has_array;
-  MethodID m_mid_byte_buffer_get_array;
-  MethodID m_mid_byte_buffer_get_array_offset;
-  MethodID m_mid_byte_buffer_get_remaining;
-  MethodID m_mid_byte_buffer_get_position;
-  MethodID m_mid_byte_buffer_set_position;
-  MethodID m_mid_byte_buffer_get_bytearray;
-  MethodID m_mid_byte_buffer_put_bytearray;
+  friend class ClassCache;
+  struct ByteBuffer
+  {
+    static const char* const m_class_name;
+    static void static_init(Env env);
+    static MethodID m_mid_has_array;
+    static MethodID m_mid_get_array;
+    static MethodID m_mid_get_array_offset;
+    static MethodID m_mid_get_remaining;
+    static MethodID m_mid_get_position;
+    static MethodID m_mid_set_position;
+    static MethodID m_mid_get_bytearray;
+    static MethodID m_mid_put_bytearray;
+  };
 };
 
 

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp Mon Nov 25 10:25:05 2013
@@ -30,7 +30,13 @@
 #include "jni_object.hpp"
 #include "jni_string.hpp"
 
+#include "jni_channel.hpp"
+#include "jni_io_stream.hpp"
+#include "jni_list.hpp"
+#include "jni_string_map.hpp"
+
 #include "../SubversionException.hpp"
+#include "../ExternalItem.hpp"
 
 namespace Java {
 
@@ -53,24 +59,23 @@ void ClassCache::create()
       exception_message = "Caught unknown C++ exception";
     }
 
-  // Use the raw environment without exception checks here
-  ::JNIEnv* const jenv = Env().get();
-  if (exception_message || jenv->ExceptionCheck())
+  const ::Java::Env env;
+  if (exception_message || env.ExceptionCheck())
     {
-      const jclass rtx = jenv->FindClass("java/lang/RuntimeException");
-      const jmethodID ctor = jenv->GetMethodID(rtx, "<init>",
-                                               "(Ljava/lang/String;"
-                                               "Ljava/lang/Throwable;)V");
-      jobject cause = jenv->ExceptionOccurred();
+      const jclass rtx = env.FindClass("java/lang/RuntimeException");
+      const jmethodID ctor = env.GetMethodID(rtx, "<init>",
+                                             "(Ljava/lang/String;"
+                                             "Ljava/lang/Throwable;)V");
+      jobject cause = env.ExceptionOccurred();
       if (!cause && exception_message)
         {
-          const jstring msg = jenv->NewStringUTF(exception_message);
-          cause = jenv->NewObject(rtx, ctor, msg, jthrowable(0));
+          const jstring msg = env.NewStringUTF(exception_message);
+          cause = env.NewObject(rtx, ctor, msg, jthrowable(0));
         }
       const jstring reason =
-        jenv->NewStringUTF("JavaHL native library initialization failed");
-      const jobject exception = jenv->NewObject(rtx, ctor, reason, cause);
-      jenv->Throw(jthrowable(exception));
+        env.NewStringUTF("JavaHL native library initialization failed");
+      const jobject exception = env.NewObject(rtx, ctor, reason, cause);
+      env.Throw(jthrowable(exception));
     }
 }
 
@@ -91,15 +96,48 @@ ClassCache::ClassCache(Env env)
     SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT(throwable, Exception),
     SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT(string, String),
 
+    SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT(list, BaseList),
+    SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT(array_list, BaseMutableList),
+
+    SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT(map, BaseMap),
+    SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT(set, BaseMap::Set),
+    SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT(iterator, BaseMap::Iterator),
+    SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT(map_entry, BaseMap::Entry),
+    SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT(hash_map, BaseMutableMap),
+
+    SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT(input_stream, InputStream),
+    SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT(output_stream, OutputStream),
+
+    SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT(byte_buffer,
+                                           ByteChannel::ByteBuffer),
+
     SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT(subversion_exception,
-                                           ::JavaHL::SubversionException)
+                                           ::JavaHL::SubversionException),
+    SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT(external_item,
+                                           ::JavaHL::ExternalItem)
 {
   m_instance = this;
   // no-op: Object::static_init(env);
   Class::static_init(env);
   Exception::static_init(env);
   // no-op: String::static_init(env);
+
+  BaseList::static_init(env);
+  BaseMutableList::static_init(env);
+
+  BaseMap::static_init(env);
+  BaseMap::Set::static_init(env);
+  BaseMap::Iterator::static_init(env);
+  BaseMap::Entry::static_init(env);
+  BaseMutableMap::static_init(env);
+
+  InputStream::static_init(env);
+  OutputStream::static_init(env);
+
+  ByteChannel::ByteBuffer::static_init(env);
+
   // no-op: ::JavaHL::SubversionException::static_init(env);
+  ::JavaHL::ExternalItem::static_init(env);
 }
 #undef SVN_JAVAHL_JNIWRAPPER_CLASS_CACHE_INIT
 

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp Mon Nov 25 10:25:05 2013
@@ -168,6 +168,26 @@ apr_status_t cleanup_global_object(void*
 
 const char* const InputStream::m_class_name = "java/io/InputStream";
 
+MethodID InputStream::m_mid_close;
+MethodID InputStream::m_mid_mark_supported;
+MethodID InputStream::m_mid_mark;
+MethodID InputStream::m_mid_reset;
+MethodID InputStream::m_mid_read_byte;
+MethodID InputStream::m_mid_read_bytearray;
+MethodID InputStream::m_mid_skip;
+
+void InputStream::static_init(Env env)
+{
+  const jclass cls = ClassCache::get_input_stream();
+  m_mid_close = env.GetMethodID(cls, "close", "()V");
+  m_mid_mark_supported = env.GetMethodID(cls, "markSupported", "()Z");
+  m_mid_mark = env.GetMethodID(cls, "mark", "(I)V");
+  m_mid_reset = env.GetMethodID(cls, "reset", "()V");
+  m_mid_read_byte = env.GetMethodID(cls, "read", "()I");
+  m_mid_read_bytearray = env.GetMethodID(cls, "read", "([BII)I");
+  m_mid_skip = env.GetMethodID(cls, "skip", "(J)J");
+}
+
 svn_stream_t*
 InputStream::get_global_stream(Env env, jobject jstream,
                                const SVN::Pool& pool)
@@ -219,6 +239,18 @@ svn_stream_t* InputStream::get_stream(co
 
 const char* const OutputStream::m_class_name = "java/io/OutputStream";
 
+MethodID OutputStream::m_mid_close;
+MethodID OutputStream::m_mid_write_byte;
+MethodID OutputStream::m_mid_write_bytearray;
+
+void OutputStream::static_init(Env env)
+{
+  const jclass cls = ClassCache::get_output_stream();
+  m_mid_close = env.GetMethodID(cls, "close", "()V");
+  m_mid_write_byte = env.GetMethodID(cls, "write", "(I)V");
+  m_mid_write_bytearray = env.GetMethodID(cls, "write", "([BII)V");
+}
+
 svn_stream_t*
 OutputStream::get_global_stream(Env env, jobject jstream,
                                const SVN::Pool& pool)

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp Mon Nov 25 10:25:05 2013
@@ -49,7 +49,7 @@ public:
    * Constructs a wrapper around an existing @c InputStream @a jstream.
    */
   explicit InputStream(Env env, jobject jstream)
-    : Object(env, m_class_name, jstream)
+    : Object(env, ClassCache::get_input_stream(), jstream)
     {}
 
   /**
@@ -73,8 +73,6 @@ public:
    */
   void close()
     {
-      if (!m_mid_close)
-        m_mid_close = m_env.GetMethodID(m_class, "close", "()V");
       m_env.CallVoidMethod(m_jthis, m_mid_close);
     }
 
@@ -83,9 +81,6 @@ public:
    */
   bool mark_supported()
     {
-      if (!m_mid_mark_supported)
-        m_mid_mark_supported = m_env.GetMethodID(m_class,
-                                                 "markSupported", "()Z");
       return m_env.CallBooleanMethod(m_jthis, m_mid_mark_supported);
     }
 
@@ -94,8 +89,6 @@ public:
    */
   void mark(jint readlimit)
     {
-      if (!m_mid_mark)
-        m_mid_mark = m_env.GetMethodID(m_class, "mark", "(I)V");
       m_env.CallVoidMethod(m_jthis, m_mid_mark, readlimit);
     }
 
@@ -104,8 +97,6 @@ public:
    */
   void reset()
     {
-      if (!m_mid_reset)
-        m_mid_reset = m_env.GetMethodID(m_class, "reset", "()V");
       m_env.CallVoidMethod(m_jthis, m_mid_reset);
     }
 
@@ -114,8 +105,6 @@ public:
    */
   jint read()
     {
-      if (!m_mid_read_byte)
-        m_mid_read_byte = m_env.GetMethodID(m_class, "read", "()I");
       return m_env.CallIntMethod(m_jthis, m_mid_read_byte);
     }
 
@@ -124,8 +113,6 @@ public:
    */
   jint read(ByteArray& dst, jint length = -1, jint offset = 0)
     {
-      if (!m_mid_read_bytearray)
-        m_mid_read_bytearray = m_env.GetMethodID(m_class, "read", "([BII)I");
       return m_env.CallIntMethod(m_jthis, m_mid_read_bytearray,
                                  dst.get(), offset,
                                  (length >= 0 ? length
@@ -149,20 +136,20 @@ public:
    */
   jlong skip(jlong count)
     {
-      if (!m_mid_skip)
-        m_mid_skip = m_env.GetMethodID(m_class, "skip", "(J)J");
       return m_env.CallLongMethod(m_jthis, m_mid_skip, count);
     }
 
 private:
+  friend class ClassCache;
+  static void static_init(Env env);
   static const char* const m_class_name;
-  MethodID m_mid_close;
-  MethodID m_mid_mark_supported;
-  MethodID m_mid_mark;
-  MethodID m_mid_reset;
-  MethodID m_mid_read_byte;
-  MethodID m_mid_read_bytearray;
-  MethodID m_mid_skip;
+  static MethodID m_mid_close;
+  static MethodID m_mid_mark_supported;
+  static MethodID m_mid_mark;
+  static MethodID m_mid_reset;
+  static MethodID m_mid_read_byte;
+  static MethodID m_mid_read_bytearray;
+  static MethodID m_mid_skip;
 };
 
 
@@ -178,7 +165,7 @@ public:
    * Constructs a wrapper around an existing @c OutputStream @a jstream.
    */
   explicit OutputStream(Env env, jobject jstream)
-    : Object(env, m_class_name, jstream)
+    : Object(env, ClassCache::get_output_stream(), jstream)
     {}
 
   /**
@@ -202,8 +189,6 @@ public:
    */
   void close()
     {
-      if (!m_mid_close)
-        m_mid_close = m_env.GetMethodID(m_class, "close", "()V");
       m_env.CallVoidMethod(m_jthis, m_mid_close);
     }
 
@@ -212,8 +197,6 @@ public:
    */
   void write(jint byte)
     {
-      if (!m_mid_write_byte)
-        m_mid_write_byte = m_env.GetMethodID(m_class, "write", "(I)V");
       m_env.CallVoidMethod(m_jthis, m_mid_write_byte, byte);
     }
 
@@ -222,8 +205,6 @@ public:
    */
   void write(const ByteArray& src, jint length = -1, jint offset = 0)
     {
-      if (!m_mid_write_bytearray)
-        m_mid_write_bytearray = m_env.GetMethodID(m_class, "write", "([BII)V");
       m_env.CallVoidMethod(m_jthis, m_mid_write_bytearray,
                            src.get(), offset,
                            (length >= 0 ? length
@@ -255,10 +236,12 @@ public:
     }
 
 private:
+  friend class ClassCache;
+  static void static_init(Env env);
   static const char* const m_class_name;
-  MethodID m_mid_close;
-  MethodID m_mid_write_byte;
-  MethodID m_mid_write_bytearray;
+  static MethodID m_mid_close;
+  static MethodID m_mid_write_byte;
+  static MethodID m_mid_write_bytearray;
 };
 
 } // namespace Java

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp Mon Nov 25 10:25:05 2013
@@ -29,22 +29,29 @@ namespace Java {
 
 const char* const BaseList::m_class_name = "java/util/List";
 
+MethodID BaseList::m_mid_size;
+MethodID BaseList::m_mid_get;
+
+void BaseList::static_init(Env env)
+{
+  const jclass cls = ClassCache::get_list();
+  m_mid_size = env.GetMethodID(cls, "size", "()I");
+  m_mid_get = env.GetMethodID(cls, "get", "(I)Ljava/lang/Object;");
+}
+
 BaseList::ovector
-BaseList::convert_to_vector(Env env, jclass cls, jobject jlist)
+BaseList::convert_to_vector(Env env, jobject jlist)
 {
-  const jint length = env.CallIntMethod(
-      jlist, env.GetMethodID(cls, "size", "()I"));
+  const jint length = env.CallIntMethod(jlist, m_mid_size);
 
   if (!length)
     return ovector();
 
-  const jmethodID mid_get = env.GetMethodID(cls, "get",
-                                            "(I)Ljava/lang/Object;");
   ovector contents(length);
   ovector::iterator it;
   jint i;
   for (i = 0, it = contents.begin(); it != contents.end(); ++it, ++i)
-    *it = env.CallObjectMethod(jlist, mid_get, i);
+    *it = env.CallObjectMethod(jlist, m_mid_get, i);
   return contents;
 }
 
@@ -53,46 +60,20 @@ BaseList::convert_to_vector(Env env, jcl
 
 const char* const BaseMutableList::m_class_name = "java/util/ArrayList";
 
-namespace {
-jobject make_array_list(Env env, const char* class_name, jint length)
-{
-  const jclass cls = env.FindClass(class_name);
-  const jmethodID mid_ctor = env.GetMethodID(cls, "<init>", "(I)V");
-  return env.NewObject(cls, mid_ctor, length);
-}
-} // anonymous namespace
-
-BaseMutableList::BaseMutableList(Env env, jint length)
-  : Object(env, m_class_name,
-           make_array_list(env, m_class_name, length))
-{}
-
-void BaseMutableList::add(jobject obj)
-{
-  if (!m_mid_add)
-    m_mid_add = m_env.GetMethodID(m_class, "add", "(Ljava/lang/Object;)Z");
-  m_env.CallBooleanMethod(m_jthis, m_mid_add, obj);
-}
-
-void BaseMutableList::clear()
-{
-  if (!m_mid_clear)
-    m_mid_clear = m_env.GetMethodID(m_class, "clear", "()V");
-  m_env.CallVoidMethod(m_jthis, m_mid_clear);
-}
-
-jobject BaseMutableList::operator[](jint index) const
-{
-  if (!m_mid_get)
-    m_mid_get = m_env.GetMethodID(m_class, "get", "(I)Ljava/lang/Object;");
-  return m_env.CallObjectMethod(m_jthis, m_mid_get, index);
-}
-
-jint BaseMutableList::length() const
-{
-  if (!m_mid_size)
-    m_mid_size = m_env.GetMethodID(m_class, "size", "()I");
-  return m_env.CallIntMethod(m_jthis, m_mid_size);
+MethodID BaseMutableList::m_mid_ctor;
+MethodID BaseMutableList::m_mid_add;
+MethodID BaseMutableList::m_mid_clear;
+MethodID BaseMutableList::m_mid_get;
+MethodID BaseMutableList::m_mid_size;
+
+void BaseMutableList::static_init(Env env)
+{
+  const jclass cls = ClassCache::get_array_list();
+  m_mid_ctor = env.GetMethodID(cls, "<init>", "(I)V");
+  m_mid_add = env.GetMethodID(cls, "add", "(Ljava/lang/Object;)Z");
+  m_mid_clear = env.GetMethodID(cls, "clear", "()V");
+  m_mid_get = env.GetMethodID(cls, "get", "(I)Ljava/lang/Object;");
+  m_mid_size = env.GetMethodID(cls, "size", "()I");
 }
 
 } // namespace Java

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp Mon Nov 25 10:25:05 2013
@@ -58,8 +58,8 @@ protected:
    * @c std::vector.
    */
   explicit BaseList(Env env, jobject jlist)
-    : Object(env, m_class_name, jlist),
-      m_contents(convert_to_vector(env, m_class, m_jthis))
+    : Object(env, ClassCache::get_list(), jlist),
+      m_contents(convert_to_vector(env, m_jthis))
     {}
 
   /**
@@ -74,8 +74,12 @@ protected:
   const ovector m_contents;
 
 private:
+  friend class ClassCache;
+  static void static_init(Env env);
   static const char* const m_class_name;
-  static ovector convert_to_vector(Env env, jclass cls, jobject jlist);
+  static MethodID m_mid_size;
+  static MethodID m_mid_get;
+  static ovector convert_to_vector(Env env, jobject jlist);
 };
 
 /**
@@ -148,12 +152,18 @@ public:
   /**
    * Clears the contents of the list.
    */
-  void clear();
+  void clear()
+    {
+      m_env.CallVoidMethod(m_jthis, m_mid_clear);
+    }
 
   /**
    * Returns the number of elements in the list.
    */
-  jint length() const;
+  jint length() const
+    {
+      return m_env.CallIntMethod(m_jthis, m_mid_size);
+    }
 
   /**
    * Checks if the list is empty.
@@ -175,25 +185,38 @@ protected:
    * Constructs and wraps an empty list of type @c java.util.ArrayList
    * with initial allocation size @a length.
    */
-  explicit BaseMutableList(Env env, jint length);
+  explicit BaseMutableList(Env env, jint length)
+    : Object(env, ClassCache::get_array_list(),
+             env.NewObject(ClassCache::get_array_list(), m_mid_ctor, length))
+    {}
+
 
   /**
    * Appends @a obj to the end of the list.
    */
-  void add(jobject obj);
+  void add(jobject obj)
+    {
+      m_env.CallBooleanMethod(m_jthis, m_mid_add, obj);
+    }
 
   /**
    * Returns the object reference at @a index.
    * @note Throws a Java exception if the index value is not valid.
    */
-  jobject operator[](jint index) const;
+  jobject operator[](jint index) const
+    {
+      return m_env.CallObjectMethod(m_jthis, m_mid_get, index);
+    }
 
 private:
+  friend class ClassCache;
+  static void static_init(Env env);
   static const char* const m_class_name;
-  MethodID m_mid_add;
-  MethodID m_mid_clear;
-  mutable MethodID m_mid_get;
-  mutable MethodID m_mid_size;
+  static MethodID m_mid_ctor;
+  static MethodID m_mid_add;
+  static MethodID m_mid_clear;
+  static MethodID m_mid_get;
+  static MethodID m_mid_size;
 };
 
 /**

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp Mon Nov 25 10:25:05 2013
@@ -145,7 +145,23 @@ class ClassCache
   SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(classtype);
   SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(throwable);
   SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(string);
+
+  SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(list);
+  SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(array_list);
+
+  SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(map);
+  SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(set);
+  SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(iterator);
+  SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(map_entry);
+  SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(hash_map);
+
+  SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(input_stream);
+  SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(output_stream);
+
+  SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(byte_buffer);
+
   SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(subversion_exception);
+  SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS(external_item);
 #undef SVN_JAVAHL_JNIWRAPPER_CACHED_CLASS
 
 public:

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp Mon Nov 25 10:25:05 2013
@@ -31,6 +31,43 @@ namespace Java {
 // Class Java::BaseMap
 
 const char* const BaseMap::m_class_name = "java/util/Map";
+MethodID BaseMap::m_mid_size;
+MethodID BaseMap::m_mid_entry_set;
+void BaseMap::static_init(Env env)
+{
+  const jclass cls = ClassCache::get_map();
+  m_mid_size = env.GetMethodID(cls, "size", "()I");
+  m_mid_entry_set = env.GetMethodID(cls, "entrySet", "()Ljava/util/Set;");
+}
+
+const char* const BaseMap::Set::m_class_name = "java/util/Set";
+MethodID BaseMap::Set::m_mid_iterator;
+void BaseMap::Set::static_init(Env env)
+{
+  m_mid_iterator = env.GetMethodID(ClassCache::get_set(), "iterator",
+                                   "()Ljava/util/Iterator;");
+}
+
+const char* const BaseMap::Iterator::m_class_name = "java/util/Iterator";
+MethodID BaseMap::Iterator::m_mid_has_next;
+MethodID BaseMap::Iterator::m_mid_next;
+void BaseMap::Iterator::static_init(Env env)
+{
+  const jclass cls = ClassCache::get_iterator();
+  m_mid_has_next = env.GetMethodID(cls, "hasNext", "()Z");
+  m_mid_next = env.GetMethodID(cls, "next", "()Ljava/lang/Object;");
+}
+
+const char* const BaseMap::Entry::m_class_name = "java/util/Map$Entry";
+MethodID BaseMap::Entry::m_mid_get_key;
+MethodID BaseMap::Entry::m_mid_get_value;
+void BaseMap::Entry::static_init(Env env)
+{
+  const jclass cls = ClassCache::get_map_entry();
+  m_mid_get_key = env.GetMethodID(cls, "getKey", "()Ljava/lang/Object;");
+  m_mid_get_value = env.GetMethodID(cls, "getValue", "()Ljava/lang/Object;");
+}
+
 
 jobject BaseMap::operator[](const std::string& index) const
 {
@@ -44,37 +81,25 @@ jobject BaseMap::operator[](const std::s
   return it->second;
 }
 
-BaseMap::somap BaseMap::convert_to_map(Env env, jclass cls, jobject jmap)
+BaseMap::somap BaseMap::convert_to_map(Env env, jobject jmap)
 {
-  if (!env.CallIntMethod(jmap, env.GetMethodID(cls, "size", "()I")))
+  if (!env.CallIntMethod(jmap, m_mid_size))
     return somap();
 
   // Get an iterator over the map's entry set
-  const jobject entries = env.CallObjectMethod(
-      jmap, env.GetMethodID(cls, "entrySet", "()Ljava/util/Set;"));
-  const jobject iterator = env.CallObjectMethod(
-      entries, env.GetMethodID(env.GetObjectClass(entries), "iterator",
-                               "()Ljava/util/Iterator;"));
-  const jclass cls_iterator = env.GetObjectClass(iterator);
-  const jmethodID mid_it_has_next = env.GetMethodID(cls_iterator,
-                                                    "hasNext", "()Z");
-  const jmethodID mid_it_next = env.GetMethodID(cls_iterator, "next",
-                                                "()Ljava/lang/Object;");
-
-  // Find the methods for retreiving the key and value from an entry
-  const jclass cls_entry = env.FindClass("java/util/Map$Entry");
-  const jmethodID mid_get_key = env.GetMethodID(cls_entry, "getKey",
-                                                "()Ljava/lang/Object;");
-  const jmethodID mid_get_value = env.GetMethodID(cls_entry, "getValue",
-                                                  "()Ljava/lang/Object;");
+  const jobject entries = env.CallObjectMethod(jmap, m_mid_entry_set);
+  const jobject iterator = env.CallObjectMethod(entries, Set::m_mid_iterator);
 
-  // And finally ... iterate over the map, filling the native map
+  // Yterate over the map, filling the native map
   somap contents;
-  while (env.CallBooleanMethod(iterator, mid_it_has_next))
+  while (env.CallBooleanMethod(iterator, Iterator::m_mid_has_next))
     {
-      const jobject e = env.CallObjectMethod(iterator, mid_it_next);
-      const String keystr(env, jstring(env.CallObjectMethod(e, mid_get_key)));
-      const jobject value(env.CallObjectMethod(e, mid_get_value));
+      const jobject entry =
+        env.CallObjectMethod(iterator, Iterator::m_mid_next);
+      const String keystr(
+          env, jstring(env.CallObjectMethod(entry, Entry::m_mid_get_key)));
+      const jobject value(
+          env.CallObjectMethod(entry, Entry::m_mid_get_value));
       const String::Contents key(keystr);
       contents.insert(somap::value_type(key.c_str(), value));
     }
@@ -85,49 +110,31 @@ BaseMap::somap BaseMap::convert_to_map(E
 
 const char* const BaseMutableMap::m_class_name = "java/util/HashMap";
 
-namespace {
-jobject make_hash_map(Env env, const char* class_name, jint length)
-{
-  const jclass cls = env.FindClass(class_name);
-  const jmethodID mid_ctor = env.GetMethodID(cls, "<init>", "(I)V");
-  return env.NewObject(cls, mid_ctor, length);
-}
-} // anonymous namespace
-
-BaseMutableMap::BaseMutableMap(Env env, jint length)
-  : Object(env, m_class_name,
-           make_hash_map(env, m_class_name, length))
-{}
-
-void BaseMutableMap::clear()
-{
-  if (!m_mid_clear)
-    m_mid_clear = m_env.GetMethodID(m_class, "clear", "()V");
-  m_env.CallVoidMethod(m_jthis, m_mid_clear);
-}
-
-jint BaseMutableMap::length() const
-{
-  if (!m_mid_size)
-    m_mid_size = m_env.GetMethodID(m_class, "size", "()I");
-  return m_env.CallIntMethod(m_jthis, m_mid_size);
+MethodID BaseMutableMap::m_mid_ctor;
+MethodID BaseMutableMap::m_mid_put;
+MethodID BaseMutableMap::m_mid_clear;
+MethodID BaseMutableMap::m_mid_has_key;
+MethodID BaseMutableMap::m_mid_get;
+MethodID BaseMutableMap::m_mid_size;
+
+void BaseMutableMap::static_init(Env env)
+{
+  const jclass cls = ClassCache::get_hash_map();
+  m_mid_ctor = env.GetMethodID(cls, "<init>", "(I)V");
+  m_mid_put = env.GetMethodID(cls, "put",
+                              "(Ljava/lang/Object;Ljava/lang/Object;)"
+                              "Ljava/lang/Object;");
+  m_mid_clear = env.GetMethodID(cls, "clear", "()V");
+  m_mid_has_key = env.GetMethodID(cls, "containsKey",
+                                  "(Ljava/lang/Object;)Z");
+  m_mid_get = env.GetMethodID(cls, "get",
+                              "(Ljava/lang/Object;)Ljava/lang/Object;");
+  m_mid_size = env.GetMethodID(cls, "size", "()I");
 }
 
-void BaseMutableMap::put(const std::string& key, jobject obj)
-{
-  if (!m_mid_put)
-    m_mid_put = m_env.GetMethodID(m_class, "put",
-                                  "(Ljava/lang/Object;Ljava/lang/Object;)"
-                                  "Ljava/lang/Object;");
-  m_env.CallObjectMethod(m_jthis, m_mid_put, String(m_env, key).get(), obj);
-}
 
 jobject BaseMutableMap::operator[](const std::string& index) const
 {
-  if (!m_mid_has_key)
-    m_mid_has_key = m_env.GetMethodID(m_class, "containsKey",
-                                      "(Ljava/lang/Object;)Z");
-
   const String key(m_env, index);
   if (!m_env.CallBooleanMethod(m_jthis, m_mid_has_key, key.get()))
     {
@@ -135,10 +142,6 @@ jobject BaseMutableMap::operator[](const
       msg += index;
       throw std::out_of_range(msg.c_str());
     }
-
-  if (!m_mid_get)
-    m_mid_get = m_env.GetMethodID(m_class, "get",
-                                  "(Ljava/lang/Object;)Ljava/lang/Object;");
   return m_env.CallObjectMethod(m_jthis, m_mid_get, key.get());
 }
 

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp Mon Nov 25 10:25:05 2013
@@ -61,8 +61,8 @@ protected:
    * @c std::map.
    */
   explicit BaseMap(Env env, jobject jmap)
-    : Object(env, m_class_name, jmap),
-      m_contents(convert_to_map(env, m_class, m_jthis))
+    : Object(env, ClassCache::get_map(), jmap),
+      m_contents(convert_to_map(env, m_jthis))
     {}
 
   /**
@@ -74,8 +74,36 @@ protected:
   const somap m_contents;
 
 private:
+  friend class ClassCache;
+  static void static_init(Env env);
   static const char* const m_class_name;
-  static somap convert_to_map(Env env, jclass cls, jobject jmap);
+
+  struct Set
+  {
+    static MethodID m_mid_iterator;
+    static void static_init(Env env);
+    static const char* const m_class_name;
+  };
+
+  struct Iterator
+  {
+    static MethodID m_mid_has_next;
+    static MethodID m_mid_next;
+    static void static_init(Env env);
+    static const char* const m_class_name;
+  };
+
+  struct Entry
+  {
+    static MethodID m_mid_get_key;
+    static MethodID m_mid_get_value;
+    static void static_init(Env env);
+    static const char* const m_class_name;
+  };
+
+  static MethodID m_mid_size;
+  static MethodID m_mid_entry_set;
+  static somap convert_to_map(Env env, jobject jmap);
 };
 
 /**
@@ -153,12 +181,18 @@ public:
   /**
    * Clears the contents of the map.
    */
-  void clear();
+  void clear()
+    {
+      m_env.CallVoidMethod(m_jthis, m_mid_clear);
+    }
 
   /**
    * Returns the number of elements in the map.
    */
-  jint length() const;
+  jint length() const
+    {
+      return m_env.CallIntMethod(m_jthis, m_mid_size);
+    }
 
   /**
    * Checks if the map is empty.
@@ -180,12 +214,20 @@ protected:
    * Constructs and wraps an empty map of type @c java.util.HashMap
    * with initial allocation size @a length.
    */
-  explicit BaseMutableMap(Env env, jint length);
+  explicit BaseMutableMap(Env env, jint length)
+    : Object(env, ClassCache::get_hash_map(),
+             env.NewObject(ClassCache::get_hash_map(), m_mid_ctor, length))
+    {}
+
 
   /**
    * Inserts @a obj identified by @a key into the map.
    */
-  void put(const std::string& key, jobject obj);
+  void put(const std::string& key, jobject obj)
+    {
+      m_env.CallObjectMethod(m_jthis, m_mid_put,
+                             String(m_env, key).get(), obj);
+    }
 
   /**
    * Returns the object reference identified by @a index.
@@ -194,12 +236,15 @@ protected:
   jobject operator[](const std::string& index) const;
 
 private:
+  friend class ClassCache;
+  static void static_init(Env env);
   static const char* const m_class_name;
-  MethodID m_mid_put;
-  MethodID m_mid_clear;
-  mutable MethodID m_mid_has_key;
-  mutable MethodID m_mid_get;
-  mutable MethodID m_mid_size;
+  static MethodID m_mid_ctor;
+  static MethodID m_mid_put;
+  static MethodID m_mid_clear;
+  static MethodID m_mid_has_key;
+  static MethodID m_mid_get;
+  static MethodID m_mid_size;
 };
 
 /**

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp Mon Nov 25 10:25:05 2013
@@ -86,15 +86,21 @@ class KeywordHashBuilder
 public:
   explicit KeywordHashBuilder(const SVN::Pool& pool)
     : m_pool(pool),
-      m_hash(apr_hash_make(pool.getPool()))
+      m_hash(apr_hash_make(pool.getPool())),
+      m_empty(svn_string_create_empty(pool.getPool()))
     {}
 
   void operator()(const std::string& key, const Java::ByteArray& value)
     {
       const char* const safe_key =
         apr_pstrmemdup(m_pool.getPool(), key.c_str(), key.size() + 1);
-      Java::ByteArray::Contents val(value);
-      apr_hash_set(m_hash, safe_key, key.size(), val.get_string(m_pool));
+      if (!value.get())
+        apr_hash_set(m_hash, safe_key, key.size(), m_empty);
+      else
+        {
+          Java::ByteArray::Contents val(value);
+          apr_hash_set(m_hash, safe_key, key.size(), val.get_string(m_pool));
+        }
     }
 
   apr_hash_t* get() const
@@ -105,6 +111,7 @@ public:
 private:
   const SVN::Pool& m_pool;
   apr_hash_t* const m_hash;
+  svn_string_t* const m_empty;
 };
 
 inline apr_hash_t*

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientException.java
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientException.java?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientException.java (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientException.java Mon Nov 25 10:25:05 2013
@@ -30,13 +30,9 @@ import java.util.List;
  */
 public class ClientException extends NativeException
 {
-    // Update the serialVersionUID when there is a incompatible change
-    // made to this class.  See any of the following, depending upon
-    // the Java release.
-    // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
-    // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
-    // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
-    // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+    // Update the serialVersionUID when there is a incompatible change made to
+    // this class.  See the java documentation for when a change is incompatible.
+    // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
     private static final long serialVersionUID = 2L;
 
     /**

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientNotifyInformation.java
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientNotifyInformation.java?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientNotifyInformation.java (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientNotifyInformation.java Mon Nov 25 10:25:05 2013
@@ -36,13 +36,9 @@ import java.util.EventObject;
  */
 public class ClientNotifyInformation extends EventObject
 {
-    // Update the serialVersionUID when there is a incompatible change
-    // made to this class.  See any of the following, depending upon
-    // the Java release.
-    // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
-    // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
-    // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
-    // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+    // Update the serialVersionUID when there is a incompatible change made to
+    // this class.  See the java documentation for when a change is incompatible.
+    // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
     private static final long serialVersionUID = 2L;
 
     /**
@@ -206,6 +202,7 @@ public class ClientNotifyInformation ext
      * @deprecated Constructor compatible with teh 1.8 API; uses
      * <code>null</code> URL and errMsgStack values.
      */
+    @Deprecated
     public ClientNotifyInformation(String path, Action action, NodeKind kind,
                              String mimeType, Lock lock, String errMsg,
                              Status contentState, Status propState,

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitInfo.java
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitInfo.java?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitInfo.java (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitInfo.java Mon Nov 25 10:25:05 2013
@@ -32,13 +32,9 @@ import org.apache.subversion.javahl.type
  */
 public class CommitInfo implements java.io.Serializable
 {
-    // Update the serialVersionUID when there is a incompatible change
-    // made to this class.  See any of the following, depending upon
-    // the Java release.
-    // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
-    // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
-    // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
-    // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+    // Update the serialVersionUID when there is a incompatible change made to
+    // this class.  See the java documentation for when a change is incompatible.
+    // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
     private static final long serialVersionUID = 1L;
 
     /** the revision committed */

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitItem.java
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitItem.java?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitItem.java (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitItem.java Mon Nov 25 10:25:05 2013
@@ -30,13 +30,9 @@ import org.apache.subversion.javahl.type
  */
 public class CommitItem implements java.io.Serializable
 {
-    // Update the serialVersionUID when there is a incompatible change
-    // made to this class.  See any of the following, depending upon
-    // the Java release.
-    // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
-    // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
-    // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
-    // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+    // Update the serialVersionUID when there is a incompatible change made to
+    // this class.  See the java documentation for when a change is incompatible.
+    // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
     private static final long serialVersionUID = 1L;
 
     /**

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/DiffSummary.java
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/DiffSummary.java?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/DiffSummary.java (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/DiffSummary.java Mon Nov 25 10:25:05 2013
@@ -33,13 +33,9 @@ import org.apache.subversion.javahl.type
  */
 public class DiffSummary extends EventObject
 {
-    // Update the serialVersionUID when there is a incompatible change
-    // made to this class.  See any of the following, depending upon
-    // the Java release.
-    // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
-    // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
-    // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
-    // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+    // Update the serialVersionUID when there is a incompatible change made to
+    // this class.  See the java documentation for when a change is incompatible.
+    // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
     private static final long serialVersionUID = 1L;
 
     private DiffKind diffKind;

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java Mon Nov 25 10:25:05 2013
@@ -355,6 +355,7 @@ public interface ISVNClient
      * @deprecated Provided for backward compatibility with 1.7. Passes
      *             metadataOnly false and allowMixRev true.
      */
+    @Deprecated
     void move(Set<String> srcPaths, String destPath, boolean force,
               boolean moveAsChild, boolean makeParents,
               Map<String, String> revpropTable,
@@ -598,7 +599,7 @@ public interface ISVNClient
      * Merge set of revisions into a new local path.
      * <p>
      * <b>Note:</b> Behaves like the 1.8 version where ignoreAncestry
-     * maps to both ignoreMergeinfo and diffIgnoreAncestry
+     * maps to both ignoreMergeinfo and diffIgnoreAncestry.
      *
      * @param path          path or url
      * @param pegRevision   revision to interpret path
@@ -635,6 +636,7 @@ public interface ISVNClient
      * @throws ClientException
      * @deprecated Will be removed in a future release
      */
+    @Deprecated
     void mergeReintegrate(String path, Revision pegRevision,
                           String localPath, boolean dryRun)
              throws ClientException;
@@ -657,7 +659,7 @@ public interface ISVNClient
      * @param pegRevision            peg rev for pathOrUrl
      * @param mergeSourceUrl         the source of the merge
      * @param srcPegRevision         peg rev for mergeSourceUrl
-     * @param srcStartRevieion       lower bound of the source revision range
+     * @param srcStartRevision       lower bound of the source revision range
      * @param srcEndRevision         upper bound of the source revision range
      * @param discoverChangedPaths   return paths of changed items
      * @param depth                  the depth to recurse to
@@ -704,7 +706,7 @@ public interface ISVNClient
      * @param target2       second path or url
      * @param revision2     second revision
      * @param relativeToDir index path is relative to this path
-     * @param outFileName   file name where difference are written
+     * @param outStream     the stream to which difference are written
      * @param depth         how deep to traverse into subdirectories
      * @param ignoreAncestry ignore if files are not related
      * @param noDiffDeleted no output on deleted files
@@ -725,6 +727,26 @@ public interface ISVNClient
               DiffOptions options)
             throws ClientException;
 
+    /**
+     * Display the differences between two paths
+     * @param target1       first path or url
+     * @param revision1     first revision
+     * @param target2       second path or url
+     * @param revision2     second revision
+     * @param relativeToDir index path is relative to this path
+     * @param outFileName   file name where difference are written
+     * @param depth         how deep to traverse into subdirectories
+     * @param ignoreAncestry ignore if files are not related
+     * @param noDiffDeleted no output on deleted files
+     * @param force         diff even on binary files
+     * @param copiesAsAdds  if set, copied files will be shown in their
+     *                      entirety, not as diffs from their sources
+     * @param ignoreProps   don't show property diffs
+     * @param propsOnly     show property changes only
+     * @param options       additional options for controlling the output
+     * @throws ClientException
+     * @since 1.8
+     */
     void diff(String target1, Revision revision1, String target2,
               Revision revision2, String relativeToDir, String outFileName,
               Depth depth, Collection<String> changelists,
@@ -740,7 +762,7 @@ public interface ISVNClient
      * @param target2       second path or url
      * @param revision2     second revision
      * @param relativeToDir index path is relative to this path
-     * @param outFileName   file name where difference are written
+     * @param outStream     the stream to which difference are written
      * @param depth         how deep to traverse into subdirectories
      * @param ignoreAncestry ignore if files are not related
      * @param noDiffDeleted no output on deleted files
@@ -758,6 +780,24 @@ public interface ISVNClient
               boolean copiesAsAdds, boolean ignoreProps, boolean propsOnly)
             throws ClientException;
 
+    /**
+     * Display the differences between two paths
+     * @param target1       first path or url
+     * @param revision1     first revision
+     * @param target2       second path or url
+     * @param revision2     second revision
+     * @param relativeToDir index path is relative to this path
+     * @param outFileName   file name where difference are written
+     * @param depth         how deep to traverse into subdirectories
+     * @param ignoreAncestry ignore if files are not related
+     * @param noDiffDeleted no output on deleted files
+     * @param force         diff even on binary files
+     * @param copiesAsAdds  if set, copied files will be shown in their
+     *                      entirety, not as diffs from their sources
+     * @param ignoreProps   don't show property diffs
+     * @param propsOnly     show property changes only
+     * @throws ClientException
+     */
     void diff(String target1, Revision revision1, String target2,
               Revision revision2, String relativeToDir, String outFileName,
               Depth depth, Collection<String> changelists,
@@ -772,7 +812,7 @@ public interface ISVNClient
      * @param startRevision first Revision to compare
      * @param endRevision   second Revision to compare
      * @param relativeToDir index path is relative to this path
-     * @param outFileName   file name where difference are written
+     * @param outStream     the stream to which difference are written
      * @param depth         how deep to traverse into subdirectories
      * @param changelists  if non-null, filter paths using changelists
      * @param ignoreAncestry ignore if files are not related
@@ -794,6 +834,27 @@ public interface ISVNClient
               DiffOptions options)
             throws ClientException;
 
+    /**
+     * Display the differences between two paths.
+     * @param target        path or url
+     * @param pegRevision   revision tointerpret target
+     * @param startRevision first Revision to compare
+     * @param endRevision   second Revision to compare
+     * @param relativeToDir index path is relative to this path
+     * @param outFileName   file name where difference are written
+     * @param depth         how deep to traverse into subdirectories
+     * @param changelists  if non-null, filter paths using changelists
+     * @param ignoreAncestry ignore if files are not related
+     * @param noDiffDeleted no output on deleted files
+     * @param force         diff even on binary files
+     * @param copiesAsAdds  if set, copied files will be shown in their
+     *                      entirety, not as diffs from their sources
+     * @param ignoreProps   don't show property diffs
+     * @param propsOnly     show property changes only
+     * @param options       additional options for controlling the output
+     * @throws ClientException
+     * @since 1.8
+     */
     void diff(String target, Revision pegRevision, Revision startRevision,
               Revision endRevision, String relativeToDir, String outFileName,
               Depth depth, Collection<String> changelists,
@@ -809,7 +870,7 @@ public interface ISVNClient
      * @param startRevision first Revision to compare
      * @param endRevision   second Revision to compare
      * @param relativeToDir index path is relative to this path
-     * @param outFileName   file name where difference are written
+     * @param outStream     the stream to which difference are written
      * @param depth         how deep to traverse into subdirectories
      * @param changelists  if non-null, filter paths using changelists
      * @param ignoreAncestry ignore if files are not related
@@ -829,6 +890,25 @@ public interface ISVNClient
               boolean copiesAsAdds, boolean ignoreProps, boolean propsOnly)
             throws ClientException;
 
+    /**
+     * Display the differences between two paths.
+     * @param target        path or url
+     * @param pegRevision   revision tointerpret target
+     * @param startRevision first Revision to compare
+     * @param endRevision   second Revision to compare
+     * @param relativeToDir index path is relative to this path
+     * @param outFileName   file name where difference are written
+     * @param depth         how deep to traverse into subdirectories
+     * @param changelists  if non-null, filter paths using changelists
+     * @param ignoreAncestry ignore if files are not related
+     * @param noDiffDeleted no output on deleted files
+     * @param force         diff even on binary files
+     * @param copiesAsAdds  if set, copied files will be shown in their
+     *                      entirety, not as diffs from their sources
+     * @param ignoreProps   don't show property diffs
+     * @param propsOnly     show property changes only
+     * @throws ClientException
+     */
     void diff(String target, Revision pegRevision, Revision startRevision,
               Revision endRevision, String relativeToDir, String outFileName,
               Depth depth, Collection<String> changelists,
@@ -868,7 +948,7 @@ public interface ISVNClient
      *
      * @param target Path or URL.
      * @param pegRevision Revision at which to interpret
-     * <code>target</code>.  If {@link Revision.Kind#unspecified} or
+     * <code>target</code>.  If {@link Revision#UNSPECIFIED} or
      * <code>null</code>, behave identically to {@link
      * #diffSummarize(String, Revision, String, Revision, Depth,
      * Collection, boolean, DiffSummaryCallback)}, using
@@ -933,14 +1013,11 @@ public interface ISVNClient
      *
      * @param paths   paths of the items
      * @param name    name of the property
-     * @param value   new value of the property. Set value to <code>
-     * null</code> to delete a property
+     * @param value   new value of the property. Set value to
+     * <code>null</code> to delete a property
      * @param depth   the depth to recurse into subdirectories
      * @param changelists changelists to filter by
      * @param force   do not check if the value is valid
-     * @param revpropTable A string-to-string mapping of revision properties
-     *                     to values which will be set if this operation
-     *                     results in a commit.
      * @throws ClientException
      */
     void propertySetLocal(Set<String> paths, String name, byte[] value,
@@ -948,6 +1025,21 @@ public interface ISVNClient
                           boolean force)
             throws ClientException;
 
+    /**
+     * Sets one property of an item with a String value
+     *
+     * @param paths   paths of the items
+     * @param name    name of the property
+     * @param value   new value of the property. Set value to <code>
+     * null</code> to delete a property
+     * @param depth   the depth to recurse into subdirectories
+     * @param changelists changelists to filter by
+     * @param force   do not check if the value is valid
+     * @param revpropTable A string-to-string mapping of revision properties
+     *                     to values which will be set if this operation
+     *                     results in a commit.
+     * @throws ClientException
+     */
     void propertySetRemote(String path, long baseRev, String name,
                            byte[] value, CommitMessageCallback handler,
                            boolean force, Map<String, String> revpropTable,
@@ -1194,7 +1286,7 @@ public interface ISVNClient
      */
     void info2(String pathOrUrl,
                Revision revision, Revision pegRevision, Depth depth,
-               boolean fertchExcluded, boolean fetchActualOnly,
+               boolean fetchExcluded, boolean fetchActualOnly,
                Collection<String> changelists, InfoCallback callback)
         throws ClientException;
 

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNConfig.java
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNConfig.java?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNConfig.java (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNConfig.java Mon Nov 25 10:25:05 2013
@@ -132,7 +132,7 @@ public interface ISVNConfig
     /**
      * Interface for reading and modifying configuration
      * categories. Returned by {@link #config()} and
-     * {@link servers()}.
+     * {@link #servers()}.
      */
     public interface Category
     {
@@ -160,7 +160,7 @@ public interface ISVNConfig
 
         /**
          * Returns the long integer value of a configuration option.
-         * @see #get(String,String,Boolean)
+         * @see #get(String,String,boolean)
          */
         long get(String section,
                  String option,
@@ -169,8 +169,8 @@ public interface ISVNConfig
 
         /**
          * Returns the {@link Tristate} value of a configuration option.
-         * @param unknown The value used for {@link Tristate.Unknown}.
-         * @see #get(String,String,Boolean)
+         * @param unknown The value used for {@link Tristate#Unknown}.
+         * @see #get(String,String,boolean)
          */
         Tristate get(String section,
                      String option,
@@ -181,7 +181,7 @@ public interface ISVNConfig
         /**
          * Check that the configuration option's value is true, false
          * or "ask". The boolean representations are the same as those
-         * understood by {@link #get(String,String,Boolean)}. If the
+         * understood by {@link #get(String,String,boolean)}. If the
          * option is not found, the default value will be parsed
          * instead.
          * @return {@link ISVNConfig#TRUE}, {@link ISVNConfig#FALSE}
@@ -207,7 +207,7 @@ public interface ISVNConfig
 
         /**
          * Set the value of a configuration option to represent a boolean.
-         * @see @set(String,String,String)
+         * @see #set(String,String,String)
          */
         void set(String section,
                  String option,
@@ -215,7 +215,7 @@ public interface ISVNConfig
 
         /**
          * Set the value of a configuration option to represent a long integer.
-         * @see @set(String,String,String)
+         * @see #set(String,String,String)
          */
         void set(String section,
                  String option,

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNEditor.java
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNEditor.java?rev=1545212&r1=1545211&r2=1545212&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNEditor.java (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNEditor.java Mon Nov 25 10:25:05 2013
@@ -31,8 +31,8 @@ import java.util.Map;
 
 /**
  * Editor interface (implements the EV2 abstraction).
- * @see <a href="http://svn.apache.org/repos/asf/subversion/trunk/subversion/include/private/svn_editor.h"
- *      >svn_editor.h</a> for all restrictions on driving an editor.
+ * @see <a href="http://svn.apache.org/repos/asf/subversion/trunk/subversion/include/private/svn_editor.h">svn_editor.h</a>
+ *      for all restrictions on driving an editor.
  * @since 1.9
  */
 public interface ISVNEditor