void fill_property_map()

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();
}