Webarc:Berkeley DB Wrapper for Carryover DB: Difference between revisions
From Adapt
No edit summary |
No edit summary |
||
Line 14: | Line 14: | ||
Example Usage | Example Usage | ||
<pre> | <pre> | ||
// | // | ||
Line 38: | Line 27: | ||
#include <fstream> | #include <fstream> | ||
#include <jni.h> | #include <jni.h> | ||
class BDBTaggedDocumentIterator : public DocumentIterator { | |||
private: | |||
UnparsedDocument _document; | |||
FILE *_in; | |||
JavaVM* _jvm; | |||
JNIEnv* _jniEnv; | |||
jobject _bdb; | |||
jclass _clsRevisionDatabase; | |||
jclass _clsRevisionData; | |||
jmethodID _mid_RevisionDatabase_getNext; | |||
jmethodID _mid_RevisionDatabase_construct; | |||
jmethodID _mid_RevisionDatabase_close; | |||
jfieldID _fid_RevisionData_date; | |||
jfieldID _fid_RevisionData_fileName; | |||
jfieldID _fid_RevisionData_offset; | |||
void _create_vm(); | |||
class RevisionData { | |||
private: | |||
JNIEnv* _rdenv; | |||
public: | |||
long date; | |||
const char* filename; | |||
long offset; | |||
RevisionData(JNIEnv *env, jobject obj, jfieldID date, jfieldID fname, jfieldID offset); | |||
~RevisionData(); | |||
}; | |||
void _openDB(const char* dbName); | |||
void _closeDB(); | |||
RevisionData* _getNextDocument(); | |||
UnparsedDocument* _nextDocument(); | |||
public: | |||
BDBTaggedDocumentIterator(); | |||
~BDBTaggedDocumentIterator(); | |||
void setTags( const char* startDoc, const char* endDoc, const char* endMetadata ); | |||
void open( const std::string& filename ); | |||
void close(); | |||
UnparsedDocument* nextDocument(); | |||
}; | |||
void indri::parse::BDBTaggedDocumentIterator::_create_vm() { | |||
JavaVMInitArgs vm_args; | |||
JavaVMOption options[2]; | |||
/* For LINUX/UNIX */ | |||
string opt1("-Djava.class.path=./lib/mwbdbwrap.jar:./lib/je-3.3.87.jar"); | |||
/* For Windows */ | |||
//string opt1("-Djava.class.path=.\\lib\\mwbdbwrap.jar;.\\lib\\je-3.3.87.jar"); | |||
string opt2("-verbose:class"); | |||
options[0].optionString = (char*)(opt1.c_str()); | |||
options[1].optionString = (char*)(opt2.c_str()); | |||
vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6 | |||
vm_args.nOptions = 1; // Change this to 2 for verbosity | |||
vm_args.options = options; | |||
vm_args.ignoreUnrecognized = 0; | |||
int ret = JNI_CreateJavaVM(&_jvm, (void**)&_jniEnv, &vm_args); | |||
if(ret < 0) | |||
printf("\nUnable to Launch JVM\n"); | |||
_clsRevisionDatabase = jniEnv->FindClass("edu/umd/umiacs/mw/bdb/RevisionDatabase"); | |||
if (_jniEnv->ExceptionCheck()) { | |||
_jniEnv->ExceptionDescribe(); | |||
} | |||
_mid_RevisionDatabase_construct = _jniEnv->GetMethodID(_clsRevisionDatabase, "<init>", "(Ljava/lang/String;)V"); | |||
_mid_RevisionDatabase_close = _jniEnv->GetMethodID(_clsRevisionDatabase, "close", "()V"); | |||
_mid_RevisionDatabase_getNext = _jniEnv->GetMethodID(_clsRevisionDatabase, "getNext", "()Ledu/umd/umiacs/mw/bdb/RevisionData;"); | |||
_clsRevisionData = _jniEnv->FindClass("edu/umd/umiacs/mw/bdb/RevisionData"); | |||
_fid_RevisionData_date = _jniEnv->GetFieldID(_clsRevisionData, "date", "J"); | |||
_fid_RevisionData_fileName = _jniEnv->GetFieldID(_clsRevisionData, "fileName", "Ljava/lang/String;"); | |||
_fid_RevisionData_offset= _jniEnv->GetFieldID(_clsRevisionData, "offset", "J"); | |||
} | |||
indri::parse::BDBTaggedDocumentIterator::RevisionData::RevisionData(JNIEnv *env, jobject obj, jfieldID fidDate, jfieldID fidFname, jfieldID fidOffset) { | |||
_rdenv = env; | |||
date = env->GetLongField(obj, fidDate); | |||
jstring jsfilename = (jstring)env->GetObjectField(obj, fidFname); | |||
filename = env->GetStringUTFChars(jsfilename, 0); | |||
offset = env->GetLongField(obj, fidOffset); | |||
} | |||
indri::parse::BDBTaggedDocumentIterator::RevisionData::~RevisionData() { | |||
// _rdenv->ReleaseStringUTFChars(jsfilename, filename); | |||
} | |||
void indri::parse::BDBTaggedDocumentIterator::_openDB(const char* dbName) { | |||
jstring jsdbName = _jniEnv->NewStringUTF(dbName); | |||
_bdb = _jniEnv->NewObject(_clsRevisionDatabase, _mid_RevisionDatabase_construct, jsdbName); | |||
} | |||
void indri::parse::BDBTaggedDocumentIterator::_closeDB() { | |||
_jniEnv->CallObjectMethod(_bdb, _mid_RevisionDatabase_close); | |||
} | } | ||
indri::parse::BDBTaggedDocumentIterator::RevisionData* indri::parse::BDBTaggedDocumentIterator::_getNextDocument() { | |||
RevisionData *revData = NULL; | |||
jobject joRevData = _jniEnv->CallObjectMethod(_bdb, _mid_RevisionDatabase_getNext); | |||
//if (_jniEnv->ExceptionCheck()) { | |||
// _jniEnv->ExceptionDescribe(); | |||
//} | |||
if (joRevData != NULL) { | |||
revData = new RevisionData(_jniEnv, joRevData, _fid_RevisionData_date, _fid_RevisionData_fileName, _fid_RevisionData_offset); | |||
} | |||
return revData; | |||
} | |||
</pre> | </pre> | ||
== Source Codes == | == Source Codes == | ||
svn co http://narasvn.umiacs.umd.edu/repository/src/webarc/ | svn co http://narasvn.umiacs.umd.edu/repository/src/webarc/mwbdbwrap |
Revision as of 23:32, 9 November 2009
What It Does
Two wrapper classes to be used by C/C++ codes via JNI.
How To Build
In Eclipse, export 'mwbdbwrap' as a JAR.
- Right-click on 'mwbdbwrap' in Package Explorer, select 'export'.
- Select mwbdbwrap/src (should have been already selected).
- Put <your directory>/mwbdbwrap.jar in Export destination.
- Select 'Export generated class files and resources'
- Select 'Add directory entries' in options
- Click 'Finish'
Usage
Example Usage
// // BDBTaggedDocumentIterator // // 22 September 2009 -- scsong // #ifndef INDRI_TRECDOCUMENTITERATOR_BDB_HPP #define INDRI_TRECDOCUMENTITERATOR_BDB_HPP #include <string> #include <fstream> #include <jni.h> class BDBTaggedDocumentIterator : public DocumentIterator { private: UnparsedDocument _document; FILE *_in; JavaVM* _jvm; JNIEnv* _jniEnv; jobject _bdb; jclass _clsRevisionDatabase; jclass _clsRevisionData; jmethodID _mid_RevisionDatabase_getNext; jmethodID _mid_RevisionDatabase_construct; jmethodID _mid_RevisionDatabase_close; jfieldID _fid_RevisionData_date; jfieldID _fid_RevisionData_fileName; jfieldID _fid_RevisionData_offset; void _create_vm(); class RevisionData { private: JNIEnv* _rdenv; public: long date; const char* filename; long offset; RevisionData(JNIEnv *env, jobject obj, jfieldID date, jfieldID fname, jfieldID offset); ~RevisionData(); }; void _openDB(const char* dbName); void _closeDB(); RevisionData* _getNextDocument(); UnparsedDocument* _nextDocument(); public: BDBTaggedDocumentIterator(); ~BDBTaggedDocumentIterator(); void setTags( const char* startDoc, const char* endDoc, const char* endMetadata ); void open( const std::string& filename ); void close(); UnparsedDocument* nextDocument(); }; void indri::parse::BDBTaggedDocumentIterator::_create_vm() { JavaVMInitArgs vm_args; JavaVMOption options[2]; /* For LINUX/UNIX */ string opt1("-Djava.class.path=./lib/mwbdbwrap.jar:./lib/je-3.3.87.jar"); /* For Windows */ //string opt1("-Djava.class.path=.\\lib\\mwbdbwrap.jar;.\\lib\\je-3.3.87.jar"); string opt2("-verbose:class"); options[0].optionString = (char*)(opt1.c_str()); options[1].optionString = (char*)(opt2.c_str()); vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6 vm_args.nOptions = 1; // Change this to 2 for verbosity vm_args.options = options; vm_args.ignoreUnrecognized = 0; int ret = JNI_CreateJavaVM(&_jvm, (void**)&_jniEnv, &vm_args); if(ret < 0) printf("\nUnable to Launch JVM\n"); _clsRevisionDatabase = jniEnv->FindClass("edu/umd/umiacs/mw/bdb/RevisionDatabase"); if (_jniEnv->ExceptionCheck()) { _jniEnv->ExceptionDescribe(); } _mid_RevisionDatabase_construct = _jniEnv->GetMethodID(_clsRevisionDatabase, "<init>", "(Ljava/lang/String;)V"); _mid_RevisionDatabase_close = _jniEnv->GetMethodID(_clsRevisionDatabase, "close", "()V"); _mid_RevisionDatabase_getNext = _jniEnv->GetMethodID(_clsRevisionDatabase, "getNext", "()Ledu/umd/umiacs/mw/bdb/RevisionData;"); _clsRevisionData = _jniEnv->FindClass("edu/umd/umiacs/mw/bdb/RevisionData"); _fid_RevisionData_date = _jniEnv->GetFieldID(_clsRevisionData, "date", "J"); _fid_RevisionData_fileName = _jniEnv->GetFieldID(_clsRevisionData, "fileName", "Ljava/lang/String;"); _fid_RevisionData_offset= _jniEnv->GetFieldID(_clsRevisionData, "offset", "J"); } indri::parse::BDBTaggedDocumentIterator::RevisionData::RevisionData(JNIEnv *env, jobject obj, jfieldID fidDate, jfieldID fidFname, jfieldID fidOffset) { _rdenv = env; date = env->GetLongField(obj, fidDate); jstring jsfilename = (jstring)env->GetObjectField(obj, fidFname); filename = env->GetStringUTFChars(jsfilename, 0); offset = env->GetLongField(obj, fidOffset); } indri::parse::BDBTaggedDocumentIterator::RevisionData::~RevisionData() { // _rdenv->ReleaseStringUTFChars(jsfilename, filename); } void indri::parse::BDBTaggedDocumentIterator::_openDB(const char* dbName) { jstring jsdbName = _jniEnv->NewStringUTF(dbName); _bdb = _jniEnv->NewObject(_clsRevisionDatabase, _mid_RevisionDatabase_construct, jsdbName); } void indri::parse::BDBTaggedDocumentIterator::_closeDB() { _jniEnv->CallObjectMethod(_bdb, _mid_RevisionDatabase_close); } indri::parse::BDBTaggedDocumentIterator::RevisionData* indri::parse::BDBTaggedDocumentIterator::_getNextDocument() { RevisionData *revData = NULL; jobject joRevData = _jniEnv->CallObjectMethod(_bdb, _mid_RevisionDatabase_getNext); //if (_jniEnv->ExceptionCheck()) { // _jniEnv->ExceptionDescribe(); //} if (joRevData != NULL) { revData = new RevisionData(_jniEnv, joRevData, _fid_RevisionData_date, _fid_RevisionData_fileName, _fid_RevisionData_offset); } return revData; }
Source Codes
svn co http://narasvn.umiacs.umd.edu/repository/src/webarc/mwbdbwrap