📄 parser.java
字号:
static { coreElements.addElement(new SetProperty()); } /* * User-defined Tags */ static final class Tag implements CoreElement { private static final String CLOSE_1 = "/>"; private static final String CLOSE = ">"; public boolean accept(ParseEventListener listener, JspReader reader, Parser parser) throws JasperException { if (reader.peekChar() != '<') return false; Mark start = reader.mark(); reader.nextChar(); String tag = reader.parseToken(false); /* * Extract the prefix and the short tag name. */ int i = tag.indexOf(':'); if (i == -1) { reader.reset(start); return false; } String prefix = tag.substring(0, i); String shortTagName = ""; if (++i < tag.length()) shortTagName = tag.substring(i); /* * Check if this is a user-defined tag; otherwise we won't touch this... */ TagLibraries libraries = listener.getTagLibraries(); if (!libraries.isUserDefinedTag(prefix, shortTagName)) { reader.reset(start); return false; } if (shortTagName == null) throw new ParseException(start, "Nothing after the :"); TagLibraryInfo tli = libraries.getTagLibInfo(prefix); TagInfo ti = tli.getTag(shortTagName); if (ti == null) throw new ParseException(start, "Unable to locate TagInfo for "+tag); String bc = ti.getBodyContent(); Hashtable attrs = reader.parseTagAttributes(); reader.skipSpaces(); Mark bodyStart = null; Mark bodyStop = null; if (reader.matches(CLOSE_1) || bc.equalsIgnoreCase(TagInfo.BODY_CONTENT_EMPTY)) { if (reader.matches(CLOSE_1)) reader.advance(CLOSE_1.length()); else throw new ParseException(start, "Body is supposed to be empty for "+tag); listener.setTemplateInfo(parser.tmplStart, parser.tmplStop); listener.handleTagBegin(start, reader.mark(), attrs, prefix, shortTagName, tli, ti); listener.handleTagEnd(start, reader.mark(), prefix, shortTagName, attrs, tli, ti); } else { // Body can be either // - JSP tags // - tag dependent stuff if (reader.matches(CLOSE)) { reader.advance(CLOSE.length()); bodyStart = reader.mark(); listener.setTemplateInfo(parser.tmplStart, parser.tmplStop); listener.handleTagBegin(start, bodyStart, attrs, prefix, shortTagName, tli, ti); if (bc.equalsIgnoreCase(TagInfo.BODY_CONTENT_TAG_DEPENDENT) || bc.equalsIgnoreCase(TagInfo.BODY_CONTENT_JSP)) { String tagEnd = "</"+tag+">"; // Parse until the end of the tag body. // Then skip the tag end... parser.parse(tagEnd); try { reader.advance(tagEnd.length()); } catch (ParseException ex) { throw new ParseException( start, Constants.getString("jsp.error.unterminated.user.tag", new Object[]{JspUtil.escapeXml(tagEnd)})); } listener.setTemplateInfo(parser.tmplStart, parser.tmplStop); listener.handleTagEnd(parser.tmplStop, reader.mark(), prefix, shortTagName, attrs, tli, ti); } else throw new ParseException(start, "Internal Error: Invalid BODY_CONTENT type"); } else throw new ParseException(start, "Unterminated user-defined tag"); } return true; } } static { coreElements.addElement(new Tag()); } /* * Plugin */ static final class Plugin implements CoreElement { private static final String OPEN_PLUGIN = "<jsp:plugin"; private static final String END_OPEN_PLUGIN = ">"; private static final String CLOSE_PLUGIN = "</jsp:plugin>"; private static final String OPEN_PARAMS = "<jsp:params>"; private static final String CLOSE_PARAMS = "</jsp:params>"; private static final String OPEN_INDIVIDUAL_PARAM = "<jsp:param"; private static final String CLOSE_INDIVIDUAL_PARAM = "/>"; private static final String OPEN_FALLBACK = "<jsp:fallback>"; private static final String CLOSE_FALLBACK = "</jsp:fallback>"; private static final JspUtil.ValidAttribute[] validAttributes = { new JspUtil.ValidAttribute ("type",true), new JspUtil.ValidAttribute("code", true), new JspUtil.ValidAttribute("codebase"), new JspUtil.ValidAttribute("align"), new JspUtil.ValidAttribute("archive"), new JspUtil.ValidAttribute("height"), new JspUtil.ValidAttribute("hspace"), new JspUtil.ValidAttribute("jreversion"), new JspUtil.ValidAttribute("name"), new JspUtil.ValidAttribute("vspace"), new JspUtil.ValidAttribute("width"), new JspUtil.ValidAttribute("nspluginurl"), new JspUtil.ValidAttribute("iepluginurl") }; public boolean accept(ParseEventListener listener, JspReader reader, Parser parser) throws JasperException { if (reader.matches(OPEN_PLUGIN)) { Mark start = reader.mark(); reader.advance(OPEN_PLUGIN.length()); Hashtable attrs = reader.parseTagAttributes (); reader.skipSpaces (); if (!reader.matches(END_OPEN_PLUGIN)) throw new ParseException (reader.mark(), Constants.getString("jsp.error.plugin.notclosed")); reader.advance (END_OPEN_PLUGIN.length ()); reader.skipSpaces (); Hashtable param = null; String fallback = null; JspUtil.checkAttributes ("plugin", attrs, validAttributes, start); if (reader.matches (OPEN_PARAMS)) { param = new Hashtable (); boolean paramsClosed = false; reader.advance (OPEN_PARAMS.length ()); /** * Can have more than one param tag. Hence get all the * params. */ while (reader.hasMoreInput ()) { reader.skipSpaces (); if (reader.matches (CLOSE_PARAMS)) { paramsClosed = true; reader.advance (CLOSE_PARAMS.length ()); break; } if (!reader.matches (OPEN_INDIVIDUAL_PARAM)) throw new ParseException (reader.mark(), Constants.getString("jsp.error.paramexpected")); reader.parsePluginParamTag(param); reader.skipSpaces (); if (!reader.matches (CLOSE_INDIVIDUAL_PARAM)) throw new ParseException (reader.mark(), Constants.getString( "jsp.error.closeindividualparam")); reader.advance (CLOSE_INDIVIDUAL_PARAM.length ()); } if (!paramsClosed) throw new ParseException (reader.mark(), Constants.getString("jsp.error.closeparams")); reader.skipSpaces (); } if (reader.matches (OPEN_FALLBACK)) { reader.advance(OPEN_FALLBACK.length ()); reader.skipSpaces (); Mark fallBackStart = reader.mark (); Mark fallBackStop = reader.skipUntil (CLOSE_FALLBACK); fallback = new String (reader.getChars(fallBackStart, fallBackStop)); reader.skipSpaces (); } if (!reader.matches(CLOSE_PLUGIN)) throw new ParseException(reader.mark(), Constants.getString( "jsp.error.unterminated", new Object[] { OPEN_PLUGIN })); reader.advance(CLOSE_PLUGIN.length()); Mark stop = reader.mark(); listener.setTemplateInfo(parser.tmplStart, parser.tmplStop); listener.handlePlugin(start, stop, attrs, param, fallback); return true; } else return false; } } static { coreElements.addElement(new Plugin()); } /* * Quoting in template text. * Entities ' and "e; */ static final class QuoteEscape implements CoreElement { /** * constants for escapes */ private static String QUOTED_START_TAG = "<\\%"; private static String QUOTED_END_TAG = "%\\>"; private static String START_TAG = "<%"; private static String END_TAG = "%>"; private static final String APOS = "'"; private static final String QUOTE = ""e;"; public boolean accept(ParseEventListener listener, JspReader reader, Parser parser) throws JasperException { try { Mark start = reader.mark(); if (reader.matches(QUOTED_START_TAG)) { reader.advance(QUOTED_START_TAG.length()); Mark end = reader.mark(); parser.caw.write(START_TAG); parser.flushCharData(start, end); return true; } else if (reader.matches(APOS)) { reader.advance(APOS.length()); Mark end = reader.mark(); parser.caw.write("\'"); parser.flushCharData(start, end); return true; } else if (reader.matches(QUOTE)) { reader.advance(QUOTE.length()); Mark end = reader.mark(); parser.caw.write("\""); parser.flushCharData(start, end); return true; } } catch (java.io.IOException ex) { System.out.println (ex.getMessage()); } return false; } } static { coreElements.addElement(new QuoteEscape()); } void flushCharData(Mark start, Mark stop) throws JasperException { char[] array = caw.toCharArray(); if (array.length != 0) // Avoid unnecessary out.write("") statements... listener.handleCharData(start, stop, caw.toCharArray()); caw = new CharArrayWriter(); } public void parse() throws JasperException { parse(null); } public void parse(String until) throws JasperException { parse(until, null); } public void parse(String until, Class[] accept) throws JasperException { boolean noJspElement = false; while (reader.hasMoreInput()) { if (until != null && reader.matches(until)) return; // If the file has changed because of a 'push' or a 'pop' // we must flush the character data for the old file. if (!reader.mark().getFile().equals(currentFile)) { flushCharData(tmplStart, tmplStop); currentFile = reader.mark().getFile(); tmplStart = reader.mark(); } Enumeration e = coreElements.elements(); if (accept != null) { Vector v = new Vector(); while (e.hasMoreElements()) { CoreElement c = (CoreElement) e.nextElement(); for(int i = 0; i < accept.length; i++) if (c.getClass().equals(accept[i])) v.addElement(c); } e = v.elements(); } boolean accepted = false; while (e.hasMoreElements()) { CoreElement c = (CoreElement) e.nextElement(); Mark m = reader.mark(); if (c.accept(listener, reader, this)) { Constants.message("jsp.message.accepted", new Object[] { c.getClass().getName(), m }, Logger.DEBUG); accepted = true; noJspElement = false; break; } } if (!accepted) { // This is a hack. "reader.nextContent()" will just return // after it sees "<" -- not necessarily a JSP element. Using // a boolean we will ensure that tmplStart changes only when // strictly necessary. if (noJspElement == false) { tmplStart = reader.mark(); noJspElement = true; } String s = reader.nextContent(); tmplStop = reader.mark(); caw.write(s, 0, s.length()); } } flushCharData(tmplStart, tmplStop); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -