dsandberg 2002/11/23 22:22:37 Modified: catalina/src/share/org/apache/catalina/ssi SSIConfig.java SSIExec.java SSIFlastmod.java SSIFsize.java SSIInclude.java SSIMediator.java SSISet.java tester/src/bin tester.xml tester/web SSIConditional03.shtml SSIVarSub05.shtml tester/web/golden SSIVarSub01.txt SSIVarSub04.txt SSIVarSub05.txt Added: tester/web/golden SSIVarSub06.txt Log: Added back Paul Speed's variable substitution SSI enhancement. Updated code/regression tests to better emulate Apache SSI. Revision Changes Path 1.2 +8 -7 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIConfig.java Index: SSIConfig.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIConfig.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SSIConfig.java 24 May 2002 04:38:58 -0000 1.1 +++ SSIConfig.java 24 Nov 2002 06:22:36 -0000 1.2 @@ -87,13 +87,14 @@ for(int i=0;i<paramNames.length;i++) { String paramName = paramNames[i]; String paramValue = paramValues[i]; + String substitutedValue = ssiMediator.substituteVariables( paramValue ); if ( paramName.equalsIgnoreCase("errmsg") ) { - ssiMediator.setConfigErrMsg( paramValue ); + ssiMediator.setConfigErrMsg( substitutedValue ); } else if ( paramName.equalsIgnoreCase("sizefmt") ) { - ssiMediator.setConfigSizeFmt( paramValue ); + ssiMediator.setConfigSizeFmt( substitutedValue ); } else if ( paramName.equalsIgnoreCase("timefmt") ) { - ssiMediator.setConfigTimeFmt( paramValue ); + ssiMediator.setConfigTimeFmt( substitutedValue ); } else { ssiMediator.log("#config--Invalid attribute: " + paramName ); //We need to fetch this value each time, since it may change during the loop 1.2 +9 -8 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIExec.java Index: SSIExec.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIExec.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SSIExec.java 24 May 2002 04:38:58 -0000 1.1 +++ SSIExec.java 24 Nov 2002 06:22:36 -0000 1.2 @@ -108,14 +108,15 @@ String configErrMsg = ssiMediator.getConfigErrMsg(); String paramName = paramNames[0]; String paramValue = paramValues[0]; + String substitutedValue = ssiMediator.substituteVariables( paramValue ); if ( paramName.equalsIgnoreCase("cgi") ) { - ssiInclude.process( ssiMediator, new String[] {"virtual"}, new String[] {paramValue}, writer ); + ssiInclude.process( ssiMediator, new String[] {"virtual"}, new String[] {substitutedValue}, writer ); } else if ( paramName.equalsIgnoreCase("cmd") ) { boolean foundProgram = false; try { Runtime rt = Runtime.getRuntime(); - Process proc = rt.exec( paramValue ); + Process proc = rt.exec( substitutedValue ); foundProgram = true; BufferedReader stdOutReader = new BufferedReader(new InputStreamReader(proc.getInputStream())); @@ -126,13 +127,13 @@ IOTools.flow( stdOutReader, writer, buf ); proc.waitFor(); } catch ( InterruptedException e ) { - ssiMediator.log( "Couldn't exec file: " + paramValue, e ); + ssiMediator.log( "Couldn't exec file: " + substitutedValue, e ); writer.write( configErrMsg ); } catch ( IOException e ) { if ( !foundProgram ) { //apache doesn't output an error message if it can't find a program } - ssiMediator.log( "Couldn't exec file: " + paramValue, e ); + ssiMediator.log( "Couldn't exec file: " + substitutedValue, e ); } } } 1.2 +7 -6 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIFlastmod.java Index: SSIFlastmod.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIFlastmod.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SSIFlastmod.java 24 May 2002 04:38:58 -0000 1.1 +++ SSIFlastmod.java 24 Nov 2002 06:22:36 -0000 1.2 @@ -93,12 +93,13 @@ for(int i=0;i<paramNames.length;i++) { String paramName = paramNames[i]; String paramValue = paramValues[i]; + String substitutedValue = ssiMediator.substituteVariables( paramValue ); try { if ( paramName.equalsIgnoreCase("file") || paramName.equalsIgnoreCase("virtual") ) { boolean virtual = paramName.equalsIgnoreCase("virtual"); - long lastModified = ssiMediator.getFileLastModified( paramValue, virtual ); + long lastModified = ssiMediator.getFileLastModified( substitutedValue, virtual ); Date date = new Date( lastModified ); String configTimeFmt = ssiMediator.getConfigTimeFmt(); writer.write( formatDate(date, configTimeFmt ) ); @@ -107,7 +108,7 @@ writer.write( configErrMsg ); } } catch ( IOException e ) { - ssiMediator.log("#flastmod--Couldn't get last modified for file: " + paramValue, e ); + ssiMediator.log("#flastmod--Couldn't get last modified for file: " + substitutedValue, e ); writer.write( configErrMsg ); } } 1.3 +7 -6 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIFsize.java Index: SSIFsize.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIFsize.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- SSIFsize.java 5 Jun 2002 19:09:17 -0000 1.2 +++ SSIFsize.java 24 Nov 2002 06:22:36 -0000 1.3 @@ -91,12 +91,13 @@ for(int i=0;i<paramNames.length;i++) { String paramName = paramNames[i]; String paramValue = paramValues[i]; + String substitutedValue = ssiMediator.substituteVariables( paramValue ); try { if ( paramName.equalsIgnoreCase("file") || paramName.equalsIgnoreCase("virtual") ) { boolean virtual = paramName.equalsIgnoreCase("virtual"); - long size = ssiMediator.getFileSize( paramValue, virtual ); + long size = ssiMediator.getFileSize( substitutedValue, virtual ); String configSizeFmt = ssiMediator.getConfigSizeFmt(); writer.write( formatSize(size, configSizeFmt ) ); } else { @@ -104,7 +105,7 @@ writer.write( configErrMsg ); } } catch ( IOException e ) { - ssiMediator.log("#fsize--Couldn't get size for file: " + paramValue, e ); + ssiMediator.log("#fsize--Couldn't get size for file: " + substitutedValue, e ); writer.write( configErrMsg ); } } 1.2 +7 -6 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIInclude.java Index: SSIInclude.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIInclude.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SSIInclude.java 24 May 2002 04:38:58 -0000 1.1 +++ SSIInclude.java 24 Nov 2002 06:22:36 -0000 1.2 @@ -92,19 +92,20 @@ for ( int i=0; i < paramNames.length; i++ ) { String paramName = paramNames[i]; String paramValue = paramValues[i]; + String substitutedValue = ssiMediator.substituteVariables( paramValue ); try { if ( paramName.equalsIgnoreCase("file") || paramName.equalsIgnoreCase("virtual") ) { boolean virtual = paramName.equalsIgnoreCase("virtual"); - String text = ssiMediator.getFileText( paramValue, virtual ); + String text = ssiMediator.getFileText( substitutedValue, virtual ); writer.write( text ); } else { ssiMediator.log("#include--Invalid attribute: " + paramName ); writer.write( configErrMsg ); } } catch ( IOException e ) { - ssiMediator.log("#include--Couldn't include file: " + paramValue, e ); + ssiMediator.log("#include--Couldn't include file: " + substitutedValue, e ); writer.write( configErrMsg ); } } 1.2 +77 -4 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIMediator.java Index: SSIMediator.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIMediator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SSIMediator.java 24 May 2002 04:38:58 -0000 1.1 +++ SSIMediator.java 24 Nov 2002 06:22:36 -0000 1.2 @@ -228,6 +228,79 @@ return variableValue; } + /** + * Applies variable substitution to the specified String and + * returns the new resolved string. + */ + public String substituteVariables( String val ) { + + // If it has no variable references then no work + // need to be done + if (val.indexOf( '$' ) < 0) + return val; + + StringBuffer sb = new StringBuffer( val ); + for (int i = 0; i < sb.length();) { + + // Find the next $ + for (; i < sb.length(); i++) { + if (sb.charAt(i) == '$') { + i++; + break; + } + } + + if (i == sb.length()) + break; + + // Check to see if the $ is escaped + if (i > 1 && sb.charAt(i-2) == '\\') { + sb.deleteCharAt(i-2); + i--; + continue; + } + + int nameStart = i; + int start = i - 1; + int end = -1; + int nameEnd = -1; + char endChar = ' '; + + // Check for {} wrapped var + if (sb.charAt(i) == '{') { + nameStart++; + endChar = '}'; + } + + // Find the end of the var reference + for (; i < sb.length(); i++) { + if (sb.charAt(i) == endChar) + break; + } + end = i; + nameEnd = end; + + if (endChar == '}') + end++; + + // We should now have enough to extract the var name + String varName = sb.substring( nameStart, nameEnd ); + + String value = getVariableValue( varName ); + if (value == null) + value = ""; + + // Replace the var name with its value + sb.replace( start, end, value ); + + // Start searching for the next $ after the value + // that was just substituted. + i = start + value.length(); + } + + return sb.toString(); + } + protected String formatDate( Date date, TimeZone timeZone ) { String retVal; 1.2 +6 -5 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSISet.java Index: SSISet.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSISet.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SSISet.java 24 May 2002 04:38:58 -0000 1.1 +++ SSISet.java 24 Nov 2002 06:22:36 -0000 1.2 @@ -92,7 +92,8 @@ variableName = paramValue; } else if ( paramName.equalsIgnoreCase("value") ) { if ( variableName != null ) { - ssiMediator.setVariableValue( variableName, paramValue ); + String substitutedValue = ssiMediator.substituteVariables( paramValue ); + ssiMediator.setVariableValue( variableName, substitutedValue ); } else { ssiMediator.log("#set--no variable specified"); writer.write( errorMessage ); 1.84 +24 -0 jakarta-tomcat-4.0/tester/src/bin/tester.xml Index: tester.xml =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/tester/src/bin/tester.xml,v retrieving revision 1.83 retrieving revision 1.84 diff -u -r1.83 -r1.84 --- tester.xml 14 Mar 2002 20:41:38 -0000 1.83 +++ tester.xml 24 Nov 2002 06:22:36 -0000 1.84 @@ -1848,6 +1848,30 @@ request="${context.path}/SSIFsize08.shtml" debug="${debug}" golden="${golden.path}/SSIFsize02.txt"/> + <tester host="${host}" port="${port}" protocol="${protocol}" + request="${context.path}/SSIVarSub01.shtml" debug="${debug}" + golden="${golden.path}/SSIVarSub01.txt"/> + + <tester host="${host}" port="${port}" protocol="${protocol}" + request="${context.path}/SSIVarSub02.shtml" debug="${debug}" + golden="${golden.path}/SSIVarSub02.txt"/> + + <tester host="${host}" port="${port}" protocol="${protocol}" + request="${context.path}/SSIVarSub03.shtml" debug="${debug}" + golden="${golden.path}/SSIVarSub03.txt"/> + + <tester host="${host}" port="${port}" protocol="${protocol}" + request="${context.path}/SSIVarSub04.shtml" debug="${debug}" + golden="${golden.path}/SSIVarSub04.txt"/> + + <tester host="${host}" port="${port}" protocol="${protocol}" + request="${context.path}/SSIVarSub05.shtml" debug="${debug}" + golden="${golden.path}/SSIVarSub05.txt"/> + + <tester host="${host}" port="${port}" protocol="${protocol}" + request="${context.path}/SSIVarSub06.shtml" debug="${debug}" + golden="${golden.path}/SSIVarSub06.txt"/> + </target> --> 1.2 +1 -1 jakarta-tomcat-4.0/tester/web/SSIConditional03.shtml Index: SSIConditional03.shtml =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/tester/web/SSIConditional03.shtml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SSIConditional03.shtml 29 Nov 2001 03:52:27 -0000 1.1 +++ SSIConditional03.shtml 24 Nov 2002 06:22:36 -0000 1.2 @@ -1,6 +1,6 @@ Before if block. <!--#set var="test" value="unquoted multi-word value" --> -<!--#if expr="\"$test\" = unquoted multi-word value" --> +<!--#if expr="$test = unquoted multi-word value" --> test = "unquoted multi-word value" <!--#else --> test = not "unquoted multi-word value" 1.2 +0 -1 jakarta-tomcat-4.0/tester/web/SSIVarSub05.shtml Index: SSIVarSub05.shtml =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/tester/web/SSIVarSub05.shtml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SSIVarSub05.shtml 29 Nov 2001 03:52:27 -0000 1.1 +++ SSIVarSub05.shtml 24 Nov 2002 06:22:36 -0000 1.2 @@ -2,4 +2,3 @@ <!--#set var="test2" value="value of test2" --> <!--#set var="test3" value="${test}|${test2}" --> <!--#echo var="test3" --> - 1.2 +1 -1 jakarta-tomcat-4.0/tester/web/golden/SSIVarSub01.txt Index: SSIVarSub01.txt =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/tester/web/golden/SSIVarSub01.txt,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SSIVarSub01.txt 29 Nov 2001 03:53:00 -0000 1.1 +++ SSIVarSub01.txt 24 Nov 2002 06:22:37 -0000 1.2 @@ -1,3 +1,3 @@ -/SSIVarSub01.shtml +/tester/SSIVarSub01.shtml 1.2 +1 -1 jakarta-tomcat-4.0/tester/web/golden/SSIVarSub04.txt Index: SSIVarSub04.txt =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/tester/web/golden/SSIVarSub04.txt,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SSIVarSub04.txt 29 Nov 2001 03:53:00 -0000 1.1 +++ SSIVarSub04.txt 24 Nov 2002 06:22:37 -0000 1.2 @@ -1,5 +1,5 @@ -value of test|value of test2 +value of test value of test2 1.2 +2 -1 jakarta-tomcat-4.0/tester/web/golden/SSIVarSub05.txt Index: SSIVarSub05.txt =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/tester/web/golden/SSIVarSub05.txt,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SSIVarSub05.txt 29 Nov 2001 03:53:00 -0000 1.1 +++ SSIVarSub05.txt 24 Nov 2002 06:22:37 -0000 1.2 @@ -1,3 +1,4 @@ -value of test\${test2} + +value of test|value of test2 1.1 jakarta-tomcat-4.0/tester/web/golden/SSIVarSub06.txt Index: SSIVarSub06.txt =================================================================== value of test${test2}
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>