Author: markt
Date: Fri Sep 29 20:39:02 2006
New Revision: 451529
URL: http://svn.apache.org/viewvc?view=rev&rev=451529
Log:
Tabs to 8 spaces. No functional change.
Modified:
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/PageDataImpl.java
Modified:
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/PageDataImpl.java
URL:
http://svn.apache.org/viewvc/tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/PageDataImpl.java?view=diff&rev=451529&r1=451528&r2=451529
==============================================================================
---
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/PageDataImpl.java
(original)
+++
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/PageDataImpl.java
Fri Sep 29 20:39:02 2006
@@ -60,19 +60,19 @@
* @param page the page nodes from which to generate the XML view
*/
public PageDataImpl(Node.Nodes page, Compiler compiler)
- throws JasperException {
+ throws JasperException {
- // First pass
- FirstPassVisitor firstPass = new FirstPassVisitor(page.getRoot(),
-
compiler.getPageInfo());
- page.visit(firstPass);
-
- // Second pass
- buf = new StringBuffer();
- SecondPassVisitor secondPass
- = new SecondPassVisitor(page.getRoot(), buf, compiler,
- firstPass.getJspIdPrefix());
- page.visit(secondPass);
+ // First pass
+ FirstPassVisitor firstPass = new FirstPassVisitor(page.getRoot(),
+
compiler.getPageInfo());
+ page.visit(firstPass);
+
+ // Second pass
+ buf = new StringBuffer();
+ SecondPassVisitor secondPass
+ = new SecondPassVisitor(page.getRoot(), buf, compiler,
+ firstPass.getJspIdPrefix());
+ page.visit(secondPass);
}
/**
@@ -81,11 +81,11 @@
* @return the input stream of the XML view
*/
public InputStream getInputStream() {
- // Turn StringBuffer into InputStream
+ // Turn StringBuffer into InputStream
try {
return new ByteArrayInputStream(buf.toString().getBytes("UTF-8"));
} catch (UnsupportedEncodingException uee) {
- // should never happen
+ // should never happen
throw new RuntimeException(uee.toString());
}
}
@@ -101,115 +101,115 @@
* attributes and adds them to the jsp:root element of the XML view.
*/
static class FirstPassVisitor
- extends Node.Visitor implements TagConstants {
+ extends Node.Visitor implements TagConstants {
- private Node.Root root;
- private AttributesImpl rootAttrs;
- private PageInfo pageInfo;
-
- // Prefix for the 'id' attribute
- private String jspIdPrefix;
-
- /*
- * Constructor
- */
- public FirstPassVisitor(Node.Root root, PageInfo pageInfo) {
- this.root = root;
- this.pageInfo = pageInfo;
- this.rootAttrs = new AttributesImpl();
- this.rootAttrs.addAttribute("", "", "version", "CDATA",
- JSP_VERSION);
- this.jspIdPrefix = "jsp";
- }
-
- public void visit(Node.Root n) throws JasperException {
- visitBody(n);
- if (n == root) {
- /*
- * Top-level page.
- *
- * Add
- * xmlns:jsp="http://java.sun.com/JSP/Page"
- * attribute only if not already present.
- */
- if (!JSP_URI.equals(rootAttrs.getValue("xmlns:jsp"))) {
- rootAttrs.addAttribute("", "", "xmlns:jsp", "CDATA",
- JSP_URI);
- }
-
- if (pageInfo.isJspPrefixHijacked()) {
- /*
- * 'jsp' prefix has been hijacked, that is, bound to a
- * namespace other than the JSP namespace. This means that
- * when adding an 'id' attribute to each element, we can't
- * use the 'jsp' prefix. Therefore, create a new prefix
- * (one that is unique across the translation unit) for use
- * by the 'id' attribute, and bind it to the JSP namespace
- */
- jspIdPrefix += "jsp";
- while (pageInfo.containsPrefix(jspIdPrefix)) {
- jspIdPrefix += "jsp";
- }
- rootAttrs.addAttribute("", "", "xmlns:" + jspIdPrefix,
- "CDATA", JSP_URI);
- }
-
- root.setAttributes(rootAttrs);
- }
- }
+ private Node.Root root;
+ private AttributesImpl rootAttrs;
+ private PageInfo pageInfo;
+
+ // Prefix for the 'id' attribute
+ private String jspIdPrefix;
+
+ /*
+ * Constructor
+ */
+ public FirstPassVisitor(Node.Root root, PageInfo pageInfo) {
+ this.root = root;
+ this.pageInfo = pageInfo;
+ this.rootAttrs = new AttributesImpl();
+ this.rootAttrs.addAttribute("", "", "version", "CDATA",
+ JSP_VERSION);
+ this.jspIdPrefix = "jsp";
+ }
+
+ public void visit(Node.Root n) throws JasperException {
+ visitBody(n);
+ if (n == root) {
+ /*
+ * Top-level page.
+ *
+ * Add
+ * xmlns:jsp="http://java.sun.com/JSP/Page"
+ * attribute only if not already present.
+ */
+ if (!JSP_URI.equals(rootAttrs.getValue("xmlns:jsp"))) {
+ rootAttrs.addAttribute("", "", "xmlns:jsp", "CDATA",
+ JSP_URI);
+ }
+
+ if (pageInfo.isJspPrefixHijacked()) {
+ /*
+ * 'jsp' prefix has been hijacked, that is, bound to a
+ * namespace other than the JSP namespace. This means that
+ * when adding an 'id' attribute to each element, we can't
+ * use the 'jsp' prefix. Therefore, create a new prefix
+ * (one that is unique across the translation unit) for use
+ * by the 'id' attribute, and bind it to the JSP namespace
+ */
+ jspIdPrefix += "jsp";
+ while (pageInfo.containsPrefix(jspIdPrefix)) {
+ jspIdPrefix += "jsp";
+ }
+ rootAttrs.addAttribute("", "", "xmlns:" + jspIdPrefix,
+ "CDATA", JSP_URI);
+ }
- public void visit(Node.JspRoot n) throws JasperException {
- addAttributes(n.getTaglibAttributes());
+ root.setAttributes(rootAttrs);
+ }
+ }
+
+ public void visit(Node.JspRoot n) throws JasperException {
+ addAttributes(n.getTaglibAttributes());
addAttributes(n.getNonTaglibXmlnsAttributes());
- addAttributes(n.getAttributes());
+ addAttributes(n.getAttributes());
- visitBody(n);
- }
+ visitBody(n);
+ }
- /*
- * Converts taglib directive into "xmlns:..." attribute of jsp:root
- * element.
- */
- public void visit(Node.TaglibDirective n) throws JasperException {
- Attributes attrs = n.getAttributes();
- if (attrs != null) {
- String qName = "xmlns:" + attrs.getValue("prefix");
- /*
- * According to javadocs of org.xml.sax.helpers.AttributesImpl,
- * the addAttribute method does not check to see if the
- * specified attribute is already contained in the list: This
- * is the application's responsibility!
- */
- if (rootAttrs.getIndex(qName) == -1) {
- String location = attrs.getValue("uri");
- if (location != null) {
+ /*
+ * Converts taglib directive into "xmlns:..." attribute of jsp:root
+ * element.
+ */
+ public void visit(Node.TaglibDirective n) throws JasperException {
+ Attributes attrs = n.getAttributes();
+ if (attrs != null) {
+ String qName = "xmlns:" + attrs.getValue("prefix");
+ /*
+ * According to javadocs of org.xml.sax.helpers.AttributesImpl,
+ * the addAttribute method does not check to see if the
+ * specified attribute is already contained in the list: This
+ * is the application's responsibility!
+ */
+ if (rootAttrs.getIndex(qName) == -1) {
+ String location = attrs.getValue("uri");
+ if (location != null) {
if (location.startsWith("/")) {
location = URN_JSPTLD + location;
}
- rootAttrs.addAttribute("", "", qName, "CDATA",
- location);
- } else {
- location = attrs.getValue("tagdir");
- rootAttrs.addAttribute("", "", qName, "CDATA",
- URN_JSPTAGDIR + location);
- }
- }
- }
- }
-
- public String getJspIdPrefix() {
- return jspIdPrefix;
- }
-
- private void addAttributes(Attributes attrs) {
- if (attrs != null) {
- int len = attrs.getLength();
+ rootAttrs.addAttribute("", "", qName, "CDATA",
+ location);
+ } else {
+ location = attrs.getValue("tagdir");
+ rootAttrs.addAttribute("", "", qName, "CDATA",
+ URN_JSPTAGDIR + location);
+ }
+ }
+ }
+ }
+
+ public String getJspIdPrefix() {
+ return jspIdPrefix;
+ }
+
+ private void addAttributes(Attributes attrs) {
+ if (attrs != null) {
+ int len = attrs.getLength();
- for (int i=0; i<len; i++) {
+ for (int i=0; i<len; i++) {
String qName = attrs.getQName(i);
- if ("version".equals(qName)) {
- continue;
- }
+ if ("version".equals(qName)) {
+ continue;
+ }
// Bugzilla 35252:
http://issues.apache.org/bugzilla/show_bug.cgi?id=35252
if(rootAttrs.getIndex(qName) == -1) {
@@ -219,9 +219,9 @@
attrs.getType(i),
attrs.getValue(i));
}
- }
- }
- }
+ }
+ }
+ }
}
@@ -230,137 +230,137 @@
* each element a unique jsp:id attribute.
*/
static class SecondPassVisitor extends Node.Visitor
- implements TagConstants {
+ implements TagConstants {
+
+ private Node.Root root;
+ private StringBuffer buf;
+ private Compiler compiler;
+ private String jspIdPrefix;
+ private boolean resetDefaultNS = false;
+
+ // Current value of jsp:id attribute
+ private int jspId;
+
+ /*
+ * Constructor
+ */
+ public SecondPassVisitor(Node.Root root, StringBuffer buf,
+ Compiler compiler, String jspIdPrefix) {
+ this.root = root;
+ this.buf = buf;
+ this.compiler = compiler;
+ this.jspIdPrefix = jspIdPrefix;
+ }
+
+ /*
+ * Visits root node.
+ */
+ public void visit(Node.Root n) throws JasperException {
+ if (n == this.root) {
+ // top-level page
+ appendXmlProlog();
+ appendTag(n);
+ } else {
+ boolean resetDefaultNSSave = resetDefaultNS;
+ if (n.isXmlSyntax()) {
+ resetDefaultNS = true;
+ }
+ visitBody(n);
+ resetDefaultNS = resetDefaultNSSave;
+ }
+ }
+
+ /*
+ * Visits jsp:root element of JSP page in XML syntax.
+ *
+ * Any nested jsp:root elements (from pages included via an
+ * include directive) are ignored.
+ */
+ public void visit(Node.JspRoot n) throws JasperException {
+ visitBody(n);
+ }
+
+ public void visit(Node.PageDirective n) throws JasperException {
+ appendPageDirective(n);
+ }
+
+ public void visit(Node.IncludeDirective n) throws JasperException {
+ // expand in place
+ visitBody(n);
+ }
+
+ public void visit(Node.Comment n) throws JasperException {
+ // Comments are ignored in XML view
+ }
+
+ public void visit(Node.Declaration n) throws JasperException {
+ appendTag(n);
+ }
- private Node.Root root;
- private StringBuffer buf;
- private Compiler compiler;
- private String jspIdPrefix;
- private boolean resetDefaultNS = false;
-
- // Current value of jsp:id attribute
- private int jspId;
-
- /*
- * Constructor
- */
- public SecondPassVisitor(Node.Root root, StringBuffer buf,
- Compiler compiler, String jspIdPrefix) {
- this.root = root;
- this.buf = buf;
- this.compiler = compiler;
- this.jspIdPrefix = jspIdPrefix;
- }
-
- /*
- * Visits root node.
- */
- public void visit(Node.Root n) throws JasperException {
- if (n == this.root) {
- // top-level page
- appendXmlProlog();
- appendTag(n);
- } else {
- boolean resetDefaultNSSave = resetDefaultNS;
- if (n.isXmlSyntax()) {
- resetDefaultNS = true;
- }
- visitBody(n);
- resetDefaultNS = resetDefaultNSSave;
- }
- }
-
- /*
- * Visits jsp:root element of JSP page in XML syntax.
- *
- * Any nested jsp:root elements (from pages included via an
- * include directive) are ignored.
- */
- public void visit(Node.JspRoot n) throws JasperException {
- visitBody(n);
- }
-
- public void visit(Node.PageDirective n) throws JasperException {
- appendPageDirective(n);
- }
-
- public void visit(Node.IncludeDirective n) throws JasperException {
- // expand in place
- visitBody(n);
- }
-
- public void visit(Node.Comment n) throws JasperException {
- // Comments are ignored in XML view
- }
-
- public void visit(Node.Declaration n) throws JasperException {
- appendTag(n);
- }
-
- public void visit(Node.Expression n) throws JasperException {
- appendTag(n);
- }
-
- public void visit(Node.Scriptlet n) throws JasperException {
- appendTag(n);
- }
-
- public void visit(Node.JspElement n) throws JasperException {
- appendTag(n);
- }
-
- public void visit(Node.ELExpression n) throws JasperException {
- if (!n.getRoot().isXmlSyntax()) {
- buf.append("<").append(JSP_TEXT_ACTION);
- buf.append(" ");
- buf.append(jspIdPrefix);
- buf.append(":id=\"");
- buf.append(jspId++).append("\">");
- }
- buf.append("${");
+ public void visit(Node.Expression n) throws JasperException {
+ appendTag(n);
+ }
+
+ public void visit(Node.Scriptlet n) throws JasperException {
+ appendTag(n);
+ }
+
+ public void visit(Node.JspElement n) throws JasperException {
+ appendTag(n);
+ }
+
+ public void visit(Node.ELExpression n) throws JasperException {
+ if (!n.getRoot().isXmlSyntax()) {
+ buf.append("<").append(JSP_TEXT_ACTION);
+ buf.append(" ");
+ buf.append(jspIdPrefix);
+ buf.append(":id=\"");
+ buf.append(jspId++).append("\">");
+ }
+ buf.append("${");
buf.append(JspUtil.escapeXml(n.getText()));
- buf.append("}");
- if (!n.getRoot().isXmlSyntax()) {
- buf.append(JSP_TEXT_ACTION_END);
- }
- buf.append("\n");
- }
-
- public void visit(Node.IncludeAction n) throws JasperException {
- appendTag(n);
- }
+ buf.append("}");
+ if (!n.getRoot().isXmlSyntax()) {
+ buf.append(JSP_TEXT_ACTION_END);
+ }
+ buf.append("\n");
+ }
+
+ public void visit(Node.IncludeAction n) throws JasperException {
+ appendTag(n);
+ }
- public void visit(Node.ForwardAction n) throws JasperException {
- appendTag(n);
- }
-
- public void visit(Node.GetProperty n) throws JasperException {
- appendTag(n);
- }
-
- public void visit(Node.SetProperty n) throws JasperException {
- appendTag(n);
- }
-
- public void visit(Node.ParamAction n) throws JasperException {
- appendTag(n);
- }
-
- public void visit(Node.ParamsAction n) throws JasperException {
- appendTag(n);
- }
-
- public void visit(Node.FallBackAction n) throws JasperException {
- appendTag(n);
- }
-
- public void visit(Node.UseBean n) throws JasperException {
- appendTag(n);
- }
-
- public void visit(Node.PlugIn n) throws JasperException {
- appendTag(n);
- }
+ public void visit(Node.ForwardAction n) throws JasperException {
+ appendTag(n);
+ }
+
+ public void visit(Node.GetProperty n) throws JasperException {
+ appendTag(n);
+ }
+
+ public void visit(Node.SetProperty n) throws JasperException {
+ appendTag(n);
+ }
+
+ public void visit(Node.ParamAction n) throws JasperException {
+ appendTag(n);
+ }
+
+ public void visit(Node.ParamsAction n) throws JasperException {
+ appendTag(n);
+ }
+
+ public void visit(Node.FallBackAction n) throws JasperException {
+ appendTag(n);
+ }
+
+ public void visit(Node.UseBean n) throws JasperException {
+ appendTag(n);
+ }
+
+ public void visit(Node.PlugIn n) throws JasperException {
+ appendTag(n);
+ }
public void visit(Node.NamedAttribute n) throws JasperException {
appendTag(n);
@@ -370,341 +370,341 @@
appendTag(n);
}
- public void visit(Node.CustomTag n) throws JasperException {
- boolean resetDefaultNSSave = resetDefaultNS;
- appendTag(n, resetDefaultNS);
- resetDefaultNS = resetDefaultNSSave;
- }
-
- public void visit(Node.UninterpretedTag n) throws JasperException {
- boolean resetDefaultNSSave = resetDefaultNS;
- appendTag(n, resetDefaultNS);
- resetDefaultNS = resetDefaultNSSave;
- }
-
- public void visit(Node.JspText n) throws JasperException {
- appendTag(n);
- }
-
- public void visit(Node.DoBodyAction n) throws JasperException {
- appendTag(n);
- }
+ public void visit(Node.CustomTag n) throws JasperException {
+ boolean resetDefaultNSSave = resetDefaultNS;
+ appendTag(n, resetDefaultNS);
+ resetDefaultNS = resetDefaultNSSave;
+ }
+
+ public void visit(Node.UninterpretedTag n) throws JasperException {
+ boolean resetDefaultNSSave = resetDefaultNS;
+ appendTag(n, resetDefaultNS);
+ resetDefaultNS = resetDefaultNSSave;
+ }
+
+ public void visit(Node.JspText n) throws JasperException {
+ appendTag(n);
+ }
+
+ public void visit(Node.DoBodyAction n) throws JasperException {
+ appendTag(n);
+ }
public void visit(Node.InvokeAction n) throws JasperException {
- appendTag(n);
- }
+ appendTag(n);
+ }
+
+ public void visit(Node.TagDirective n) throws JasperException {
+ appendTagDirective(n);
+ }
+
+ public void visit(Node.AttributeDirective n) throws JasperException {
+ appendTag(n);
+ }
+
+ public void visit(Node.VariableDirective n) throws JasperException {
+ appendTag(n);
+ }
+
+ public void visit(Node.TemplateText n) throws JasperException {
+ /*
+ * If the template text came from a JSP page written in JSP syntax,
+ * create a jsp:text element for it (JSP 5.3.2).
+ */
+ appendText(n.getText(), !n.getRoot().isXmlSyntax());
+ }
+
+ /*
+ * Appends the given tag, including its body, to the XML view.
+ */
+ private void appendTag(Node n) throws JasperException {
+ appendTag(n, false);
+ }
+
+ /*
+ * Appends the given tag, including its body, to the XML view,
+ * and optionally reset default namespace to "", if none specified.
+ */
+ private void appendTag(Node n, boolean addDefaultNS)
+ throws JasperException {
+
+ Node.Nodes body = n.getBody();
+ String text = n.getText();
+
+ buf.append("<").append(n.getQName());
+ buf.append("\n");
+
+ printAttributes(n, addDefaultNS);
+ buf.append(" ").append(jspIdPrefix).append(":id").append("=\"");
+ buf.append(jspId++).append("\"\n");
+
+ if (ROOT_ACTION.equals(n.getLocalName()) || body != null
+ || text != null) {
+ buf.append(">\n");
+ if (ROOT_ACTION.equals(n.getLocalName())) {
+ if (compiler.getCompilationContext().isTagFile()) {
+ appendTagDirective();
+ } else {
+ appendPageDirective();
+ }
+ }
+ if (body != null) {
+ body.visit(this);
+ } else {
+ appendText(text, false);
+ }
+ buf.append("</" + n.getQName() + ">\n");
+ } else {
+ buf.append("/>\n");
+ }
+ }
+
+ /*
+ * Appends the page directive with the given attributes to the XML
+ * view.
+ *
+ * Since the import attribute of the page directive is the only page
+ * attribute that is allowed to appear multiple times within the same
+ * document, and since XML allows only single-value attributes,
+ * the values of multiple import attributes must be combined into one,
+ * separated by comma.
+ *
+ * If the given page directive contains just 'contentType' and/or
+ * 'pageEncoding' attributes, we ignore it, as we've already appended
+ * a page directive containing just these two attributes.
+ */
+ private void appendPageDirective(Node.PageDirective n) {
+ boolean append = false;
+ Attributes attrs = n.getAttributes();
+ int len = (attrs == null) ? 0 : attrs.getLength();
+ for (int i=0; i<len; i++) {
+ String attrName = attrs.getQName(i);
+ if (!"pageEncoding".equals(attrName)
+ && !"contentType".equals(attrName)) {
+ append = true;
+ break;
+ }
+ }
+ if (!append) {
+ return;
+ }
+
+ buf.append("<").append(n.getQName());
+ buf.append("\n");
+
+ // append jsp:id
+ buf.append(" ").append(jspIdPrefix).append(":id").append("=\"");
+ buf.append(jspId++).append("\"\n");
+
+ // append remaining attributes
+ for (int i=0; i<len; i++) {
+ String attrName = attrs.getQName(i);
+ if ("import".equals(attrName) || "contentType".equals(attrName)
+ || "pageEncoding".equals(attrName)) {
+ /*
+ * Page directive's 'import' attribute is considered
+ * further down, and its 'pageEncoding' and 'contentType'
+ * attributes are ignored, since we've already appended
+ * a new page directive containing just these two
+ * attributes
+ */
+ continue;
+ }
+ String value = attrs.getValue(i);
+ buf.append(" ").append(attrName).append("=\"");
+ buf.append(JspUtil.getExprInXml(value)).append("\"\n");
+ }
+ if (n.getImports().size() > 0) {
+ // Concatenate names of imported classes/packages
+ boolean first = true;
+ ListIterator iter = n.getImports().listIterator();
+ while (iter.hasNext()) {
+ if (first) {
+ first = false;
+ buf.append(" import=\"");
+ } else {
+ buf.append(",");
+ }
+ buf.append(JspUtil.getExprInXml((String) iter.next()));
+ }
+ buf.append("\"\n");
+ }
+ buf.append("/>\n");
+ }
+
+ /*
+ * Appends a page directive with 'pageEncoding' and 'contentType'
+ * attributes.
+ *
+ * The value of the 'pageEncoding' attribute is hard-coded
+ * to UTF-8, whereas the value of the 'contentType' attribute, which
+ * is identical to what the container will pass to
+ * ServletResponse.setContentType(), is derived from the pageInfo.
+ */
+ private void appendPageDirective() {
+ buf.append("<").append(JSP_PAGE_DIRECTIVE_ACTION);
+ buf.append("\n");
+
+ // append jsp:id
+ buf.append(" ").append(jspIdPrefix).append(":id").append("=\"");
+ buf.append(jspId++).append("\"\n");
+ buf.append(" ").append("pageEncoding").append("=\"UTF-8\"\n");
+ buf.append(" ").append("contentType").append("=\"");
+ buf.append(compiler.getPageInfo().getContentType()).append("\"\n");
+ buf.append("/>\n");
+ }
+
+ /*
+ * Appends the tag directive with the given attributes to the XML
+ * view.
+ *
+ * If the given tag directive contains just a 'pageEncoding'
+ * attributes, we ignore it, as we've already appended
+ * a tag directive containing just this attributes.
+ */
+ private void appendTagDirective(Node.TagDirective n)
+ throws JasperException {
+
+ boolean append = false;
+ Attributes attrs = n.getAttributes();
+ int len = (attrs == null) ? 0 : attrs.getLength();
+ for (int i=0; i<len; i++) {
+ String attrName = attrs.getQName(i);
+ if (!"pageEncoding".equals(attrName)) {
+ append = true;
+ break;
+ }
+ }
+ if (!append) {
+ return;
+ }
- public void visit(Node.TagDirective n) throws JasperException {
- appendTagDirective(n);
- }
-
- public void visit(Node.AttributeDirective n) throws JasperException {
- appendTag(n);
- }
-
- public void visit(Node.VariableDirective n) throws JasperException {
- appendTag(n);
- }
+ appendTag(n);
+ }
+
+ /*
+ * Appends a tag directive containing a single 'pageEncoding'
+ * attribute whose value is hard-coded to UTF-8.
+ */
+ private void appendTagDirective() {
+ buf.append("<").append(JSP_TAG_DIRECTIVE_ACTION);
+ buf.append("\n");
+
+ // append jsp:id
+ buf.append(" ").append(jspIdPrefix).append(":id").append("=\"");
+ buf.append(jspId++).append("\"\n");
+ buf.append(" ").append("pageEncoding").append("=\"UTF-8\"\n");
+ buf.append("/>\n");
+ }
+
+ private void appendText(String text, boolean createJspTextElement) {
+ if (createJspTextElement) {
+ buf.append("<").append(JSP_TEXT_ACTION);
+ buf.append("\n");
+
+ // append jsp:id
+ buf.append("
").append(jspIdPrefix).append(":id").append("=\"");
+ buf.append(jspId++).append("\"\n");
+ buf.append(">\n");
+
+ appendCDATA(text);
+ buf.append(JSP_TEXT_ACTION_END);
+ buf.append("\n");
+ } else {
+ appendCDATA(text);
+ }
+ }
- public void visit(Node.TemplateText n) throws JasperException {
- /*
- * If the template text came from a JSP page written in JSP syntax,
- * create a jsp:text element for it (JSP 5.3.2).
- */
- appendText(n.getText(), !n.getRoot().isXmlSyntax());
- }
-
- /*
- * Appends the given tag, including its body, to the XML view.
- */
- private void appendTag(Node n) throws JasperException {
- appendTag(n, false);
- }
-
- /*
- * Appends the given tag, including its body, to the XML view,
- * and optionally reset default namespace to "", if none specified.
- */
- private void appendTag(Node n, boolean addDefaultNS)
- throws JasperException {
-
- Node.Nodes body = n.getBody();
- String text = n.getText();
-
- buf.append("<").append(n.getQName());
- buf.append("\n");
-
- printAttributes(n, addDefaultNS);
- buf.append(" ").append(jspIdPrefix).append(":id").append("=\"");
- buf.append(jspId++).append("\"\n");
-
- if (ROOT_ACTION.equals(n.getLocalName()) || body != null
- || text != null) {
- buf.append(">\n");
- if (ROOT_ACTION.equals(n.getLocalName())) {
- if (compiler.getCompilationContext().isTagFile()) {
- appendTagDirective();
- } else {
- appendPageDirective();
- }
- }
- if (body != null) {
- body.visit(this);
- } else {
- appendText(text, false);
- }
- buf.append("</" + n.getQName() + ">\n");
- } else {
- buf.append("/>\n");
- }
- }
-
- /*
- * Appends the page directive with the given attributes to the XML
- * view.
- *
- * Since the import attribute of the page directive is the only page
- * attribute that is allowed to appear multiple times within the same
- * document, and since XML allows only single-value attributes,
- * the values of multiple import attributes must be combined into one,
- * separated by comma.
- *
- * If the given page directive contains just 'contentType' and/or
- * 'pageEncoding' attributes, we ignore it, as we've already appended
- * a page directive containing just these two attributes.
- */
- private void appendPageDirective(Node.PageDirective n) {
- boolean append = false;
- Attributes attrs = n.getAttributes();
- int len = (attrs == null) ? 0 : attrs.getLength();
- for (int i=0; i<len; i++) {
- String attrName = attrs.getQName(i);
- if (!"pageEncoding".equals(attrName)
- && !"contentType".equals(attrName)) {
- append = true;
- break;
- }
- }
- if (!append) {
- return;
- }
-
- buf.append("<").append(n.getQName());
- buf.append("\n");
-
- // append jsp:id
- buf.append(" ").append(jspIdPrefix).append(":id").append("=\"");
- buf.append(jspId++).append("\"\n");
-
- // append remaining attributes
- for (int i=0; i<len; i++) {
- String attrName = attrs.getQName(i);
- if ("import".equals(attrName) || "contentType".equals(attrName)
- || "pageEncoding".equals(attrName)) {
- /*
- * Page directive's 'import' attribute is considered
- * further down, and its 'pageEncoding' and 'contentType'
- * attributes are ignored, since we've already appended
- * a new page directive containing just these two
- * attributes
- */
- continue;
- }
- String value = attrs.getValue(i);
- buf.append(" ").append(attrName).append("=\"");
- buf.append(JspUtil.getExprInXml(value)).append("\"\n");
- }
- if (n.getImports().size() > 0) {
- // Concatenate names of imported classes/packages
- boolean first = true;
- ListIterator iter = n.getImports().listIterator();
- while (iter.hasNext()) {
- if (first) {
- first = false;
- buf.append(" import=\"");
- } else {
- buf.append(",");
- }
- buf.append(JspUtil.getExprInXml((String) iter.next()));
- }
- buf.append("\"\n");
- }
- buf.append("/>\n");
- }
-
- /*
- * Appends a page directive with 'pageEncoding' and 'contentType'
- * attributes.
- *
- * The value of the 'pageEncoding' attribute is hard-coded
- * to UTF-8, whereas the value of the 'contentType' attribute, which
- * is identical to what the container will pass to
- * ServletResponse.setContentType(), is derived from the pageInfo.
- */
- private void appendPageDirective() {
- buf.append("<").append(JSP_PAGE_DIRECTIVE_ACTION);
- buf.append("\n");
-
- // append jsp:id
- buf.append(" ").append(jspIdPrefix).append(":id").append("=\"");
- buf.append(jspId++).append("\"\n");
- buf.append(" ").append("pageEncoding").append("=\"UTF-8\"\n");
- buf.append(" ").append("contentType").append("=\"");
- buf.append(compiler.getPageInfo().getContentType()).append("\"\n");
- buf.append("/>\n");
- }
-
- /*
- * Appends the tag directive with the given attributes to the XML
- * view.
- *
- * If the given tag directive contains just a 'pageEncoding'
- * attributes, we ignore it, as we've already appended
- * a tag directive containing just this attributes.
- */
- private void appendTagDirective(Node.TagDirective n)
- throws JasperException {
-
- boolean append = false;
- Attributes attrs = n.getAttributes();
- int len = (attrs == null) ? 0 : attrs.getLength();
- for (int i=0; i<len; i++) {
- String attrName = attrs.getQName(i);
- if (!"pageEncoding".equals(attrName)) {
- append = true;
- break;
- }
- }
- if (!append) {
- return;
- }
-
- appendTag(n);
- }
-
- /*
- * Appends a tag directive containing a single 'pageEncoding'
- * attribute whose value is hard-coded to UTF-8.
- */
- private void appendTagDirective() {
- buf.append("<").append(JSP_TAG_DIRECTIVE_ACTION);
- buf.append("\n");
-
- // append jsp:id
- buf.append(" ").append(jspIdPrefix).append(":id").append("=\"");
- buf.append(jspId++).append("\"\n");
- buf.append(" ").append("pageEncoding").append("=\"UTF-8\"\n");
- buf.append("/>\n");
- }
-
- private void appendText(String text, boolean createJspTextElement) {
- if (createJspTextElement) {
- buf.append("<").append(JSP_TEXT_ACTION);
- buf.append("\n");
-
- // append jsp:id
- buf.append("
").append(jspIdPrefix).append(":id").append("=\"");
- buf.append(jspId++).append("\"\n");
- buf.append(">\n");
-
- appendCDATA(text);
- buf.append(JSP_TEXT_ACTION_END);
- buf.append("\n");
- } else {
- appendCDATA(text);
- }
- }
-
- /*
- * Appends the given text as a CDATA section to the XML view, unless
- * the text has already been marked as CDATA.
- */
- private void appendCDATA(String text) {
- buf.append(CDATA_START_SECTION);
- buf.append(escapeCDATA(text));
- buf.append(CDATA_END_SECTION);
- }
-
- /*
- * Escapes any occurrences of "]]>" (by replacing them with "]]>")
- * within the given text, so it can be included in a CDATA section.
- */
- private String escapeCDATA(String text) {
+ /*
+ * Appends the given text as a CDATA section to the XML view, unless
+ * the text has already been marked as CDATA.
+ */
+ private void appendCDATA(String text) {
+ buf.append(CDATA_START_SECTION);
+ buf.append(escapeCDATA(text));
+ buf.append(CDATA_END_SECTION);
+ }
+
+ /*
+ * Escapes any occurrences of "]]>" (by replacing them with "]]>")
+ * within the given text, so it can be included in a CDATA section.
+ */
+ private String escapeCDATA(String text) {
if( text==null ) return "";
- int len = text.length();
- CharArrayWriter result = new CharArrayWriter(len);
- for (int i=0; i<len; i++) {
- if (((i+2) < len)
- && (text.charAt(i) == ']')
- && (text.charAt(i+1) == ']')
- && (text.charAt(i+2) == '>')) {
- // match found
- result.write(']');
- result.write(']');
- result.write('&');
- result.write('g');
- result.write('t');
- result.write(';');
- i += 2;
- } else {
- result.write(text.charAt(i));
- }
- }
- return result.toString();
- }
-
- /*
- * Appends the attributes of the given Node to the XML view.
- */
- private void printAttributes(Node n, boolean addDefaultNS) {
-
- /*
- * Append "xmlns" attributes that represent tag libraries
- */
- Attributes attrs = n.getTaglibAttributes();
- int len = (attrs == null) ? 0 : attrs.getLength();
- for (int i=0; i<len; i++) {
- String name = attrs.getQName(i);
- String value = attrs.getValue(i);
- buf.append("
").append(name).append("=\"").append(value).append("\"\n");
- }
-
- /*
- * Append "xmlns" attributes that do not represent tag libraries
- */
- attrs = n.getNonTaglibXmlnsAttributes();
- len = (attrs == null) ? 0 : attrs.getLength();
- boolean defaultNSSeen = false;
- for (int i=0; i<len; i++) {
- String name = attrs.getQName(i);
- String value = attrs.getValue(i);
- buf.append("
").append(name).append("=\"").append(value).append("\"\n");
- defaultNSSeen |= "xmlns".equals(name);
- }
- if (addDefaultNS && !defaultNSSeen) {
- buf.append(" xmlns=\"\"\n");
- }
- resetDefaultNS = false;
-
- /*
- * Append all other attributes
- */
- attrs = n.getAttributes();
- len = (attrs == null) ? 0 : attrs.getLength();
- for (int i=0; i<len; i++) {
- String name = attrs.getQName(i);
- String value = attrs.getValue(i);
- buf.append(" ").append(name).append("=\"");
- buf.append(JspUtil.getExprInXml(value)).append("\"\n");
- }
- }
-
- /*
- * Appends XML prolog with encoding declaration.
- */
- private void appendXmlProlog() {
- buf.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
- }
+ int len = text.length();
+ CharArrayWriter result = new CharArrayWriter(len);
+ for (int i=0; i<len; i++) {
+ if (((i+2) < len)
+ && (text.charAt(i) == ']')
+ && (text.charAt(i+1) == ']')
+ && (text.charAt(i+2) == '>')) {
+ // match found
+ result.write(']');
+ result.write(']');
+ result.write('&');
+ result.write('g');
+ result.write('t');
+ result.write(';');
+ i += 2;
+ } else {
+ result.write(text.charAt(i));
+ }
+ }
+ return result.toString();
+ }
+
+ /*
+ * Appends the attributes of the given Node to the XML view.
+ */
+ private void printAttributes(Node n, boolean addDefaultNS) {
+
+ /*
+ * Append "xmlns" attributes that represent tag libraries
+ */
+ Attributes attrs = n.getTaglibAttributes();
+ int len = (attrs == null) ? 0 : attrs.getLength();
+ for (int i=0; i<len; i++) {
+ String name = attrs.getQName(i);
+ String value = attrs.getValue(i);
+ buf.append("
").append(name).append("=\"").append(value).append("\"\n");
+ }
+
+ /*
+ * Append "xmlns" attributes that do not represent tag libraries
+ */
+ attrs = n.getNonTaglibXmlnsAttributes();
+ len = (attrs == null) ? 0 : attrs.getLength();
+ boolean defaultNSSeen = false;
+ for (int i=0; i<len; i++) {
+ String name = attrs.getQName(i);
+ String value = attrs.getValue(i);
+ buf.append("
").append(name).append("=\"").append(value).append("\"\n");
+ defaultNSSeen |= "xmlns".equals(name);
+ }
+ if (addDefaultNS && !defaultNSSeen) {
+ buf.append(" xmlns=\"\"\n");
+ }
+ resetDefaultNS = false;
+
+ /*
+ * Append all other attributes
+ */
+ attrs = n.getAttributes();
+ len = (attrs == null) ? 0 : attrs.getLength();
+ for (int i=0; i<len; i++) {
+ String name = attrs.getQName(i);
+ String value = attrs.getValue(i);
+ buf.append(" ").append(name).append("=\"");
+ buf.append(JspUtil.getExprInXml(value)).append("\"\n");
+ }
+ }
+
+ /*
+ * Appends XML prolog with encoding declaration.
+ */
+ private void appendXmlProlog() {
+ buf.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]