Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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