/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * Free SoftwareFoundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */ package com.caucho.jsp.java; import com.caucho.jsp.*; import com.caucho.jsp.cfg.*; import com.caucho.util.CompileException; import com.caucho.util.L10N; import com.caucho.util.LineCompileException; import com.caucho.vfs.PersistentDependency; import com.caucho.xml.QName; import javax.servlet.jsp.tagext.SimpleTag; import javax.servlet.jsp.tagext.Tag; import javax.servlet.jsp.tagext.TagInfo; import java.util.ArrayList; import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; /** * Generates the nodes for JSP code. */ public class JavaJspBuilder extends JspBuilder { public static final String JSTL_CORE_URI = "http://java.sun.com/jsp/jstl/core"; public static final String JSTL_EL_CORE_URI = "http://java.sun.com/jstl/core"; public static final String JSTL_RT_CORE_URI = "http://java.sun.com/jstl/core_rt"; public static final String JSTL_FMT_URI = "http://java.sun.com/jsp/jstl/fmt"; public static final String JSTL_EL_FMT_URI = "http://java.sun.com/jstl/fmt"; public static final String JSTL_RT_FMT_URI = "http://java.sun.com/jstl/fmt_rt"; public static final String JSTL_XML_URI = "http://java.sun.com/jsp/jstl/xml"; public static final String JSTL_EL_XML_URI = "http://java.sun.com/jstl/xml"; public static final String JSTL_RT_XML_URI = "http://java.sun.com/jstl/xml_rt"; public static final String JSTL_SQL_URI = "http://java.sun.com/jsp/jstl/sql"; public static final String JSTL_EL_SQL_URI = "http://java.sun.com/jstl/sql"; public static final String JSTL_RT_SQL_URI = "http://java.sun.com/jstl/sql_rt"; public static final String JSF_CORE_URI = "http://java.sun.com/jsf/core"; public static final QName JSP_BODY_NAME = new QName("jsp", "body", JspNode.JSP_NS); public static final QName JSP_ATTR_NAME = new QName("jsp", "attribute", JspNode.JSP_NS); private static L10N L = new L10N(JavaJspBuilder.class); private static Logger log = Logger.getLogger(JavaJspBuilder.class.getName()); static final int IGNORE = 0; static final int DIRECTIVE_PAGE = IGNORE + 1; static final int TEXT = DIRECTIVE_PAGE + 1; static final int EXPR = TEXT + 1; static final int SCRIPTLET = EXPR + 1; static final int DECLARATION = SCRIPTLET + 1; static final int FUNCTION = DECLARATION + 1; static final int SET = FUNCTION + 1; static final int INCLUDE = SET + 1; static final int FORWARD = INCLUDE + 1; static final int REQUEST = INCLUDE + 1; static final int USE_BEAN = REQUEST + 1; static final int GET_PROPERTY = USE_BEAN + 1; static final int SET_PROPERTY = GET_PROPERTY + 1; static final int TAG = GET_PROPERTY + 1; static final int PLUGIN = TAG + 1; static final int ROOT = PLUGIN + 1; static final int JSP_TEXT = ROOT + 1; static final int JSP_ATTRIBUTE = JSP_TEXT + 1; static final int JSP_BODY = JSP_ATTRIBUTE + 1; static final int IF = JSP_BODY + 1; static final int FOREACH = IF + 1; static final int EXPR_EL = FOREACH + 1; static HashMap<QName,Class> _tagMap; static HashMap<QName,Class> _fastTagMap; static HashMap<QName,Class> _jsfTagMap; static HashMap<QName, Class> _jstlTlvTagMap; private JavaJspGenerator _gen; private JspNode _rootNode; private JspNode _currentNode; private JspNode _openNode; private int _elementDepth; private boolean _isTagDependent; /** * Creates the JSP builder. */ public JavaJspBuilder() { } /** * Returns the generator. */ public JspGenerator getGenerator() { return _gen; } /** * Returns the root node. */ public JspNode getRootNode() { return _rootNode; } /** * Sets the prototype mode. */ public void setPrototype(boolean prototype) { _parseState.setPrototype(prototype); } /** * Gets the prototype mode. */ public boolean isPrototype() { return _parseState.isPrototype(); } /** * Starts the document */ public void startDocument() throws JspParseException { try { // jsp/031a if (_rootNode != null) return; if (_parseState.isTag()) _gen = new JavaTagGenerator(_tagManager); else _gen = new JavaJspGenerator(_tagManager); _gen.setParseState(getParseState()); _gen.setJspCompiler(getJspCompiler()); _gen.setJspParser(getJspParser()); _gen.setRequireSource(getRequireSource()); _gen.setJspBuilder(this); _rootNode = new JspTop(); _rootNode.setParseState(getParseState()); _rootNode.setGenerator(_gen); _rootNode.setStartLocation(_sourcePath, _filename, _line); _gen.setRootNode(_rootNode); _gen.init(); _currentNode = _rootNode; } catch (Exception e) { throw JspParseException.create(e); } } /** * Starts the document */ public void endDocument() throws JspParseException { if (_parseState.getXml() != null && _parseState.getXml().getEncoding() != null) _parseState.setXmlPageEncoding(_parseState.getXml().getEncoding()); } /** * Starts an element. * * @param qname the name of the element to start */ public void startElement(QName qname) throws JspParseException { Class<?> cl = null; _elementDepth++; if (! _isTagDependent) { } else if (_elementDepth == 2 && (JSP_ATTR_NAME.equals(qname) || JSP_BODY_NAME.equals(qname))) { _isTagDependent = false; } else { createElementNode(qname); return; } if (isFastJstl()) cl = _fastTagMap.get(qname); if (cl == null && isFastJsf()) { Class type = _jsfTagMap.get(qname); if (JsfFacetNode.class.equals(type) && _currentNode != null && ! JsfTagNode.class.isAssignableFrom(_currentNode.getClass())) { } else { cl = type; } } if (cl == null) cl = _tagMap.get(qname); if (cl != null) { try { JspNode node = (JspNode) cl.newInstance(); node.setGenerator(_gen); node.setParseState(_parseState); node.setQName(qname); node.setParent(_currentNode); node.setStartLocation(_sourcePath, _filename, _line); _openNode = node; return; } catch (Exception e) { throw new JspParseException(e); } } // jsp/10j0 if (isPrototype()) { createElementNode(qname); return; } if (JspNode.JSP_NS.equals(qname.getNamespace())) throw new JspParseException(L.l("unknown JSP <{0}>", qname.getName())); TagInfo tagInfo; try { tagInfo = _gen.getTag(qname); } catch (JspParseException e) { throw error(e); } if (tagInfo == null) { createElementNode(qname); return; } if ("tagdependent".equals(tagInfo.getBodyContent())) startTagDependent(); Class tagClass = null; try { tagClass = _gen.getTagClass(qname); } catch (ClassNotFoundException e) { tagClass = JspTagFileSupport.class; log.log(Level.FINE, e.toString(), e); } catch (Exception e) { throw error(e); } if (tagInfo == null || tagClass == null) throw _gen.error(L.l("<{0}> is an unknown tag.", qname.getName())); if (tagInfo instanceof TagInfoExt) { TagInfoExt tagInfoExt = (TagInfoExt) tagInfo; ArrayList<PersistentDependency> dependList = tagInfoExt.getDependList(); for (int i = 0; i < dependList.size(); i++) { _gen.addDepend(dependList.get(i)); } } if (JspTagSupport.class.isAssignableFrom(tagClass) && ! JspTagFileSupport.class.equals(tagClass)) { // jsp/1004 _gen.addTagFileClass(tagClass.getName()); } if (JspTagFileSupport.class.isAssignableFrom(tagClass)) { TagFileTag customTag = new TagFileTag(); customTag.setGenerator(_gen); customTag.setParseState(_parseState); customTag.setQName(qname); customTag.setParent(_currentNode); customTag.setTagInfo(tagInfo); customTag.setTagClass(tagClass); _openNode = customTag; _openNode.setStartLocation(_sourcePath, _filename, _line); } else if (Tag.class.isAssignableFrom(tagClass)) { CustomTag customTag = null; Class c = _jstlTlvTagMap.get(qname); if (c != null) { try { customTag = (CustomTag) c.newInstance(); } catch (Throwable e) { } } if (customTag == null) customTag = new CustomTag(); customTag.setGenerator(_gen); customTag.setParseState(_parseState); customTag.setQName(qname); customTag.setParent(_currentNode); customTag.setTagInfo(tagInfo); customTag.setTagClass(tagClass); _openNode = customTag; _openNode.setStartLocation(_sourcePath, _filename, _line); if (tagInfo instanceof TagInfoImpl) { TldTag tldTag = ((TagInfoImpl) tagInfo).getTldTag(); if (tldTag instanceof JsfTag) { JsfTag jsfTag = (JsfTag) tldTag; JsfTagNode jsfTagNode = new JsfTagNode(); jsfTagNode.setGenerator(_gen); jsfTagNode.setParseState(_parseState); jsfTagNode.setQName(qname); jsfTagNode.setParent(_currentNode); jsfTagNode.setComponentClass(jsfTag.getComponentClass()); _openNode = jsfTagNode; _openNode.setStartLocation(_sourcePath, _filename, _line); return; } } } else if (SimpleTag.class.isAssignableFrom(tagClass)) { CustomSimpleTag customTag = new CustomSimpleTag(); customTag.setGenerator(_gen); customTag.setParseState(_parseState); customTag.setQName(qname); customTag.setParent(_currentNode); customTag.setTagInfo(tagInfo); customTag.setTagClass(tagClass); _openNode = customTag; _openNode.setStartLocation(_sourcePath, _filename, _line); } else throw _gen.error(L.l("<{0}>: tag class {0} must either implement Tag or SimpleTag.", qname.getName(), tagClass.getName())); } @Override public void startTagDependent() { if (! _isTagDependent) { _isTagDependent = true; _elementDepth = 1; } } @Override public boolean isTagDependent() { return _isTagDependent; } protected void createElementNode(QName qname) { JspXmlElement elt = new JspXmlElement(); elt.setGenerator(_gen); elt.setParseState(_parseState); elt.setQName(qname); elt.setParent(_currentNode); elt.setStartLocation(_sourcePath, _filename, _line); _openNode = elt; } /** * Starts a prefix mapping. * * @param prefix the xml prefix * @param uri the namespace uri */ public void startPrefixMapping(String prefix, String uri) throws JspParseException { getParseState().pushNamespace(prefix, uri); _gen.addOptionalTaglib(prefix, uri); } /** * Adds an attribute to the element. * * @param name the attribute name * @param value the attribute value */ public void attribute(QName name, String value) throws JspParseException { _openNode.addAttribute(name, value); } /** * Called when the attributes end. */ public void endAttributes() throws JspParseException { _currentNode.addChild(_openNode); _currentNode = _openNode; _currentNode.setNamespace(_parseState.getNamespaces()); _currentNode.endAttributes(); _currentNode.setEndAttributeLocation(_filename, _line); } /** * Ends an element. * * @param qname the name of the element to end */ public void endElement(String name) throws JspParseException { if (! _currentNode.getTagName().equals(name)) { throw error(L.l("Close tag </{0}> does not match the current tag, <{1}>.", name, _currentNode.getTagName())); } _elementDepth--; try { JspNode node = _currentNode; _currentNode = node.getParent(); node.setEndLocation(_filename, _line); node.endElement(); _currentNode.addChildEnd(node); } catch (JspLineParseException e) { throw e; } catch (JspParseException e) { throw error(e); } catch (Exception e) { throw new JspParseException(e); } if (_elementDepth <= 0) _isTagDependent = false; } /** * Adds text. * * @param text the text to add */ public void text(String text) throws JspParseException { if (_currentNode != null) { JspNode node = _currentNode.addText(text); if (node != null) { node.setStartLocation(_sourcePath, _filename, _line); } } } /** * Adds text. * * @param text the text to add */ public void text(String text, String srcFilename, int startLine, int endLine) throws JspParseException { if (_currentNode != null) { JspNode node = _currentNode.addText(text); if (node != null) { node.setStartLocation(null, srcFilename, startLine); node.setEndLocation(srcFilename, endLine); } } } /** * Returns the current node. */ public JspNode getCurrentNode() { return _currentNode; } public JspParseException error(String message) { return new JspLineParseException(_filename + ":" + _line + ": " + message + _gen.getSourceLines(_sourcePath, _line)); } public JspParseException error(Throwable e) { if (e instanceof LineCompileException) return new JspLineParseException(e); else if (e instanceof CompileException) return new JspLineParseException(_filename + ":" + _line + ": " + e.getMessage() + _gen.getSourceLines(_sourcePath, _line), e); else return new JspLineParseException(_filename + ":" + _line + ": " + String.valueOf(e) + _gen.getSourceLines(_sourcePath, _line), e); } private static void addMap(HashMap<QName,Class> map, String prefix, String localName, String uri, Class cl) { map.put(new QName(prefix, localName, uri), cl); map.put(new QName(prefix, localName, "urn:jsptld:" + uri), cl); } static { _tagMap = new HashMap<QName,Class>(); addMap(_tagMap, "jsp", "root", JspNode.JSP_NS, JspRoot.class); addMap(_tagMap, "jsp", "directive.page", JspNode.JSP_NS, JspDirectivePage.class); addMap(_tagMap, "jsp", "directive.include", JspNode.JSP_NS, JspDirectiveInclude.class); addMap(_tagMap, "jsp", "directive.cache", JspNode.JSP_NS, NullTag.class); addMap(_tagMap, "jsp", "directive.taglib", JspNode.JSP_NS, JspDirectiveTaglib.class); addMap(_tagMap, "jsp", "directive.attribute", JspNode.JSP_NS, JspDirectiveAttribute.class); addMap(_tagMap, "jsp", "directive.variable", JspNode.JSP_NS, JspDirectiveVariable.class); addMap(_tagMap, "jsp", "directive.tag", JspNode.JSP_NS, JspDirectiveTag.class); addMap(_tagMap, "jsp", "expression", JspNode.JSP_NS, JspExpression.class); addMap(_tagMap, "jsp", "scriptlet", JspNode.JSP_NS, JspScriptlet.class); addMap(_tagMap, "jsp", "declaration", JspNode.JSP_NS, JspDeclaration.class); addMap(_tagMap, "jsp", "useBean", JspNode.JSP_NS, JspUseBean.class); addMap(_tagMap, "jsp", "getProperty", JspNode.JSP_NS, JspGetProperty.class); addMap(_tagMap, "jsp", "setProperty", JspNode.JSP_NS, JspSetProperty.class); addMap(_tagMap, "jsp", "include", JspNode.JSP_NS, JspInclude.class); addMap(_tagMap, "jsp", "forward", JspNode.JSP_NS, JspForward.class); addMap(_tagMap, "jsp", "param", JspNode.JSP_NS, JspParam.class); addMap(_tagMap, "jsp", "plugin", JspNode.JSP_NS, JspPlugin.class); addMap(_tagMap, "jsp", "params", JspNode.JSP_NS, JspParams.class); addMap(_tagMap, "jsp", "fallback", JspNode.JSP_NS, JspFallback.class); addMap(_tagMap, "jsp", "attribute", JspNode.JSP_NS, JspAttribute.class); addMap(_tagMap, "jsp", "doBody", JspNode.JSP_NS, JspDoBody.class); addMap(_tagMap, "jsp", "invoke", JspNode.JSP_NS, JspInvoke.class); addMap(_tagMap, "jsp", "body", JspNode.JSP_NS, JspBody.class); addMap(_tagMap, "jsp", "text", JspNode.JSP_NS, JspText.class); addMap(_tagMap, "jsp", "element", JspNode.JSP_NS, JspElement.class); addMap(_tagMap, "jsp", "output", JspNode.JSP_NS, JspOutput.class); _fastTagMap = new HashMap<QName,Class>(_tagMap); // shortcut addMap(_fastTagMap, "resin-c", "out", JSTL_CORE_URI, JstlCoreOut.class); addMap(_fastTagMap, "resin-c", "out", JSTL_RT_CORE_URI, JstlCoreOut.class); addMap(_fastTagMap, "resin-c", "out", JSTL_EL_CORE_URI, JstlCoreOut.class); addMap(_fastTagMap, "resin-c", "set", JSTL_CORE_URI, JstlCoreSet.class); addMap(_fastTagMap, "resin-c", "set", JSTL_EL_CORE_URI, JstlCoreSet.class); addMap(_fastTagMap, "resin-c", "set", JSTL_RT_CORE_URI, JstlCoreSet.class); addMap(_fastTagMap, "resin-c", "remove", JSTL_CORE_URI, JstlCoreRemove.class); addMap(_fastTagMap, "resin-c", "remove", JSTL_EL_CORE_URI, JstlCoreRemove.class); addMap(_fastTagMap, "resin-c", "remove", JSTL_RT_CORE_URI, JstlCoreRemove.class); addMap(_fastTagMap, "resin-c", "catch", JSTL_CORE_URI, JstlCoreCatch.class); addMap(_fastTagMap, "resin-c", "catch", JSTL_EL_CORE_URI, JstlCoreCatch.class); addMap(_fastTagMap, "resin-c", "catch", JSTL_RT_CORE_URI, JstlCoreCatch.class); addMap(_fastTagMap, "resin-c", "if", JSTL_CORE_URI, JstlCoreIf.class); addMap(_fastTagMap, "resin-c", "if", JSTL_EL_CORE_URI, JstlCoreIf.class); addMap(_fastTagMap, "resin-c", "if", JSTL_RT_CORE_URI, JstlCoreIf.class); addMap(_fastTagMap, "resin-c", "choose", JSTL_CORE_URI, JstlCoreChoose.class); addMap(_fastTagMap, "resin-c", "choose", JSTL_EL_CORE_URI, JstlCoreChoose.class); addMap(_fastTagMap, "resin-c", "choose", JSTL_RT_CORE_URI, JstlCoreChoose.class); addMap(_fastTagMap, "resin-c", "when", JSTL_CORE_URI, JstlCoreWhen.class); addMap(_fastTagMap, "resin-c", "when", JSTL_EL_CORE_URI, JstlCoreWhen.class); addMap(_fastTagMap, "resin-c", "when", JSTL_RT_CORE_URI, JstlCoreWhen.class); addMap(_fastTagMap, "resin-c", "otherwise", JSTL_CORE_URI, JstlCoreOtherwise.class); addMap(_fastTagMap, "resin-c", "otherwise", JSTL_EL_CORE_URI, JstlCoreOtherwise.class); addMap(_fastTagMap, "resin-c", "otherwise", JSTL_RT_CORE_URI, JstlCoreOtherwise.class); addMap(_fastTagMap, "resin-c", "forEach", JSTL_CORE_URI, JstlCoreForEach.class); addMap(_fastTagMap, "resin-c", "forEach", JSTL_EL_CORE_URI, JstlCoreForEach.class); addMap(_fastTagMap, "resin-c", "forEach", JSTL_RT_CORE_URI, JstlCoreForEach.class); addMap(_fastTagMap, "resin-fmt", "message", JSTL_FMT_URI, JstlFmtMessage.class); addMap(_fastTagMap, "resin-fmt", "message", JSTL_EL_FMT_URI, JstlFmtMessage.class); addMap(_fastTagMap, "resin-fmt", "message", JSTL_RT_FMT_URI, JstlFmtMessage.class); addMap(_fastTagMap, "resin-fmt", "setBundle", JSTL_FMT_URI, JstlFmtSetBundle.class); addMap(_fastTagMap, "resin-fmt", "setBundle", JSTL_EL_FMT_URI, JstlFmtSetBundle.class); addMap(_fastTagMap, "resin-fmt", "setBundle", JSTL_RT_FMT_URI, JstlFmtSetBundle.class); addMap(_fastTagMap, "resin-fmt", "bundle", JSTL_FMT_URI, JstlFmtBundle.class); addMap(_fastTagMap, "resin-fmt", "bundle", JSTL_EL_FMT_URI, JstlFmtBundle.class); addMap(_fastTagMap, "resin-fmt", "bundle", JSTL_RT_FMT_URI, JstlFmtBundle.class); addMap(_fastTagMap, "resin-fmt", "param", JSTL_FMT_URI, JstlFmtParam.class); addMap(_fastTagMap, "resin-fmt", "param", JSTL_EL_FMT_URI, JstlFmtParam.class); addMap(_fastTagMap, "resin-fmt", "param", JSTL_RT_FMT_URI, JstlFmtParam.class); addMap(_fastTagMap, "resin-xml", "out", JSTL_XML_URI, JstlXmlOut.class); addMap(_fastTagMap, "resin-xml", "out", JSTL_RT_XML_URI, JstlXmlOut.class); addMap(_fastTagMap, "resin-xml", "out", JSTL_EL_XML_URI, JstlXmlOut.class); addMap(_fastTagMap, "resin-xml", "set", JSTL_XML_URI, JstlXmlSet.class); addMap(_fastTagMap, "resin-xml", "set", JSTL_RT_XML_URI, JstlXmlSet.class); addMap(_fastTagMap, "resin-xml", "set", JSTL_EL_XML_URI, JstlXmlSet.class); addMap(_fastTagMap, "resin-xml", "if", JSTL_XML_URI, JstlXmlIf.class); addMap(_fastTagMap, "resin-xml", "if", JSTL_RT_XML_URI, JstlXmlIf.class); addMap(_fastTagMap, "resin-xml", "if", JSTL_EL_XML_URI, JstlXmlIf.class); addMap(_fastTagMap, "resin-xml", "choose", JSTL_XML_URI, JstlCoreChoose.class); addMap(_fastTagMap, "resin-xml", "choose", JSTL_RT_XML_URI, JstlCoreChoose.class); addMap(_fastTagMap, "resin-xml", "choose", JSTL_EL_XML_URI, JstlCoreChoose.class); addMap(_fastTagMap, "resin-xml", "when", JSTL_XML_URI, JstlXmlWhen.class); addMap(_fastTagMap, "resin-xml", "when", JSTL_RT_XML_URI, JstlXmlWhen.class); addMap(_fastTagMap, "resin-xml", "when", JSTL_EL_XML_URI, JstlXmlWhen.class); addMap(_fastTagMap, "resin-xml", "otherwise", JSTL_XML_URI, JstlCoreOtherwise.class); addMap(_fastTagMap, "resin-xml", "otherwise", JSTL_RT_XML_URI, JstlCoreOtherwise.class); addMap(_fastTagMap, "resin-xml", "otherwise", JSTL_EL_XML_URI, JstlCoreOtherwise.class); _jsfTagMap = new HashMap<QName,Class>(); addMap(_jsfTagMap, "faces", "facet", JSF_CORE_URI, JsfFacetNode.class); addMap(_jsfTagMap, "faces", "view", JSF_CORE_URI, JsfViewRoot.class); addMap(_jsfTagMap, "faces", "phaseListener", JSF_CORE_URI, JsfPhaseListener.class); _jstlTlvTagMap = new HashMap<QName, Class>(); addMap(_jstlTlvTagMap, "resin-c", "choose", JSTL_CORE_URI, JstlTlvCoreChoose.class); addMap(_jstlTlvTagMap, "resin-c", "choose", JSTL_EL_CORE_URI, JstlTlvCoreChoose.class); addMap(_jstlTlvTagMap, "resin-c", "choose", JSTL_RT_CORE_URI, JstlTlvCoreChoose.class); addMap(_jstlTlvTagMap, "resin-c", "when", JSTL_CORE_URI, JstlTlvCoreWhen.class); addMap(_jstlTlvTagMap, "resin-c", "when", JSTL_EL_CORE_URI, JstlTlvCoreWhen.class); addMap(_jstlTlvTagMap, "resin-c", "when", JSTL_RT_CORE_URI, JstlTlvCoreWhen.class); addMap(_jstlTlvTagMap, "resin-c", "otherwise", JSTL_CORE_URI, JstlTlvCoreOtherwise.class); addMap(_jstlTlvTagMap, "resin-c", "otherwise", JSTL_EL_CORE_URI, JstlTlvCoreOtherwise.class); addMap(_jstlTlvTagMap, "resin-c", "otherwise", JSTL_RT_CORE_URI, JstlTlvCoreOtherwise.class); addMap(_jstlTlvTagMap, "resin-xml", "choose", JSTL_XML_URI, JstlTlvXmlChoose.class); addMap(_jstlTlvTagMap, "resin-xml", "choose", JSTL_RT_XML_URI, JstlTlvXmlChoose.class); addMap(_jstlTlvTagMap, "resin-xml", "choose", JSTL_EL_XML_URI, JstlTlvXmlChoose.class); addMap(_jstlTlvTagMap, "resin-xml", "when", JSTL_XML_URI, JstlTlvXmlWhen.class); addMap(_jstlTlvTagMap, "resin-xml", "when", JSTL_RT_XML_URI, JstlTlvXmlWhen.class); addMap(_jstlTlvTagMap, "resin-xml", "when", JSTL_EL_XML_URI, JstlTlvXmlWhen.class); addMap(_jstlTlvTagMap, "resin-xml", "otherwise", JSTL_XML_URI, JstlTlvXmlOtherwise.class); addMap(_jstlTlvTagMap, "resin-xml", "otherwise", JSTL_RT_XML_URI, JstlTlvXmlOtherwise.class); addMap(_jstlTlvTagMap, "resin-xml", "otherwise", JSTL_EL_XML_URI, JstlTlvXmlOtherwise.class); addMap(_jstlTlvTagMap, "resin-sql", "update", JSTL_SQL_URI, JstlTlvSqlUpdate.class); addMap(_jstlTlvTagMap, "resin-sql", "update", JSTL_RT_SQL_URI, JstlTlvSqlUpdate.class); addMap(_jstlTlvTagMap, "resin-sql", "update", JSTL_EL_SQL_URI, JstlTlvSqlUpdate.class); } }