[[[
    JavaHL: Factor out common java string map processing into StringsTable
class from svn_string_t specific processing in the RevpropTable class

    [ in subversion/bindings/javahl/native ]

    * StringsTable.cpp, StringsTable.h, RevpropTable.cpp, RevpropTable.h
      (m_revprops): Move m_revprops to base class and rename to more
appropriate m_strings
      (RevpropTable): Move constructor logic to base class StringsTable
      (~RevpropTable): Move local reference release from destructor to the
end of the new common constructor as by the end of the constructor all data
has been copied and a reference to java object is no longer required

    * StringsTable.cpp, StringsTable.h
      (hash): New function to create (char *) to (char *) hash from java
Map<String, String> to be used for creating of lock tocken table for
svn_ra_open4 call

    * RevpropTable.cpp, RevpropTable.h
      (hash): Use the new base member variable m_strings instead of
m_revprops
]]]
Index: subversion/bindings/javahl/native/RevpropTable.cpp
===================================================================
--- subversion/bindings/javahl/native/RevpropTable.cpp  (revision 1328758)
+++ subversion/bindings/javahl/native/RevpropTable.cpp  (working copy)
@@ -37,19 +37,17 @@
 
 RevpropTable::~RevpropTable()
 {
-  if (m_revpropTable != NULL)
-    JNIUtil::getEnv()->DeleteLocalRef(m_revpropTable);
 }
 
 apr_hash_t *RevpropTable::hash(const SVN::Pool &pool, bool nullIfEmpty)
 {
-  if (m_revprops.size() == 0 && nullIfEmpty)
+  if (m_strings.size() == 0 && nullIfEmpty)
     return NULL;
 
   apr_hash_t *revprop_table = apr_hash_make(pool.getPool());
 
   std::map<std::string, std::string>::const_iterator it;
-  for (it = m_revprops.begin(); it != m_revprops.end(); ++it)
+  for (it = m_strings.begin(); it != m_strings.end(); ++it)
     {
       const char *propname = apr_pstrdup(pool.getPool(), it->first.c_str());
       if (!svn_prop_name_is_valid(propname))
@@ -72,60 +70,6 @@ apr_hash_t *RevpropTable::hash(const SVN::Pool &pool, bool 
nullIfEmpty)
 }
 
 RevpropTable::RevpropTable(jobject jrevpropTable)
+: StringsTable(jrevpropTable)
 {
-  m_revpropTable = jrevpropTable;
-
-  if (jrevpropTable != NULL)
-    {
-      static jmethodID keySet = 0, toArray = 0, get = 0;
-      JNIEnv *env = JNIUtil::getEnv();
-
-      jclass mapClazz = env->FindClass("java/util/Map");
-
-      if (keySet == 0)
-        {
-          keySet = env->GetMethodID(mapClazz, "keySet",
-                                    "()Ljava/util/Set;");
-          if (JNIUtil::isExceptionThrown())
-            return;
-        }
-
-      jobject jkeySet = env->CallObjectMethod(jrevpropTable, keySet);
-      if (JNIUtil::isExceptionThrown())
-        return;
-
-      if (get == 0)
-        {
-          get = env->GetMethodID(mapClazz, "get",
-                                 "(Ljava/lang/Object;)Ljava/lang/Object;");
-          if (JNIUtil::isExceptionThrown())
-            return;
-        }
-
-      Array keyArray(jkeySet);
-      std::vector<jobject> keys = keyArray.vector();
-
-      for (std::vector<jobject>::const_iterator it = keys.begin();
-            it < keys.end(); ++it)
-        {
-          JNIStringHolder propname((jstring)*it);
-          if (JNIUtil::isExceptionThrown())
-            return;
-
-          jobject jpropval = env->CallObjectMethod(jrevpropTable, get, *it);
-          if (JNIUtil::isExceptionThrown())
-            return;
-
-          JNIStringHolder propval((jstring)jpropval);
-          if (JNIUtil::isExceptionThrown())
-            return;
-
-          m_revprops[std::string((const char *)propname)]
-            = std::string((const char *)propval);
-
-          JNIUtil::getEnv()->DeleteLocalRef(jpropval);
-        }
-
-      JNIUtil::getEnv()->DeleteLocalRef(jkeySet);
-    }
 }
Index: subversion/bindings/javahl/native/RevpropTable.h
===================================================================
--- subversion/bindings/javahl/native/RevpropTable.h    (revision 1328758)
+++ subversion/bindings/javahl/native/RevpropTable.h    (working copy)
@@ -36,15 +36,14 @@ struct apr_hash_t;
 #include <map>
 #include <string>
 
-class RevpropTable
+#include "StringsTable.h"
+
+class RevpropTable : public StringsTable
 {
- private:
-  std::map<std::string, std::string> m_revprops;
-  jobject m_revpropTable;
  public:
   RevpropTable(jobject jrevpropTable);
-  ~RevpropTable();
-  apr_hash_t *hash(const SVN::Pool &pool, bool nullIfEmpty = true);
+  virtual ~RevpropTable();
+  virtual apr_hash_t *hash(const SVN::Pool &pool, bool nullIfEmpty = true);
 };
 
 #endif // REVPROPTABLE_H
Index: subversion/bindings/javahl/native/StringsTable.cpp
===================================================================
--- subversion/bindings/javahl/native/RevpropTable.cpp  (revision 1328758)
+++ subversion/bindings/javahl/native/StringsTable.cpp  (working copy)
@@ -20,11 +20,11 @@
  * ====================================================================
  * @endcopyright
  *
- * @file RevpropTable.cpp
- * @brief Implementation of the class RevpropTable
+ * @file StringsTable.cpp
+ * @brief Implementation of the class StringsTable
  */
 
-#include "RevpropTable.h"
+#include "StringsTable.h"
 #include "JNIUtil.h"
 #include "JNIStringHolder.h"
 #include "Array.h"
@@ -35,47 +35,32 @@
 #include "svn_props.h"
 #include <iostream>
 
-RevpropTable::~RevpropTable()
+StringsTable::~StringsTable()
 {
-  if (m_revpropTable != NULL)
-    JNIUtil::getEnv()->DeleteLocalRef(m_revpropTable);
 }
 
-apr_hash_t *RevpropTable::hash(const SVN::Pool &pool, bool nullIfEmpty)
+apr_hash_t *StringsTable::hash(const SVN::Pool &pool, bool nullIfEmpty)
 {
-  if (m_revprops.size() == 0 && nullIfEmpty)
+  if (m_strings.size() == 0 && nullIfEmpty)
     return NULL;
 
-  apr_hash_t *revprop_table = apr_hash_make(pool.getPool());
+  apr_hash_t *stringsTable = apr_hash_make(pool.getPool());
 
   std::map<std::string, std::string>::const_iterator it;
-  for (it = m_revprops.begin(); it != m_revprops.end(); ++it)
+  for (it = m_strings.begin(); it != m_strings.end(); ++it)
     {
-      const char *propname = apr_pstrdup(pool.getPool(), it->first.c_str());
-      if (!svn_prop_name_is_valid(propname))
-        {
-          const char *msg = apr_psprintf(pool.getPool(),
-                                         "Invalid property name: '%s'",
-                                         propname);
-          JNIUtil::throwNativeException(JAVA_PACKAGE "/ClientException", msg,
-                                        NULL, SVN_ERR_CLIENT_PROPERTY_NAME);
-          return NULL;
-        }
-
-      svn_string_t *propval = svn_string_create(it->second.c_str(),
-                                                pool.getPool());
+      const char *key = apr_pstrdup(pool.getPool(), it->first.c_str());
+      const char  *value = apr_pstrdup(pool.getPool(), it->second.c_str());
 
-      apr_hash_set(revprop_table, propname, APR_HASH_KEY_STRING, propval);
+      apr_hash_set(stringsTable, key, APR_HASH_KEY_STRING, value);
     }
 
-  return revprop_table;
+  return stringsTable;
 }
 
-RevpropTable::RevpropTable(jobject jrevpropTable)
+StringsTable::StringsTable(jobject stringHashTable)
 {
-  m_revpropTable = jrevpropTable;
-
-  if (jrevpropTable != NULL)
+  if (stringHashTable != NULL)
     {
       static jmethodID keySet = 0, toArray = 0, get = 0;
       JNIEnv *env = JNIUtil::getEnv();
@@ -90,7 +75,7 @@ RevpropTable::RevpropTable(jobject jrevpropTable)
             return;
         }
 
-      jobject jkeySet = env->CallObjectMethod(jrevpropTable, keySet);
+      jobject jkeySet = env->CallObjectMethod(stringHashTable, keySet);
       if (JNIUtil::isExceptionThrown())
         return;
 
@@ -112,7 +97,7 @@ RevpropTable::RevpropTable(jobject jrevpropTable)
           if (JNIUtil::isExceptionThrown())
             return;
 
-          jobject jpropval = env->CallObjectMethod(jrevpropTable, get, *it);
+          jobject jpropval = env->CallObjectMethod(stringHashTable, get, *it);
           if (JNIUtil::isExceptionThrown())
             return;
 
@@ -120,7 +105,7 @@ RevpropTable::RevpropTable(jobject jrevpropTable)
           if (JNIUtil::isExceptionThrown())
             return;
 
-          m_revprops[std::string((const char *)propname)]
+          m_strings[std::string((const char *)propname)]
             = std::string((const char *)propval);
 
           JNIUtil::getEnv()->DeleteLocalRef(jpropval);
@@ -128,4 +113,7 @@ RevpropTable::RevpropTable(jobject jrevpropTable)
 
       JNIUtil::getEnv()->DeleteLocalRef(jkeySet);
     }
+
+  if (stringHashTable != NULL)
+    JNIUtil::getEnv()->DeleteLocalRef(stringHashTable);
 }
Index: subversion/bindings/javahl/native/StringsTable.h
===================================================================
--- subversion/bindings/javahl/native/RevpropTable.h    (revision 1328758)
+++ subversion/bindings/javahl/native/StringsTable.h    (working copy)
@@ -20,12 +20,12 @@
  * ====================================================================
  * @endcopyright
  *
- * @file RevpropTable.h
- * @brief Interface of the class RevpropTable
+ * @file StringsTable.h
+ * @brief Interface of the class StringsTable
  */
 
-#ifndef REVPROPTABLE_H
-#define REVPROPTABLE_H
+#ifndef STRINGSTABLE_H
+#define STRINGSTABLE_H
 
 #include <jni.h>
 #include "Pool.h"
@@ -36,15 +36,14 @@ struct apr_hash_t;
 #include <map>
 #include <string>
 
-class RevpropTable
+class StringsTable
 {
- private:
-  std::map<std::string, std::string> m_revprops;
-  jobject m_revpropTable;
+ protected:
+  std::map<std::string, std::string> m_strings;
  public:
-  RevpropTable(jobject jrevpropTable);
-  ~RevpropTable();
-  apr_hash_t *hash(const SVN::Pool &pool, bool nullIfEmpty = true);
+  StringsTable(jobject stringHashTable);
+  virtual ~StringsTable();
+  virtual apr_hash_t *hash(const SVN::Pool &pool, bool nullIfEmpty = true);
 };
 
-#endif // REVPROPTABLE_H
+#endif // STRINGSTABLE_H

Reply via email to