Webarc:Berkeley DB Wrapper for Carryover DB: Difference between revisions
From Adapt
No edit summary |
No edit summary |
||
| (One intermediate revision by the same user not shown) | |||
| Line 12: | Line 12: | ||
== Usage == | == Usage == | ||
Example | Example C++ Code | ||
<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 | ||
Latest 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 C++ Code
//
// 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