📄 jsphandler.cpp
字号:
JspCompilerClass = env->FindClass("org/pi3/jsp/core/Pi3JspCompiler");
if (!JspCompilerClass) { goto init_error; }
/* get the JspCompiler constructor */
jmethodID JspCompilerMID;
JspCompilerMID = env->GetMethodID(JspCompilerClass, "<init>", "()V");
if (!JspCompilerMID) { goto init_error; };
/* get the JspCompiler object */
JspCompilerObject = env->NewObject( JspCompilerClass, JspCompilerMID );
if (!JspCompilerObject) { goto init_error; };
/* get the Pi3JspCompiler.compile method */
jmethodID compileMID;
compileMID = env->GetMethodID(JspCompilerClass, "compile",
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z");
if (!compileMID) { goto init_error; };
/* invoke the Pi3JspCompiler.compile method */
jboolean bRes;
bRes = env->CallBooleanMethod(JspCompilerObject, compileMID,
env->NewStringUTF( (const char *)sEncoding ),
env->NewStringUTF( (const char *)sClassPath ),
env->NewStringUTF( (const char *)sOutputPath ),
env->NewStringUTF( pSourcePath ));
if (!bRes)
{
Log( &tPIHTTP, "Pi3JspCompiler.compile() method failed for %s.",
pSourcePath );
}
else
{
Log( &tPIHTTP, "Pi3JspCompiler.compile() method invoked for %s.",
pSourcePath );
goto done;
}
init_error:
Exception = env->ExceptionOccurred();
if ( Exception && ServletUtilsObject && grabStackTraceMID )
{
Log( &tPIHTTP, "%s: Exception occured: ", GetLogName());
/* invoke ServletUtils.grabStackTrace */
jstring jmsg = (jstring)env->CallObjectMethod(ServletUtilsObject,
grabStackTraceMID, Exception);
if (jmsg) {
jboolean isCopy;
const char *msg = env->GetStringUTFChars(jmsg, &isCopy);
Log( &tPIHTTP, msg);
HTTPCore_logError(&tPIHTTP, msg);
env->ReleaseStringUTFChars(jmsg, msg);
}
else
{
HTTPCore_logError( &tPIHTTP, "%s: \
An unknown exception occured during invokation of java compiler.", GetLogName());
}
env->ExceptionDescribe();
env->ExceptionClear();
} else {
HTTPCore_logError(&tPIHTTP, "%s: Check your CLASSPATH settings.",
GetLogName());
};
iRet = HTTPUtil_doHTTPError(&tPIHTTP, ST_INTERNALERROR);
done:
/* We are done. */
if (!PIHTTP_isChild( &tPIHTTP )) {
if (!JVM()->DetachCurrentThread()/* !jvm->DestroyJavaVM() **/) {
Log( &tPIHTTP, "%s: JVM detached.", GetLogName());
} else {
Log( &tPIHTTP, "%s: Error when trying to detach JVM.", GetLogName());
};
};
#endif // WIN32
#ifdef POSIX
pid_t iPid;
PIString sEnc("-encoding");
iPid = ::fork();
switch( iPid )
{
case -1:
break;
case 0:
/* ---
This is the child
--- */
enum { MAX_PARAMS = 7 };
char *ppParams[MAX_PARAMS];
sEnc.Concatenate(sEncoding);
if (sClassPath.Len())
{
ppParams[0] = (char *)(const char *)sEnc;
ppParams[1] = "-classpath";
ppParams[2] = (char *)(const char *)sClassPath;
ppParams[3] = "-d";
ppParams[4] = (char *)(const char *)sOutputPath;
ppParams[5] = (char *)pSourcePath;
ppParams[6] = NULL;
}
else
{
ppParams[0] = (char *)(const char *)sEnc;
ppParams[1] = "-d";
ppParams[2] = (char *)(const char *)sOutputPath;
ppParams[3] = (char *)pSourcePath;
ppParams[4] = NULL;
};
if ( ::execv((const char *)sCompiler, (char *const *)ppParams)==-1 )
{
perror( "Java Compiler, execv() failed." );
fprintf( stderr, "Path is '%s'\n", pSourcePath );
fflush( stderr );
::_exit( 1 );
};
/* none of the following should happen */
::_exit( -1 );
assert( 0 );
break;
default:
/* --- this is the parent --- */
waitpid( iPid, &iRet, WUNTRACED );
/* --- log debug information about the process --- */
HTTPCore_logDebug( DBG_MED, "Process created!, \n\tPid %d", iPid );
};
#endif // POSIX
return iRet;
}
int Jsp::Handle( int iPhase, PIHTTP &tPIHTTP, PIIOBuffer &pB/* tBuffer */ )
{
if ( iPhase != PH_HANDLE ) return PIAPI_ERROR;
/**
* Assume we can't keep open connection due to
* unknow Content-Length because of dynamic Jsp
**/
PIDB_replace( tPIHTTP.pConnectionDB, PIDBTYPE_OPAQUE, KEY_INT_KEEPOPEN, 0, 0 );
PIDB *pR = tPIHTTP.pResponseDB;
const char *pServletName = 0;
int iRet = PIAPI_ERROR;
PIString sServletPath;
PIString sClassFile;
const char *Ext;
PIFInfo *pFI;
PIFInfo *pTmpFI;
// File modification times
PIPLATFORM_TIME tJsp;
PIPLATFORM_TIME tJava;
PIPLATFORM_TIME tClass;
// Ascertain Jsp name from path and compile Jsp
const char *pPath = (const char *)PIDB_lookup( pR, PIDBTYPE_STRING,
KEY_INT_PATH, 0 );
if (!pPath) return PIAPI_ERROR;
pFI = PIFInfo_new( pPath );
if (!PIFInfo_exists( pFI ) || !PIFInfo_isRegular( pFI ))
{
PIFInfo_delete( pFI );
return HTTPUtil_doHTTPError( &tPIHTTP, ST_NOTFOUND );
}
Ext = PIFInfo_getExtension( pFI );
if ( Ext && !PIUtil_stricmp(Ext, "jsp"))
{
const char *pServletName = PIFInfo_getName( pFI );
if ( pServletName )
{
sClassName = PIString( pServletName, strlen( pServletName ) - 4 );
}
else
{
goto init_error;
};
}
else
{
goto init_error;
};
sServletPath = sSourcePath;
sServletPath.Concatenate( PIPlatform_getDirectorySeparator() );
sServletPath.Concatenate( sClassName );
sServletPath.Concatenate( ".java" );
PISync_lock( pMutex );
tJsp = PIFInfo_getLastModified( pFI );
pTmpFI = PIFInfo_new( (const char *)sServletPath );
tJava = PIFInfo_getLastModified( pTmpFI );
PIFInfo_delete( pTmpFI );
// no java source or older than jsp source
if ( tJsp > tJava )
{
JspFlexLexer scanner(pPath, sServletPath, sClassName, sExtendsName);
iRet = scanner.exec();
if (iRet) {
iRet = PIAPI_ERROR;
HTTPCore_logError( &tPIHTTP, "Jsp parser failed for \
Input: %s, ServletPath: %s, ClassName: %s, Extends: %",
pPath,
(const char *)sServletPath,
(const char *)sClassName,
(const char *)sExtendsName
) ;
goto init_error;
};
pTmpFI = PIFInfo_new( sServletPath );
tJava = PIFInfo_getLastModified( pTmpFI );
PIFInfo_delete( pTmpFI );
}
PIFInfo_delete( pFI );
sClassFile = sOutputPath;
sClassFile.Concatenate( PIPlatform_getDirectorySeparator() );
sClassFile.Concatenate( sClassName );
sClassFile.Concatenate( ".class" );
pFI = PIFInfo_new( (const char *)sClassFile );
tClass = PIFInfo_getLastModified( pFI );
// no java class or older than java source
if ( tJava > tClass )
{
// call the java compiler
iRet = Compile( tPIHTTP, sServletPath );
if (iRet != PIAPI_COMPLETED ) {
HTTPCore_logError( &tPIHTTP,
"Java compiler failed for: \"%s\"", (const char *)sServletPath) ;
goto init_error;
};
};
iRet = Servlet::Handle( iPhase, tPIHTTP, pB );
init_error:
PISync_unlock( pMutex );
PIFInfo_delete( pFI );
if (iRet) {
return HTTPUtil_doHTTPError( &tPIHTTP, ST_INTERNALERROR );
}
return iRet;
};
/*____________________________________________________________________________*\
*
Function:
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int Jsp_constructor( PIObject *pObj,
int iArgc, const char *ppArgv[] )
{
return HandlerBaseServlet_constructor( pObj, PI_NEW( Jsp( pObj,
iArgc, ppArgv, "Jsp handler" ) ) );
}
/*____________________________________________________________________________*\
*
Function:
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int Jsp_destructor( PIObject *pObj, int,
const char *[] )
{
delete (Servlet *)PIObject_getUserData( pObj );
return PIAPI_COMPLETED;
}
#if 0
/*___+++CNF_BEGIN+++___*/
<Class>
Name JspClass
Type LogicExtension
Library Servlet
OnClassLoad HandlerBaseServlet_onClassLoad
Constructor Jsp_constructor
CopyConstructor HandlerBaseServlet_copyConstructor
Destructor Jsp_destructor
Execute HandlerBaseServlet_execute
</Class>
<Object>
Name Jsp
Class JspClass
Context ServletContainer
</Object>
/*___+++CNF_END+++___*/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -