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/21 12:58:17 UTC

svn commit: r1544144 - in /subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl: ./ native/jniwrapper/jni_env.hpp native/jniwrapper/jni_io_stream.cpp native/jniwrapper/jni_stack.hpp native/org_apache_subversion_javahl_util_PropLib.cpp

Author: brane
Date: Thu Nov 21 11:58:17 2013
New Revision: 1544144

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

Modified:
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/   (props changed)
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_env.hpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp
    subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp

Propchange: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/
------------------------------------------------------------------------------
  Merged /subversion/trunk/subversion/bindings/javahl:r1544061-1544138

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_env.hpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_env.hpp?rev=1544144&r1=1544143&r2=1544144&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_env.hpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_env.hpp Thu Nov 21 11:58:17 2013
@@ -204,7 +204,7 @@ public:
     }
 
   /** Wrapped JNI function. */
-  void DeleteGlobalRef(jobject obj) const
+  void DeleteGlobalRef(jobject obj) const throw()
     {
       m_env->DeleteGlobalRef(obj);
     }
@@ -217,7 +217,7 @@ public:
     }
 
   /** Wrapped JNI function. */
-  void PopLocalFrame() const
+  void PopLocalFrame() const throw()
     {
       m_env->PopLocalFrame(NULL);
     }
@@ -280,7 +280,7 @@ public:
     }
 
   /** Wrapped JNI function. */
-  jboolean IsInstanceOf(jobject obj, jclass cls) const
+  jboolean IsInstanceOf(jobject obj, jclass cls) const throw()
     {
       return m_env->IsInstanceOf(obj, cls);
     }
@@ -346,7 +346,7 @@ public:
       const char* text = m_env->GetStringUTFChars(str, is_copy);
       check_java_exception();
       if (!text)
-        throw std::runtime_error(
+        throw_java_out_of_memory(
               _("Could not get contents of Java String"));
       return text;
     }
@@ -358,7 +358,6 @@ public:
         throw std::logic_error(
               _("Can not release contents of a null String"));
       m_env->ReleaseStringUTFChars(str, new_text);
-      check_java_exception();
     }
 
   /** Wrapped JNI function. */
@@ -471,7 +470,7 @@ public:
   jsize GetArrayLength(jarray array) const
     {
       if (!array)
-        return -1;
+        return 0;
       return m_env->GetArrayLength(array);
     }
 
@@ -479,9 +478,8 @@ public:
   jobjectArray NewObjectArray(jsize length, jclass cls, jobject init) const
     {
       jobjectArray array = m_env->NewObjectArray(length, cls, init);
-      check_java_exception();
       if (!array)
-        throw std::runtime_error(_("Could not create Object array"));
+        throw_java_out_of_memory(_("Could not create Object array"));
       return array;
     }
 
@@ -506,24 +504,28 @@ public:
   T##Array New##N##Array(jsize length) const                            \
     {                                                                   \
       T##Array array = m_env->New##N##Array(length);                    \
-      check_java_exception();                                           \
       if (!array)                                                       \
         throw_java_out_of_memory(_("Could not create "#T" array"));     \
       return array;                                                     \
     }                                                                   \
   T* Get##N##ArrayElements(T##Array array, jboolean* is_copy) const     \
     {                                                                   \
+      if (!array)                                                       \
+        return NULL;                                                    \
+                                                                        \
       T* data = m_env->Get##N##ArrayElements(array, is_copy);           \
       check_java_exception();                                           \
       if (!data)                                                        \
-        throw std::runtime_error(                                       \
-            _("Could not get "#T" array contents"));                    \
+        throw_java_out_of_memory(                                       \
+            _("Could not get "#N" array contents"));                    \
       return data;                                                      \
     }                                                                   \
   void Release##N##ArrayElements(T##Array array, T* data, jint mode) const \
     {                                                                   \
+      if (!array)                                                       \
+        throw std::logic_error(                                         \
+            _("Can not release contents of a null "#T"Array"));         \
       m_env->Release##N##ArrayElements(array, data, mode);              \
-      check_java_exception();                                           \
     }
 
   SVN_JAVAHL_JNIWRAPPER_PRIMITIVE_TYPE_ARRAY(jboolean, Boolean)

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp?rev=1544144&r1=1544143&r2=1544144&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp Thu Nov 21 11:58:17 2013
@@ -172,6 +172,9 @@ svn_stream_t*
 InputStream::get_global_stream(Env env, jobject jstream,
                                const SVN::Pool& pool)
 {
+  if (!jstream)
+    return NULL;
+
   const bool has_mark = InputStream(env, jstream).mark_supported();
 
   std::auto_ptr<GlobalObject> baton(new GlobalObject(env, jstream));
@@ -194,6 +197,9 @@ InputStream::get_global_stream(Env env, 
 
 svn_stream_t* InputStream::get_stream(const SVN::Pool& pool)
 {
+  if (!m_jthis)
+    return NULL;
+
   const bool has_mark = mark_supported();
 
   svn_stream_t* const stream = svn_stream_create(this, pool.getPool());
@@ -217,6 +223,9 @@ svn_stream_t*
 OutputStream::get_global_stream(Env env, jobject jstream,
                                const SVN::Pool& pool)
 {
+  if (!jstream)
+    return NULL;
+
   std::auto_ptr<GlobalObject> baton(new GlobalObject(env, jstream));
 
   svn_stream_t* const stream = svn_stream_create(baton.get(), pool.getPool());
@@ -231,6 +240,9 @@ OutputStream::get_global_stream(Env env,
 
 svn_stream_t* OutputStream::get_stream(const SVN::Pool& pool)
 {
+  if (!m_jthis)
+    return NULL;
+
   svn_stream_t* const stream = svn_stream_create(this, pool.getPool());
   svn_stream_set_write(stream, stream_write);
   svn_stream_set_close(stream, stream_close_output);

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp?rev=1544144&r1=1544143&r2=1544144&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp Thu Nov 21 11:58:17 2013
@@ -176,6 +176,21 @@
       return svn_error_create((C), NULL, msg);                          \
     }
 
+/**
+ * Exception checker for the oldstyle implementation that does not use
+ * the @c Java::Env environment wrapper.
+ *
+ * @param E A wrapped environment (@c Java::Env) instance.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(E)  \
+  do {                                          \
+    if ((E).ExceptionCheck())                   \
+      throw ::Java::SignalExceptionThrown();    \
+  } while(0)
+
+
 namespace Java {
 
 /**

Modified: subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp?rev=1544144&r1=1544143&r2=1544144&view=diff
==============================================================================
--- subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp (original)
+++ subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp Thu Nov 21 11:58:17 2013
@@ -29,13 +29,15 @@
 
 #include "../include/org_apache_subversion_javahl_util_PropLib.h"
 
-#include "JNIStackElement.h"
-#include "JNIStringHolder.h"
-#include "JNIByteArray.h"
-#include "JNIUtil.h"
-#include "InputStream.h"
+#include "jniwrapper/jni_stack.hpp"
+#include "jniwrapper/jni_array.hpp"
+#include "jniwrapper/jni_list.hpp"
+#include "jniwrapper/jni_string.hpp"
+#include "jniwrapper/jni_io_stream.hpp"
+#include "ExternalItem.hpp"
+#include "SubversionException.hpp"
+
 #include "EnumMapper.h"
-#include "Path.h"
 #include "Pool.h"
 
 #include "svn_props.h"
@@ -82,74 +84,7 @@ private:
   const char* m_mime_type;
   svn_stream_t* m_contents;
 };
-} // anonymous namespace
-
-
-JNIEXPORT jbyteArray JNICALL
-Java_org_apache_subversion_javahl_util_PropLib_checkNodeProp(
-    JNIEnv* env, jobject jthis,
-    jstring jname, jbyteArray jvalue, jstring jpath, jobject jkind,
-    jstring jmime_type, jobject jfile_contents,
-    jboolean jskip_some_checks)
-{
-  JNIEntry(PropLib, checkLocalProp);
-
-  JNIStringHolder name(jname);
-  if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-
-  JNIByteArray value(jvalue);
-  if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-
-  JNIStringHolder path(jpath);
-  if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-
-  svn_node_kind_t kind = EnumMapper::toNodeKind(jkind);
-  if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-
-  JNIStringHolder mime_type(jmime_type);
-  if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-
-  InputStream contents(jfile_contents);
-  if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-
-  // Using a "global" request pool since we don't keep a context with
-  // its own pool around for these functions.
-  SVN::Pool pool;
-
-  PropGetter getter(mime_type.c_str(),
-                    (jfile_contents ? contents.getStream(pool) : NULL));
-
-  svn_string_t propval;
-  propval.data = reinterpret_cast<const char*>(value.getBytes());
-  propval.len = value.getLength();
-
-  const svn_string_t* canonval;
-  SVN_JNI_ERR(svn_wc_canonicalize_svn_prop(
-                  &canonval, name.c_str(), &propval, path.c_str(),
-                  kind, svn_boolean_t(jskip_some_checks),
-                  PropGetter::callback, &getter,
-                  pool.getPool()),
-              NULL);
-
-  return JNIUtil::makeJByteArray(canonval->data, int(canonval->len));
-}
-
-
-#include "jniwrapper/jni_stack.hpp"
-#include "jniwrapper/jni_array.hpp"
-#include "jniwrapper/jni_list.hpp"
-#include "jniwrapper/jni_string.hpp"
-#include "ExternalItem.hpp"
-#include "SubversionException.hpp"
 
-
-namespace {
 struct FormatRevision
 {
   explicit FormatRevision(const svn_opt_revision_t* const& revarg,
@@ -278,6 +213,51 @@ private:
 } // anoymous namespace
 
 
+JNIEXPORT jbyteArray JNICALL
+Java_org_apache_subversion_javahl_util_PropLib_checkNodeProp(
+    JNIEnv* jenv, jobject jthis,
+    jstring jname, jbyteArray jvalue, jstring jpath, jobject jkind,
+    jstring jmime_type, jobject jfile_contents,
+    jboolean jskip_some_checks)
+{
+  SVN_JAVAHL_JNI_TRY(PropLib, checkLocalProp)
+    {
+      const Java::Env env(jenv);
+
+      const svn_node_kind_t kind = EnumMapper::toNodeKind(jkind);
+      SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+      const Java::String name_str(env, jname);
+      const Java::ByteArray value(env, jvalue);
+      const Java::String path_str(env, jpath);
+      const Java::String mime_type_str(env, jmime_type);
+      Java::InputStream file_contents(env, jfile_contents);
+
+      // Using a "global" request pool since we don't keep a context
+      // with its own pool around for these functions.
+      SVN::Pool pool;
+
+      const Java::String::Contents name(name_str);
+      const Java::String::Contents path(path_str);
+      const Java::String::Contents mime_type(mime_type_str);
+      PropGetter getter(mime_type.c_str(), file_contents.get_stream(pool));
+
+      const svn_string_t* canonval;
+      SVN_JAVAHL_CHECK(env,
+                       svn_wc_canonicalize_svn_prop(
+                           &canonval, name.c_str(),
+                           Java::ByteArray::Contents(value).get_string(pool),
+                           path.c_str(), kind,
+                           svn_boolean_t(jskip_some_checks),
+                           PropGetter::callback, &getter,
+                           pool.getPool()));
+      return Java::ByteArray(env, canonval->data, jint(canonval->len)).get();
+    }
+  SVN_JAVAHL_JNI_CATCH;
+  return NULL;
+}
+
+
 JNIEXPORT jobject JNICALL
 Java_org_apache_subversion_javahl_util_PropLib_parseExternals(
     JNIEnv* jenv, jobject jthis,