*** original_JSPCompiler.java Sat Jul 3 11:32:28 1999 --- JSPCompiler.java Sat Jul 3 21:03:10 1999 *************** *** 318,323 **** --- 318,330 ---- runatServer = true; } } + } else if((srcPos < src.length()-10) && // TODO change the 10 + // to something sensible + srcEqualsAt("jsp:",srcPos + 1)) { + // one of those <jsp:... things + srcPos += "<jsp:".length(); + parseAction(); + return true; } else if(srcPos < src.length()-10 && src.substring(srcPos+1, srcPos+5).equalsIgnoreCase("BEAN") && Character.isWhitespace(src.charAt(srcPos+5))) *************** *** 447,453 **** private void parseInclude(String value, boolean virtual) throws StringIndexOutOfBoundsException, JSPException { File prevJspFile; String s, prevSrc; ! int prevSrcPos, prevLineNr; prevJspFile = jspFile; prevSrc = src; --- 454,460 ---- private void parseInclude(String value, boolean virtual) throws StringIndexOutOfBoundsException, JSPException { File prevJspFile; String s, prevSrc; ! int prevSrcPos, prevLineNr; prevJspFile = jspFile; prevSrc = src; *************** *** 477,482 **** --- 484,588 ---- } } + private void parseAction() throws StringIndexOutOfBoundsException, JSPException { + if((srcEqualsAt("forward")) + && Character.isWhitespace(src.charAt(srcPos+"forward".length()+1))) { + srcPos += "forward".length() + 1; + parseActionForward(); + } else if((srcEqualsAt("getProperty") + && Character.isWhitespace(src.charAt(srcPos+"getProperty".length() + 1)))) { + srcPos += "getProperty".length() + 1; + parseActionGetProperty(); + } else if(srcEqualsAt("include") + && Character.isWhitespace(src.charAt(srcPos+"include".length() + 1))) { + srcPos += "include".length() + 1; + parseActionInclude(); + } else if(srcEqualsAt("plugin") + && Character.isWhitespace(src.charAt(srcPos+"plugin".length() + 1))) { + srcPos += "plugin".length() + 1; + parseActionPlugin(); + } else if(srcEqualsAt("setProperty") + && Character.isWhitespace(src.charAt(srcPos+"setProperty".length() + 1))) { + srcPos += "setProperty".length() + 1; + parseActionSetProperty(); + } else if(srcEqualsAt("useBean") + && Character.isWhitespace(src.charAt(srcPos+"useBean".length() + 1))) { + srcPos += "useBean".length() + 1; + parseActionUseBean(); + } else { + throw new JSPException("<B>" + jspFile.getPath() + ":" + lineNr + "</B>: Unknown jsp action"); + } + } + + + /** + * Parses the jsp:forward tag. + * Ignores illegal parameters.<BR> + * Relative URL's will probably not work, as request.sendRedirect is used + */ + private void parseActionForward() throws StringIndexOutOfBoundsException, JSPException { + String page = (String)(parseParameters().get("page")); + if(page == null) { + throw new JSPException("<B>" + jspFile.getPath() + ":" + lineNr + "</B>: jsp:forward requires a \"page\" parameter"); + } + recordFileAndLineNr(scriptletsCode); + scriptletsCode.append("\t\t\tresponse.sendRedirect(request.encodeRedirectURL(\"" + page + "\"));").append(lineSeparator); + } + + + private void parseActionGetProperty() throws StringIndexOutOfBoundsException, JSPException { + Hashtable params = parseParameters(); + } + + + /** + * Parses the jsp:include tag. + * Ignores illegal parameters. + */ + private void parseActionInclude() throws StringIndexOutOfBoundsException, JSPException { + String page = (String)(parseParameters().get("page")); + if(page == null) { + throw new JSPException("<B>" + jspFile.getPath() + ":" + lineNr + "</B>: jsp:include requires a \"page\" parameter"); + } + } + + + private void parseActionPlugin() throws StringIndexOutOfBoundsException, JSPException { + Hashtable params = parseParameters(); + } + + + private void parseActionSetProperty() throws StringIndexOutOfBoundsException, JSPException { + Hashtable params = parseParameters(); + } + + + private void parseActionUseBean() throws StringIndexOutOfBoundsException, JSPException { + Hashtable params = parseParameters(); + } + + + /** + * Reads all the parameters of a tag and returns them in a Hashtable. + */ + private Hashtable parseParameters() throws StringIndexOutOfBoundsException, JSPException { + Hashtable result = new Hashtable(); + for(;;) { + // check for end of tag + if((src.charAt(srcPos) == '/') + &&(src.charAt(srcPos + 1) == '>')) { + srcPos++; + break; + } else if(src.charAt(srcPos) == '>') { + break; + } + String[] keyAndValue = parseKeyAndValue(); + result.put(keyAndValue[0], keyAndValue[1]); + } + return result; + } + + private void parseBean() throws StringIndexOutOfBoundsException, JSPException { Properties beanAttributes; Hashtable beanDefaultProperties; *************** *** 655,660 **** --- 761,776 ---- } finally { lineNr = endLineNr; } + } + + + private boolean srcEqualsAt(String string) { + return srcEqualsAt(string,srcPos); + } + + + private boolean srcEqualsAt(String string, int pos) { + return src.substring(pos, pos + string.length()).equals(string); } private String[] parseKeyAndValue() throws StringIndexOutOfBoundsException {