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();