From 515cab331c279d9e9882668a80d352fc1b9e3090 Mon Sep 17 00:00:00 2001 From: zaaarf Date: Thu, 8 Aug 2024 00:29:54 +0200 Subject: [PATCH] chore: cleanup, reorganizing java glue --- .gitignore | 26 +++++++++---------- Cargo.toml | 3 +-- {java => dist/java}/build.gradle | 9 +++++-- {java => dist/java}/settings.gradle | 0 .../java}/src/mp/code/BufferController.java | 0 {java => dist/java}/src/mp/code/Client.java | 0 .../java}/src/mp/code/CursorController.java | 0 .../java}/src/mp/code/Workspace.java | 0 .../java}/src/mp/code/data/Cursor.java | 0 .../java}/src/mp/code/data/TextChange.java | 0 .../mp/code/exceptions/ChannelException.java | 0 .../mp/code/exceptions/CodeMPException.java | 0 .../code/exceptions/DeadlockedException.java | 0 .../exceptions/InvalidStateException.java | 0 .../code/exceptions/TransportException.java | 0 .../java/{buffer_controller.rs => buffer.rs} | 15 ++++++++--- src/ffi/java/client.rs | 12 ++++----- .../java/{cursor_controller.rs => cursor.rs} | 5 ++++ src/ffi/java/mod.rs | 6 ++--- src/ffi/java/workspace.rs | 12 ++++----- 20 files changed, 52 insertions(+), 36 deletions(-) rename {java => dist/java}/build.gradle (84%) rename {java => dist/java}/settings.gradle (100%) rename {java => dist/java}/src/mp/code/BufferController.java (100%) rename {java => dist/java}/src/mp/code/Client.java (100%) rename {java => dist/java}/src/mp/code/CursorController.java (100%) rename {java => dist/java}/src/mp/code/Workspace.java (100%) rename {java => dist/java}/src/mp/code/data/Cursor.java (100%) rename {java => dist/java}/src/mp/code/data/TextChange.java (100%) rename {java => dist/java}/src/mp/code/exceptions/ChannelException.java (100%) rename {java => dist/java}/src/mp/code/exceptions/CodeMPException.java (100%) rename {java => dist/java}/src/mp/code/exceptions/DeadlockedException.java (100%) rename {java => dist/java}/src/mp/code/exceptions/InvalidStateException.java (100%) rename {java => dist/java}/src/mp/code/exceptions/TransportException.java (100%) rename src/ffi/java/{buffer_controller.rs => buffer.rs} (84%) rename src/ffi/java/{cursor_controller.rs => cursor.rs} (90%) diff --git a/.gitignore b/.gitignore index bb25495..4ef1d0d 100644 --- a/.gitignore +++ b/.gitignore @@ -14,18 +14,18 @@ index.d.ts index.node # java -java/*.iml -java/.idea/ -java/*.h -java/**/*.class -java/build/ -java/.classpath -java/.gradle/ -java/.project -java/.settings/ -java/bin/ +dist/java/*.iml +dist/java/.idea/ +dist/java/*.h +dist/java/**/*.class +dist/java/build/ +dist/java/.classpath +dist/java/.gradle/ +dist/java/.project +dist/java/.settings/ +dist/java/bin/ # intellij insists on creating the wrapper every time even if it's not strictly necessary -java/gradle/ -java/gradlew -java/gradlew.bat +dist/java/gradle/ +dist/java/gradlew +dist/java/gradlew.bat diff --git a/Cargo.toml b/Cargo.toml index 131420b..9e7c6ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,9 +60,8 @@ napi-build = { version = "2", optional = true } pyo3-build-config = { version = "0.19.2", optional = true } [features] -default = ["js"] +default = [] lua = ["mlua", "derive_more", "lazy_static", "tracing-subscriber"] java = ["lazy_static", "jni", "tracing-subscriber"] -java-artifact = ["java"] # also builds the jar js = ["napi-build", "tracing-subscriber", "rmpv", "napi", "napi-derive", "futures"] python = ["pyo3", "pyo3-asyncio", "tracing-subscriber", "pyo3-build-config"] diff --git a/java/build.gradle b/dist/java/build.gradle similarity index 84% rename from java/build.gradle rename to dist/java/build.gradle index 31d157c..335d696 100644 --- a/java/build.gradle +++ b/dist/java/build.gradle @@ -1,12 +1,16 @@ plugins { - id 'java' + id 'java-library' id 'maven-publish' id 'com.github.johnrengelman.shadow' version '8.1.1' id 'com.palantir.git-version' version '3.1.0' } group = 'mp.code' -version = versionDetails().lastTag +version = versionDetails().lastTag.substring(1) + +java { + sourceCompatibility = targetCompatibility = JavaVersion.VERSION_1_8 +} repositories { mavenCentral() @@ -29,6 +33,7 @@ shadowJar { } def rustDir = projectDir.toPath() + .parent .parent .resolve('target') .resolve('release') diff --git a/java/settings.gradle b/dist/java/settings.gradle similarity index 100% rename from java/settings.gradle rename to dist/java/settings.gradle diff --git a/java/src/mp/code/BufferController.java b/dist/java/src/mp/code/BufferController.java similarity index 100% rename from java/src/mp/code/BufferController.java rename to dist/java/src/mp/code/BufferController.java diff --git a/java/src/mp/code/Client.java b/dist/java/src/mp/code/Client.java similarity index 100% rename from java/src/mp/code/Client.java rename to dist/java/src/mp/code/Client.java diff --git a/java/src/mp/code/CursorController.java b/dist/java/src/mp/code/CursorController.java similarity index 100% rename from java/src/mp/code/CursorController.java rename to dist/java/src/mp/code/CursorController.java diff --git a/java/src/mp/code/Workspace.java b/dist/java/src/mp/code/Workspace.java similarity index 100% rename from java/src/mp/code/Workspace.java rename to dist/java/src/mp/code/Workspace.java diff --git a/java/src/mp/code/data/Cursor.java b/dist/java/src/mp/code/data/Cursor.java similarity index 100% rename from java/src/mp/code/data/Cursor.java rename to dist/java/src/mp/code/data/Cursor.java diff --git a/java/src/mp/code/data/TextChange.java b/dist/java/src/mp/code/data/TextChange.java similarity index 100% rename from java/src/mp/code/data/TextChange.java rename to dist/java/src/mp/code/data/TextChange.java diff --git a/java/src/mp/code/exceptions/ChannelException.java b/dist/java/src/mp/code/exceptions/ChannelException.java similarity index 100% rename from java/src/mp/code/exceptions/ChannelException.java rename to dist/java/src/mp/code/exceptions/ChannelException.java diff --git a/java/src/mp/code/exceptions/CodeMPException.java b/dist/java/src/mp/code/exceptions/CodeMPException.java similarity index 100% rename from java/src/mp/code/exceptions/CodeMPException.java rename to dist/java/src/mp/code/exceptions/CodeMPException.java diff --git a/java/src/mp/code/exceptions/DeadlockedException.java b/dist/java/src/mp/code/exceptions/DeadlockedException.java similarity index 100% rename from java/src/mp/code/exceptions/DeadlockedException.java rename to dist/java/src/mp/code/exceptions/DeadlockedException.java diff --git a/java/src/mp/code/exceptions/InvalidStateException.java b/dist/java/src/mp/code/exceptions/InvalidStateException.java similarity index 100% rename from java/src/mp/code/exceptions/InvalidStateException.java rename to dist/java/src/mp/code/exceptions/InvalidStateException.java diff --git a/java/src/mp/code/exceptions/TransportException.java b/dist/java/src/mp/code/exceptions/TransportException.java similarity index 100% rename from java/src/mp/code/exceptions/TransportException.java rename to dist/java/src/mp/code/exceptions/TransportException.java diff --git a/src/ffi/java/buffer_controller.rs b/src/ffi/java/buffer.rs similarity index 84% rename from src/ffi/java/buffer_controller.rs rename to src/ffi/java/buffer.rs index e094d97..66a2199 100644 --- a/src/ffi/java/buffer_controller.rs +++ b/src/ffi/java/buffer.rs @@ -4,6 +4,7 @@ use crate::api::Controller; use super::{util::JExceptable, RT}; +/// Gets the name of the buffer. #[no_mangle] pub extern "system" fn Java_mp_code_BufferController_get_1name( env: JNIEnv, @@ -17,6 +18,7 @@ pub extern "system" fn Java_mp_code_BufferController_get_1name( .as_raw() } +/// Gets the contents of the buffers. #[no_mangle] pub extern "system" fn Java_mp_code_BufferController_get_1content( env: JNIEnv, @@ -30,6 +32,7 @@ pub extern "system" fn Java_mp_code_BufferController_get_1content( .as_raw() } +/// Tries to fetch a [crate::api::TextChange], or returns null if there's nothing. #[no_mangle] pub extern "system" fn Java_mp_code_BufferController_try_1recv( mut env: JNIEnv, @@ -41,6 +44,7 @@ pub extern "system" fn Java_mp_code_BufferController_try_1recv( recv_jni(&mut env, change) } +/// Blocks until it receives a [crate::api::TextChange]. #[no_mangle] pub extern "system" fn Java_mp_code_BufferController_recv( mut env: JNIEnv, @@ -52,6 +56,7 @@ pub extern "system" fn Java_mp_code_BufferController_recv( recv_jni(&mut env, change) } +/// Utility method to convert a [crate::api::TextChange] to its Java equivalent. fn recv_jni(env: &mut JNIEnv, change: Option) -> jobject { match change { None => JObject::null().as_raw(), @@ -61,16 +66,16 @@ fn recv_jni(env: &mut JNIEnv, change: Option) -> jobject class, "(JJLjava/lang/String;)V", &[ - JValueGen::Long(event.span.start.try_into().unwrap()), - JValueGen::Long(event.span.end.try_into().unwrap()), + JValueGen::Long(jlong::from(event.start)), + JValueGen::Long(jlong::from(event.end)), JValueGen::Object(&env.new_string(event.content).expect("Failed to create String!")), ] ).expect("failed creating object").into_raw() } } - } +/// Receives from Java, converts and sends a [crate::api::TextChange]. #[no_mangle] pub extern "system" fn Java_mp_code_BufferController_send<'local>( mut env: JNIEnv, @@ -89,11 +94,13 @@ pub extern "system" fn Java_mp_code_BufferController_send<'local>( let controller = unsafe { Box::leak(Box::from_raw(self_ptr as *mut crate::buffer::Controller)) }; controller.send(crate::api::TextChange { - span: (start as usize)..(end as usize), + start: start as u32, + end: end as u32 content }).jexcept(&mut env); } +/// Called by the Java GC to drop a [crate::buffer::Controller]. #[no_mangle] pub extern "system" fn Java_mp_code_BufferController_free( _env: JNIEnv, diff --git a/src/ffi/java/client.rs b/src/ffi/java/client.rs index 4dba552..4a471e5 100644 --- a/src/ffi/java/client.rs +++ b/src/ffi/java/client.rs @@ -3,12 +3,6 @@ use crate::{client::Client, Workspace}; use super::{util::JExceptable, RT}; -/// Called by the Java GC to drop a [Client]. -#[no_mangle] -pub extern "system" fn Java_mp_code_Client_free(_env: JNIEnv, _class: JClass, input: jlong) { - let _ = unsafe { Box::from_raw(input as *mut Client) }; -} - /// Connects to a given URL and returns a [Client] to interact with that server. #[no_mangle] pub extern "system" fn Java_mp_code_Client_connect<'local>( @@ -110,3 +104,9 @@ pub extern "system" fn Java_mp_code_Client_setup_1tracing<'local>( .map(|p| env.get_string(&p).expect("couldn't get java string").into()) ); } + +/// Called by the Java GC to drop a [Client]. +#[no_mangle] +pub extern "system" fn Java_mp_code_Client_free(_env: JNIEnv, _class: JClass, input: jlong) { + let _ = unsafe { Box::from_raw(input as *mut Client) }; +} diff --git a/src/ffi/java/cursor_controller.rs b/src/ffi/java/cursor.rs similarity index 90% rename from src/ffi/java/cursor_controller.rs rename to src/ffi/java/cursor.rs index a2be4b8..91217c4 100644 --- a/src/ffi/java/cursor_controller.rs +++ b/src/ffi/java/cursor.rs @@ -3,6 +3,7 @@ use crate::{api::Controller, ffi::java::util::JExceptable}; use super::RT; +/// Tries to fetch a [crate::api::Cursor], or returns null if there's nothing. #[no_mangle] pub extern "system" fn Java_mp_code_CursorController_try_1recv( mut env: JNIEnv, @@ -14,6 +15,7 @@ pub extern "system" fn Java_mp_code_CursorController_try_1recv( jni_recv(&mut env, cursor) } +/// Blocks until it receives a [crate::api::Cursor]. #[no_mangle] pub extern "system" fn Java_mp_code_CursorController_recv( mut env: JNIEnv, @@ -25,6 +27,7 @@ pub extern "system" fn Java_mp_code_CursorController_recv( jni_recv(&mut env, cursor) } +/// Utility method to convert a [crate::api::Cursor] to its Java equivalent. fn jni_recv(env: &mut JNIEnv, cursor: Option) -> jobject { match cursor { None => JObject::null().as_raw(), @@ -46,6 +49,7 @@ fn jni_recv(env: &mut JNIEnv, cursor: Option) -> jobject { } } +/// Receives from Java, converts and sends a [crate::api::Cursor]. #[no_mangle] pub extern "system" fn Java_mp_code_CursorController_send<'local>( mut env: JNIEnv, @@ -86,6 +90,7 @@ pub extern "system" fn Java_mp_code_CursorController_send<'local>( }).jexcept(&mut env); } +/// Called by the Java GC to drop a [crate::cursor::Controller]. #[no_mangle] pub extern "system" fn Java_mp_code_CursorController_free( _env: JNIEnv, diff --git a/src/ffi/java/mod.rs b/src/ffi/java/mod.rs index 1e9a3d5..f35a5ec 100644 --- a/src/ffi/java/mod.rs +++ b/src/ffi/java/mod.rs @@ -1,14 +1,14 @@ pub mod client; pub mod workspace; pub mod util; - -pub mod cursor_controller; -pub mod buffer_controller; +pub mod cursor; +pub mod buffer; lazy_static::lazy_static! { pub(crate) static ref RT: tokio::runtime::Runtime = tokio::runtime::Runtime::new().expect("could not create tokio runtime"); } +/// Sets up logging. Useful for debugging. pub(crate) fn setup_logger(debug: bool, path: Option) { let format = tracing_subscriber::fmt::format() .with_level(true) diff --git a/src/ffi/java/workspace.rs b/src/ffi/java/workspace.rs index 9fa958e..766c9ce 100644 --- a/src/ffi/java/workspace.rs +++ b/src/ffi/java/workspace.rs @@ -3,12 +3,6 @@ use crate::Workspace; use super::{util::JExceptable, RT}; -/// Called by the Java GC to drop a [Workspace]. -#[no_mangle] -pub extern "system" fn Java_mp_code_Workspace_free(_env: JNIEnv, _class: JClass, input: jlong) { - let _ = unsafe { Box::from_raw(input as *mut Workspace) }; -} - /// Gets the workspace id. #[no_mangle] pub extern "system" fn Java_mp_code_Workspace_get_1workspace_1id<'local>( @@ -202,3 +196,9 @@ pub extern "system" fn Java_mp_code_Workspace_select_1buffer( JObject::null().as_raw() } } + +/// Called by the Java GC to drop a [Workspace]. +#[no_mangle] +pub extern "system" fn Java_mp_code_Workspace_free(_env: JNIEnv, _class: JClass, input: jlong) { + let _ = unsafe { Box::from_raw(input as *mut Workspace) }; +}