📄 servletcontainer.cpp
字号:
os << "ServletContainer: Can't create SessionPool." << ends;
iOK = 0;
};
if (setDefaultJspFactory( env )) {
os << "ServletContainer: Can't set default JspFactory." << ends;
iOK = 0;
};
if (createServletContext( env )) {
os << "ServletContainer: Can't create ServletContext." << ends;
iOK = 0;
};
if ( env->EnsureLocalCapacity(numLocalRefs) < 0 ) {
if ( env->PushLocalFrame(numLocalRefs) < 0) {
iOK = 0;
};
};
};
// Delete duplicated strings
for (; iOptions; ) {
PIUtil_free( options[--iOptions].optionString );
};
if (!iOK) CONFIG_ERR( Object(), os.str() );
};
ServletContainer::~ServletContainer()
{
jvm->AttachCurrentThread((void **)&env, NULL);
if (jSessionPool) env->DeleteGlobalRef(jSessionPool);
Log( "Servlet container: SessionPool destroyed.");
if (jJspFactory) env->DeleteGlobalRef(jJspFactory);
if (jContext) env->DeleteGlobalRef(jContext);
Log( "Servlet container: ServletContext destroyed.");
/**
* Won't work 'cause the running thread isn't the main thread
* in most cases (except init errors)
**/
if ( PIThread_getSystemHandle( PIThread_getCurrent()) == pStartupTID && jvm )
{
jvm->DestroyJavaVM();
};
if ( logfile != PIPLATFORM_FD_INVALID ) { PIFile_close( logfile ); };
Pi3Expression_delete( pExpr );
PIDB_delete( pServlets );
};
int ServletContainer::createServletContext( JNIEnv *env ) {
/* get the ServletContext */
if (!jContext) {
/* get the ServletContext class */
jclass ServletContextClass = env->FindClass("org/pi3/servlet/core/Pi3ServletContext");
if (!ServletContextClass) return PIAPI_ERROR;
/* get the ServletContext constructor */
jmethodID ServletContextMID;
ServletContextMID = env->GetMethodID( ServletContextClass, "<init>", "(ILjava/lang/String;)V");
if (!ServletContextMID) return PIAPI_ERROR;
/* get the ServletContext object */
jContext = env->NewObject( ServletContextClass, ServletContextMID,
(int)this, env->NewStringUTF((const char *)sDocBase) );
if (!jContext) return PIAPI_ERROR;
jContext = env->NewGlobalRef(jContext);
Log( "Servlet container: ServletContext created.");
};
return PIAPI_COMPLETED;
}
int ServletContainer::createSessionPool( JNIEnv *env ) {
/* get the SessionPool */
if (!jSessionPool) {
jclass SessionPoolClass = env->FindClass("java/util/Hashtable");
if (!SessionPoolClass) return PIAPI_ERROR;
/* get the SessionPool object */
jmethodID SessionPoolMID;
SessionPoolMID = env->GetMethodID( SessionPoolClass, "<init>", "()V");
if (!SessionPoolMID) return PIAPI_ERROR;
jSessionPool = env->NewObject(SessionPoolClass, SessionPoolMID);
if (!jSessionPool) return PIAPI_ERROR;
jSessionPool = env->NewGlobalRef(jSessionPool);
Log( "Servlet container: SessionPool created.");
};
return PIAPI_COMPLETED;
}
int ServletContainer::setDefaultJspFactory( JNIEnv *env ) {
/* set the default JspFactory */
if (!jJspFactory) {
jclass JspFactoryClass = 0;
JspFactoryClass = env->FindClass("org/pi3/jsp/core/Pi3JspFactory");
if (!JspFactoryClass) return PIAPI_ERROR;
/* get the JspFactory object */
jmethodID JspFactoryMID;
JspFactoryMID = env->GetMethodID( JspFactoryClass, "<init>", "()V");
if (!JspFactoryMID) return PIAPI_ERROR;
jJspFactory = env->NewObject(JspFactoryClass, JspFactoryMID);
if (!jJspFactory) return PIAPI_ERROR;
/* Get and invoke the setDefaultFactory method */
jmethodID setDefaultMID;
setDefaultMID = env->GetStaticMethodID( JspFactoryClass, "setDefaultFactory",
"(Ljavax/servlet/jsp/JspFactory;)V");
if (!setDefaultMID) return PIAPI_ERROR;
env->CallStaticVoidMethod(JspFactoryClass, setDefaultMID, jJspFactory);
if ( env->ExceptionOccurred() ) return PIAPI_ERROR;
jJspFactory = env->NewGlobalRef(jJspFactory);
};
return PIAPI_COMPLETED;
};
int ServletContainer::validateSessionPool( JNIEnv *env ) {
jclass SessionPoolClass = 0;
SessionPoolClass = env->GetObjectClass(jSessionPool);
/* Check the sessions, delete all invalid sessions */
jmethodID elementsMID;
elementsMID = env->GetMethodID( SessionPoolClass, "elements",
"()Ljava/util/Enumeration;");
if (!elementsMID) return PIAPI_ERROR;
jobject SessionPoolElements;
SessionPoolElements = env->CallObjectMethod(jSessionPool, elementsMID);
if ( env->ExceptionOccurred() ) return PIAPI_ERROR;
jmethodID nextElementMID;
nextElementMID = env->GetMethodID( env->GetObjectClass(SessionPoolElements),
"nextElement", "()Ljava/lang/Object;");
if (!nextElementMID) return PIAPI_ERROR;
jmethodID hasMoreElementsMID;
hasMoreElementsMID = env->GetMethodID( env->GetObjectClass(SessionPoolElements),
"hasMoreElements", "()Z");
if (!hasMoreElementsMID) return PIAPI_ERROR;
while (env->CallBooleanMethod(SessionPoolElements, hasMoreElementsMID)) {
jobject HttpSession;
HttpSession = env->CallObjectMethod(SessionPoolElements, nextElementMID);
if ( env->ExceptionOccurred() ) return PIAPI_ERROR;
if (HttpSession) {
jmethodID isValidMID;
isValidMID = env->GetMethodID( env->GetObjectClass(HttpSession),
"isValid", "()Z");
if (!isValidMID) return PIAPI_ERROR;
jboolean bValid;
bValid = env->CallBooleanMethod(HttpSession, isValidMID);
if ( env->ExceptionOccurred() ) return PIAPI_ERROR;
if (!bValid) {
jmethodID getSidMID;
getSidMID = env->GetMethodID( env->GetObjectClass(HttpSession),
"getSID", "()Ljava/lang/String;");
if (!getSidMID) return PIAPI_ERROR;
jobject SID;
SID = env->CallObjectMethod(HttpSession, getSidMID);
if ( env->ExceptionOccurred() ) return PIAPI_ERROR;
jmethodID removeMID;
removeMID = env->GetMethodID( env->GetObjectClass(jSessionPool),
"remove", "(Ljava/lang/Object;)Ljava/lang/Object;");
if (!removeMID) return PIAPI_ERROR;
env->CallObjectMethod(jSessionPool, removeMID, SID);
if ( env->ExceptionOccurred() ) return PIAPI_ERROR;
env->DeleteGlobalRef(HttpSession);
};
};
};
return PIAPI_COMPLETED;
}
int ServletContainer::Log( PIHTTP *pPIHTTP, const char *msg )
{
if ( logfile == PIPLATFORM_FD_INVALID ) return PIAPI_COMPLETED;
enum { BUF_SIZE=1024 };
char szBuf[BUF_SIZE];
char *pBuf = szBuf;
int iRet = PIAPI_COMPLETED;
if ( pExpr ) {
int iLen = Pi3Expression_write( pExpr, pPIHTTP, 0, pBuf, BUF_SIZE );
if ( iLen>BUF_SIZE )
{
pBuf = PI_NEW( char[iLen] );
iLen = Pi3Expression_write( pExpr, pPIHTTP, 0, pBuf, iLen );
};
iRet = PIFile_writeAtomic( logfile, iLen, pBuf );
};
iRet = PIFile_writeAtomic( logfile, strlen(msg), msg );
iRet = PIFile_writeAtomic( logfile, strlen("\r\n"), "\r\n" );
if ( iRet )
{
/* --- an error occurred --- */
HTTPCore_logError( pPIHTTP, "ServletContainer: \
Container()->Log() failed for file '%s', error code '%d'.",
(const char *)sLogfileName, PIPlatform_getLastError() );
};
return iRet;
};
int ServletContainer::Log( const char *msg )
{
if ( logfile == PIPLATFORM_FD_INVALID ) return PIAPI_COMPLETED;
enum { BUF_SIZE=1024 };
char szBuf[BUF_SIZE];
char *pBuf = szBuf;
int iRet = PIAPI_COMPLETED;
iRet = PIFile_writeAtomic( logfile, strlen(msg), msg );
iRet = PIFile_writeAtomic( logfile, strlen("\r\n"), "\r\n" );
return iRet;
};
int ServletContainer::registerServlet( const char *ClassName, jobject Servlet ) {
return PIDB_replace( pServlets, PIDBTYPE_OPAQUE, ClassName, (void *)Servlet, 0 );
};
int ServletContainer::unregServlet( const char *ClassName ) {
return PIDB_replace( pServlets, PIDBTYPE_OPAQUE, ClassName, 0, 0 );
};
jobject ServletContainer::getServlet( const char *ClassName ) {
return (jobject)PIDB_lookup( pServlets, PIDBTYPE_OPAQUE, ClassName, 0 );
};
/*____________________________________________________________________________*\
*
Function:
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int ServletContainer_onClassLoad( PIClass_LoadAction eLoad, void * )
{
return PIAPI_COMPLETED;
}
/*____________________________________________________________________________*\
*
Function:
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int ServletContainer_constructor( PIObject *pObj,
int iArgc, const char *ppArgv[] )
{
ServletContainer *pCont = (ServletContainer *)PI_NEW(
ServletContainer( pObj, iArgc, ppArgv ) );
if (!( pCont && pCont->IsOK() ))
{
delete pCont;
return PIAPI_ERROR;
};
if ( PIObject_setUserData( pObj, pCont ) )
{
delete pCont;
CONFIG_ERR( pObj, "ServletContainer_constructor: PIObject_setUserData() failed" );
return PIAPI_ERROR;
};
return PIAPI_COMPLETED;
}
/*____________________________________________________________________________*\
*
Function:
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int ServletContainer_copyConstructor( PIObject *o, int i, const char *a[] )
{
return PIAPI_ERROR;
}
/*____________________________________________________________________________*\
*
Function:
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int ServletContainer_execute( PIObject *pObj,
int iArgc, const char *ppArgv[] )
{
return PIAPI_ERROR;
}
/*____________________________________________________________________________*\
*
Function:
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int ServletContainer_destructor( PIObject *pObj, int i, const char *a[] )
{
delete (ServletContainer *)PIObject_getUserData( pObj );
return PIAPI_COMPLETED;
}
#if 0
/*___+++CNF_BEGIN+++___*/
<Class>
Name ServletContainerClass
Type LogicExtension
Library Servlet
OnClassLoad ServletContainer_onClassLoad
Constructor ServletContainer_constructor
CopyConstructor ServletContainer_copyConstructor
Destructor ServletContainer_destructor
Execute ServletContainer_execute
</Class>
<Object>
Name ServletContainer
Class ServletContainerClass
JvmNumber 1
JvmOption "-Djava.compiler=NONE"
JvmOption "-verbose:jni"
JvmOption "-Djava.class.path=servlet.jar;Pi3Servlet.jar;..\Jsp"
JvmOption "-Djava.library.path=."
JvmLocalReferences 128
JvmIgnoreUnrecognized ""
LogFile "../Logs/servlet.log"
Expression "[$t|$P|$k|$T] "
OpenMode "a"
DocBase ".\WebRoot2"
</Object>
/*___+++CNF_END+++___*/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -