Skip to content

Commit

Permalink
not able to create iterator
Browse files Browse the repository at this point in the history
Signed-off-by: pushkarm029 <pushkarmishra029@gmail.com>
  • Loading branch information
Pushkarm029 committed Jun 26, 2024
1 parent 5872949 commit d98b080
Show file tree
Hide file tree
Showing 9 changed files with 338 additions and 138 deletions.
35 changes: 0 additions & 35 deletions fs-storage/src/jni/btree_wrapper.rs

This file was deleted.

122 changes: 61 additions & 61 deletions fs-storage/src/jni/file_storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ use jnix::{IntoJava, JnixEnv};

use crate::base_storage::BaseStorage;

use super::btree_wrapper::WrapperBTreeMap;
// use super::btree_wrapper::WrapperBTreeMap;
use crate::file_storage::FileStorage;

impl FileStorage<String, String> {
fn from_jlong<'a>(value: jlong) -> &'a mut Self {
pub fn from_jlong<'a>(value: jlong) -> &'a mut Self {
unsafe { &mut *(value as *mut FileStorage<String, String>) }
}
}
Expand Down Expand Up @@ -241,66 +241,66 @@ pub extern "system" fn Java_FileStorage_merge(
});
}

#[no_mangle]
pub extern "system" fn Java_FileStorage_createIterator<'local>(
_env: JNIEnv<'local>,
_class: JClass<'local>,
file_storage_ptr: jlong,
) -> jlong {
let wrapper =
WrapperBTreeMap::new(FileStorage::from_jlong(file_storage_ptr));
Box::into_raw(Box::new(wrapper)) as jlong
}
// #[no_mangle]
// pub extern "system" fn Java_FileStorage_createIterator<'local>(
// _env: JNIEnv<'local>,
// _class: JClass<'local>,
// file_storage_ptr: jlong,
// ) -> jlong {
// let wrapper =
// WrapperBTreeMap::new(FileStorage::from_jlong(file_storage_ptr));
// Box::into_raw(Box::new(wrapper)) as jlong
// }

#[no_mangle]
pub extern "system" fn Java_FileStorageIterator_hasNext<'local>(
_env: JNIEnv<'local>,
_class: JClass<'local>,
iterator_ptr: jlong,
) -> jboolean {
let iterator: &mut WrapperBTreeMap<String, String> =
WrapperBTreeMap::from_jlong(iterator_ptr);
iterator.has_next() as jboolean
}
// #[no_mangle]
// pub extern "system" fn Java_FileStorageIterator_hasNext<'local>(
// _env: JNIEnv<'local>,
// _class: JClass<'local>,
// iterator_ptr: jlong,
// ) -> jboolean {
// let iterator: &mut WrapperBTreeMap<String, String> =
// WrapperBTreeMap::from_jlong(iterator_ptr);
// iterator.has_next() as jboolean
// }

#[no_mangle]
pub extern "system" fn Java_FileStorageIterator_next<'local>(
mut env: JNIEnv<'local>,
_class: JClass<'local>,
iterator_ptr: jlong,
) -> jobject {
if let Some((key, value)) =
WrapperBTreeMap::<String, String>::from_jlong(iterator_ptr)
.native_next()
{
let entry_class = env
.find_class("java/util/AbstractMap$SimpleEntry")
.unwrap();
let entry = env
.new_object(
entry_class,
"(Ljava/lang/Object;Ljava/lang/Object;)V",
&[
(&JObject::from(env.new_string(key).unwrap())).into(),
(&JObject::from(env.new_string(value).unwrap())).into(),
],
)
.unwrap();
// #[no_mangle]
// pub extern "system" fn Java_FileStorageIterator_next<'local>(
// mut env: JNIEnv<'local>,
// _class: JClass<'local>,
// iterator_ptr: jlong,
// ) -> jobject {
// if let Some((key, value)) =
// WrapperBTreeMap::<String, String>::from_jlong(iterator_ptr)
// .native_next()
// {
// let entry_class = env
// .find_class("java/util/AbstractMap$SimpleEntry")
// .unwrap();
// let entry = env
// .new_object(
// entry_class,
// "(Ljava/lang/Object;Ljava/lang/Object;)V",
// &[
// (&JObject::from(env.new_string(key).unwrap())).into(),
// (&JObject::from(env.new_string(value).unwrap())).into(),
// ],
// )
// .unwrap();

return entry.into_raw();
}
JObject::null().into_raw()
}
// return entry.into_raw();
// }
// JObject::null().into_raw()
// }

#[no_mangle]
pub extern "system" fn Java_FileStorageIterator_destroyIterator<'local>(
_env: JNIEnv<'local>,
_class: JClass<'local>,
iterator_ptr: jlong,
) {
unsafe {
drop(Box::from_raw(
iterator_ptr as *mut WrapperBTreeMap<String, String>,
));
}
}
// #[no_mangle]
// pub extern "system" fn Java_FileStorageIterator_destroyIterator<'local>(
// _env: JNIEnv<'local>,
// _class: JClass<'local>,
// iterator_ptr: jlong,
// ) {
// unsafe {
// drop(Box::from_raw(
// iterator_ptr as *mut WrapperBTreeMap<String, String>,
// ));
// }
// }
2 changes: 1 addition & 1 deletion fs-storage/src/jni/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
pub mod btree_wrapper;
pub mod wrapper_btreemap;
pub mod file_storage;
86 changes: 86 additions & 0 deletions fs-storage/src/jni/wrapper_btreemap.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
use crate::wrapper_btreemap::WrapperBTreeMap;
use crate::file_storage::FileStorage;
// This is the interface to the JVM that we'll call the majority of our
// methods on.
use jni::JNIEnv;

// These objects are what you should use as arguments to your native
// function. They carry extra lifetime information to prevent them escaping
// this context and getting used after being GC'd.
use jni::objects::{JClass, JObject, JString, JValue};

// This is just a pointer. We'll be returning it from our function. We
// can't return one of the objects with lifetime information because the
// lifetime checker won't let us.
use jni::sys::{jboolean, jlong, jobject, jstring};
use jnix::{IntoJava, JnixEnv};

impl WrapperBTreeMap<String, String> {
pub fn from_jlong(value: jlong) -> &'static mut Self {
unsafe { &mut *(value as *mut WrapperBTreeMap<String, String>) }
}
}

// JNI bindings

// #[no_mangle]
// pub extern "system" fn Java_FileStorage_create<'local>(
// mut env: JNIEnv<'local>,
// _class: JClass,
// label: JString<'local>,
// path: JString<'local>,
// ) -> jlong {
// let label: String = env
// .get_string(&label)
// .expect("Couldn't get label!")
// .into();
// let path: String = env
// .get_string(&path)
// .expect("Couldn't get path!")
// .into();

// let file_storage: FileStorage<String, String> =
// FileStorage::new(label, Path::new(&path)).unwrap_or_else(|err| {
// env.throw_new("java/lang/RuntimeException", &err.to_string())
// .expect("Failed to throw RuntimeException");
// FileStorage::new("".to_string(), Path::new("")).unwrap()
// });
// Box::into_raw(Box::new(file_storage)) as jlong
// }

#[no_mangle]
pub extern "system" fn Java_WrapperBTreeMap_create<'local>(
mut env: JNIEnv<'local>,
_class: JClass,
storage_ptr: jlong,
) -> jlong {
// currently, only for file_storage
let filestorage = FileStorage::from_jlong(storage_ptr);
let wrapper = WrapperBTreeMap::new(filestorage);
Box::into_raw(Box::new(wrapper)) as jlong
}

#[no_mangle]
pub extern "system" fn Java_WrapperBTreeMap_get<'local>(
mut env: JNIEnv<'local>,
_class: JClass,
id: JString<'local>,
wrapper_ptr: jlong,
) -> jstring {
let id: String = env.get_string(&id).expect("msg").into();
let wrapper = WrapperBTreeMap::from_jlong(wrapper_ptr);
let data: String = wrapper.get_data(id);
env.new_string(data).unwrap().into_raw()
}

// match value {
// Some(value) => env.new_string(value).unwrap().into_raw(),
// None => {
// env.throw_new(
// "java/lang/RuntimeException",
// &"no value present for this key".to_string(),
// )
// .unwrap();
// env.new_string("").unwrap().into_raw()
// }
// }
1 change: 1 addition & 0 deletions fs-storage/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
pub mod base_storage;
pub mod file_storage;
pub mod wrapper_btreemap;
#[cfg(feature = "jni-bindings")]
pub mod jni;
pub mod monoid;
Expand Down
79 changes: 79 additions & 0 deletions fs-storage/src/wrapper_btreemap.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
use crate::base_storage::BaseStorage;
use std::cell::RefCell;
use std::collections::btree_map::{IntoIter, Iter};
use std::collections::BTreeMap;
use std::rc::Rc;

pub struct WrapperBTreeMap<K, V> {
data: Rc<RefCell<BTreeMap<K, V>>>,
index: usize,
}

impl<K, V> WrapperBTreeMap<K, V>
where
K: Ord + Clone,
V: Clone,
{
pub fn new<S: BaseStorage<K, V>>(storage: &S) -> Self {
WrapperBTreeMap {
data: Rc::new(RefCell::new(storage.as_ref().clone())),
index: 0,
}
}

pub fn get_data(&self, id: K) -> V {
let borrow = self.data.borrow();
borrow.get(&id).unwrap().clone()
}

// pub fn has_next(&self) -> bool {
// let borrow = self.data.borrow_mut();
// let iter = borrow.iter();
// iter.clone().nth(self.index).is_some()
// }

// pub fn native_next(&mut self) -> Option<(K, V)> {
// let borrow = self.data.borrow_mut();
// let mut iter = borrow.iter();
// iter.nth(self.index).map(|(k, v)| {
// self.index += 1;
// (k.clone(), v.clone())
// })
// }
}

pub struct WrapperBTreeMapIterator<'a, K, V> {
iter: Iter<'a, K, V>,
}

impl<'a, K, V> WrapperBTreeMapIterator<'a, K, V>
where
K: Ord + Clone,
V: Clone,
{
pub fn new(storage: WrapperBTreeMap<K, V>) -> Self {
let binding = storage.data.clone();
let borrow = binding.borrow();
// let iter = <std::collections::BTreeMap<K, V> as Clone>::clone(&borrow)
// .iter();
WrapperBTreeMapIterator {
iter: borrow.iter(),
}
}

pub fn has_next(&mut self) -> bool {
// let borrow = self.iter.clone();
// self.iter.peekable().peek().is_some()
}

pub fn native_next(&mut self) -> Option<(K, V)> {
self.iter
.next()
.map(|(k, v)| (k.clone(), v.clone()))
}

// pub fn native_next(&self) -> Option<(K, V)> {
// let borrow = self.iter.borrow_mut();
// borrow.clone().next().map(|(k, v)| (k.clone(), v.clone()))
// }
}
20 changes: 12 additions & 8 deletions fs-storage/tests/FileStorage.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public class FileStorage {

private static native void set(String id, String value, long file_storage_ptr);

private static native String getValue(String id, long file_storage_ptr);
// private static native String getValue(String id, long file_storage_ptr);

private static native void remove(String id, long file_storage_ptr);

Expand All @@ -35,9 +35,9 @@ public void set(String id, String value) {
set(id, value, this.fileStoragePtr);
}

public String get(String id) {
return getValue(id, this.fileStoragePtr);
}
// public String get(String id) {
// return getValue(id, this.fileStoragePtr);
// }

public void remove(String id) {
remove(id, this.fileStoragePtr);
Expand Down Expand Up @@ -66,9 +66,13 @@ public void erase() {
public void merge(FileStorage other) {
merge(this.fileStoragePtr, other.fileStoragePtr);
}

public FileStorageIterator iterator() {
long iteratorPtr = createIterator(this.fileStoragePtr);
return new FileStorageIterator(iteratorPtr);

public WrapperBTreeMap getBTreeWrapper() {
return new WrapperBTreeMap(this.fileStoragePtr);
}

// public FileStorageIterator iterator() {
// long iteratorPtr = createIterator(this.fileStoragePtr);
// return new FileStorageIterator(iteratorPtr);
// }
}
Loading

0 comments on commit d98b080

Please sign in to comment.