JavaErrorTarget.cpp

Go to the documentation of this file.
00001 /*
00002 // $Id: //open/dev/fennel/farrago/JavaErrorTarget.cpp#7 $
00003 // Fennel is a library of data storage and processing components.
00004 // Copyright (C) 2005-2009 The Eigenbase Project
00005 // Copyright (C) 2005-2009 SQLstream, Inc.
00006 // Copyright (C) 2005-2009 LucidEra, Inc.
00007 // Portions Copyright (C) 1999-2009 John V. Sichi
00008 //
00009 // This program is free software; you can redistribute it and/or modify it
00010 // under the terms of the GNU General Public License as published by the Free
00011 // Software Foundation; either version 2 of the License, or (at your option)
00012 // any later version approved by The Eigenbase Project.
00013 //
00014 // This program is distributed in the hope that it will be useful,
00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 // GNU General Public License for more details.
00018 //
00019 // You should have received a copy of the GNU General Public License
00020 // along with this program; if not, write to the Free Software
00021 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022 */
00023 
00024 #include "fennel/common/CommonPreamble.h"
00025 #include "fennel/farrago/JavaErrorTarget.h"
00026 #include "fennel/farrago/JavaExcn.h"
00027 
00028 #include "boost/lexical_cast.hpp"
00029 
00030 FENNEL_BEGIN_CPPFILE("$Id: //open/dev/fennel/farrago/JavaErrorTarget.cpp#7 $");
00031 
00032 #define JAVAERRORTARGET_TYPE_STR ("JavaErrorTarget")
00033 
00034 JavaErrorTarget::JavaErrorTarget(jobject javaErrorInit)
00035 {
00036     JniEnvAutoRef pEnv;
00037 
00038     JniUtil::incrementHandleCount(JAVAERRORTARGET_TYPE_STR, this);
00039     javaError = pEnv->NewGlobalRef(javaErrorInit);
00040 
00041     jclass classErrorTarget = pEnv->FindClass(
00042         "net/sf/farrago/fennel/FennelJavaErrorTarget");
00043     methNotifyError = pEnv->GetMethodID(
00044         classErrorTarget,
00045         "handleRowError",
00046         "(Ljava/lang/String;ZLjava/lang/String;Ljava/nio/ByteBuffer;I)Ljava/lang/Object;");
00047 }
00048 
00049 JavaErrorTarget::~JavaErrorTarget()
00050 {
00051     JniEnvAutoRef pEnv;
00052 
00053     pEnv->DeleteGlobalRef(javaError);
00054     JniUtil::decrementHandleCount(JAVAERRORTARGET_TYPE_STR, this);
00055     javaError = NULL;
00056 }
00057 
00058 void JavaErrorTarget::notifyError(
00059     const std::string &source,
00060     ErrorLevel level,
00061     const std::string &message,
00062     void *address,
00063     long capacity,
00064     int index)
00065 {
00066     JniEnvAutoRef pEnv;
00067 
00068     // NOTE jvs 21-Aug-2007:  use ref reapers here since this
00069     // may be called over and over before control returns to Java
00070 
00071     jstring javaSource = pEnv->NewStringUTF(source.c_str());
00072     JniLocalRefReaper javaSourceReaper(pEnv, javaSource);
00073     jboolean javaIsWarning = (level == ROW_WARNING) ? true : false;
00074     jstring javaMessage = pEnv->NewStringUTF(message.c_str());
00075     JniLocalRefReaper javaMessageReaper(pEnv, javaMessage);
00076     jobject javaByteBuffer =
00077         pEnv->NewDirectByteBuffer(address, capacity);
00078     JniLocalRefReaper javaByteBufferReaper(pEnv, javaByteBuffer);
00079     jint javaIndex = index;
00080 
00081     pEnv->CallObjectMethod(
00082         javaError, methNotifyError,
00083         javaSource, javaIsWarning, javaMessage,
00084         javaByteBuffer, javaIndex);
00085 }
00086 
00087 FENNEL_END_CPPFILE("$Id: //open/dev/fennel/farrago/JavaErrorTarget.cpp#7 $");
00088 
00089 // End JavaErrorTarget.cpp

Generated on Mon Jun 22 04:00:18 2009 for Fennel by  doxygen 1.5.1