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/06 03:21:49 UTC

svn commit: r1539213 - in /subversion/trunk/subversion/bindings/javahl/native: jniwrapper/jni_list.cpp jniwrapper/jni_list.hpp org_apache_subversion_javahl_util_PropLib.cpp

Author: brane
Date: Wed Nov  6 02:21:48 2013
New Revision: 1539213

URL: http://svn.apache.org/r1539213
Log:
Implement the svn:externals parser in JavaHL.

* subversion/bindings/javahl/native/jniwrapper/jni_list.hpp
  (Java::BaseMutableList, Java::MutableList): New base class and template.
  (Java::BaseList::size_type): Remove typedef.
  (Java::BaseList::length): Change to return a jint.
  (Java::BaseList::operator[]): Change index type to jint.
  (Java::List::operator[]): Likewise.
* subversion/bindings/javahl/native/jniwrapper/jni_list.cpp
  (Java::BaseMutableList): Implement.
  (BaseList::convert_to_vector): Adjust index type.

* subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp
  (Java_org_apache_subversion_javahl_util_PropLib_parseExternals):
   Finish implementation.
  (Java_org_apache_subversion_javahl_util_PropLib_unparseExternals):
   Update index type.

Modified:
    subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp
    subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp
    subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp

Modified: subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp?rev=1539213&r1=1539212&r2=1539213&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp Wed Nov  6 02:21:48 2013
@@ -25,13 +25,15 @@
 
 namespace Java {
 
+// Class Java::BaseList
+
 const char* const BaseList::m_class_name = "java/util/List";
 
 BaseList::ovector
 BaseList::convert_to_vector(Env env, jclass cls, jobject jlist)
 {
-  const size_type length = size_type(
-      env.CallIntMethod(jlist, env.GetMethodID(cls, "size", "()I")));
+  const jint length = env.CallIntMethod(
+      jlist, env.GetMethodID(cls, "size", "()I"));
 
   if (!length)
     return ovector();
@@ -46,4 +48,55 @@ BaseList::convert_to_vector(Env env, jcl
   return contents;
 }
 
+
+// Class Java::BaseMutableList
+
+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)),
+      m_mid_add(NULL),
+      m_mid_clear(NULL),
+      m_mid_get(NULL),
+      m_mid_size(NULL)
+{}
+
+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_add);
+}
+
 } // namespace Java

Modified: subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp?rev=1539213&r1=1539212&r2=1539213&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp Wed Nov  6 02:21:48 2013
@@ -43,17 +43,19 @@ class BaseList : public Object
   typedef std::vector<jobject> ovector;
 
 public:
-  typedef ovector::size_type size_type;
-
   /**
    * Returns the number of elements in the list.
    */
-  size_type length() const
+  jint length() const
     {
-      return m_contents.size();
+      return jint(m_contents.size());
     }
 
 protected:
+  /**
+   * Constructs the list wrapper, converting the contents to an
+   * @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))
@@ -62,9 +64,9 @@ protected:
   /**
    * Returns the object reference at @a index.
    */
-  jobject operator[](ovector::size_type index) const
+  jobject operator[](jint index) const
     {
-      return m_contents[index];
+      return m_contents[ovector::size_type(index)];
     }
 
 private:
@@ -93,12 +95,115 @@ public:
   /**
    * Returns a wrapper object for the object reference at @a index.
    */
-  T operator[](size_type index) const
+  T operator[](jint index) const
     {
       return T(m_env, BaseList::operator[](index));
     }
 };
 
+/**
+ * Non-template base for a mutable type-safe Java list.
+ *
+ * @since New in 1.9.
+ */
+class BaseMutableList : public Object
+{
+public:
+  /**
+   * Clears the contents of the list.
+   */
+  void clear();
+
+  /**
+   * Returns the number of elements in the list.
+   */
+  jint length() const;
+
+  /**
+   * Checks if the list is empty.
+   */
+  bool is_empty() const
+    {
+      return (length() == 0);
+    }
+
+protected:
+  /**
+   * Constructs the list wrapper, deriving the class from @a jlist.
+   */
+  explicit BaseMutableList(Env env, jobject jlist)
+    : Object(env, jlist),
+      m_mid_add(NULL),
+      m_mid_clear(NULL),
+      m_mid_get(NULL),
+      m_mid_size(NULL)
+    {}
+
+  /**
+   * Constructs and wraps an empty list of type @c java.util.ArrayList
+   * with initial allocation size @a length.
+   */
+  explicit BaseMutableList(Env env, jint length);
+
+  /**
+   * Appends @a obj to the end of the list.
+   */
+  void add(jobject obj);
+
+  /**
+   * Returns the object reference at @a index.
+   */
+  jobject operator[](jint index) const;
+
+private:
+  static const char* const m_class_name;
+  jmethodID m_mid_add;
+  jmethodID m_mid_clear;
+  mutable jmethodID m_mid_get;
+  mutable jmethodID m_mid_size;
+};
+
+/**
+ * Template wrapper for a mutable type-safe Java list.
+ *
+ * @since New in 1.9.
+ */
+template <typename T>
+class MutableList : public BaseMutableList
+{
+public:
+  /**
+   * Constructs the list wrapper, deriving the class from @a jlist.
+   */
+  explicit MutableList(Env env, jobject jlist)
+    : BaseMutableList(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)
+    {}
+
+  /**
+   * Appends @a obj to the end of the list.
+   */
+  void add(const T& obj)
+    {
+      BaseMutableList::add(obj.get());
+    }
+
+  /**
+   * Returns a wrapper object for the object reference at @a index.
+   */
+  T operator[](jint index) const
+    {
+      return T(m_env, BaseMutableList::operator[](index));
+    }
+};
+
 } // namespace Java
 
 #endif // SVN_JAVAHL_JNIWRAPPER_LIST_HPP

Modified: subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp?rev=1539213&r1=1539212&r2=1539213&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp Wed Nov  6 02:21:48 2013
@@ -190,7 +190,37 @@ Java_org_apache_subversion_javahl_util_P
       const Java::Env env(jenv);
 
       const Java::ByteArray description(env, jdescription);
-      const Java::String paren_dir(env, jparent_dir);
+      const Java::String parent_dir(env, jparent_dir);
+
+      // Using a "global" request pool since we don't keep a context
+      // with its own pool around for these functions.
+      SVN::Pool pool;
+
+      apr_array_header_t* externals;
+      SVN_JAVAHL_CHECK(svn_wc_parse_externals_description3(
+                           &externals,
+                           Java::String::Contents(parent_dir).c_str(),
+                           Java::ByteArray::Contents(description).data(),
+                           svn_boolean_t(jcanonicalize_url),
+                           pool.getPool()));
+
+      Java::MutableList<JavaHL::ExternalItem> items(env, externals->nelts);
+      for (jint i = 0; i < externals->nelts; ++i)
+        {
+          // References to the newly created external items are stored
+          // in the list, so make sure the local reference in this
+          // frame get cleared on each iteration.
+          Java::LocalFrame frame;
+
+          const svn_wc_external_item2_t* const item =
+            APR_ARRAY_IDX(externals, i, svn_wc_external_item2_t*);
+          items.add(JavaHL::ExternalItem(env,
+                                         item->target_dir,
+                                         item->url,
+                                         &item->revision,
+                                         &item->peg_revision));
+        }
+      return items.get();
     }
   SVN_JAVAHL_JNI_CATCH;
   return NULL;
@@ -213,7 +243,8 @@ Java_org_apache_subversion_javahl_util_P
       SVN::Pool iterpool;
 
       std::ostringstream buffer;
-      for (jint i = 0; i < items.length(); ++i)
+      const jint items_length = items.length();
+      for (jint i = 0; i < items_length; ++i)
         {
           iterpool.clear();