diff options
Diffstat (limited to 'connectivity/source/drivers/jdbc/Object.cxx')
-rw-r--r-- | connectivity/source/drivers/jdbc/Object.cxx | 269 |
1 files changed, 212 insertions, 57 deletions
diff --git a/connectivity/source/drivers/jdbc/Object.cxx b/connectivity/source/drivers/jdbc/Object.cxx index b5251960a4..b8e8c87954 100644 --- a/connectivity/source/drivers/jdbc/Object.cxx +++ b/connectivity/source/drivers/jdbc/Object.cxx @@ -45,7 +45,7 @@ #include <com/sun/star/uno/Sequence.hxx> #include "resource/jdbc_log.hrc" - +#include <rtl/logfile.hxx> #include <comphelper/logging.hxx> #include <memory> @@ -112,17 +112,10 @@ void SDBThreadAttach::releaseRef() // statische Variablen der Klasse: jclass java_lang_Object::theClass = 0; -jclass java_lang_Object::getMyClass() +jclass java_lang_Object::getMyClass() const { if( !theClass ) - { - SDBThreadAttach t; - - if( !t.pEnv ) return (jclass)NULL; - jclass tempClass = t.pEnv->FindClass( "java/lang/Object" ); - theClass = (jclass)t.pEnv->NewGlobalRef( tempClass ); - t.pEnv->DeleteLocalRef( tempClass ); - } + theClass = findMyClass("java/lang/Object"); return theClass; } // der eigentliche Konstruktor @@ -146,9 +139,7 @@ java_lang_Object::~java_lang_Object() if( object ) { SDBThreadAttach t; - if( t.pEnv ) - t.pEnv->DeleteGlobalRef( object ); - object = NULL; + clearObject(*t.pEnv); } SDBThreadAttach::releaseRef(); } @@ -166,65 +157,30 @@ void java_lang_Object::clearObject() if( object ) { SDBThreadAttach t; - if( t.pEnv ) - t.pEnv->DeleteGlobalRef( object ); - object = NULL; + clearObject(*t.pEnv); } } // der protected-Konstruktor fuer abgeleitete Klassen void java_lang_Object::saveRef( JNIEnv * pXEnv, jobject myObj ) { OSL_ENSURE( myObj, "object in c++ -> Java Wrapper" ); - if( pXEnv && myObj ) + if( myObj ) object = pXEnv->NewGlobalRef( myObj ); } java_lang_Class * java_lang_Object::getClass() { - jobject out; SDBThreadAttach t; - if( t.pEnv ) - { - // temporaere Variable initialisieren - static const char * cSignature = "()Ljava/lang/Class;"; - static const char * cMethodName = "getClass"; - // Java-Call absetzen - static jmethodID mID = NULL; - if ( !mID ) - mID = t.pEnv->GetMethodID( getMyClass(), cMethodName, cSignature );OSL_ENSURE(mID,"Unknown method id!"); - if( mID ) - { - out = t.pEnv->CallObjectMethodA( object, mID, NULL ); - ThrowSQLException(t.pEnv,NULL); - return new java_lang_Class( t.pEnv, out ); - } //mID - } //pEnv - return NULL; + static jmethodID mID(NULL); + jobject out = callObjectMethod(t.pEnv,"getClass","()Ljava/lang/Class;", mID); + return out ? new java_lang_Class( t.pEnv, out ) : NULL; } ::rtl::OUString java_lang_Object::toString() const { - - SDBThreadAttach t; - ::rtl::OUString aStr; - if( t.pEnv ) - { - // temporaere Variable initialisieren - static const char * cSignature = "()Ljava/lang/String;"; - static const char * cMethodName = "toString"; - // Java-Call absetzen - static jmethodID mID = NULL; - if ( !mID ) - mID = t.pEnv->GetMethodID( getMyClass(), cMethodName, cSignature );OSL_ENSURE(mID,"Unknown method id!"); - if( mID ) - { - jstring out = (jstring)t.pEnv->CallObjectMethod( object, mID); - ThrowSQLException(t.pEnv,NULL); - aStr = JavaString2String(t.pEnv,out); - } //mID - } //pEnv - return aStr; + static jmethodID mID(NULL); + return callStringMethod("toString",mID); } // -------------------------------------------------------------------------------- @@ -240,14 +196,14 @@ namespace _pEnvironment->ExceptionClear(); // we have to clear the exception here because we want to handle it itself - if ( _pEnvironment->IsInstanceOf( jThrow, java_sql_SQLException_BASE::getMyClass() ) ) + if ( _pEnvironment->IsInstanceOf( jThrow, java_sql_SQLException_BASE::st_getMyClass() ) ) { ::std::auto_ptr< java_sql_SQLException_BASE > pException( new java_sql_SQLException_BASE( _pEnvironment, jThrow ) ); _out_rException = SQLException( pException->getMessage(), _rxContext, pException->getSQLState(), pException->getErrorCode(), Any() ); return true; } - else if ( _pEnvironment->IsInstanceOf( jThrow, java_lang_Throwable::getMyClass() ) ) + else if ( _pEnvironment->IsInstanceOf( jThrow, java_lang_Throwable::st_getMyClass() ) ) { ::std::auto_ptr< java_lang_Throwable > pThrow( new java_lang_Throwable( _pEnvironment, jThrow ) ); ::rtl::OUString sMessage = pThrow->getMessage(); @@ -283,5 +239,204 @@ void java_lang_Object::ThrowSQLException( JNIEnv* _pEnvironment, const Reference if ( lcl_translateJNIExceptionToUNOException( _pEnvironment, _rxContext, aException ) ) throw aException; } +// ----------------------------------------------------------------------------- +void java_lang_Object::obtainMethodId(JNIEnv* _pEnv,const char* _pMethodName, const char* _pSignature,jmethodID& _inout_MethodID) const +{ + if ( !_inout_MethodID ) + { + _inout_MethodID = _pEnv->GetMethodID( getMyClass(), _pMethodName, _pSignature ); + OSL_ENSURE( _inout_MethodID, _pSignature ); + if ( !_inout_MethodID ) + throw SQLException(); + } // if ( !_inout_MethodID ) +} +// ----------------------------------------------------------------------------- +sal_Bool java_lang_Object::callBooleanMethod( const char* _pMethodName, jmethodID& _inout_MethodID ) const +{ + jboolean out( sal_False ); + + SDBThreadAttach t; + OSL_ENSURE( t.pEnv, "java_lang_Object::callBooleanMethod: no Java enviroment anymore!" ); + obtainMethodId(t.pEnv, _pMethodName,"()Z", _inout_MethodID); + // call method + out = t.pEnv->CallBooleanMethod( object, _inout_MethodID ); + ThrowSQLException( t.pEnv, NULL ); + + return out; +} +// ----------------------------------------------------------------------------- +sal_Bool java_lang_Object::callBooleanMethodWithIntArg( const char* _pMethodName, jmethodID& _inout_MethodID, sal_Int32 _nArgument ) const +{ + jboolean out( sal_False ); + SDBThreadAttach t; + OSL_ENSURE( t.pEnv, "java_lang_Object::callBooleanMethodWithIntArg: no Java enviroment anymore!" ); + obtainMethodId(t.pEnv, _pMethodName,"(I)Z", _inout_MethodID); + // call method + out = t.pEnv->CallBooleanMethod( object, _inout_MethodID, _nArgument ); + ThrowSQLException( t.pEnv, NULL ); + + return out; +} +// ------------------------------------------------------------------------- +jobject java_lang_Object::callResultSetMethod( JNIEnv& _rEnv,const char* _pMethodName, jmethodID& _inout_MethodID ) const +{ + // call method + jobject out = callObjectMethod(&_rEnv,_pMethodName,"()Ljava/sql/ResultSet;", _inout_MethodID); + return out; +} +// ------------------------------------------------------------------------- +sal_Int32 java_lang_Object::callIntMethod( const char* _pMethodName, jmethodID& _inout_MethodID,bool _bIgnoreException ) const +{ + SDBThreadAttach t; + OSL_ENSURE( t.pEnv, "java_lang_Object::callIntMethod: no Java enviroment anymore!" ); + obtainMethodId(t.pEnv, _pMethodName,"()I", _inout_MethodID); + + // call method + jint out( t.pEnv->CallIntMethod( object, _inout_MethodID ) ); + if ( _bIgnoreException ) + isExceptionOccured(t.pEnv,sal_True); + else + ThrowSQLException( t.pEnv, NULL ); + + return (sal_Int32)out; +} +// ------------------------------------------------------------------------- +sal_Int32 java_lang_Object::callIntMethodWithIntArg( const char* _pMethodName, jmethodID& _inout_MethodID,sal_Int32 _nArgument ) const +{ + SDBThreadAttach t; + OSL_ENSURE( t.pEnv, "java_lang_Object::callIntMethod: no Java enviroment anymore!" ); + obtainMethodId(t.pEnv, _pMethodName,"(I)I", _inout_MethodID); + // call method + jint out( t.pEnv->CallIntMethod( object, _inout_MethodID , _nArgument) ); + ThrowSQLException( t.pEnv, NULL ); + + return (sal_Int32)out; +} +// ------------------------------------------------------------------------- +void java_lang_Object::callVoidMethod( const char* _pMethodName, jmethodID& _inout_MethodID) const +{ + SDBThreadAttach t; + OSL_ENSURE( t.pEnv, "java_lang_Object::callIntMethod: no Java enviroment anymore!" ); + obtainMethodId(t.pEnv, _pMethodName,"()V", _inout_MethodID); + + // call method + t.pEnv->CallVoidMethod( object, _inout_MethodID ); + ThrowSQLException( t.pEnv, NULL ); +} +// ------------------------------------------------------------------------- +void java_lang_Object::callVoidMethodWithIntArg( const char* _pMethodName, jmethodID& _inout_MethodID, sal_Int32 _nArgument,bool _bIgnoreException ) const +{ + SDBThreadAttach t; + OSL_ENSURE( t.pEnv, "java_lang_Object::callIntMethod: no Java enviroment anymore!" ); + obtainMethodId(t.pEnv, _pMethodName,"(I)V", _inout_MethodID); + + // call method + t.pEnv->CallVoidMethod( object, _inout_MethodID,_nArgument ); + if ( _bIgnoreException ) + isExceptionOccured(t.pEnv,sal_True); + else + ThrowSQLException( t.pEnv, NULL ); +} +// ------------------------------------------------------------------------- +void java_lang_Object::callVoidMethodWithBoolArg( const char* _pMethodName, jmethodID& _inout_MethodID, sal_Int32 _nArgument,bool _bIgnoreException ) const +{ + SDBThreadAttach t; + OSL_ENSURE( t.pEnv, "java_lang_Object::callIntMethod: no Java enviroment anymore!" ); + obtainMethodId(t.pEnv, _pMethodName,"(Z)V", _inout_MethodID); + // call method + t.pEnv->CallVoidMethod( object, _inout_MethodID,_nArgument ); + if ( _bIgnoreException ) + isExceptionOccured(t.pEnv,sal_True); + else + ThrowSQLException( t.pEnv, NULL ); +} +// ----------------------------------------------------------------------------- +::rtl::OUString java_lang_Object::callStringMethod( const char* _pMethodName, jmethodID& _inout_MethodID ) const +{ + SDBThreadAttach t; + OSL_ENSURE( t.pEnv, "java_lang_Object::callStringMethod: no Java enviroment anymore!" ); + + // call method + jstring out = (jstring)callObjectMethod(t.pEnv,_pMethodName,"()Ljava/lang/String;", _inout_MethodID); + return JavaString2String( t.pEnv, out ); +} +// ----------------------------------------------------------------------------- +jobject java_lang_Object::callObjectMethod( JNIEnv * _pEnv,const char* _pMethodName,const char* _pSignature, jmethodID& _inout_MethodID ) const +{ + // obtain method ID + obtainMethodId(_pEnv, _pMethodName,_pSignature, _inout_MethodID); + // call method + jobject out = _pEnv->CallObjectMethod( object, _inout_MethodID); + ThrowSQLException( _pEnv, NULL ); + return out; +} + +// ----------------------------------------------------------------------------- +jobject java_lang_Object::callObjectMethodWithIntArg( JNIEnv * _pEnv,const char* _pMethodName,const char* _pSignature, jmethodID& _inout_MethodID , sal_Int32 _nArgument) const +{ + obtainMethodId(_pEnv, _pMethodName,_pSignature, _inout_MethodID); + // call method + jobject out = _pEnv->CallObjectMethod( object, _inout_MethodID,_nArgument ); + ThrowSQLException( _pEnv, NULL ); + return out; +} +// ----------------------------------------------------------------------------- +::rtl::OUString java_lang_Object::callStringMethodWithIntArg( const char* _pMethodName, jmethodID& _inout_MethodID , sal_Int32 _nArgument) const +{ + SDBThreadAttach t; + OSL_ENSURE( t.pEnv, "java_lang_Object::callStringMethod: no Java enviroment anymore!" ); + jstring out = (jstring)callObjectMethodWithIntArg(t.pEnv,_pMethodName,"(I)Ljava/lang/String;",_inout_MethodID,_nArgument); + return JavaString2String( t.pEnv, out ); +} +// ------------------------------------------------------------------------- +void java_lang_Object::callVoidMethodWithStringArg( const char* _pMethodName, jmethodID& _inout_MethodID,const ::rtl::OUString& _nArgument ) const +{ + SDBThreadAttach t; + OSL_ENSURE( t.pEnv, "java_lang_Object::callIntMethod: no Java enviroment anymore!" ); + obtainMethodId(t.pEnv, _pMethodName,"(Ljava/lang/String;)V", _inout_MethodID); + + jstring str = convertwchar_tToJavaString(t.pEnv,_nArgument); + // call method + t.pEnv->CallVoidMethod( object, _inout_MethodID , str); + t.pEnv->DeleteLocalRef(str); + ThrowSQLException( t.pEnv, NULL ); +} +// ------------------------------------------------------------------------- +sal_Int32 java_lang_Object::callIntMethodWithStringArg( const char* _pMethodName, jmethodID& _inout_MethodID,const ::rtl::OUString& _nArgument ) const +{ + SDBThreadAttach t; + OSL_ENSURE( t.pEnv, "java_lang_Object::callIntMethodWithStringArg: no Java enviroment anymore!" ); + obtainMethodId(t.pEnv, _pMethodName,"(Ljava/lang/String;)I", _inout_MethodID); + + //TODO: Check if the code below is needed + //jdbc::LocalRef< jstring > str( t.env(), convertwchar_tToJavaString( t.pEnv, sql ) ); + //{ + // jdbc::ContextClassLoaderScope ccl( t.env(), + // m_pConnection ? m_pConnection->getDriverClassLoader() : jdbc::GlobalRef< jobject >(), + // m_aLogger, + // *this + // ); + jstring str = convertwchar_tToJavaString(t.pEnv,_nArgument); + // call method + jint out = t.pEnv->CallIntMethod( object, _inout_MethodID , str); + t.pEnv->DeleteLocalRef(str); + ThrowSQLException( t.pEnv, NULL ); + return (sal_Int32)out; +} +// ----------------------------------------------------------------------------- +jclass java_lang_Object::findMyClass(const char* _pClassName) +{ + // die Klasse muss nur einmal geholt werden, daher statisch + SDBThreadAttach t; + jclass tempClass = t.pEnv->FindClass(_pClassName); OSL_ENSURE(tempClass,"Java : FindClass nicht erfolgreich!"); + if(!tempClass) + { + t.pEnv->ExceptionDescribe(); + t.pEnv->ExceptionClear(); + } + jclass globClass = (jclass)t.pEnv->NewGlobalRef( tempClass ); + t.pEnv->DeleteLocalRef( tempClass ); + return globClass; +} |