/*
 * Copyright 1999,2005 The Apache Software Foundation.
 * 
 * Licensed 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 org.apache.jasper.compiler.tagplugin.TagPlugin;
import org.apache.jasper.compiler.tagplugin.TagPluginContext;


public final class Out implements TagPlugin {
    
    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 strValName = ctxt.getTemporaryVariableName();
        String strDefName = ctxt.getTemporaryVariableName();
        String strEscapeXmlName = ctxt.getTemporaryVariableName();
        
        //according to the tag file, the value attribute is mandatory.
        ctxt.generateJavaSource("String " + strValName + " = null;");
        ctxt.generateJavaSource("if(");
        ctxt.generateAttribute("value");
        ctxt.generateJavaSource("!=null){");
        ctxt.generateJavaSource("    " + strValName + " = (");
        ctxt.generateAttribute("value");
        ctxt.generateJavaSource(").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;\n");
        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 + " = Boolean.parseBoolean((");
            ctxt.generateAttribute("default");
            ctxt.generateJavaSource(").toString());");
        }
        
        //main part. 
        ctxt.generateJavaSource("if(null != " + strValName +"){");
        ctxt.generateJavaSource("    if(" + strEscapeXmlName + "){");
        ctxt.generateJavaSource("        " + strValName + " = org.apache.jasper.tagplugins.jstl.Util.escapeXml(" + strValName + ");");
        ctxt.generateJavaSource("    }");
        ctxt.generateJavaSource("    out.write(" + strValName + ");");
        ctxt.generateJavaSource("}else{");
        ctxt.generateJavaSource("    if(null != " + strDefName + "){");
        ctxt.generateJavaSource("        if(" + strEscapeXmlName + "){");
        ctxt.generateJavaSource("            " + strDefName + " = org.apache.jasper.tagplugins.jstl.Util.escapeXml(" + strDefName + ");");
        ctxt.generateJavaSource("        }");
        ctxt.generateJavaSource("        out.write(" + strDefName + ");");
        ctxt.generateJavaSource("    }else{");
        ctxt.generateBody();
        ctxt.generateJavaSource("    }");
        ctxt.generateJavaSource("}");   
    }
}
