This is an automated email from the ASF dual-hosted git repository.

tison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new 2e7a17141 chore(bindings/java): move out convert fns (#3389)
2e7a17141 is described below

commit 2e7a1714151d66df7f09d018bfc8acc315964afa
Author: tison <[email protected]>
AuthorDate: Thu Oct 26 20:30:37 2023 +0800

    chore(bindings/java): move out convert fns (#3389)
    
    Signed-off-by: tison <[email protected]>
---
 bindings/java/src/blocking_operator.rs |  2 +-
 bindings/java/src/convert.rs           | 76 +++++++++++++++++++++++++++++++
 bindings/java/src/lib.rs               | 81 +++++++++-------------------------
 bindings/java/src/operator.rs          |  4 +-
 bindings/java/src/utility.rs           |  4 +-
 5 files changed, 102 insertions(+), 65 deletions(-)

diff --git a/bindings/java/src/blocking_operator.rs 
b/bindings/java/src/blocking_operator.rs
index 4713e8894..a87cd9b44 100644
--- a/bindings/java/src/blocking_operator.rs
+++ b/bindings/java/src/blocking_operator.rs
@@ -27,7 +27,7 @@ use jni::JNIEnv;
 
 use opendal::BlockingOperator;
 
-use crate::jstring_to_string;
+use crate::convert::jstring_to_string;
 use crate::make_entry;
 use crate::make_metadata;
 use crate::Result;
diff --git a/bindings/java/src/convert.rs b/bindings/java/src/convert.rs
new file mode 100644
index 000000000..115bc9981
--- /dev/null
+++ b/bindings/java/src/convert.rs
@@ -0,0 +1,76 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+use jni::objects::{JMap, JObject, JString};
+use jni::sys::jlong;
+use jni::JNIEnv;
+use std::collections::HashMap;
+
+pub(crate) fn usize_to_jlong(n: Option<usize>) -> jlong {
+    // usize is always >= 0, so we can use -1 to identify the empty value.
+    n.map_or(-1, |v| v as jlong)
+}
+
+pub(crate) fn jmap_to_hashmap(
+    env: &mut JNIEnv,
+    params: &JObject,
+) -> crate::Result<HashMap<String, String>> {
+    let map = JMap::from_env(env, params)?;
+    let mut iter = map.iter(env)?;
+
+    let mut result: HashMap<String, String> = HashMap::new();
+    while let Some(e) = iter.next(env)? {
+        let k = JString::from(e.0);
+        let v = JString::from(e.1);
+        result.insert(env.get_string(&k)?.into(), env.get_string(&v)?.into());
+    }
+
+    Ok(result)
+}
+
+pub(crate) fn hashmap_to_jmap<'a>(
+    env: &mut JNIEnv<'a>,
+    map: &HashMap<String, String>,
+) -> crate::Result<JObject<'a>> {
+    let map_object = env.new_object("java/util/HashMap", "()V", &[])?;
+    let jmap = env.get_map(&map_object)?;
+    for (k, v) in map {
+        let key = env.new_string(k)?;
+        let value = env.new_string(v)?;
+        jmap.put(env, &key, &value)?;
+    }
+    Ok(map_object)
+}
+
+pub(crate) fn string_to_jstring<'a>(
+    env: &mut JNIEnv<'a>,
+    s: Option<&str>,
+) -> crate::Result<JObject<'a>> {
+    s.map_or_else(
+        || Ok(JObject::null()),
+        |v| Ok(env.new_string(v.to_string())?.into()),
+    )
+}
+
+/// # Safety
+///
+/// The caller must guarantee that the Object passed in is an instance
+/// of `java.lang.String`, passing in anything else will lead to undefined 
behavior.
+pub(crate) fn jstring_to_string(env: &mut JNIEnv, s: &JString) -> 
crate::Result<String> {
+    let res = unsafe { env.get_string_unchecked(s)? };
+    Ok(res.into())
+}
diff --git a/bindings/java/src/lib.rs b/bindings/java/src/lib.rs
index a70642ae8..f472e7a53 100644
--- a/bindings/java/src/lib.rs
+++ b/bindings/java/src/lib.rs
@@ -19,10 +19,8 @@ use std::cell::RefCell;
 use std::collections::HashMap;
 use std::ffi::c_void;
 
-use crate::error::Error;
 use jni::objects::JObject;
-use jni::objects::JString;
-use jni::objects::{JMap, JValue};
+use jni::objects::JValue;
 use jni::sys::jboolean;
 use jni::sys::jint;
 use jni::sys::jlong;
@@ -41,6 +39,7 @@ use tokio::runtime::Builder;
 use tokio::runtime::Runtime;
 
 mod blocking_operator;
+mod convert;
 mod error;
 mod operator;
 mod utility;
@@ -101,36 +100,6 @@ unsafe fn get_global_runtime<'local>() -> &'local Runtime {
     RUNTIME.get_unchecked()
 }
 
-fn usize_to_jlong(n: Option<usize>) -> jlong {
-    // usize is always >= 0, so we can use -1 to identify the empty value.
-    n.map_or(-1, |v| v as jlong)
-}
-
-fn jmap_to_hashmap(env: &mut JNIEnv, params: &JObject) -> 
Result<HashMap<String, String>> {
-    let map = JMap::from_env(env, params)?;
-    let mut iter = map.iter(env)?;
-
-    let mut result: HashMap<String, String> = HashMap::new();
-    while let Some(e) = iter.next(env)? {
-        let k = JString::from(e.0);
-        let v = JString::from(e.1);
-        result.insert(env.get_string(&k)?.into(), env.get_string(&v)?.into());
-    }
-
-    Ok(result)
-}
-
-fn hashmap_to_jmap<'a>(env: &mut JNIEnv<'a>, map: &HashMap<String, String>) -> 
Result<JObject<'a>> {
-    let map_object = env.new_object("java/util/HashMap", "()V", &[])?;
-    let jmap = env.get_map(&map_object)?;
-    for (k, v) in map {
-        let key = env.new_string(k)?;
-        let value = env.new_string(v)?;
-        jmap.put(env, &key, &value)?;
-    }
-    Ok(map_object)
-}
-
 fn make_presigned_request<'a>(env: &mut JNIEnv<'a>, req: PresignedRequest) -> 
Result<JObject<'a>> {
     let method = env.new_string(req.method().as_str())?;
     let uri = env.new_string(req.uri().to_string())?;
@@ -145,7 +114,7 @@ fn make_presigned_request<'a>(env: &mut JNIEnv<'a>, req: 
PresignedRequest) -> Re
         }
         map
     };
-    let headers = hashmap_to_jmap(env, &headers)?;
+    let headers = convert::hashmap_to_jmap(env, &headers)?;
     let result = env.new_object(
         "org/apache/opendal/PresignedRequest",
         "(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V",
@@ -203,9 +172,9 @@ fn make_capability<'a>(env: &mut JNIEnv<'a>, cap: 
Capability) -> Result<JObject<
             JValue::Bool(cap.write_with_content_type as jboolean),
             JValue::Bool(cap.write_with_content_disposition as jboolean),
             JValue::Bool(cap.write_with_cache_control as jboolean),
-            JValue::Long(usize_to_jlong(cap.write_multi_max_size)),
-            JValue::Long(usize_to_jlong(cap.write_multi_min_size)),
-            JValue::Long(usize_to_jlong(cap.write_multi_align_size)),
+            JValue::Long(convert::usize_to_jlong(cap.write_multi_max_size)),
+            JValue::Long(convert::usize_to_jlong(cap.write_multi_min_size)),
+            JValue::Long(convert::usize_to_jlong(cap.write_multi_align_size)),
             JValue::Bool(cap.create_dir as jboolean),
             JValue::Bool(cap.delete as jboolean),
             JValue::Bool(cap.copy as jboolean),
@@ -221,7 +190,7 @@ fn make_capability<'a>(env: &mut JNIEnv<'a>, cap: 
Capability) -> Result<JObject<
             JValue::Bool(cap.presign_write as jboolean),
             JValue::Bool(cap.batch as jboolean),
             JValue::Bool(cap.batch_delete as jboolean),
-            JValue::Long(usize_to_jlong(cap.batch_max_operations)),
+            JValue::Long(convert::usize_to_jlong(cap.batch_max_operations)),
             JValue::Bool(cap.blocking as jboolean),
         ],
     )?;
@@ -241,7 +210,7 @@ fn make_metadata<'a>(env: &mut JNIEnv<'a>, metadata: 
Metadata) -> Result<JObject
 
     let last_modified = if contains_metakey(Metakey::LastModified) {
         metadata.last_modified().map_or_else(
-            || Ok::<JObject<'_>, Error>(JObject::null()),
+            || Ok::<JObject<'_>, error::Error>(JObject::null()),
             |v| {
                 Ok(env.new_object(
                     "java/util/Date",
@@ -255,35 +224,41 @@ fn make_metadata<'a>(env: &mut JNIEnv<'a>, metadata: 
Metadata) -> Result<JObject
     };
 
     let cache_control = if contains_metakey(Metakey::CacheControl) {
-        string_to_jstring(env, metadata.cache_control())?
+        convert::string_to_jstring(env, metadata.cache_control())?
     } else {
         JObject::null()
     };
+
     let content_disposition = if contains_metakey(Metakey::ContentDisposition) 
{
-        string_to_jstring(env, metadata.content_disposition())?
+        convert::string_to_jstring(env, metadata.content_disposition())?
     } else {
         JObject::null()
     };
+
     let content_md5 = if contains_metakey(Metakey::ContentMd5) {
-        string_to_jstring(env, metadata.content_md5())?
+        convert::string_to_jstring(env, metadata.content_md5())?
     } else {
         JObject::null()
     };
+
     let content_type = if contains_metakey(Metakey::ContentType) {
-        string_to_jstring(env, metadata.content_type())?
+        convert::string_to_jstring(env, metadata.content_type())?
     } else {
         JObject::null()
     };
+
     let etag = if contains_metakey(Metakey::Etag) {
-        string_to_jstring(env, metadata.etag())?
+        convert::string_to_jstring(env, metadata.etag())?
     } else {
         JObject::null()
     };
+
     let version = if contains_metakey(Metakey::Version) {
-        string_to_jstring(env, metadata.version())?
+        convert::string_to_jstring(env, metadata.version())?
     } else {
         JObject::null()
     };
+
     let content_length = if contains_metakey(Metakey::ContentLength) {
         metadata.content_length() as jlong
     } else {
@@ -319,19 +294,3 @@ fn make_entry<'a>(env: &mut JNIEnv<'a>, entry: Entry) -> 
Result<JObject<'a>> {
         &[JValue::Object(&path), JValue::Object(&metadata)],
     )?)
 }
-
-fn string_to_jstring<'a>(env: &mut JNIEnv<'a>, s: Option<&str>) -> 
Result<JObject<'a>> {
-    s.map_or_else(
-        || Ok(JObject::null()),
-        |v| Ok(env.new_string(v.to_string())?.into()),
-    )
-}
-
-/// # Safety
-///
-/// The caller must guarantee that the Object passed in is an instance
-/// of `java.lang.String`, passing in anything else will lead to undefined 
behavior.
-fn jstring_to_string(env: &mut JNIEnv, s: &JString) -> Result<String> {
-    let res = unsafe { env.get_string_unchecked(s)? };
-    Ok(res.into())
-}
diff --git a/bindings/java/src/operator.rs b/bindings/java/src/operator.rs
index 9b9b79982..293ca4b33 100644
--- a/bindings/java/src/operator.rs
+++ b/bindings/java/src/operator.rs
@@ -32,10 +32,10 @@ use opendal::raw::PresignedRequest;
 use opendal::Operator;
 use opendal::Scheme;
 
+use crate::convert::jmap_to_hashmap;
+use crate::convert::jstring_to_string;
 use crate::get_current_env;
 use crate::get_global_runtime;
-use crate::jmap_to_hashmap;
-use crate::jstring_to_string;
 use crate::make_entry;
 use crate::make_metadata;
 use crate::make_operator_info;
diff --git a/bindings/java/src/utility.rs b/bindings/java/src/utility.rs
index eed9f62d3..b3190db7b 100644
--- a/bindings/java/src/utility.rs
+++ b/bindings/java/src/utility.rs
@@ -18,9 +18,11 @@
 use jni::objects::{JClass, JObject};
 use jni::sys::{jobjectArray, jsize};
 use jni::JNIEnv;
+
 use opendal::Scheme;
 
-use crate::{string_to_jstring, Result};
+use crate::convert::string_to_jstring;
+use crate::Result;
 
 /// # Safety
 ///

Reply via email to