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