1use jni::JNIEnv;
23use jni::sys::jlong;
24
25pub enum DMSCJavaException {
27 DMSCErrors,
29 ConfigError,
31 ValidationError,
33 AuthError,
35 DatabaseError,
37 CacheError,
39 NetworkError,
41 NullPointerError,
43 IllegalArgumentError,
45}
46
47impl DMSCJavaException {
48 pub fn class_name(&self) -> &'static str {
50 match self {
51 DMSCJavaException::DMSCErrors => "com/dunimd/dmsc/DMSCError",
52 DMSCJavaException::ConfigError => "com/dunimd/dmsc/DMSCConfigError",
53 DMSCJavaException::ValidationError => "com/dunimd/dmsc/validation/DMSCValidationError",
54 DMSCJavaException::AuthError => "com/dunimd/dmsc/auth/DMSCAuthError",
55 DMSCJavaException::DatabaseError => "com/dunimd/dmsc/database/DMSCDatabaseError",
56 DMSCJavaException::CacheError => "com/dunimd/dmsc/cache/DMSCCacheError",
57 DMSCJavaException::NetworkError => "com/dunimd/dmsc/DMSCNetworkError",
58 DMSCJavaException::NullPointerError => "java/lang/NullPointerException",
59 DMSCJavaException::IllegalArgumentError => "java/lang/IllegalArgumentException",
60 }
61 }
62}
63
64pub fn throw_exception(env: &mut JNIEnv, exception_type: DMSCJavaException, message: &str) {
66 let class_name = exception_type.class_name();
67
68 if let Err(e) = env.throw_new(class_name, message) {
69 eprintln!("Failed to throw Java exception: {:?}", e);
70 }
71}
72
73pub fn throw_dmsc_error(env: &mut JNIEnv, message: &str) {
75 throw_exception(env, DMSCJavaException::DMSCErrors, message);
76}
77
78pub fn throw_null_pointer(env: &mut JNIEnv, message: &str) {
80 throw_exception(env, DMSCJavaException::NullPointerError, message);
81}
82
83pub fn throw_illegal_argument(env: &mut JNIEnv, message: &str) {
85 throw_exception(env, DMSCJavaException::IllegalArgumentError, message);
86}
87
88pub fn check_not_null(env: &mut JNIEnv, ptr: jlong, context: &str) -> bool {
90 if ptr == 0 {
91 throw_null_pointer(env, &format!("{} pointer is null", context));
92 false
93 } else {
94 true
95 }
96}
97
98#[macro_export]
100macro_rules! check_java_ptr {
101 ($env:expr, $ptr:expr, $context:expr) => {
102 if !$crate::java::exception::check_not_null($env, $ptr, $context) {
103 return;
104 }
105 };
106}
107
108#[macro_export]
110macro_rules! check_java_ptr_or_default {
111 ($env:expr, $ptr:expr, $context:expr, $default:expr) => {
112 if !$crate::java::exception::check_not_null($env, $ptr, $context) {
113 return $default;
114 }
115 };
116}