Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/SVNClient.cpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/SVNClient.cpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/SVNClient.cpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/SVNClient.cpp
 Mon Feb  9 11:23:39 2015
@@ -339,7 +339,8 @@ void SVNClient::remove(Targets &targets,
 
 void SVNClient::revert(StringArray &paths, svn_depth_t depth,
                        StringArray &changelists,
-                       bool clear_changelists)
+                       bool clear_changelists,
+                       bool metadata_only)
 {
     SVN::Pool subPool(pool);
 
@@ -352,6 +353,7 @@ void SVNClient::revert(StringArray &path
     SVN_JNI_ERR(svn_client_revert3(targets.array(subPool), depth,
                                    changelists.array(subPool),
                                    clear_changelists,
+                                   metadata_only,
                                    ctx, subPool.getPool()), );
 }
 
@@ -1184,7 +1186,7 @@ void SVNClient::relocate(const char *fro
 void SVNClient::blame(const char *path, Revision &pegRevision,
                       Revision &revisionStart, Revision &revisionEnd,
                       bool ignoreMimeType, bool includeMergedRevisions,
-                      BlameCallback *callback)
+                      BlameCallback *callback, DiffOptions const& options)
 {
     SVN::Pool subPool(pool);
     SVN_JNI_NULL_PTR_EX(path, "path", );
@@ -1198,7 +1200,7 @@ void SVNClient::blame(const char *path,
     SVN_JNI_ERR(svn_client_blame5(
           intPath.c_str(), pegRevision.revision(), revisionStart.revision(),
           revisionEnd.revision(),
-          svn_diff_file_options_create(subPool.getPool()), ignoreMimeType,
+          options.fileOptions(subPool), ignoreMimeType,
           includeMergedRevisions, BlameCallback::callback, callback, ctx,
           subPool.getPool()),
         );

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/SVNClient.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/SVNClient.h?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/SVNClient.h
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/SVNClient.h
 Mon Feb  9 11:23:39 2015
@@ -82,7 +82,7 @@ class SVNClient :public SVNBase
   void blame(const char *path, Revision &pegRevision,
              Revision &revisionStart, Revision &revisionEnd,
              bool ignoreMimeType, bool includeMergedRevisions,
-             BlameCallback *callback);
+             BlameCallback *callback, DiffOptions const& options);
   void relocate(const char *from, const char *to, const char *path,
                 bool ignoreExternals);
   apr_hash_t *streamFileContent(const char *path,
@@ -161,7 +161,7 @@ class SVNClient :public SVNBase
   void add(const char *path, svn_depth_t depth, bool force,
            bool no_ignore, bool no_autoprops, bool add_parents);
   void revert(StringArray &paths, svn_depth_t depth, StringArray &changelists,
-              bool clear_changelists);
+              bool clear_changelists, bool metadata_only);
   void remove(Targets &targets, CommitMessage *message, bool force,
               bool keep_local, PropertyTable &revprops,
               CommitCallback *callback);

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/Utility.cpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/Utility.cpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/Utility.cpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/Utility.cpp
 Mon Feb  9 11:23:39 2015
@@ -52,7 +52,10 @@ public:
       const char* const safe_key =
         apr_pstrmemdup(m_pool, key.c_str(), key.size() + 1);
       if (!value.get())
-        apr_hash_set(m_hash, safe_key, key.size(), m_default);
+        {
+          if (m_default != NULL)
+            apr_hash_set(m_hash, safe_key, key.size(), m_default);
+        }
       else
         {
           Java::ByteArray::Contents val(value);
@@ -70,20 +73,22 @@ private:
   apr_hash_t* const m_hash;
   const svn_string_t* const m_default;
 };
+
+typedef ::Java::ImmutableMap< ::Java::ByteArray, jbyteArray> 
ImmutableByteArrayMap;
 } // anonymous namespace
 
 apr_hash_t*
 make_keyword_hash(::Java::Env env, jobject jkeywords, apr_pool_t* pool)
 {
   const svn_string_t* const empty = svn_string_create_empty(pool);
-  const ::Java::Map< ::Java::ByteArray, jbyteArray> keywords(env, jkeywords);
+  const ImmutableByteArrayMap keywords(env, jkeywords);
   return keywords.for_each(MapToHashIteration(empty, pool)).get();
 }
 
 apr_hash_t*
 make_property_hash(::Java::Env env, jobject jproperties, apr_pool_t* pool)
 {
-  const ::Java::Map< ::Java::ByteArray, jbyteArray> props(env, jproperties);
+  const ImmutableByteArrayMap props(env, jproperties);
   return props.for_each(MapToHashIteration(NULL, pool)).get();
 }
 

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp
 Mon Feb  9 11:23:39 2015
@@ -325,10 +325,17 @@ const char* const OutOfMemoryError::m_cl
 
 const char* const IndexOutOfBoundsException::m_class_name =
   "java/lang/IndexOutOfBoundsException";
+IndexOutOfBoundsException::ClassImpl::~ClassImpl() {}
 
 const char* const IOException::m_class_name =
   "java/io/IOException";
 
+const char* const IllegalArgumentException::m_class_name =
+  "java/lang/IllegalArgumentException";
+
+const char *const NoSuchElementException::m_class_name =
+  "java/util/NoSuchElementException";
+NoSuchElementException::ClassImpl::~ClassImpl() {}
 
 // Implementation of jni_stack.hpp
 

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp
 Mon Feb  9 11:23:39 2015
@@ -163,14 +163,20 @@ class ClassCacheImpl
       return pimpl;                                             \
     }
 
-  JNIWRAPPER_DEFINE_CACHED_CLASS(list, BaseList);
-  JNIWRAPPER_DEFINE_CACHED_CLASS(array_list, BaseMutableList);
-
-  JNIWRAPPER_DEFINE_CACHED_CLASS(map, BaseMap);
-  JNIWRAPPER_DEFINE_CACHED_CLASS(set, BaseMap::Set);
-  JNIWRAPPER_DEFINE_CACHED_CLASS(iterator, BaseMap::Iterator);
-  JNIWRAPPER_DEFINE_CACHED_CLASS(map_entry, BaseMap::Entry);
-  JNIWRAPPER_DEFINE_CACHED_CLASS(hash_map, BaseMutableMap);
+  JNIWRAPPER_DEFINE_CACHED_CLASS(exc_index_out_of_bounds,
+                                 IndexOutOfBoundsException);
+  JNIWRAPPER_DEFINE_CACHED_CLASS(exc_no_such_element,
+                                 NoSuchElementException);
+
+  JNIWRAPPER_DEFINE_CACHED_CLASS(iterator, BaseIterator);
+
+  JNIWRAPPER_DEFINE_CACHED_CLASS(list, BaseImmutableList);
+  JNIWRAPPER_DEFINE_CACHED_CLASS(array_list, BaseList);
+
+  JNIWRAPPER_DEFINE_CACHED_CLASS(map, BaseImmutableMap);
+  JNIWRAPPER_DEFINE_CACHED_CLASS(set, BaseImmutableMap::Set);
+  JNIWRAPPER_DEFINE_CACHED_CLASS(map_entry, BaseImmutableMap::Entry);
+  JNIWRAPPER_DEFINE_CACHED_CLASS(hash_map, BaseMap);
 
   JNIWRAPPER_DEFINE_CACHED_CLASS(input_stream, InputStream);
   JNIWRAPPER_DEFINE_CACHED_CLASS(output_stream, OutputStream);
@@ -279,6 +285,9 @@ JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(cla
 JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(throwable);
 JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(string);
 
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(exc_index_out_of_bounds);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(exc_no_such_element);
+
 JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(list);
 JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(array_list);
 

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp
 Mon Feb  9 11:23:39 2015
@@ -264,6 +264,23 @@ public:
     {}
 
 private:
+  /**
+   * This object's implementation details.
+   */
+  class ClassImpl : public Object::ClassImpl
+  {
+    friend class ClassCacheImpl;
+
+  protected:
+    explicit ClassImpl(Env env, jclass cls)
+      : Object::ClassImpl(env, cls)
+      {}
+
+  public:
+    virtual ~ClassImpl();
+  };
+
+  friend class ClassCacheImpl;
   static const char* const m_class_name;
 };
 
@@ -286,6 +303,62 @@ private:
   static const char* const m_class_name;
 };
 
+/**
+ * Generator class for exceptions of type @c 
java.lang.IllegalArgumentException.
+ *
+ * @since New in 1.9.
+ */
+class IllegalArgumentException : public Exception
+{
+public:
+  /**
+   * Constructs an exception generator object.
+   */
+  explicit IllegalArgumentException(Env env)
+    : Exception(env, m_class_name)
+    {}
+
+private:
+  static const char* const m_class_name;
+};
+
+/**
+ * Generator class for exceptions of type
+ * @c java.util.NoSuchElementException.
+ *
+ * @since New in 1.9.
+ */
+class NoSuchElementException : public Exception
+{
+public:
+  /**
+   * Constructs an exception generator object.
+   */
+  explicit NoSuchElementException(Env env)
+    : Exception(env, m_class_name)
+    {}
+
+private:
+  /**
+   * This object's implementation details.
+   */
+  class ClassImpl : public Object::ClassImpl
+  {
+    friend class ClassCacheImpl;
+
+  protected:
+    explicit ClassImpl(Env env, jclass cls)
+      : Object::ClassImpl(env, cls)
+      {}
+
+  public:
+    virtual ~ClassImpl();
+  };
+
+  friend class ClassCacheImpl;
+  static const char* const m_class_name;
+};
+
 } // namespace Java
 
-#endif // SVN_JAVAHL_JNIWRAPPER_ENV_HPP
+#endif // SVN_JAVAHL_JNIWRAPPER_EXCEPTION_HPP

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp
 Mon Feb  9 11:23:39 2015
@@ -21,54 +21,65 @@
  * @endcopyright
  */
 
+#include <stdexcept>
+#include <string>
+
 #include "jni_list.hpp"
 
+#include "svn_private_config.h"
+
 namespace Java {
 
-// Class Java::BaseList
+// Class Java::BaseImmutableList
 
-const char* const BaseList::m_class_name = "java/util/List";
+const char* const BaseImmutableList::m_class_name = "java/util/List";
 
-BaseList::ClassImpl::ClassImpl(Env env, jclass cls)
+BaseImmutableList::ClassImpl::ClassImpl(Env env, jclass cls)
   : Object::ClassImpl(env, cls),
     m_mid_size(env.GetMethodID(cls, "size", "()I")),
-    m_mid_get(env.GetMethodID(cls, "get", "(I)Ljava/lang/Object;"))
+    m_mid_get(env.GetMethodID(cls, "get", "(I)Ljava/lang/Object;")),
+    m_mid_add(env.GetMethodID(cls, "add", "(Ljava/lang/Object;)Z")),
+    m_mid_clear(env.GetMethodID(cls, "clear", "()V")),
+    m_mid_iter(env.GetMethodID(cls, "listIterator", 
"()Ljava/util/ListIterator;"))
 {}
 
-BaseList::ClassImpl::~ClassImpl() {}
+BaseImmutableList::ClassImpl::~ClassImpl() {}
 
-BaseList::ovector
-BaseList::convert_to_vector(Env env, jobject jlist)
+jobject BaseImmutableList::operator[](jint index) const
 {
-  const ClassImpl* pimpl =
-    dynamic_cast<const ClassImpl*>(ClassCache::get_list(env));
-  const jint length = env.CallIntMethod(jlist, pimpl->m_mid_size);
-
-  if (!length)
-    return ovector();
-
-  ovector contents(length);
-  ovector::iterator it;
-  jint i;
-  for (i = 0, it = contents.begin(); it != contents.end(); ++it, ++i)
-    *it = env.CallObjectMethod(jlist, pimpl->m_mid_get, i);
-  return contents;
+  try
+    {
+      return m_env.CallObjectMethod(m_jthis, impl().m_mid_get, index);
+    }
+  catch (const SignalExceptionThrown&)
+    {
+      // Just rethrow if it's not an IndexOutOfBoundsException.
+      if (!m_env.IsInstanceOf(
+              m_env.ExceptionOccurred(),
+              ClassCache::get_exc_index_out_of_bounds(m_env)->get_class()))
+        throw;
+
+      m_env.ExceptionClear();
+      std::string msg(_("List index out of bounds: "));
+      msg += index;
+      throw std::out_of_range(msg.c_str());
+    }
 }
 
+BaseImmutableList::Iterator BaseImmutableList::get_iterator() const
+{
+  return Iterator(m_env, m_env.CallObjectMethod(m_jthis, impl().m_mid_iter));
+}
 
-// Class Java::BaseMutableList
+// Class Java::BaseList
 
-const char* const BaseMutableList::m_class_name = "java/util/ArrayList";
+const char* const BaseList::m_class_name = "java/util/ArrayList";
 
-BaseMutableList::ClassImpl::ClassImpl(Env env, jclass cls)
-  : Object::ClassImpl(env, cls),
-    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"))
+BaseList::ClassImpl::ClassImpl(Env env, jclass cls)
+  : BaseImmutableList::ClassImpl(env, cls),
+    m_mid_ctor(env.GetMethodID(cls, "<init>", "(I)V"))
 {}
 
-BaseMutableList::ClassImpl::~ClassImpl() {}
+BaseList::ClassImpl::~ClassImpl() {}
 
 } // namespace Java

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp
 Mon Feb  9 11:23:39 2015
@@ -24,56 +24,89 @@
 #ifndef SVN_JAVAHL_JNIWRAPPER_LIST_HPP
 #define SVN_JAVAHL_JNIWRAPPER_LIST_HPP
 
-#include <algorithm>
-#include <vector>
-
 #include "jni_env.hpp"
 #include "jni_object.hpp"
+#include "jni_iterator.hpp"
 
 namespace Java {
 
 /**
  * Non-template base for an immutable type-safe Java list.
  *
- * Converts the list to a @c std::vector of @c jobject references.
- *
  * @since New in 1.9.
  */
-class BaseList : public Object
+class BaseImmutableList : public Object
 {
-  typedef std::vector<jobject> ovector;
-
 public:
   /**
    * Returns the number of elements in the list.
    */
   jint length() const
     {
-      return jint(m_contents.size());
+      return m_env.CallIntMethod(m_jthis, impl().m_mid_size);
+    }
+
+  /**
+   * Checks if the list is empty.
+   */
+  bool is_empty() const
+    {
+      return (length() == 0);
     }
 
 protected:
   /**
-   * Constructs the list wrapper, converting the contents to an
-   * @c std::vector.
+   * Constructs the list wrapper
    */
-  explicit BaseList(Env env, jobject jlist)
-    : Object(env, ClassCache::get_list(env), jlist),
-      m_contents(convert_to_vector(env, m_jthis))
+  explicit BaseImmutableList(Env env, jobject jlist)
+    : Object(env, ClassCache::get_list(env), jlist)
     {}
 
   /**
-   * Returns the object reference at @a index.
-   * @throw std::out_of_range if the index value is not valid.
+   * Constructor used by BaseList
    */
-  jobject operator[](jint index) const
+  explicit BaseImmutableList(Env env, const Object::ClassImpl* pimpl)
+    : Object(env, pimpl)
+    {}
+
+  /**
+   * Clears the contents of the list.
+   */
+  void clear()
     {
-      return m_contents[ovector::size_type(index)];
+      m_env.CallVoidMethod(m_jthis, impl().m_mid_clear);
     }
 
-  const ovector m_contents;
+  /**
+   * Appends @a obj to the end of the list.
+   */
+  void add(jobject obj)
+    {
+      m_env.CallVoidMethod(m_jthis, impl().m_mid_add, obj);
+    }
+
+  /**
+   * Returns the object reference at @a index.
+   * @throw std::out_of_range if the index value is not valid.
+   */
+  jobject operator[](jint index) const;
+
+  /**
+   * Iterator used by subclasses.
+   */
+  class Iterator : public BaseIterator
+  {
+    friend class BaseImmutableList;
+    explicit Iterator(Env env, jobject jiterator)
+      : BaseIterator(env, jiterator)
+      {}
+  };
+
+  /**
+   * Returns an iterator instance.
+   */
+  Iterator get_iterator() const;
 
-private:
   /**
    * This object's implementation details.
    */
@@ -89,11 +122,15 @@ private:
 
     const MethodID m_mid_size;
     const MethodID m_mid_get;
+    const MethodID m_mid_add;
+    const MethodID m_mid_clear;
+    const MethodID m_mid_iter;
   };
 
+private:
+  friend class Iterator;
   friend class ClassCacheImpl;
   static const char* const m_class_name;
-  static ovector convert_to_vector(Env env, jobject jlist);
 
   const ClassImpl& impl() const
     {
@@ -107,15 +144,14 @@ private:
  * @since New in 1.9.
  */
 template <typename T, typename NativeT=jobject>
-class List : public BaseList
+class ImmutableList : public BaseImmutableList
 {
 public:
   /**
-   * Constructs the list wrapper, converting the contents to an
-   * @c std::vector.
+   * Constructs the list wrapper.
    */
-  explicit List(Env env, jobject jlist)
-    : BaseList(env, jlist)
+  explicit ImmutableList(Env env, jobject jlist)
+    : BaseImmutableList(env, jlist)
     {}
 
   /**
@@ -124,7 +160,7 @@ public:
    */
   T operator[](jint index) const
     {
-      return T(m_env, NativeT(BaseList::operator[](index)));
+      return T(m_env, NativeT(BaseImmutableList::operator[](index)));
     }
 
   /**
@@ -135,29 +171,11 @@ public:
   template<typename F>
   F for_each(F function) const
     {
-      const FunctorAdapter<F> adapter(m_env, function);
-      std::for_each(m_contents.begin(), m_contents.end(), adapter);
+      Iterator iter(get_iterator());
+      while (iter.has_next())
+        function(T(m_env, NativeT(iter.next())));
       return function;
     }
-
-private:
-  template<typename F>
-  struct FunctorAdapter
-  {
-    explicit FunctorAdapter(const Env& env, F& function)
-      : m_env(env),
-        m_function(function)
-      {}
-
-    void operator()(const jobject& obj) const
-      {
-        const T item(m_env, NativeT(obj));
-        m_function(item);
-      }
-
-    const Env& m_env;
-    F& m_function;
-  };
 };
 
 /**
@@ -165,7 +183,7 @@ private:
  *
  * @since New in 1.9.
  */
-class BaseMutableList : public Object
+class BaseList : public BaseImmutableList
 {
 public:
   /**
@@ -173,66 +191,40 @@ public:
    */
   void clear()
     {
-      m_env.CallVoidMethod(m_jthis, impl().m_mid_clear);
-    }
-
-  /**
-   * Returns the number of elements in the list.
-   */
-  jint length() const
-    {
-      return m_env.CallIntMethod(m_jthis, impl().m_mid_size);
-    }
-
-  /**
-   * Checks if the list is empty.
-   */
-  bool is_empty() const
-    {
-      return (length() == 0);
+      BaseImmutableList::clear();
     }
 
 protected:
   /**
-   * Constructs the list wrapper, deriving the class from @a jlist.
+   * Constructs the list wrapper, treating @a jlist as a @c java.util.List.
    */
-  explicit BaseMutableList(Env env, jobject jlist)
-    : Object(env, ClassCache::get_array_list(env), jlist)
+  explicit BaseList(Env env, jobject jlist)
+    : BaseImmutableList(env, jlist)
     {}
 
   /**
    * Constructs and wraps an empty list of type @c java.util.ArrayList
    * with initial allocation size @a length.
    */
-  explicit BaseMutableList(Env env, jint length)
-    : Object(env, ClassCache::get_array_list(env))
+  explicit BaseList(Env env, jint length)
+    : BaseImmutableList(env, ClassCache::get_array_list(env))
     {
       set_this(env.NewObject(get_class(), impl().m_mid_ctor, length));
     }
 
-
   /**
    * Appends @a obj to the end of the list.
    */
   void add(jobject obj)
     {
-      m_env.CallBooleanMethod(m_jthis, impl().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
-    {
-      return m_env.CallObjectMethod(m_jthis, impl().m_mid_get, index);
+      BaseImmutableList::add(obj);
     }
 
 private:
   /**
    * This object's implementation details.
    */
-  class ClassImpl : public Object::ClassImpl
+  class ClassImpl : public BaseImmutableList::ClassImpl
   {
     friend class ClassCacheImpl;
 
@@ -243,10 +235,6 @@ private:
     virtual ~ClassImpl();
 
     const MethodID m_mid_ctor;
-    const MethodID m_mid_add;
-    const MethodID m_mid_clear;
-    const MethodID m_mid_get;
-    const MethodID m_mid_size;
   };
 
   friend class ClassCacheImpl;
@@ -264,39 +252,53 @@ private:
  * @since New in 1.9.
  */
 template <typename T, typename NativeT=jobject>
-class MutableList : public BaseMutableList
+class List : public BaseList
 {
 public:
   /**
    * Constructs the list wrapper, deriving the class from @a jlist.
    */
-  explicit MutableList(Env env, jobject jlist)
-    : BaseMutableList(env, jlist)
+  explicit List(Env env, jobject jlist)
+    : BaseList(env, jlist)
     {}
 
   /**
    * Constructs and wraps an empty list of type @c java.util.ArrayList
    * with initial allocation size @a length.
    */
-  explicit MutableList(Env env, jint length_ = 0)
-    : BaseMutableList(env, length_)
+  explicit List(Env env, jint length_ = 0)
+    : BaseList(env, length_)
     {}
 
   /**
+   * Returns a wrapper object for the object reference at @a index.
+   * @throw std::out_of_range if the index value is not valid.
+   */
+  T operator[](jint index) const
+    {
+      return T(m_env, NativeT(BaseList::operator[](index)));
+    }
+
+  /**
    * Appends @a obj to the end of the list.
    */
   void add(const T& obj)
     {
-      BaseMutableList::add(obj.get());
+      BaseList::add(obj.get());
     }
 
   /**
-   * Returns a wrapper object for the object reference at @a index.
-   * @note Throws a Java exception if the index value is not valid.
+   * Iterates over the items in the list, calling @a function for
+   * each item.
+   * @see std::for_each
    */
-  T operator[](jint index) const
+  template<typename F>
+  F for_each(F function) const
     {
-      return T(m_env, NativeT(BaseMutableList::operator[](index)));
+      Iterator iter(get_iterator());
+      while (iter.has_next())
+        function(T(m_env, NativeT(iter.next())));
+      return function;
     }
 };
 

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp
 Mon Feb  9 11:23:39 2015
@@ -171,6 +171,9 @@ public:
   JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(throwable);
   JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(string);
 
+  JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(exc_index_out_of_bounds);
+  JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(exc_no_such_element);
+
   JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(list);
   JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(array_list);
 

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp
 Mon Feb  9 11:23:39 2015
@@ -30,123 +30,81 @@
 
 namespace Java {
 
-// Class Java::BaseMap
+// Class Java::BaseImmutableMap
 
-const char* const BaseMap::m_class_name = "java/util/Map";
+const char* const BaseImmutableMap::m_class_name = "java/util/Map";
 
-BaseMap::ClassImpl::ClassImpl(Env env, jclass cls)
+BaseImmutableMap::ClassImpl::ClassImpl(Env env, jclass cls)
   : Object::ClassImpl(env, cls),
+    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")),
     m_mid_entry_set(env.GetMethodID(cls, "entrySet", "()Ljava/util/Set;"))
 {}
 
-BaseMap::ClassImpl::~ClassImpl() {}
-
-const char* const BaseMap::Set::m_class_name = "java/util/Set";
-
-BaseMap::Set::ClassImpl::ClassImpl(Env env, jclass cls)
-  : Object::ClassImpl(env, cls),
-    m_mid_iterator(env.GetMethodID(cls, "iterator",
-                                   "()Ljava/util/Iterator;"))
-{}
-
-BaseMap::Set::ClassImpl::~ClassImpl() {}
+BaseImmutableMap::ClassImpl::~ClassImpl() {}
 
-const char* const BaseMap::Iterator::m_class_name = "java/util/Iterator";
+jobject BaseImmutableMap::operator[](const std::string& index) const
+{
+  const String key(m_env, index);
+  if (!m_env.CallBooleanMethod(m_jthis, impl().m_mid_has_key, key.get()))
+    {
+      std::string msg(_("Map does not contain key: "));
+      msg += index;
+      throw std::out_of_range(msg.c_str());
+    }
+  return m_env.CallObjectMethod(m_jthis, impl().m_mid_get, key.get());
+}
 
-BaseMap::Iterator::ClassImpl::ClassImpl(Env env, jclass cls)
-  : Object::ClassImpl(env, cls),
-    m_mid_has_next(env.GetMethodID(cls, "hasNext", "()Z")),
-    m_mid_next(env.GetMethodID(cls, "next", "()Ljava/lang/Object;"))
-{}
+BaseImmutableMap::Iterator BaseImmutableMap::get_iterator() const
+{
+  const jobject jentry_set =
+    m_env.CallObjectMethod(m_jthis, impl().m_mid_entry_set);
+  const jobject jiterator =
+    m_env.CallObjectMethod(jentry_set, Set::impl(m_env).m_mid_iterator);
+  return Iterator(m_env, jiterator);
+}
 
-BaseMap::Iterator::ClassImpl::~ClassImpl() {}
+// Class Java::BaseImmutableMap::Entry
 
-const char* const BaseMap::Entry::m_class_name = "java/util/Map$Entry";
+const char* const BaseImmutableMap::Entry::m_class_name = 
"java/util/Map$Entry";
 
-BaseMap::Entry::ClassImpl::ClassImpl(Env env, jclass cls)
+BaseImmutableMap::Entry::ClassImpl::ClassImpl(Env env, jclass cls)
   : Object::ClassImpl(env, cls),
     m_mid_get_key(env.GetMethodID(cls, "getKey", "()Ljava/lang/Object;")),
     m_mid_get_value(env.GetMethodID(cls, "getValue", "()Ljava/lang/Object;"))
 {}
 
-BaseMap::Entry::ClassImpl::~ClassImpl() {}
+BaseImmutableMap::Entry::ClassImpl::~ClassImpl() {}
 
+// Class Java::BaseImmutableMap::Set
 
-jobject BaseMap::operator[](const std::string& index) const
-{
-  somap::const_iterator it = m_contents.find(index);
-  if (it == m_contents.end())
-    {
-      std::string msg(_("Map does not contain key: "));
-      msg += index;
-      throw std::out_of_range(msg.c_str());
-    }
-  return it->second;
-}
+const char* const BaseImmutableMap::Set::m_class_name = "java/util/Set";
 
-BaseMap::somap BaseMap::convert_to_map(Env env, jobject jmap)
-{
-  const ClassImpl* pimpl =
-    dynamic_cast<const ClassImpl*>(ClassCache::get_map(env));
+BaseImmutableMap::Set::ClassImpl::ClassImpl(Env env, jclass cls)
+  : Object::ClassImpl(env, cls),
+    m_mid_iterator(env.GetMethodID(cls, "iterator",
+                                   "()Ljava/util/Iterator;"))
+{}
 
-  if (!env.CallIntMethod(jmap, pimpl->m_mid_size))
-    return somap();
+BaseImmutableMap::Set::ClassImpl::~ClassImpl() {}
 
-  // Get an iterator over the map's entry set
-  const jobject entries = env.CallObjectMethod(jmap, pimpl->m_mid_entry_set);
-  const jobject iterator = env.CallObjectMethod(entries,
-                                                Set::impl(env).m_mid_iterator);
-
-  const Iterator::ClassImpl& iterimpl = Iterator::impl(env);
-  const Entry::ClassImpl& entimpl = Entry::impl(env);
-
-  // Yterate over the map, filling the native map
-  somap contents;
-  while (env.CallBooleanMethod(iterator, iterimpl.m_mid_has_next))
-    {
-      const jobject entry =
-        env.CallObjectMethod(iterator, iterimpl.m_mid_next);
-      const String keystr(
-          env, jstring(env.CallObjectMethod(entry, entimpl.m_mid_get_key)));
-      const jobject value(
-          env.CallObjectMethod(entry, entimpl.m_mid_get_value));
-      const String::Contents key(keystr);
-      contents.insert(somap::value_type(key.c_str(), value));
-    }
-  return contents;
-}
 
-// Class Java::BaseMutableMap
+// Class Java::BaseMap
 
-const char* const BaseMutableMap::m_class_name = "java/util/HashMap";
+const char* const BaseMap::m_class_name = "java/util/HashMap";
 
-BaseMutableMap::ClassImpl::ClassImpl(Env env, jclass cls)
-  : Object::ClassImpl(env, cls),
-    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"))
+BaseMap::ClassImpl::ClassImpl(Env env, jclass cls)
+  : BaseImmutableMap::ClassImpl(env, cls),
+    m_mid_ctor(env.GetMethodID(cls, "<init>", "(I)V"))
 {}
 
-BaseMutableMap::ClassImpl::~ClassImpl() {}
-
-jobject BaseMutableMap::operator[](const std::string& index) const
-{
-  const String key(m_env, index);
-  if (!m_env.CallBooleanMethod(m_jthis, impl().m_mid_has_key, key.get()))
-    {
-      std::string msg(_("Map does not contain key: "));
-      msg += index;
-      throw std::out_of_range(msg.c_str());
-    }
-  return m_env.CallObjectMethod(m_jthis, impl().m_mid_get, key.get());
-}
+BaseMap::ClassImpl::~ClassImpl() {}
 
 } // namespace Java

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp
 Mon Feb  9 11:23:39 2015
@@ -24,54 +24,76 @@
 #ifndef SVN_JAVAHL_JNIWRAPPER_STRING_MAP_HPP
 #define SVN_JAVAHL_JNIWRAPPER_STRING_MAP_HPP
 
-#include <map>
 #include <string>
-#include <algorithm>
 
 #include "jni_env.hpp"
 #include "jni_object.hpp"
+#include "jni_iterator.hpp"
 
 namespace Java {
 
 /**
  * Non-template base for an immutable type-safe Java map with String keys.
  *
- * Converts the map to a @c std::map containing @c jobject references.
- *
  * @since New in 1.9.
  */
-class BaseMap : public Object
+class BaseImmutableMap : public Object
 {
-  typedef std::map<std::string, jobject> somap;
-
 public:
   /**
    * Returns the number of elements in the map.
    */
   jint length() const
     {
-      return jint(m_contents.size());
+      return m_env.CallIntMethod(m_jthis, impl().m_mid_size);
+    }
+
+  /**
+   * Checks if the map is empty.
+   */
+  bool is_empty() const
+    {
+      return (length() == 0);
     }
 
 protected:
   /**
-   * Constructs the map wrapper, converting the contents to an
-   * @c std::map.
+   * Constructs the map wrapper.
    */
-  explicit BaseMap(Env env, jobject jmap)
-    : Object(env, ClassCache::get_map(env), jmap),
-      m_contents(convert_to_map(env, m_jthis))
+  explicit BaseImmutableMap(Env env, jobject jmap)
+    : Object(env, ClassCache::get_map(env), jmap)
     {}
 
   /**
+   * Constructor used by BaseMap.
+   */
+  explicit BaseImmutableMap(Env env, const Object::ClassImpl* pimpl)
+    : Object(env, pimpl)
+    {}
+
+  /**
+   * Clears the contents of the map.
+   */
+  void clear()
+    {
+      m_env.CallVoidMethod(m_jthis, impl().m_mid_clear);
+    }
+
+  /**
+   * Inserts @a obj identified by @a key into the map.
+   */
+  void put(const std::string& key, jobject obj)
+    {
+      m_env.CallObjectMethod(m_jthis, impl().m_mid_put,
+                             String(m_env, key).get(), obj);
+    }
+
+  /**
    * Returns the object reference identified by @a index.
    * @throw std::out_of_range if there is no such element.
    */
   jobject operator[](const std::string& index) const;
 
-  const somap m_contents;
-
-private:
   /**
    * This object's implementation details.
    */
@@ -85,6 +107,10 @@ private:
   public:
     virtual ~ClassImpl();
 
+    const MethodID m_mid_put;
+    const MethodID m_mid_clear;
+    const MethodID m_mid_has_key;
+    const MethodID m_mid_get;
     const MethodID m_mid_size;
     const MethodID m_mid_entry_set;
   };
@@ -96,35 +122,38 @@ private:
 
   friend class ClassCacheImpl;
   static const char* const m_class_name;
-  static somap convert_to_map(Env env, jobject jmap);
 
-  struct Set
+  class Iterator : public BaseIterator
   {
-    /**
-     * This object's implementation details.
-     */
-    class ClassImpl : public Object::ClassImpl
-    {
-      friend class ClassCacheImpl;
+    friend class BaseImmutableMap;
+    explicit Iterator(Env env, jobject jiterator)
+      : BaseIterator(env, jiterator)
+      {}
+  };
 
-    protected:
-      explicit ClassImpl(Env env, jclass cls);
+  Iterator get_iterator() const;
 
-    public:
-      virtual ~ClassImpl();
+  class Entry : public Object
+  {
+  public:
+    explicit Entry(Env env, jobject jentry)
+    : Object(env, ClassCache::get_map_entry(env), jentry)
+    {}
 
-      const MethodID m_mid_iterator;
-    };
+    const std::string key() const
+      {
+        const jstring jkey =
+          jstring(m_env.CallObjectMethod(m_jthis, impl().m_mid_get_key));
+        const String::Contents key(String(m_env, jkey));
+        return std::string(key.c_str());
+      }
 
-    static const char* const m_class_name;
-    static const ClassImpl& impl(Env env)
+    jobject value() const
       {
-        return *dynamic_cast<const ClassImpl*>(ClassCache::get_set(env));
+        return m_env.CallObjectMethod(m_jthis, impl().m_mid_get_value);
       }
-  };
 
-  struct Iterator
-  {
+  private:
     /**
      * This object's implementation details.
      */
@@ -138,18 +167,20 @@ private:
     public:
       virtual ~ClassImpl();
 
-      const MethodID m_mid_has_next;
-      const MethodID m_mid_next;
+      const MethodID m_mid_get_key;
+      const MethodID m_mid_get_value;
     };
 
+    friend class ClassCacheImpl;
     static const char* const m_class_name;
-    static const ClassImpl& impl(Env env)
+    const ClassImpl& impl() const
       {
-        return *dynamic_cast<const ClassImpl*>(ClassCache::get_iterator(env));
+        return *dynamic_cast<const ClassImpl*>(m_impl);
       }
   };
 
-  struct Entry
+private:
+  struct Set
   {
     /**
      * This object's implementation details.
@@ -164,14 +195,13 @@ private:
     public:
       virtual ~ClassImpl();
 
-      const MethodID m_mid_get_key;
-      const MethodID m_mid_get_value;
+      const MethodID m_mid_iterator;
     };
 
     static const char* const m_class_name;
     static const ClassImpl& impl(Env env)
       {
-        return *dynamic_cast<const ClassImpl*>(ClassCache::get_map_entry(env));
+        return *dynamic_cast<const ClassImpl*>(ClassCache::get_set(env));
       }
   };
 };
@@ -182,15 +212,15 @@ private:
  * @since New in 1.9.
  */
 template <typename T, typename NativeT=jobject>
-class Map : public BaseMap
+class ImmutableMap : public BaseImmutableMap
 {
 public:
   /**
    * Constructs the map wrapper, converting the contents to an
    * @c std::map.
    */
-  explicit Map(Env env, jobject jmap)
-    : BaseMap(env, jmap)
+  explicit ImmutableMap(Env env, jobject jmap)
+    : BaseImmutableMap(env, jmap)
     {}
 
   /**
@@ -199,7 +229,7 @@ public:
    */
   T operator[](const std::string& index) const
     {
-      return T(m_env, NativeT(BaseMap::operator[](index)));
+      return T(m_env, NativeT(BaseImmutableMap::operator[](index)));
     }
 
   /**
@@ -207,37 +237,22 @@ public:
    * each item.
    * @see std::for_each
    * @note Unlike std::for_each, which invokes the functor with a
-   *     single @c value_type argument, this iterator adapts it to cal
-   *     @a function with separate @c const references to the key and
-   *     value.
+   *       single @c value_type argument, this iterator calls
+   *       @a function with separate @c const references to the key
+   *       and value.
    */
   template<typename F>
   F for_each(F function) const
     {
-      const FunctorAdapter<F> adapter(m_env, function);
-      std::for_each(m_contents.begin(), m_contents.end(), adapter);
+      Iterator iter(get_iterator());
+      while (iter.has_next())
+        {
+          Entry entry(m_env, iter.next());
+          const std::string& key(entry.key());
+          function(key, T(m_env, NativeT(entry.value())));
+        }
       return function;
     }
-
-private:
-  template<typename F>
-  struct FunctorAdapter
-  {
-    explicit FunctorAdapter(const Env& env, F& function)
-      : m_env(env),
-        m_function(function)
-      {}
-
-    void operator()(const std::pair<std::string, jobject>& item) const
-      {
-        const std::string& key(item.first);
-        const T value(m_env, NativeT(item.second));
-        m_function(key, value);
-      }
-
-    const Env& m_env;
-    F& m_function;
-  };
 };
 
 /**
@@ -245,7 +260,7 @@ private:
  *
  * @since New in 1.9.
  */
-class BaseMutableMap : public Object
+class BaseMap : public BaseImmutableMap
 {
 public:
   /**
@@ -253,64 +268,32 @@ public:
    */
   void clear()
     {
-      m_env.CallVoidMethod(m_jthis, impl().m_mid_clear);
-    }
-
-  /**
-   * Returns the number of elements in the map.
-   */
-  jint length() const
-    {
-      return m_env.CallIntMethod(m_jthis, impl().m_mid_size);
-    }
-
-  /**
-   * Checks if the map is empty.
-   */
-  bool is_empty() const
-    {
-      return (length() == 0);
+      BaseImmutableMap::clear();
     }
 
 protected:
   /**
-   * Constructs the map wrapper, deriving the class from @a jmap.
+   * Constructs the map wrapper, treating @a jmap as a @c java.util.Map.
    */
-  explicit BaseMutableMap(Env env, jobject jmap)
-    : Object(env, ClassCache::get_hash_map(env), jmap)
+  explicit BaseMap(Env env, jobject jmap)
+    : BaseImmutableMap(env, jmap)
     {}
 
   /**
    * Constructs and wraps an empty map of type @c java.util.HashMap
    * with initial allocation size @a length.
    */
-  explicit BaseMutableMap(Env env, jint length)
-    : Object(env, ClassCache::get_hash_map(env))
+  explicit BaseMap(Env env, jint length)
+    : BaseImmutableMap(env, ClassCache::get_hash_map(env))
     {
       set_this(env.NewObject(get_class(), impl().m_mid_ctor, length));
     }
 
-
-  /**
-   * Inserts @a obj identified by @a key into the map.
-   */
-  void put(const std::string& key, jobject obj)
-    {
-      m_env.CallObjectMethod(m_jthis, impl().m_mid_put,
-                             String(m_env, key).get(), obj);
-    }
-
-  /**
-   * Returns the object reference identified by @a index.
-   * @throw std::out_of_range if there is no such element.
-   */
-  jobject operator[](const std::string& index) const;
-
 private:
   /**
    * This object's implementation details.
    */
-  class ClassImpl : public Object::ClassImpl
+  class ClassImpl : public BaseImmutableMap::ClassImpl
   {
     friend class ClassCacheImpl;
 
@@ -321,11 +304,6 @@ private:
     virtual ~ClassImpl();
 
     const MethodID m_mid_ctor;
-    const MethodID m_mid_put;
-    const MethodID m_mid_clear;
-    const MethodID m_mid_has_key;
-    const MethodID m_mid_get;
-    const MethodID m_mid_size;
   };
 
   const ClassImpl& impl() const
@@ -343,22 +321,22 @@ private:
  * @since New in 1.9.
  */
 template <typename T, typename NativeT=jobject>
-class MutableMap : public BaseMutableMap
+class Map : public BaseMap
 {
 public:
   /**
    * Constructs the map wrapper, deriving the class from @a jmap.
    */
-  explicit MutableMap(Env env, jobject jmap)
-    : BaseMutableMap(env, jmap)
+  explicit Map(Env env, jobject jmap)
+    : BaseMap(env, jmap)
     {}
 
   /**
    * Constructs and wraps an empty map of type @c java.util.HashMap
    * with initial allocation size @a length.
    */
-  explicit MutableMap(Env env, jint length = 0)
-    : BaseMutableMap(env, length)
+  explicit Map(Env env, jint length = 0)
+    : BaseMap(env, length)
     {}
 
   /**
@@ -366,7 +344,7 @@ public:
    */
   void put(const std::string& key, const T& obj)
     {
-      BaseMutableMap::put(key, obj.get());
+      BaseMap::put(key, obj.get());
     }
 
   /**
@@ -375,7 +353,29 @@ public:
    */
   T operator[](const std::string& index) const
     {
-      return T(m_env, NativeT(BaseMutableMap::operator[](index)));
+      return T(m_env, NativeT(BaseMap::operator[](index)));
+    }
+
+  /**
+   * Iterates over the items in the map, calling @a function for
+   * each item.
+   * @see std::for_each
+   * @note Unlike std::for_each, which invokes the functor with a
+   *       single @c value_type argument, this iterator calls
+   *       @a function with separate @c const references to the key
+   *       and value.
+   */
+  template<typename F>
+  F for_each(F function) const
+    {
+      Iterator iter(get_iterator());
+      while (iter.has_next())
+        {
+          Entry entry(m_env, iter.next());
+          const std::string& key(entry.key());
+          function(key, T(m_env, NativeT(entry.value())));
+        }
+      return function;
     }
 };
 

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
 Mon Feb  9 11:23:39 2015
@@ -439,7 +439,7 @@ Java_org_apache_subversion_javahl_SVNCli
 JNIEXPORT void JNICALL
 Java_org_apache_subversion_javahl_SVNClient_revert
 (JNIEnv *env, jobject jthis, jobject jpaths, jobject jdepth,
- jobject jchangelists, jboolean jclear_changelists)
+ jobject jchangelists, jboolean jclear_changelists, jboolean jmetadata_only)
 {
   JNIEntry(SVNClient, revert);
   SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -459,7 +459,7 @@ Java_org_apache_subversion_javahl_SVNCli
     return;
 
   cl->revert(paths, EnumMapper::toDepth(jdepth),
-             changelists, bool(jclear_changelists));
+             changelists, bool(jclear_changelists), bool(jmetadata_only));
 }
 
 JNIEXPORT void JNICALL
@@ -1646,7 +1646,8 @@ JNIEXPORT void JNICALL
 Java_org_apache_subversion_javahl_SVNClient_blame
 (JNIEnv *env, jobject jthis, jstring jpath, jobject jpegRevision,
  jobject jrevisionStart, jobject jrevisionEnd, jboolean jignoreMimeType,
- jboolean jincludeMergedRevisions, jobject jblameCallback)
+ jboolean jincludeMergedRevisions, jobject jblameCallback,
+ jobject jdiffOptions)
 {
   JNIEntry(SVNClient, blame);
   SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -1671,10 +1672,15 @@ Java_org_apache_subversion_javahl_SVNCli
   if (JNIUtil::isExceptionThrown())
     return;
 
+  DiffOptions options(jdiffOptions);
+  if (JNIUtil::isExceptionThrown())
+    return;
+
   BlameCallback callback(jblameCallback);
   cl->blame(path, pegRevision, revisionStart, revisionEnd,
             jignoreMimeType ? true : false,
-            jincludeMergedRevisions ? true : false, &callback);
+            jincludeMergedRevisions ? true : false, &callback,
+            options);
 }
 
 JNIEXPORT void JNICALL

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.cpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.cpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.cpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.cpp
 Mon Feb  9 11:23:39 2015
@@ -28,12 +28,19 @@
 #include "JNIStackElement.h"
 #include "svn_version.h"
 
+namespace {
+const svn_version_t* javahl_version()
+{
+  SVN_VERSION_BODY;
+}
+} //anonymous namespace
+
 JNIEXPORT jint JNICALL
 Java_org_apache_subversion_javahl_types_Version_getMajor(JNIEnv *env,
  jobject jthis)
 {
   JNIEntry(Version, getMajor);
-  return SVN_VER_MAJOR;
+  return javahl_version()->major;
 }
 
 JNIEXPORT jint JNICALL
@@ -41,7 +48,7 @@ Java_org_apache_subversion_javahl_types_
  jobject jthis)
 {
   JNIEntry(Version, getMinor);
-  return SVN_VER_MINOR;
+  return javahl_version()->minor;
 }
 
 JNIEXPORT jint JNICALL
@@ -49,7 +56,7 @@ Java_org_apache_subversion_javahl_types_
  jobject jthis)
 {
   JNIEntry(Version, getPatch);
-  return SVN_VER_PATCH;
+  return javahl_version()->patch;
 }
 
 JNIEXPORT jstring JNICALL

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigLib.cpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigLib.cpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigLib.cpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigLib.cpp
 Mon Feb  9 11:23:39 2015
@@ -41,8 +41,10 @@
 #include "JNICriticalSection.h"
 
 #include "svn_auth.h"
+#include "svn_base64.h"
 #include "svn_config.h"
 #include "svn_hash.h"
+#include "svn_x509.h"
 
 #include "svn_private_config.h"
 
@@ -140,41 +142,14 @@ jobject build_credential(Java::Env env,
   else if (0 == strcmp(cred_kind, SVN_AUTH_CRED_SSL_SERVER_TRUST))
     {
       entry = static_cast<svn_string_t*>(
-          svn_hash_gets(cred, SVN_CONFIG_AUTHN_HOSTNAME_KEY));
-      const char* hostname = (entry ? entry->data : NULL);
-
-      entry = static_cast<svn_string_t*>(
-          svn_hash_gets(cred, SVN_CONFIG_AUTHN_FINGERPRINT_KEY));
-      const char* fingerprint = (entry ? entry->data : NULL);
-
-      entry = static_cast<svn_string_t*>(
-          svn_hash_gets(cred, SVN_CONFIG_AUTHN_VALID_FROM_KEY));
-      const char* valid_from = (entry ? entry->data : NULL);
-
-      entry = static_cast<svn_string_t*>(
-          svn_hash_gets(cred, SVN_CONFIG_AUTHN_VALID_UNTIL_KEY));
-      const char* valid_until = (entry ? entry->data : NULL);
-
-      entry = static_cast<svn_string_t*>(
-          svn_hash_gets(cred, SVN_CONFIG_AUTHN_ISSUER_DN_KEY));
-      const char* issuer = (entry ? entry->data : NULL);
-
-      entry = static_cast<svn_string_t*>(
           svn_hash_gets(cred, SVN_CONFIG_AUTHN_ASCII_CERT_KEY));
-      const char* der = (entry ? entry->data : NULL);
+      const char* ascii_cert = (entry ? entry->data : NULL);
 
       entry = static_cast<svn_string_t*>(
           svn_hash_gets(cred, SVN_CONFIG_AUTHN_FAILURES_KEY));
       jint failflags = (!entry ? 0 : jint(apr_atoi64(entry->data)));
 
-      info = JavaHL::AuthnCallback
-        ::SSLServerCertInfo(env,
-                            Java::String(env, hostname),
-                            Java::String(env, fingerprint),
-                            Java::String(env, valid_from),
-                            Java::String(env, valid_until),
-                            Java::String(env, issuer),
-                            Java::String(env, der)).get();
+      info = JavaHL::AuthnCallback::SSLServerCertInfo(env, ascii_cert).get();
       failures = JavaHL::AuthnCallback
         ::SSLServerCertFailures(env, failflags).get();
     }
@@ -368,7 +343,20 @@ Java_org_apache_subversion_javahl_util_C
         const char* const m_text_pattern;
 
         const ::Java::Env m_env;
-        ::Java::MutableList<JavaHL::Credential> m_credentials;
+        ::Java::List<JavaHL::Credential> m_credentials;
+
+        bool match_array(const char* pattern,
+                         const apr_array_header_t* hostnames)
+          {
+            for (int i = 0; i < hostnames->nelts; ++i)
+              {
+                const char* const hostname =
+                  APR_ARRAY_IDX(hostnames, i, const char*);
+                if (!apr_fnmatch(pattern, hostname, 0))
+                  return true;
+              }
+            return false;
+          }
 
       public:
         explicit Callback(::Java::Env ctor_env,
@@ -411,25 +399,41 @@ Java_org_apache_subversion_javahl_util_C
                 svn_hash_gets(cb_cred_hash, SVN_CONFIG_AUTHN_PASSTYPE_KEY));
             const char* const store = (entry ? entry->data : NULL);
 
-            entry = static_cast<svn_string_t*>(
-                svn_hash_gets(cb_cred_hash, SVN_CONFIG_AUTHN_HOSTNAME_KEY));
-            const char* const hostname = (entry ? entry->data : NULL);
-
-            entry = static_cast<svn_string_t*>(
-                svn_hash_gets(cb_cred_hash, SVN_CONFIG_AUTHN_FINGERPRINT_KEY));
-            const char* const fingerprint = (entry ? entry->data : NULL);
+            const svn_string_t* ascii_cert = static_cast<svn_string_t*>(
+                svn_hash_gets(cb_cred_hash, SVN_CONFIG_AUTHN_ASCII_CERT_KEY));
 
-            entry = static_cast<svn_string_t*>(
-                svn_hash_gets(cb_cred_hash, SVN_CONFIG_AUTHN_VALID_FROM_KEY));
-            const char* const valid_from = (entry ? entry->data : NULL);
-
-            entry = static_cast<svn_string_t*>(
-                svn_hash_gets(cb_cred_hash, SVN_CONFIG_AUTHN_VALID_UNTIL_KEY));
-            const char* const valid_until = (entry ? entry->data : NULL);
-
-            entry = static_cast<svn_string_t*>(
-                svn_hash_gets(cb_cred_hash, SVN_CONFIG_AUTHN_ISSUER_DN_KEY));
-            const char* const issuer = (entry ? entry->data : NULL);
+            /* Parsed certificate data. */
+            const char* subject = NULL;
+            const char* issuer = NULL;
+            const char* fingerprint = NULL;
+            const apr_array_header_t* hostnames = NULL;
+
+            if (ascii_cert)
+              {
+                const svn_string_t* const der =
+                  svn_base64_decode_string(ascii_cert, cb_scratch_pool);
+                svn_x509_certinfo_t* certinfo;
+                svn_error_t* err = svn_x509_parse_cert(
+                    &certinfo, der->data, der->len,
+                    cb_scratch_pool, cb_scratch_pool);
+                if (err)
+                  {
+                    // Ignore credentials that can't be parsed.
+                    svn_error_clear(err);
+                    return SVN_NO_ERROR;
+                  }
+                else
+                  {
+                    subject = svn_x509_certinfo_get_subject(
+                        certinfo, cb_scratch_pool);
+                    issuer = svn_x509_certinfo_get_issuer(
+                        certinfo, cb_scratch_pool);
+                    fingerprint = svn_checksum_to_cstring_display(
+                        svn_x509_certinfo_get_digest(certinfo),
+                        cb_scratch_pool);
+                    hostnames = svn_x509_certinfo_get_hostnames(certinfo);
+                  }
+              }
 
             bool match = (m_realm_pattern
                           && !apr_fnmatch(m_realm_pattern, cb_realmstring, 0));
@@ -441,8 +445,8 @@ Java_org_apache_subversion_javahl_util_C
 
             if (!match && m_hostname_pattern)
               match = (match
-                       || (hostname
-                           && !apr_fnmatch(m_hostname_pattern, hostname, 0)));
+                       || (hostnames
+                           &&  match_array(m_hostname_pattern, hostnames)));
 
             if (!match && m_text_pattern)
               match = (match
@@ -450,16 +454,14 @@ Java_org_apache_subversion_javahl_util_C
                            && !apr_fnmatch(m_text_pattern, username, 0))
                        || (store
                            && !apr_fnmatch(m_text_pattern, store, 0))
-                       || (hostname
-                           && !apr_fnmatch(m_text_pattern, hostname, 0))
+                       || (subject
+                           && !apr_fnmatch(m_text_pattern, subject, 0))
+                       || (issuer
+                           && !apr_fnmatch(m_text_pattern, issuer, 0))
                        || (fingerprint
                            && !apr_fnmatch(m_text_pattern, fingerprint, 0))
-                       || (valid_from
-                           && !apr_fnmatch(m_text_pattern, valid_from, 0))
-                       || (valid_until
-                           && !apr_fnmatch(m_text_pattern, valid_until, 0))
-                       || (issuer
-                           && !apr_fnmatch(m_text_pattern, issuer, 0)));
+                       || (hostnames
+                           && match_array(m_text_pattern, hostnames)));
 
             if (match)
               m_credentials.add(

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp
 Mon Feb  9 11:23:39 2015
@@ -291,7 +291,7 @@ Java_org_apache_subversion_javahl_util_P
                              pool.getPool()));
       }
 
-      Java::MutableList<JavaHL::ExternalItem> items(env, externals->nelts);
+      Java::List<JavaHL::ExternalItem> items(env, externals->nelts);
       for (jint i = 0; i < externals->nelts; ++i)
         {
           // References to the newly created external items are stored
@@ -323,7 +323,7 @@ Java_org_apache_subversion_javahl_util_P
     {
       const Java::Env env(jenv);
 
-      const Java::List<JavaHL::ExternalItem> items(env, jitems);
+      const Java::ImmutableList<JavaHL::ExternalItem> items(env, jitems);
       const Java::String parent_dir(env, jparent_dir);
 
       // Using a "global" iteration pool since we don't keep a context

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp
 Mon Feb  9 11:23:39 2015
@@ -118,6 +118,8 @@ Java_org_apache_subversion_javahl_util_S
     jstring jurl, jstring jrepos_root_url,
     jobject jdate, jstring jauthor)
 {
+  typedef Java::Map<Java::ByteArray, jbyteArray> ByteArrayMap;
+
   SVN_JAVAHL_JNI_TRY(SubstLib, buildKeywords)
     {
       const Java::Env env(jenv);
@@ -130,8 +132,7 @@ Java_org_apache_subversion_javahl_util_S
           env, pool, jkeywords_value, jrevision,
           jurl, jrepos_root_url, jdate, jauthor);
 
-      Java::MutableMap<Java::ByteArray, jbyteArray>
-        keywords(env, jint(apr_hash_count(kw)));
+      ByteArrayMap keywords(env, jint(apr_hash_count(kw)));
       for (apr_hash_index_t* hi = apr_hash_first(pool.getPool(), kw);
            hi; hi = apr_hash_next(hi))
         {

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictDescriptor.java
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictDescriptor.java?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictDescriptor.java
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictDescriptor.java
 Mon Feb  9 11:23:39 2015
@@ -71,13 +71,26 @@ public class ConflictDescriptor
      */
     private ConflictVersion srcRightVersion;
 
-    /** This constructor should only be called from JNI code. */
-    public ConflictDescriptor(String path, Kind conflictKind, NodeKind 
nodeKind,
+    // Information about property conflicts. New in 1.9
+    private String propRejectAbspath;
+    private byte[] propValueBase;
+    private byte[] propValueWorking;
+    private byte[] propValueIncomingOld;
+    private byte[] propValueIncomingNew;
+
+
+    // Private constructor, only called from the JNI code.
+    private ConflictDescriptor(String path, Kind conflictKind, NodeKind 
nodeKind,
                        String propertyName, boolean isBinary, String mimeType,
                        Action action, Reason reason, Operation operation,
                        String basePath, String theirPath,
                        String myPath, String mergedPath,
-                       ConflictVersion srcLeft, ConflictVersion srcRight)
+                       ConflictVersion srcLeft, ConflictVersion srcRight,
+                       String propRejectAbspath, byte[] propValueBase,
+                       byte[] propValueWorking,
+                       byte[] propValueIncomingOld,
+                       byte[] propValueIncomingNew)
+
     {
         this.path = path;
         this.conflictKind = conflictKind;
@@ -94,6 +107,28 @@ public class ConflictDescriptor
         this.operation = operation;
         this.srcLeftVersion = srcLeft;
         this.srcRightVersion = srcRight;
+        this.propRejectAbspath = propRejectAbspath;
+        this.propValueBase = propValueBase;
+        this.propValueWorking = propValueWorking;
+        this.propValueIncomingOld = propValueIncomingOld;
+        this.propValueIncomingNew = propValueIncomingNew;
+    }
+
+    /**
+     * This constructor should only be called from JNI code.
+     * @deprecated
+     */
+    @Deprecated
+    public ConflictDescriptor(String path, Kind conflictKind, NodeKind 
nodeKind,
+                       String propertyName, boolean isBinary, String mimeType,
+                       Action action, Reason reason, Operation operation,
+                       String basePath, String theirPath,
+                       String myPath, String mergedPath,
+                       ConflictVersion srcLeft, ConflictVersion srcRight)
+    {
+        this(path, conflictKind, nodeKind, propertyName, isBinary, mimeType,
+             action, reason, operation, basePath, theirPath, myPath, 
mergedPath,
+             srcLeft, srcRight, null, null, null, null, null);
     }
 
     public String getPath()
@@ -171,6 +206,32 @@ public class ConflictDescriptor
         return srcRightVersion;
     }
 
+    public String getPropRejectAbspath()
+    {
+        return propRejectAbspath;
+    }
+
+    public byte[] getPropValueBase()
+    {
+        return propValueBase;
+    }
+
+    public byte[] getPropValueWorking()
+    {
+        return propValueWorking;
+    }
+
+    public byte[] getPropValueIncomingOld()
+    {
+        return propValueIncomingOld;
+    }
+
+    public byte[] getPropValueIncomingNew()
+    {
+        return propValueIncomingNew;
+    }
+
+
     /**
      * Rich man's enum for <code>svn_wc_conflict_kind_t</code>.
      */

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
 Mon Feb  9 11:23:39 2015
@@ -261,12 +261,15 @@ public interface ISVNClient
      * @param changelists changelists to filter by
      * @param clearChangelists If set, will clear changelist association
      *                         from the reverted paths.
+     * @param metadataOnly Revert just the metadata (including conflict data)
+     *                     and not the working files/dirs
      * @throws ClientException
      * @since 1.9
      */
     void revert(Set<String> paths, Depth depth,
                 Collection<String> changelists,
-                boolean clearChangelists)
+                boolean clearChangelists,
+                boolean metadataOnly)
             throws ClientException;
 
     /**
@@ -1323,12 +1326,28 @@ public interface ISVNClient
      *                      information
      * @param callback      callback to receive the file content and the other
      *                      information
+     * @param options       additional options for controlling the output
      * @throws ClientException
+     * @since 1.9
      */
     void blame(String path, Revision pegRevision, Revision revisionStart,
                Revision revisionEnd, boolean ignoreMimeType,
                boolean includeMergedRevisions,
-               BlameCallback callback) throws ClientException;
+               BlameCallback callback, DiffOptions options)
+            throws ClientException;
+
+    /**
+     * Retrieve the content together with the author, the revision and the date
+     * of the last change of each line
+     * <p>
+     * Behaves like the 1.9 version with <code>options</code> set to
+     * their default values.
+     */
+    void blame(String path, Revision pegRevision, Revision revisionStart,
+               Revision revisionEnd, boolean ignoreMimeType,
+               boolean includeMergedRevisions,
+               BlameCallback callback)
+            throws ClientException;
 
     /**
      * Set directory for the configuration information, taking the

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java
 Mon Feb  9 11:23:39 2015
@@ -599,13 +599,15 @@ public interface ISVNRemote
         private FileRevision(String path, long revision,
                              boolean resultOfMerge,
                              Map<String, byte[]> revisionProperties,
-                             Map<String, byte[]> propertiesDelta)
+                             Map<String, byte[]> propertiesDelta,
+                             boolean textDelta)
         {
             this.path = path;
             this.revision = revision;
             this.resultOfMerge = resultOfMerge;
             this.revisionProperties = revisionProperties;
             this.propertiesDelta = propertiesDelta;
+            this.textDelta = textDelta;
         }
 
         /**
@@ -643,11 +645,17 @@ public interface ISVNRemote
             return propertiesDelta;
         }
 
+        /**
+         * @return A flag indicating that this revision has a text delta.
+         */
+        public boolean hasTextDelta() { return textDelta; }
+
         private String path;
         private long revision;
         private boolean resultOfMerge;
         private Map<String, byte[]> revisionProperties;
         private Map<String, byte[]> propertiesDelta;
+        private boolean textDelta;
     }
 
     /**

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
 Mon Feb  9 11:23:39 2015
@@ -194,21 +194,22 @@ public class SVNClient implements ISVNCl
 
     public native void revert(Set<String> paths, Depth depth,
                               Collection<String> changelists,
-                              boolean clearChangelists)
+                              boolean clearChangelists,
+                              boolean metadataOnly)
             throws ClientException;
 
     public void revert(Set<String> paths, Depth depth,
                        Collection<String> changelists)
             throws ClientException
     {
-        revert(paths, depth, changelists, false);
+        revert(paths, depth, changelists, false, false);
     }
 
     public void revert(String path, Depth depth,
                        Collection<String> changelists)
             throws ClientException
     {
-        revert(Collections.singleton(path), depth, changelists, false);
+        revert(Collections.singleton(path), depth, changelists, false, false);
     }
 
     public native void add(String path, Depth depth, boolean force,
@@ -651,11 +652,23 @@ public class SVNClient implements ISVNCl
                                 boolean ignoreExternals)
             throws ClientException;
 
+    public void blame(String path, Revision pegRevision,
+                      Revision revisionStart,
+                      Revision revisionEnd, boolean ignoreMimeType,
+                      boolean includeMergedRevisions,
+                      BlameCallback callback)
+            throws ClientException
+    {
+        blame(path, pegRevision, revisionStart, revisionEnd, ignoreMimeType,
+              includeMergedRevisions, callback, null);
+    }
+
     public native void blame(String path, Revision pegRevision,
                              Revision revisionStart,
                              Revision revisionEnd, boolean ignoreMimeType,
                              boolean includeMergedRevisions,
-                             BlameCallback callback)
+                             BlameCallback callback,
+                             DiffOptions options)
             throws ClientException;
 
     public native void setConfigDirectory(String configDir)

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java
 Mon Feb  9 11:23:39 2015
@@ -466,11 +466,12 @@ public class SVNUtil
      *             otherwise, only those credentials that have a username,
      *             and where the username matches the pattern, will be
      *             returned.
-     * @param hostnamePattern A glob pattern for the hostname (CN) of
-     *             a server certificate; if <code>null</code>, all credntials
-     *             will be considered; otherwise, only those credentials
-     *             that have a server certificate with a hostname that
-     *             matches the pattern will be returned.
+     * @param hostnamePattern A glob pattern for the hostnames of a
+     *             server certificate; if <code>null</code>, all
+     *             credntials will be considered; otherwise, only
+     *             those credentials that have a server certificate
+     *             with a hostname that matches the pattern will be
+     *             returned.
      * @param textPattern A glob pattern that must match any textual
      *             information in a credential, for example, a realm,
      *             username, certificate details, etc; passwords, passphrases

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/AuthnCallback.java
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/AuthnCallback.java?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/AuthnCallback.java
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/AuthnCallback.java
 Mon Feb  9 11:23:39 2015
@@ -23,6 +23,8 @@
 
 package org.apache.subversion.javahl.callback;
 
+import java.util.Date;
+import java.util.List;
 import java.util.logging.Logger;
 
 /**
@@ -243,74 +245,84 @@ public interface AuthnCallback
         private static final long serialVersionUID = 1L;
 
         /**
-         * @return The primary CN of the certificate.
+         * @return The subject of the certificate.
          */
-        public String getHostname()
+        public String getSubject()
         {
-            return hostname;
+            return subject;
         }
 
         /**
-         * @return The text representation of the certificate fingerprint.
+         * @return The certificate issuer.
          */
-        public String getFingerprint()
+        public String getIssuer()
         {
-            return fingerprint;
+            return issuer;
         }
 
         /**
-         * @return The text represent representation of the date from
-         *         which the certificate is valid.
+         * @return The from which the certificate is valid.
          */
-        public String getValidFrom()
+        public Date getValidFrom()
         {
             return validFrom;
         }
 
         /**
-         * @return The text represent representation of the date after
-         *         which the certificate is no longer valid.
+         * @return The date after which the certificate is no longer valid.
          */
-        public String getValidUntil()
+        public Date getValidTo()
         {
-            return validUntil;
+            return validTo;
         }
 
         /**
-         * @return The DN of the certificate issuer.
+         * @return The certificate fingerprint.
          */
-        public String getIssuer()
+        public byte[] getFingerprint()
         {
-            return issuer;
+            return fingerprint;
         }
 
         /**
-         * @return the Base64-encoded DER representation of the certificate.
+         * @return A list of host names that the certificate represents.
          */
-        public String getDER()
+        public List<String> getHostnames()
         {
-            return der;
+            return hostnames;
+        }
+
+        /**
+         * @return the Base64-encoded raw certificate data.
+         */
+        public String getCert()
+        {
+            return asciiCert;
         }
 
         /* This private constructor is used by the native implementation. */
-        private SSLServerCertInfo(String hostname, String fingerprint,
-                                  String validFrom, String validUntil,
-                                  String issuer, String der)
+        private SSLServerCertInfo(String subject, String issuer,
+                                  long validFrom, long validTo,
+                                  byte[] fingerprint,
+                                  List<String> hostnames,
+                                  String asciiCert)
         {
-            this.hostname = hostname;
-            this.fingerprint = fingerprint;
-            this.validFrom = validFrom;
-            this.validUntil = validUntil;
+            this.subject = subject;
             this.issuer = issuer;
-            this.der = der;
+            this.validFrom = new Date(validFrom);
+            this.validTo = new Date(validTo);
+            this.fingerprint = fingerprint;
+            this.hostnames = hostnames;
+            this.asciiCert = asciiCert;
         }
 
-        private String hostname;
-        private String fingerprint;
-        private String validFrom;
-        private String validUntil;
+        private String subject;
         private String issuer;
-        private String der;
+        private Date validFrom;
+        private Date validTo;
+        private byte[] fingerprint;
+        private List<String> hostnames;
+        private String asciiCert;
     }
 
     /**

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigLib.java
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigLib.java?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigLib.java
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigLib.java
 Mon Feb  9 11:23:39 2015
@@ -81,48 +81,6 @@ public class ConfigLib
         return nativeRemoveCredential(configDir, kind.toString(), realm);
     }
 
-    ///** @see SVNUtil.addCredential */
-    //public SVNUtil.Credential addCredential(String configDir,
-    //                                        SVNUtil.Credential credential,
-    //                                        boolean replace)
-    //    throws ClientException, SubversionException
-    //{
-    //    final SVNUtil.Credential.Kind kind = credential.getKind();
-    //
-    //    final String username =
-    //        ((kind == SVNUtil.Credential.Kind.username
-    //          || kind == SVNUtil.Credential.Kind.simple)
-    //         ? credential.getUsername() : null);
-    //
-    //    final String password =
-    //        (kind == SVNUtil.Credential.Kind.simple
-    //         ? credential.getPassword() : null);
-    //
-    //    final AuthnCallback.SSLServerCertInfo sci =
-    //        (kind == SVNUtil.Credential.Kind.sslServer
-    //         ? credential.getServerCertInfo() : null);
-    //
-    //    final AuthnCallback.SSLServerCertFailures scf =
-    //        (kind == SVNUtil.Credential.Kind.sslServer
-    //         ? credential.getServerCertFailures() : null);
-    //
-    //    final String passphrase =
-    //        (kind == SVNUtil.Credential.Kind.sslClientPassphrase
-    //         ? credential.getClientCertPassphrase() : null);
-    //
-    //    return nativeAddCredential(configDir, kind.toString(),
-    //                               credential.getRealm(),
-    //                               username, password,
-    //                               (sci != null ? sci.getHostname() : null),
-    //                               (sci != null ? sci.getFingerprint() : 
null),
-    //                               (sci != null ? sci.getValidFrom() : null),
-    //                               (sci != null ? sci.getValidUntil() : 
null),
-    //                               (sci != null ? sci.getIssuer() : null),
-    //                               (sci != null ? sci.getDER() : null),
-    //                               (scf != null ? scf.getFailures() : 0),
-    //                               passphrase);
-    //}
-
     /** @see SVNUtil.searchCredentials */
     public List<SVNUtil.Credential>
         searchCredentials(String configDir,
@@ -151,22 +109,6 @@ public class ConfigLib
                                String realm)
         throws ClientException, SubversionException;
 
-    //private native SVNUtil.Credential
-    //    nativeAddCredential(String configDir,
-    //                        String kind,
-    //                        String realm,
-    //                        String username,
-    //                        String password,
-    //                        String serverCertHostname,
-    //                        String serverCertFingerprint,
-    //                        String serverCertValidFrom,
-    //                        String serverCertValidUntil,
-    //                        String serverCertIssuer,
-    //                        String serverCertDER,
-    //                        int serverCertFailures,
-    //                        String clientCertPassphrase)
-    //    throws ClientException, SubversionException;
-
     private native List<SVNUtil.Credential>
         nativeSearchCredentials(String configDir,
                                 String kind,

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
 Mon Feb  9 11:23:39 2015
@@ -259,7 +259,7 @@ public class BasicTests extends SVNTests
         tempclient.dispose();
 
         // create Y and Y/Z directories in the repository
-        addExpectedCommitItem(null, thisTest.getUrl().toString(), "Y", 
NodeKind.none,
+        addExpectedCommitItem(null, thisTest.getUrl().toString(), "Y", 
NodeKind.dir,
                               CommitItemStateFlags.Add);
         Set<String> urls = new HashSet<String>(1);
         urls.add(thisTest.getUrl() + "/Y");
@@ -1004,9 +1004,9 @@ public class BasicTests extends SVNTests
         OneTest thisTest = new OneTest();
 
         // create Y and Y/Z directories in the repository
-        addExpectedCommitItem(null, thisTest.getUrl().toString(), "Y", 
NodeKind.none,
+        addExpectedCommitItem(null, thisTest.getUrl().toString(), "Y", 
NodeKind.dir,
                               CommitItemStateFlags.Add);
-        addExpectedCommitItem(null, thisTest.getUrl().toString(), "Y/Z", 
NodeKind.none,
+        addExpectedCommitItem(null, thisTest.getUrl().toString(), "Y/Z", 
NodeKind.dir,
                               CommitItemStateFlags.Add);
         Set<String> urls = new HashSet<String>(2);
         urls.add(thisTest.getUrl() + "/Y");
@@ -3885,11 +3885,46 @@ public class BasicTests extends SVNTests
                      false, false, callback);
         assertEquals(1, callback.numberOfLines());
         BlameCallbackImpl.BlameLine line = callback.getBlameLine(0);
-        if (line != null)
-        {
-            assertEquals(1, line.getRevision());
-            assertEquals("jrandom", line.getAuthor());
+        assertNotNull(line);
+        assertEquals(1, line.getRevision());
+        assertEquals("jrandom", line.getAuthor());
+        assertEquals("This is the file 'iota'.", line.getLine());
+    }
+
+    /**
+     * Test blame with diff options.
+     * @since 1.9
+     */
+    public void testBlameWithDiffOptions() throws Throwable
+    {
+        OneTest thisTest = new OneTest();
+        // Modify the file iota, making only whitespace changes.
+        File iota = new File(thisTest.getWorkingCopy(), "iota");
+        FileOutputStream stream = new FileOutputStream(iota, false);
+        stream.write("This   is   the   file   'iota'.\t".getBytes());
+        stream.close();
+        Set<String> srcPaths = new HashSet<String>(1);
+        srcPaths.add(thisTest.getWCPath());
+        try {
+            client.username("rayjandom");
+            client.commit(srcPaths, Depth.infinity, false, false, null, null,
+                          new ConstMsg("Whitespace-only change in /iota"), 
null);
+        } finally {
+            client.username("jrandom");
         }
+
+        // Run blame on the result
+        BlameCallbackImpl callback = new BlameCallbackImpl();
+        client.blame(thisTest.getWCPath() + "/iota", Revision.HEAD,
+                     Revision.getInstance(1), Revision.HEAD,
+                     false, false, callback,
+                     new DiffOptions(DiffOptions.Flag.IgnoreWhitespace));
+        assertEquals(1, callback.numberOfLines());
+        BlameCallbackImpl.BlameLine line = callback.getBlameLine(0);
+        assertNotNull(line);
+        assertEquals(1, line.getRevision());
+        assertEquals("jrandom", line.getAuthor());
+        assertEquals("This   is   the   file   'iota'.\t", line.getLine());
     }
 
     /**

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
 Mon Feb  9 11:23:39 2015
@@ -1398,6 +1398,7 @@ public class SVNRemoteTests extends SVNT
         ISVNRemote.FileRevision rev = result.get(0);
         assertEquals("/iota", rev.getPath());
         assertFalse(rev.isResultOfMerge());
+        assertTrue(rev.hasTextDelta());
     }
 
     // This test is a result of a threading bug that was identified in

Modified: 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java
URL: 
http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java?rev=1658362&r1=1658361&r2=1658362&view=diff
==============================================================================
--- 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java
 (original)
+++ 
subversion/branches/remove-log-addressing/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java
 Mon Feb  9 11:23:39 2015
@@ -257,10 +257,11 @@ class SVNTests extends TestCase
         greekRepos = new File(localTmp, "repos");
         greekDump = new File(localTmp, "greek_dump");
         admin.create(greekRepos, true,false, null, this.fsType);
-        addExpectedCommitItem(greekFiles.getAbsolutePath(), null, null,
-                              NodeKind.none, CommitItemStateFlags.Add);
+        addExpectedCommitItem(greekFiles.getAbsolutePath(),
+                              makeReposUrl(greekRepos).toString(), null,
+                              NodeKind.dir, CommitItemStateFlags.Add);
         client.doImport(greekFiles.getAbsolutePath(),
-                       makeReposUrl(greekRepos).toString(),
+                        makeReposUrl(greekRepos).toString(),
                         Depth.infinity, false, false, null,
                         new MyCommitMessage(), null);
         admin.dump(greekRepos, new FileOutputStream(greekDump),


Reply via email to