in subversion/bindings/javahl/native/CreateJ.cpp [1128:1221]
void fill_property_map(jobject map,
apr_hash_t* prop_hash, apr_array_header_t* prop_diffs,
apr_pool_t* scratch_pool, jmethodID put_mid)
{
SVN_ERR_ASSERT_NO_RETURN(!(prop_hash && prop_diffs));
if (!map || (prop_hash == NULL && prop_diffs == NULL))
return;
JNIEnv *env = JNIUtil::getEnv();
// Create a local frame for our references
env->PushLocalFrame(LOCAL_FRAME_SIZE);
if (JNIUtil::isJavaExceptionThrown())
return;
// The caller may not know the concrete class of the map, so
// determine the "put" method identifier here.
if (put_mid == 0)
{
put_mid = env->GetMethodID(env->GetObjectClass(map), "put",
"(Ljava/lang/Object;Ljava/lang/Object;)"
"Ljava/lang/Object;");
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NOTHING();
}
struct body
{
void operator()(const char* key, const svn_string_t* val)
{
jstring jpropName = JNIUtil::makeJString(key);
if (JNIUtil::isJavaExceptionThrown())
return;
jbyteArray jpropVal = (val ? JNIUtil::makeJByteArray(val) : NULL);
if (JNIUtil::isJavaExceptionThrown())
return;
jobject ret = m_env->CallObjectMethod(m_map, m_put_mid,
jpropName, jpropVal);
if (JNIUtil::isJavaExceptionThrown())
return;
m_env->DeleteLocalRef(ret);
m_env->DeleteLocalRef(jpropVal);
m_env->DeleteLocalRef(jpropName);
}
JNIEnv*& m_env;
jmethodID& m_put_mid;
jobject& m_map;
body(JNIEnv*& xenv, jmethodID& xput_mid, jobject& xmap)
: m_env(xenv), m_put_mid(xput_mid), m_map(xmap)
{}
} loop_body(env, put_mid, map);
if (prop_hash)
{
if (!scratch_pool)
scratch_pool = apr_hash_pool_get(prop_hash);
apr_hash_index_t *hi;
for (hi = apr_hash_first(scratch_pool, prop_hash);
hi; hi = apr_hash_next(hi))
{
const char* key;
svn_string_t* val;
const void* v_key;
void* v_val;
apr_hash_this(hi, &v_key, NULL, &v_val);
key = static_cast<const char*>(v_key);
val = static_cast<svn_string_t*>(v_val);
loop_body(key, val);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NOTHING();
}
}
else
{
for (int i = 0; i < prop_diffs->nelts; ++i)
{
svn_prop_t* prop = &APR_ARRAY_IDX(prop_diffs, i, svn_prop_t);
loop_body(prop->name, prop->value);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NOTHING();
}
}
POP_AND_RETURN_NOTHING();
}