Skip to content

Commit

Permalink
feat(binding/java): support info ops (#3154)
Browse files Browse the repository at this point in the history
* feat(binding/java): support info ops

* feat(binding/java): cast usize to long

* chore(binding/java): del unused import
  • Loading branch information
G-XD authored Sep 21, 2023
1 parent 332748b commit 23f05b9
Show file tree
Hide file tree
Showing 8 changed files with 550 additions and 4 deletions.
25 changes: 25 additions & 0 deletions bindings/java/src/blocking_operator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ use opendal::Scheme;

use crate::get_global_runtime;
use crate::jmap_to_hashmap;
use crate::make_operator_info;
use crate::Result;

#[no_mangle]
Expand Down Expand Up @@ -160,3 +161,27 @@ fn intern_delete(env: &mut JNIEnv, op: &mut BlockingOperator, path: JString) ->
let path = env.get_string(&path)?;
Ok(op.delete(path.to_str()?)?)
}

/// # Safety
///
/// This function should not be called before the Operator are ready.
#[no_mangle]
pub unsafe extern "system" fn Java_org_apache_opendal_BlockingOperator_info<'local>(
mut env: JNIEnv<'local>,
_: JClass,
op: *mut BlockingOperator,
) -> JObject<'local> {
intern_info(&mut env, &mut *op).unwrap_or_else(|e| {
e.throw(&mut env);
JObject::null()
})
}

fn intern_info<'local>(
env: &mut JNIEnv<'local>,
op: &mut BlockingOperator,
) -> Result<JObject<'local>> {
let info = op.info();

make_operator_info(env, info)
}
86 changes: 82 additions & 4 deletions bindings/java/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,23 @@ use std::cell::RefCell;
use std::collections::HashMap;
use std::ffi::c_void;

use jni::objects::JMap;
use crate::error::Error;
use jni::objects::JObject;
use jni::objects::JString;
use jni::objects::JValue;
use jni::objects::{JMap, JValue};
use jni::sys::jboolean;
use jni::sys::jint;
use jni::sys::jlong;
use jni::sys::JNI_VERSION_1_8;
use jni::JNIEnv;
use jni::JavaVM;
use once_cell::sync::OnceCell;
use opendal::raw::PresignedRequest;
use opendal::Capability;
use opendal::OperatorInfo;
use tokio::runtime::Builder;
use tokio::runtime::Runtime;

use crate::error::Error;

mod blocking_operator;
mod error;
mod metadata;
Expand Down Expand Up @@ -144,3 +146,79 @@ fn make_presigned_request<'a>(env: &mut JNIEnv<'a>, req: PresignedRequest) -> Re
)?;
Ok(result)
}

fn make_operator_info<'a>(env: &mut JNIEnv<'a>, info: OperatorInfo) -> Result<JObject<'a>> {
let operator_info_class = env.find_class("org/apache/opendal/OperatorInfo")?;

let schema = env.new_string(info.scheme().to_string())?;
let root = env.new_string(info.root().to_string())?;
let name = env.new_string(info.name().to_string())?;
let full_capability_obj = make_capability(env, info.full_capability())?;
let native_capability_obj = make_capability(env, info.native_capability())?;

let operator_info_obj = env
.new_object(
operator_info_class,
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/apache/opendal/Capability;Lorg/apache/opendal/Capability;)V",
&[
JValue::Object(&schema),
JValue::Object(&root),
JValue::Object(&name),
JValue::Object(&full_capability_obj),
JValue::Object(&native_capability_obj),
],
)?;

Ok(operator_info_obj)
}

fn make_capability<'a>(env: &mut JNIEnv<'a>, cap: Capability) -> Result<JObject<'a>> {
let capability_class = env.find_class("org/apache/opendal/Capability")?;

let capability = env.new_object(
capability_class,
"(ZZZZZZZZZZZZZZZZZZJJJZZZZZZZZZZZZZZZJZ)V",
&[
JValue::Bool(cap.stat as jboolean),
JValue::Bool(cap.stat_with_if_match as jboolean),
JValue::Bool(cap.stat_with_if_none_match as jboolean),
JValue::Bool(cap.read as jboolean),
JValue::Bool(cap.read_can_seek as jboolean),
JValue::Bool(cap.read_can_next as jboolean),
JValue::Bool(cap.read_with_range as jboolean),
JValue::Bool(cap.read_with_if_match as jboolean),
JValue::Bool(cap.read_with_if_none_match as jboolean),
JValue::Bool(cap.read_with_override_cache_control as jboolean),
JValue::Bool(cap.read_with_override_content_disposition as jboolean),
JValue::Bool(cap.read_with_override_content_type as jboolean),
JValue::Bool(cap.write as jboolean),
JValue::Bool(cap.write_can_multi as jboolean),
JValue::Bool(cap.write_can_append as jboolean),
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(cap.write_multi_max_size.map_or(-1, |v| v as jlong)),
JValue::Long(cap.write_multi_min_size.map_or(-1, |v| v as jlong)),
JValue::Long(cap.write_multi_align_size.map_or(-1, |v| v as jlong)),
JValue::Bool(cap.create_dir as jboolean),
JValue::Bool(cap.delete as jboolean),
JValue::Bool(cap.copy as jboolean),
JValue::Bool(cap.rename as jboolean),
JValue::Bool(cap.list as jboolean),
JValue::Bool(cap.list_with_limit as jboolean),
JValue::Bool(cap.list_with_start_after as jboolean),
JValue::Bool(cap.list_with_delimiter_slash as jboolean),
JValue::Bool(cap.list_without_delimiter as jboolean),
JValue::Bool(cap.presign as jboolean),
JValue::Bool(cap.presign_read as jboolean),
JValue::Bool(cap.presign_stat as jboolean),
JValue::Bool(cap.presign_write as jboolean),
JValue::Bool(cap.batch as jboolean),
JValue::Bool(cap.batch_delete as jboolean),
JValue::Long(cap.batch_max_operations.map_or(-1, |v| v as jlong)),
JValue::Bool(cap.blocking as jboolean),
],
)?;

Ok(capability)
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ public Metadata stat(String path) {
return new Metadata(stat(nativeHandle, path));
}

public OperatorInfo info() {
return info(nativeHandle);
}

@Override
protected native void disposeInternal(long handle);

Expand All @@ -73,4 +77,6 @@ public Metadata stat(String path) {
private static native void delete(long nativeHandle, String path);

private static native long stat(long nativeHandle, String path);

private static native OperatorInfo info(long nativeHandle);
}
Loading

0 comments on commit 23f05b9

Please sign in to comment.