[[[
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