Skip to content

Commit a3395a0

Browse files
committed
java-sdk fix limit_depth_level and trigger_count as Integer
1 parent e3af0aa commit a3395a0

7 files changed

Lines changed: 81 additions & 14 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
# [3.0.21]
8+
9+
- java-sdk: fix `limit_depth_level` and `trigger_count` being correctly passed and read as `Integer` in submit/replace order options and order detail.
10+
711
# [3.0.20]
812

913
- add `limit_depth_level`, `trigger_count`, `monitor_price` to `OrderDetail`, 'Order' types.

java/crates/macros/src/lib.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,14 @@ struct FieldArgs {
1414
objarray: bool,
1515
#[darling(default)]
1616
priarray: bool,
17+
/// Rust type used for set_field: must implement IntoJValue and
18+
/// From<FieldType>.
1719
#[darling(default)]
18-
derivative_types: bool,
20+
set_as: Option<Path>,
21+
/// Like set_as but for Option<T> fields: wrapper type with
22+
/// From<Option<FieldType>>.
23+
#[darling(default)]
24+
set_as_opt: Option<Path>,
1925
}
2026

2127
#[derive(FromMeta, Debug, Default)]
@@ -122,9 +128,15 @@ pub fn impl_java_class(input: TokenStream) -> TokenStream {
122128
};
123129
let java_field = ident.to_string().to_camel_case();
124130

125-
if args.derivative_types {
131+
if let Some(set_type) = args.set_as_opt.as_ref() {
132+
// Option<T> field: pass ident.map(set_type::from) as Option<set_type>, which
133+
// implements IntoJValue
134+
set_fields.push(quote! {
135+
crate::types::set_field(env, &obj, #java_field, #ident.map(#set_type::from))?;
136+
});
137+
} else if let Some(set_type) = args.set_as.as_ref() {
126138
set_fields.push(quote! {
127-
crate::types::set_field(env, &obj, #java_field, crate::types::enum_types::DerivativeTypes::from(#ident))?;
139+
crate::types::set_field(env, &obj, #java_field, #set_type::from(#ident))?;
128140
});
129141
} else if args.objarray {
130142
set_fields.push(quote! {

java/src/init.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use jni::{
88

99
use crate::types::ClassLoader;
1010

11+
pub(crate) static INTEGER_CLASS: OnceLock<GlobalRef> = OnceLock::new();
1112
pub(crate) static LONG_CLASS: OnceLock<GlobalRef> = OnceLock::new();
1213
pub(crate) static STRING_CLASS: OnceLock<GlobalRef> = OnceLock::new();
1314
pub(crate) static DECIMAL_CLASS: OnceLock<GlobalRef> = OnceLock::new();
@@ -59,6 +60,7 @@ pub extern "system" fn Java_com_longport_SdkNative_init<'a>(
5960
) {
6061
init_class!(
6162
env,
63+
(INTEGER_CLASS, "java/lang/Integer"),
6264
(LONG_CLASS, "java/lang/Long"),
6365
(STRING_CLASS, "java/lang/String"),
6466
(DECIMAL_CLASS, "java/math/BigDecimal"),

java/src/trade_context.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::{
2323
async_util,
2424
error::jni_result,
2525
init::TRADE_CONTEXT_CLASS,
26-
types::{FromJValue, IntoJValue, ObjectArray, get_field, set_field},
26+
types::{FromJValue, IntoJValue, JavaInteger, ObjectArray, get_field, set_field},
2727
};
2828

2929
#[derive(Default)]
@@ -350,13 +350,13 @@ pub unsafe extern "system" fn Java_com_longport_SdkNative_tradeContextReplaceOrd
350350
if let Some(trailing_percent) = trailing_percent {
351351
new_opts = new_opts.trailing_percent(trailing_percent);
352352
}
353-
let limit_depth_level: Option<i32> = get_field(env, &opts, "limitDepthLevel")?;
353+
let limit_depth_level: Option<JavaInteger> = get_field(env, &opts, "limitDepthLevel")?;
354354
if let Some(limit_depth_level) = limit_depth_level {
355-
new_opts = new_opts.limit_depth_level(limit_depth_level);
355+
new_opts = new_opts.limit_depth_level(limit_depth_level.into());
356356
}
357-
let trigger_count: Option<i32> = get_field(env, &opts, "triggerCount")?;
357+
let trigger_count: Option<JavaInteger> = get_field(env, &opts, "triggerCount")?;
358358
if let Some(trigger_count) = trigger_count {
359-
new_opts = new_opts.trigger_count(trigger_count);
359+
new_opts = new_opts.trigger_count(trigger_count.into());
360360
}
361361
let monitor_price: Option<Decimal> = get_field(env, &opts, "monitorPrice")?;
362362
if let Some(monitor_price) = monitor_price {
@@ -419,13 +419,13 @@ pub unsafe extern "system" fn Java_com_longport_SdkNative_tradeContextSubmitOrde
419419
if let Some(outside_rth) = outside_rth {
420420
new_opts = new_opts.outside_rth(outside_rth);
421421
}
422-
let limit_depth_level: Option<i32> = get_field(env, &opts, "limitDepthLevel")?;
422+
let limit_depth_level: Option<JavaInteger> = get_field(env, &opts, "limitDepthLevel")?;
423423
if let Some(limit_depth_level) = limit_depth_level {
424-
new_opts = new_opts.limit_depth_level(limit_depth_level);
424+
new_opts = new_opts.limit_depth_level(limit_depth_level.into());
425425
}
426-
let trigger_count: Option<i32> = get_field(env, &opts, "triggerCount")?;
426+
let trigger_count: Option<JavaInteger> = get_field(env, &opts, "triggerCount")?;
427427
if let Some(trigger_count) = trigger_count {
428-
new_opts = new_opts.trigger_count(trigger_count);
428+
new_opts = new_opts.trigger_count(trigger_count.into());
429429
}
430430
let monitor_price: Option<Decimal> = get_field(env, &opts, "monitorPrice")?;
431431
if let Some(monitor_price) = monitor_price {

java/src/types/classes.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ impl_java_class!(
123123
eps_ttm,
124124
bps,
125125
dividend_yield,
126-
#[java(derivative_types)]
126+
#[java(set_as = crate::types::enum_types::DerivativeTypes)]
127127
stock_derivatives,
128128
board,
129129
]
@@ -652,7 +652,9 @@ impl_java_class!(
652652
trigger_status,
653653
currency,
654654
outside_rth,
655+
#[java(set_as_opt = crate::types::JavaInteger)]
655656
limit_depth_level,
657+
#[java(set_as_opt = crate::types::JavaInteger)]
656658
trigger_count,
657659
monitor_price,
658660
remark
@@ -915,7 +917,9 @@ impl_java_class!(
915917
trigger_status,
916918
currency,
917919
outside_rth,
920+
#[java(set_as_opt = crate::types::JavaInteger)]
918921
limit_depth_level,
922+
#[java(set_as_opt = crate::types::JavaInteger)]
919923
trigger_count,
920924
monitor_price,
921925
remark,

java/src/types/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub(crate) use self::{
2525
},
2626
object_array::ObjectArray,
2727
primary_array::PrimaryArray,
28+
primary_types::JavaInteger,
2829
};
2930

3031
pub(crate) trait ClassLoader {

java/src/types/primary_types.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ use std::borrow::Cow;
22

33
use jni::{JNIEnv, errors::Result, objects::JValueOwned};
44

5-
use crate::types::{FromJValue, IntoJValue, JSignature};
5+
use crate::{
6+
init::INTEGER_CLASS,
7+
types::{FromJValue, IntoJValue, JSignature},
8+
};
69

710
impl JSignature for i32 {
811
fn signature() -> Cow<'static, str> {
@@ -83,3 +86,44 @@ impl IntoJValue for f64 {
8386
Ok(JValueOwned::from(self))
8487
}
8588
}
89+
90+
pub(crate) struct JavaInteger(i32);
91+
92+
impl From<i32> for JavaInteger {
93+
#[inline]
94+
fn from(value: i32) -> Self {
95+
JavaInteger(value)
96+
}
97+
}
98+
99+
impl From<JavaInteger> for i32 {
100+
#[inline]
101+
fn from(value: JavaInteger) -> Self {
102+
value.0
103+
}
104+
}
105+
106+
impl JSignature for JavaInteger {
107+
fn signature() -> Cow<'static, str> {
108+
"Ljava/lang/Integer;".into()
109+
}
110+
}
111+
112+
impl FromJValue for JavaInteger {
113+
fn from_jvalue(env: &mut JNIEnv, value: JValueOwned) -> Result<Self> {
114+
let obj = value.l()?;
115+
let value = env.call_method(obj, "intValue", "()I", &[])?;
116+
Ok(JavaInteger(value.i()?))
117+
}
118+
}
119+
120+
impl IntoJValue for JavaInteger {
121+
fn into_jvalue<'a>(self, env: &mut JNIEnv<'a>) -> Result<JValueOwned<'a>> {
122+
let obj = env.new_object(
123+
INTEGER_CLASS.get().unwrap(),
124+
"(I)V",
125+
&[JValueOwned::from(self.0).borrow()],
126+
)?;
127+
Ok(JValueOwned::from(obj))
128+
}
129+
}

0 commit comments

Comments
 (0)