Example #1
0
/*
 * Class:     ru_aot_morph_JavaMorphAPI
 * Method:    closeImpl
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_ru_aot_morph_JavaMorphAPI_closeImpl
  (JNIEnv *env, jclass clazz){
	try{
		//dispose of dics
		if(dic.pLemmatizer!=0){delete dic.pLemmatizer;dic.pLemmatizer=0;}
		if(dic.pAgramtab!=0){delete dic.pAgramtab;dic.pAgramtab=0;}

		if(setClazz!=NULL){env->DeleteGlobalRef(setClazz);setClazz=NULL;}
		//if(setConstructor!=NULL){env->DeleteGlobalRef(setConstructor);setConstructor=NULL;}
		if(JNIAPIExceptionClass!=NULL){env->DeleteGlobalRef(JNIAPIExceptionClass);JNIAPIExceptionClass=NULL;}
		//if(method_convertFromCharsetCp1251ToJavaString!=NULL){env->DeleteGlobalRef(method_convertFromCharsetCp1251ToJavaString);method_convertFromCharsetCp1251ToJavaString=NULL;}
		//if(method_grammemSetAddGrammem!=NULL){env->DeleteGlobalRef(method_grammemSetAddGrammem);method_grammemSetAddGrammem=NULL;}
		//if(method_paradigmsetAddNewParadigm!=NULL){env->DeleteGlobalRef(method_paradigmsetAddNewParadigm);method_paradigmsetAddNewParadigm=NULL;}
		//if(method_wordresult_new!=NULL){env->DeleteGlobalRef(method_wordresult_new);method_wordresult_new=NULL;}

		inited=false;
		return;//ok
	}catch(CExpc& e){
		char* err=str_compose("C++ exception: CExpc: %s",e.m_strCause.c_str());
		throwEx(env, err);
		return;
	}catch(int e){
		string errstr("C++ exception: int: ");
		errstr+=e;
		errstr+=".";
		throwEx(env, strdup(errstr.c_str()));
		return;
	}catch(...){
		throwEx(env, strdup("Unknown C++ exception."));
		return;
	}
}
Example #2
0
bool InitMorphologySystem(JNIEnv *env, jni_dictionary &dic){
	switch (dic.Language){
		case morphRussian:
			dic.lang=Russian;
			break;
		case morphEnglish :
		case morphGerman:
		default:
			throwEx(env, strdup("assertion error: A1"));
			return false;
	}

	string langua_str = GetStringByLanguage(dic.Language);
	dic.pLemmatizer = new T;
	string strError;
	if (!dic.pLemmatizer->LoadDictionariesRegistry(strError)){
   		char* err=str_compose("Cannot load %s morphological dictionary. Error details: %s", langua_str.c_str(), strError.c_str());
		throwEx(env, err);
		return false;
	}
	dic.pAgramtab = new Y;
	if (!dic.pAgramtab->LoadFromRegistry()){
   		char* err=str_compose("Cannot load %s gramtab.", langua_str.c_str());
		throwEx(env, err);
		return false;
	}
	return true;
}
Example #3
0
/*
 * Class:     ru_aot_morph_JavaMorphAPI
 * Method:    lookupWordImpl
 * Signature: (I[B)Lru/aot/morph/JavaMorphAPI/WordResult;
 */
JNIEXPORT jobject JNICALL Java_ru_aot_morph_JavaMorphAPI_lookupWordImpl
  (JNIEnv *env, jclass clazz, jint languageId, jbyteArray word){
	jbyte* bytes=NULL;
	char* chars=NULL;
	try{
		if(!inited||dic.pAgramtab==0||dic.pLemmatizer==0){
			throwEx(env, strdup("Dictionaries are not loaded. Call JavaMorphAPI.initDictionaries() first!"));
			return NULL;
		}
		if(languageId!=0){
			throwEx(env, strdup("The only language implemented is Russian."));
			return NULL;
		}
		if(word==NULL){
			throwEx(env, strdup("word is null"));
			return NULL;
		}

		jsize len=env->GetArrayLength(word);
		bytes=env->GetByteArrayElements(word,NULL);
		if(bytes==0){
			throwEx(env, strdup("Out of memory"));
			return NULL;
		}
		chars=(char*)malloc(len+1);
		if(chars==0){
			throwEx(env, strdup("Out of memory"));
			return NULL;
		}
		for(jsize i=0;i<len;i++){chars[i]=(char)bytes[i];}
		chars[len]=(char)0;
		string s = chars;
		free(chars);chars=0;
		env->ReleaseByteArrayElements(word,bytes,JNI_ABORT);
		bytes=NULL;
		Trim(s);
		if (s.empty()){
			throwEx(env, strdup("Empty or whitespace-only string instead of a word."));
			return NULL;
		}
		return GetMorphInfo(env, clazz, dic, s);
	}catch(CExpc& e){
		char* err=str_compose("C++ exception: CExpc: %s",e.m_strCause.c_str());
		throwEx(env, err);
		if(chars!=0){free(chars);chars=0;}
		if(bytes!=NULL){env->ReleaseByteArrayElements(word,bytes,JNI_ABORT);bytes=NULL;}
	}catch(int e){
		string errstr("C++ exception: int: ");
		errstr+=e;
		errstr+=".";
		throwEx(env, strdup(errstr.c_str()));
		if(chars!=0){free(chars);chars=0;}
		if(bytes!=NULL){env->ReleaseByteArrayElements(word,bytes,JNI_ABORT);bytes=NULL;}
	}catch(...){
		throwEx(env, strdup("Unknown C++ exception."));
		if(chars!=0){free(chars);chars=0;}
		if(bytes!=NULL){env->ReleaseByteArrayElements(word,bytes,JNI_ABORT);bytes=NULL;}
	}
	return NULL;
}
Example #4
0
/*
 * Class:     ru_aot_morph_JavaMorphAPI
 * Method:    initImpl
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_ru_aot_morph_JavaMorphAPI_initImpl
  (JNIEnv *env, jclass clazz, jint languagesBitSet){
	dic.pAgramtab=0;
	dic.pLemmatizer=0;
	setClazz=NULL;
	setConstructor=NULL;
	JNIAPIExceptionClass=NULL;
	method_convertFromCharsetCp1251ToJavaString=NULL;
	method_grammemSetAddGrammem=NULL;
	method_paradigmsetAddNewParadigm=NULL;
	method_wordresult_new=NULL;
	JNIAPIExceptionClass=env->FindClass("ru/aot/morph/JavaMorphAPI$JavaMorphAPIException");if(JNIAPIExceptionClass==NULL||env->ExceptionOccurred()){if(!env->ExceptionOccurred())env->FatalError("JNIMorphAPI JNI: Cannot resolve exception class");return;}
	JNIAPIExceptionClass=(jclass)env->NewGlobalRef(JNIAPIExceptionClass);if(JNIAPIExceptionClass==NULL||env->ExceptionOccurred()){throwEx(env,strdup("global ref error"));Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);return;}
	setClazz=env->FindClass("java/util/HashSet");if(setClazz==NULL||env->ExceptionOccurred()){throwEx(env,strdup("Out of memory"));Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);return;}
	setClazz=(jclass)env->NewGlobalRef(setClazz);if(setClazz==NULL||env->ExceptionOccurred()){throwEx(env,strdup("global ref error"));Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);return;}
	setConstructor=env->GetMethodID(setClazz, "<init>", "()V");if(setConstructor==NULL||env->ExceptionOccurred()){throwEx(env,strdup("Out of memory"));Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);return;}
	//setConstructor=(jmethodID)env->NewGlobalRef(setConstructor);if(setConstructor==NULL||env->ExceptionOccurred()){throwEx(env,strdup("global ref error"));Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);return;}
	method_convertFromCharsetCp1251ToJavaString=env->GetStaticMethodID(clazz, "convertFromCP1251", "([B)Ljava/lang/String;");if(method_convertFromCharsetCp1251ToJavaString==NULL||env->ExceptionOccurred()){throwEx(env,strdup("Out of memory"));Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);return;}
	//method_convertFromCharsetCp1251ToJavaString=(jmethodID)env->NewGlobalRef(method_convertFromCharsetCp1251ToJavaString);if(method_convertFromCharsetCp1251ToJavaString==NULL||env->ExceptionOccurred()){throwEx(env,strdup("global ref error"));Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);return;}
	method_grammemSetAddGrammem=env->GetStaticMethodID(clazz, "addGrammemToSet", "(Ljava/util/HashSet;I)V");if(method_grammemSetAddGrammem==NULL||env->ExceptionOccurred()){throwEx(env,strdup("Out of memory"));Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);return;}
	//method_grammemSetAddGrammem=(jmethodID)env->NewGlobalRef(method_grammemSetAddGrammem);if(method_grammemSetAddGrammem==NULL||env->ExceptionOccurred()){throwEx(env,strdup("global ref error"));Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);return;}
	method_paradigmsetAddNewParadigm=env->GetStaticMethodID(clazz, "addParadigmToSet", "(Ljava/util/HashSet;Ljava/util/HashSet;Ljava/lang/String;ZI)V");if(method_paradigmsetAddNewParadigm==NULL||env->ExceptionOccurred()){throwEx(env,strdup("Out of memory"));Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);return;}
	//method_paradigmsetAddNewParadigm=(jmethodID)env->NewGlobalRef(method_paradigmsetAddNewParadigm);if(method_paradigmsetAddNewParadigm==NULL||env->ExceptionOccurred()){throwEx(env,strdup("global ref error"));Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);return;}
	method_wordresult_new=env->GetStaticMethodID(clazz, "createWordResult", "(Ljava/util/HashSet;)Lru/aot/morph/JavaMorphAPI$WordResult;");if(method_wordresult_new==NULL||env->ExceptionOccurred()){throwEx(env,strdup("method_wordresult_new is null"));Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);return;}
	//method_wordresult_new=(jmethodID)env->NewGlobalRef(method_wordresult_new);if(method_wordresult_new==NULL||env->ExceptionOccurred()){throwEx(env,strdup("global ref error"));Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);return;}

	inited=false;
	if(languagesBitSet==0){
		throwEx(env, strdup("The set of languages is empty."));
		return;
	}
	if(languagesBitSet!=1){
		throwEx(env, strdup("Russian is the only language supported by JavaMorphAPI."));
		return;
	}
	dic.Language=morphRussian;
	try{
		//dic.Language=morphEnglish;
		//dic.Language=morphGerman;

		//LOADING DICTS
		bool bResult = false;
		switch (dic.Language){
			case morphRussian:
				bResult = InitMorphologySystem<CLemmatizerRussian, CRusGramTab>(env,dic);
				break;
/*			case morphEnglish :
				bResult = InitMorphologySystem<CLemmatizerEnglish, CEngGramTab>(env,dic);
				break;
			case morphGerman:
				bResult = InitMorphologySystem<CLemmatizerGerman, CGerGramTab>(env,dic);
				break; */
			default:
				throwEx(env,strdup("assertion error: A2."));
				return;
		};
		if (!bResult){
			Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);
			return;//exception was thrown by InitMorphologySystem
		}

		inited=true;
		return;//ok
	}catch(CExpc& e){
		const char* ca=e.m_strCause.c_str();
		char* err=str_compose("C++ exception: CExpc: %s",ca);
		throwEx(env, err);
		Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);
		return;
	}catch(int e){
		string errstr("C++ exception: int: ");
		errstr+=e;
		errstr+=".";
		throwEx(env, strdup(errstr.c_str()));
		Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);
		return;
	}catch(...){
		throwEx(env, strdup("Unknown C++ exception."));
		Java_ru_aot_morph_JavaMorphAPI_closeImpl(env,clazz);
		return;
	}
}
Example #5
0
/* cp1251 charset on input string - for Russian */
jobject GetMorphInfo(JNIEnv *env, jclass clazz, jni_dictionary& dic, string& Form){
	jobject paradigmset=NULL;
	jobject grammemset=NULL;
	jstring jbaseForm=NULL;
	jobject wordresult=NULL;
	jbyteArray baseFormBytes=NULL;
//	try{
	bool bCapital   = is_upper_alpha((BYTE)Form[0], dic.Language);
	vector<CFormInfo> Paradigms;
	dic.pLemmatizer->CreateParadigmCollection(false, Form, bCapital, true, Paradigms);
	paradigmset=env->NewObject(setClazz, setConstructor);
	if(env->ExceptionOccurred())return NULL;
	if(paradigmset==0){
		throwEx(env, strdup("Out of memory"));
		return NULL;
	}
	for(int i=0; i < Paradigms.size(); i++){
		const CFormInfo& F = Paradigms[i];
		bool found=F.m_bFound;
		string baseForm=F.GetWordForm(0);
		const char* chars=baseForm.c_str();
		jsize length=(jsize)strlen(chars);
		baseFormBytes=env->NewByteArray(length);
		if(env->ExceptionOccurred()){
			//paradigmset is a local ref, no need to release.
			return NULL;
		}
		if(baseFormBytes==0){
			throwEx(env, strdup("Out of memory"));
			//paradigmset is a local ref, no need to release.
			return NULL;
		}
		env->SetByteArrayRegion(baseFormBytes, (jsize)0, length, (jbyte*)chars);
		if(env->ExceptionOccurred()){
			//paradigmset is a local ref, no need to release.
			//baseFormBytes is a local ref, no need to release.
			return NULL;
		}
		//for Russian bytes
		jbaseForm=(jstring)env->CallStaticObjectMethod(clazz, method_convertFromCharsetCp1251ToJavaString, baseFormBytes);
		if(env->ExceptionOccurred()){
			//paradigmset is a local ref, no need to release.
			//baseFormBytes is a local ref, no need to release.
			return NULL;
		}
		if(jbaseForm==0){
			throwEx(env, strdup("Out of memory"));
			//paradigmset is a local ref, no need to release.
			//baseFormBytes is a local ref, no need to release.
			return NULL;
		}
		//baseFormBytes is a local ref, no need to release.
		string GramCodes=F.GetSrcAncode();
		BYTE  PartOfSpeech = dic.pAgramtab->GetPartOfSpeech(GramCodes.c_str());
		//assert(dic.lang==Russian);
		rus_pos pos=(rus_pos)PartOfSpeech;

		string CommonAncode=F.GetCommonAncode();
		QWORD grammems=0;
		QWORD grammems1;
		bool ok=GetGrammems(dic, CommonAncode.c_str(), grammems1);
		if(ok)grammems=grammems1;
		for (long i=0; i < GramCodes.length(); i+=2){
			QWORD grammems2;
			bool ok2=GetGrammems(dic, GramCodes.c_str()+i, grammems2);
			if(ok2)grammems|=grammems2;
		}
		//assert(dic.lang==Russian);
		size_t GrammemsCountInLanguage = dic.pAgramtab->GetGrammemsCount();
		grammemset=env->NewObject(setClazz, setConstructor);
		if(env->ExceptionOccurred()){
			//paradigmset is a local ref, no need to release.
			//jbaseForm is a local ref, no need to release.
			return NULL;
		}
		if(grammemset==0){
			throwEx(env, strdup("Out of memory"));
			//paradigmset is a local ref, no need to release.
			//jbaseForm is a local ref, no need to release.
			return NULL;
		}
		for (int i = GrammemsCountInLanguage-1; i>=0; i--){
			if ((((QWORD)1)<<i) & grammems){
				env->CallStaticVoidMethod(clazz, method_grammemSetAddGrammem, grammemset, (jint)(rus_grammems)i);
				if(env->ExceptionOccurred()){
					//paradigmset is a local ref, no need to release.
					//jbaseForm is a local ref, no need to release.
					//grammemset is a local ref, no need to release.
					return NULL;
				}
			}
		}
		env->CallStaticVoidMethod(clazz, method_paradigmsetAddNewParadigm,
				paradigmset, grammemset, jbaseForm, (jboolean)found, (jint)pos);
		//jbaseForm is a local ref, no need to release.
		//grammemset is a local ref, no need to release.
		if(env->ExceptionOccurred()){
			//paradigmset is a local ref, no need to release.
			return NULL;
		}
	}
	wordresult=env->CallStaticObjectMethod(clazz, method_wordresult_new, paradigmset);
	//paradigmset is a local ref, no need to release.
	if(env->ExceptionOccurred()){
		return NULL;
	}
	if(wordresult==0){
		throwEx(env, strdup("Out of memory"));
		return NULL;
	}
	return wordresult;
//	}catch(CExpc e){
//		char* err=str_compose("C++ exception: CExpc: %s",e.m_strCause.c_str());
//		throwEx(env, err);
		//paradigmset is a local ref, no need to release.
		//jbaseForm is a local ref, no need to release.
		//grammemset is a local ref, no need to release.
		//wordresult is a local ref, no need to release.
//	}catch(int e){
//		string errstr("C++ exception: int: ");
//		errstr+=e;
//		errstr+=".";
//		throwEx(env, strdup(errstr.c_str()));
		//paradigmset is a local ref, no need to release.
		//jbaseForm is a local ref, no need to release.
		//grammemset is a local ref, no need to release.
		//wordresult is a local ref, no need to release.
//	}catch(...){
		//throwEx(env, strdup("Unknown C++ exception."));
		//paradigmset is a local ref, no need to release.
		//jbaseForm is a local ref, no need to release.
		//grammemset is a local ref, no need to release.
		//wordresult is a local ref, no need to release.
//	}
//	return NULL;
}
Example #6
0
void testException()
{
	int i = 0;
	//i = 2 / i;
	throwEx();
}