| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| package org.apache.jasper.tagplugins.jstl.core; |
| |
| import java.io.IOException; |
| import java.io.Reader; |
| |
| import javax.servlet.jsp.JspWriter; |
| |
| import org.apache.jasper.compiler.tagplugin.TagPlugin; |
| import org.apache.jasper.compiler.tagplugin.TagPluginContext; |
| import org.apache.jasper.tagplugins.jstl.Util; |
| |
| |
| public final class Out implements TagPlugin { |
| |
| @Override |
| public void doTag(TagPluginContext ctxt) { |
| |
| //these two data member are to indicate |
| //whether the corresponding attribute is specified |
| boolean hasDefault=false, hasEscapeXml=false; |
| hasDefault = ctxt.isAttributeSpecified("default"); |
| hasEscapeXml = ctxt.isAttributeSpecified("escapeXml"); |
| |
| //strValName, strEscapeXmlName & strDefName are two variables' name |
| //standing for value, escapeXml and default attribute |
| String strObjectName = ctxt.getTemporaryVariableName(); |
| String strValName = ctxt.getTemporaryVariableName(); |
| String strDefName = ctxt.getTemporaryVariableName(); |
| String strEscapeXmlName = ctxt.getTemporaryVariableName(); |
| String strSkipBodyName = ctxt.getTemporaryVariableName(); |
| |
| //according to the tag file, the value attribute is mandatory. |
| ctxt.generateImport("java.io.Reader"); |
| ctxt.generateJavaSource("Object " + strObjectName + "="); |
| ctxt.generateAttribute("value"); |
| ctxt.generateJavaSource(";"); |
| ctxt.generateJavaSource("String " + strValName + "=null;"); |
| ctxt.generateJavaSource("if(!(" + strObjectName + |
| " instanceof Reader) && "+ strObjectName + " != null){"); |
| ctxt.generateJavaSource( |
| strValName + " = " + strObjectName + ".toString();"); |
| ctxt.generateJavaSource("}"); |
| |
| //initiate the strDefName with null. |
| //if the default has been specified, then assign the value to it; |
| ctxt.generateJavaSource("String " + strDefName + " = null;"); |
| if(hasDefault){ |
| ctxt.generateJavaSource("if("); |
| ctxt.generateAttribute("default"); |
| ctxt.generateJavaSource(" != null){"); |
| ctxt.generateJavaSource(strDefName + " = ("); |
| ctxt.generateAttribute("default"); |
| ctxt.generateJavaSource(").toString();"); |
| ctxt.generateJavaSource("}"); |
| } |
| |
| //initiate the strEscapeXmlName with true; |
| //if the escapeXml is specified, assign the value to it; |
| ctxt.generateJavaSource("boolean " + strEscapeXmlName + " = true;"); |
| if(hasEscapeXml){ |
| ctxt.generateJavaSource(strEscapeXmlName + " = "); |
| ctxt.generateAttribute("escapeXml"); |
| ctxt.generateJavaSource(";"); |
| } |
| |
| //main part. |
| ctxt.generateJavaSource( |
| "boolean " + strSkipBodyName + " = " + |
| "org.apache.jasper.tagplugins.jstl.core.Out.output(out, " + |
| strObjectName + ", " + strValName + ", " + strDefName + ", " + |
| strEscapeXmlName + ");"); |
| ctxt.generateJavaSource("if(!" + strSkipBodyName + ") {"); |
| ctxt.generateBody(); |
| ctxt.generateJavaSource("}"); |
| } |
| |
| public static boolean output(JspWriter out, Object input, String value, |
| String defaultValue, boolean escapeXml) throws IOException { |
| if (input instanceof Reader) { |
| char[] buffer = new char[8096]; |
| int read = 0; |
| while (read != -1) { |
| read = ((Reader) input).read(buffer); |
| if (read != -1) { |
| if (escapeXml) { |
| String escaped = Util.escapeXml(buffer, read); |
| if (escaped == null) { |
| out.write(buffer, 0, read); |
| } else { |
| out.print(escaped); |
| } |
| } else { |
| out.write(buffer, 0, read); |
| } |
| } |
| } |
| return true; |
| } else { |
| String v = value != null ? value : defaultValue; |
| if (v != null) { |
| if(escapeXml){ |
| v = Util.escapeXml(v); |
| } |
| out.write(v); |
| return true; |
| } else { |
| return false; |
| } |
| } |
| } |
| } |