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::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 keys = keyArray.vector(); - - for (std::vector::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 #include -class RevpropTable +#include "StringsTable.h" + +class RevpropTable : public StringsTable { - private: - std::map 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 -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::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 #include "Pool.h" @@ -36,15 +36,14 @@ struct apr_hash_t; #include #include -class RevpropTable +class StringsTable { - private: - std::map m_revprops; - jobject m_revpropTable; + protected: + std::map 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