You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ki...@apache.org on 2003/01/28 01:13:39 UTC

cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/runtime JspContextWrapper.java

kinman      2003/01/27 16:13:39

  Modified:    jasper2/src/share/org/apache/jasper/compiler Generator.java
                        TagFileProcessor.java
               jasper2/src/share/org/apache/jasper/resources
                        messages.properties messages_es.properties
                        messages_fr.properties messages_ja.properties
               jasper2/src/share/org/apache/jasper/runtime
                        JspContextWrapper.java
  Log:
  - Implements name-from-attribute and alias in variable directives in tag file
  
  Revision  Changes    Path
  1.154     +66 -19    jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java
  
  Index: Generator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v
  retrieving revision 1.153
  retrieving revision 1.154
  diff -u -r1.153 -r1.154
  --- Generator.java	22 Jan 2003 20:54:54 -0000	1.153
  +++ Generator.java	28 Jan 2003 00:13:37 -0000	1.154
  @@ -2478,6 +2478,43 @@
   	    return attrValue;
   	}
   
  +	/**
  +	 * Generate code to create a map for the alias variables
  +	 * @return the name of the map
  +	 */
  +	private String generateAliasMap(Node.CustomTag n, String tagHandlerVar)
  +		throws JasperException {
  +
  +	    TagInfo tagInfo = n.getTagInfo();
  +	    TagVariableInfo[] tagVars = tagInfo.getTagVariableInfos();
  +	    String aliasMapVar = "null";
  +
  +	    boolean aliasSeen = false;
  +	    for (int i=0; i<tagVars.length; i++) {
  +
  +		String nameFrom = tagVars[i].getNameFromAttribute();
  +		if (nameFrom != null) {
  +		    String aliaseName = n.getAttributeValue(nameFrom);
  +		    if (aliaseName == null) continue;
  +
  +		    if ( ! aliasSeen ) {
  +			out.printin("java.util.HashMap ");
  +			aliasMapVar = tagHandlerVar+"_aliasMap";
  +			out.print(aliasMapVar);
  +		        out.println(" = new java.util.HashMap();");
  +		        aliasSeen = true;
  +		    }
  +		    out.printin(aliasMapVar);
  +		    out.print(".put(");
  +		    out.print(quote(tagVars[i].getNameGiven()));
  +		    out.print(", ");
  +		    out.print(quote(aliaseName));
  +		    out.println(");");
  +		}
  +	    }
  +	    return aliasMapVar;
  +	}
  +
   	private void generateSetters(Node.CustomTag n,
   				     String tagHandlerVar,
   				     TagHandlerInfo handlerInfo,
  @@ -2485,10 +2522,15 @@
   	            throws JasperException {
   
   	    // Set context
  -	    out.printin(tagHandlerVar);
   	    if (simpleTag) {
  -		out.println(".setJspContext(pageContext);");
  +		// Generate alias map 
  +		String aliasMapVar= generateAliasMap(n, tagHandlerVar);
  +		out.printin(tagHandlerVar);
  +		out.print(".setJspContext(pageContext, ");
  +		out.print(aliasMapVar);
  +		out.println(");");
   	    } else {
  +		out.printin(tagHandlerVar);
   		out.println(".setPageContext(pageContext);");
   	    }
   
  @@ -3132,7 +3174,12 @@
        * sync AT_BEGIN and AT_END scripting variables.
        */
       private void generateSetJspContext(TagInfo tagInfo) {
  -        out.printil("public void setJspContext( JspContext ctx ) {");
  +
  +	boolean nestedSeen = false;
  +	boolean atBeginSeen = false;
  +	boolean atEndSeen = false;
  +
  +        out.printil("public void setJspContext(JspContext ctx, java.util.Map aliasMap) {");
           out.pushIndent();
           out.printil("super.setJspContext(ctx);");
   	TagVariableInfo[] tagVars = tagInfo.getTagVariableInfos();
  @@ -3144,26 +3191,26 @@
   
   	    switch(tagVars[i].getScope()) {
   	    case VariableInfo.NESTED:
  -		out.printil("if (_jspx_nested == null)");
  -		out.pushIndent();
  -		out.printil("_jspx_nested = new java.util.ArrayList();");
  -		out.popIndent();
  +		if ( ! nestedSeen ) {
  +		    out.printil("_jspx_nested = new java.util.ArrayList();");
  +		    nestedSeen = true;
  +		}
   		out.printin("_jspx_nested.add(");
   		break;
   
   	    case VariableInfo.AT_BEGIN:
  -		out.printil("if (_jspx_at_begin == null)");
  -		out.pushIndent();
  -		out.printil("_jspx_at_begin = new java.util.ArrayList();");
  -		out.popIndent();
  +		if ( ! atBeginSeen ) {
  +		    out.printil("_jspx_at_begin = new java.util.ArrayList();");
  +		    atBeginSeen = true;
  +		}
   		out.printin("_jspx_at_begin.add(");
   		break;
   
   	    case VariableInfo.AT_END:
  -		out.printil("if (_jspx_at_end == null)");
  -		out.pushIndent();
  -		out.printil("_jspx_at_end = new java.util.ArrayList();");
  -		out.popIndent();
  +		if ( ! atEndSeen ) {
  +		    out.printil("_jspx_at_end = new java.util.ArrayList();");
  +		    atEndSeen = true;
  +		}
   		out.printin("_jspx_at_end.add(");
   		break;
   	    } // switch
  @@ -3171,7 +3218,7 @@
   	    out.print(quote(tagVars[i].getNameGiven()));
   	    out.println(");");
   	}
  -	out.printil("this.jspContext = new org.apache.jasper.runtime.JspContextWrapper(ctx, _jspx_nested, _jspx_at_begin, _jspx_at_end);");
  +	out.printil("this.jspContext = new org.apache.jasper.runtime.JspContextWrapper(ctx, _jspx_nested, _jspx_at_begin, _jspx_at_end, aliasMap);");
   	out.popIndent();
           out.printil("}");
           out.println();
  
  
  
  1.38      +69 -12    jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagFileProcessor.java
  
  Index: TagFileProcessor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagFileProcessor.java,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- TagFileProcessor.java	18 Dec 2002 23:18:21 -0000	1.37
  +++ TagFileProcessor.java	28 Jan 2003 00:13:37 -0000	1.38
  @@ -113,7 +113,9 @@
   	};
   
   	private static final JspUtil.ValidAttribute[] variableDirectiveAttrs = {
  -	    new JspUtil.ValidAttribute("name-given", true),
  +	    new JspUtil.ValidAttribute("name-given"),
  +	    new JspUtil.ValidAttribute("name-from-attribute"),
  +	    new JspUtil.ValidAttribute("alias"),
   	    new JspUtil.ValidAttribute("variable-class"),
   	    new JspUtil.ValidAttribute("scope"),
   	    new JspUtil.ValidAttribute("declare"),
  @@ -210,6 +212,21 @@
                                       variableDirectiveAttrs, err);
   
               String nameGiven = n.getAttributeValue("name-given");
  +            String nameFromAttribute = n.getAttributeValue("name-from-attribute");
  +	    if (nameGiven == null && nameFromAttribute == null) {
  +		err.jspError("jsp.variable.either.name");
  +	    }
  +
  +	    if (nameGiven != null && nameFromAttribute != null) {
  +		err.jspError("jsp.variable.both.name");
  +	    }
  +
  +	    String alias = n.getAttributeValue("alias");
  +	    if (nameFromAttribute != null && alias == null ||
  +		nameFromAttribute == null && alias != null) {
  +		err.jspError("jsp.variable.alias");
  +	    }
  +
               String className = n.getAttributeValue("variable-class");
               if (className == null)
                   className = "java.lang.String";
  @@ -231,11 +248,19 @@
                   }
               }
   
  -	    variableVector.addElement(new TagVariableInfo(nameGiven,
  -							  null,
  -							  className,
  -							  declare,
  -							  scope));
  +	    if (nameFromAttribute != null) {
  +		// An alias has been specified.  We use nameGiven to
  +		// hold the value of alias, and nameFromAttribute to
  +		// hold what its alias
  +		nameGiven = alias;
  +	    }
  +		
  +	    variableVector.addElement(new TagVariableInfo(
  +						nameGiven,
  +						nameFromAttribute,
  +						className,
  +						declare,
  +						scope));
           }
   
   	/*
  @@ -323,8 +348,13 @@
           page.visit(tagFileVisitor);
   
   	/*
  -	 * It is illegal to have a variable.name-given equal to an
  -	 * attribute.name in the same tag file translation unit.
  +	 * TODO: need to check for uniqueness of attribute name, variable
  +	 * name-given, and vraibale alias.
  +	 */
  +
  +	/*
  +	 * It is illegal to have a variable.name-given or variable.alias equal
  +         * to an attribute.name in the same tag file translation unit.
   	 */
   	Iterator attrsIter = tagFileVisitor.getAttributesVector().iterator();
   	while (attrsIter.hasNext()) {
  @@ -332,9 +362,36 @@
   	    Iterator varsIter = tagFileVisitor.getVariablesVector().iterator();
   	    while (varsIter.hasNext()) {
   		TagVariableInfo varInfo = (TagVariableInfo) varsIter.next();
  -		if (attrInfo.getName().equals(varInfo.getNameGiven())) {
  +		String attrName = attrInfo.getName();
  +		if (attrName.equals(varInfo.getNameGiven())) {
   		    err.jspError("jsp.error.tagfile.var_name_given_equals_attr_name",
  -				 path, attrInfo.getName());
  +				 path, attrName);
  +		}
  +	    }
  +	}
  +	/*
  +	 * It is illegal to have a variable.name-given equal another
  +	 * variable.alias the same tag file translation unit.
  +	 */
  +	Iterator varsIter = tagFileVisitor.getVariablesVector().iterator();
  +	while (varsIter.hasNext()) {
  +	    TagVariableInfo varsInfo = (TagVariableInfo) varsIter.next();
  +	    if (varsInfo.getNameFromAttribute() == null) {
  +		// Only interested in aliases.
  +		continue;
  +	    }
  +	    String nameGiven = varsInfo.getNameGiven();
  +
  +	    Iterator varsIter2 = tagFileVisitor.getVariablesVector().iterator();
  +	    while (varsIter2.hasNext()) {
  +		TagVariableInfo varsInfo2 = (TagVariableInfo) varsIter2.next();
  +		if (varsInfo2.getNameFromAttribute() != null) {
  +		    // Only interest in non-aliases
  +		    continue;
  +		}
  +		if (nameGiven.equals(varsInfo2.getNameGiven())) {
  +		    err.jspError("jsp.error.tagfile.nameGiven_equals.alias",
  +				path, nameGiven);
   		}
   	    }
   	}
  
  
  
  1.85      +5 -2      jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages.properties
  
  Index: messages.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages.properties,v
  retrieving revision 1.84
  retrieving revision 1.85
  diff -u -r1.84 -r1.85
  --- messages.properties	27 Jan 2003 18:10:47 -0000	1.84
  +++ messages.properties	28 Jan 2003 00:13:38 -0000	1.85
  @@ -313,7 +313,7 @@
   jsp.error.attribute.standard.non_rt_with_expr=The {0} attribute of the {1} standard action does not accept any expressions
   jsp.error.scripting.variable.missing_name=Unable to determine scripting variable name from attribute {0}
   jasper.error.emptybodycontent.nonempty=According to TLD, tag {0} must be empty, but is not
  -jsp.error.tagfile.var_name_given_equals_attr_name=In tag file {0}, the name-given attribute ({1}) of a variable directive equals the name attribute of an attribute directive
  +jsp.error.tagfile.var_name_given_equals_attr_name=In tag file {0}, the name-given attribute or the alias attribute ({1}) of a variable directive equals the name attribute of an attribute directive
   jsp.error.useBean.noSession=Illegal for useBean to use session scope when JSP page declares (via page directive) that it does not participate in sessions
   jsp.error.xml.encodingByteOrderUnsupported = Given byte order for encoding \"{0}\" is not supported.
   jsp.error.xml.encodingDeclInvalid = Invalid encoding name \"{0}\".
  @@ -356,3 +356,6 @@
   jsp.error.attribute.invalidPrefix=The attribute prefix {0} does not correspond to any imported tag library
   jsp.error.nested.jspattribute=a jsp:attribute standard action cannot be nested within another jsp:attribute standard action
   jsp.error.nested.jspbody=a jsp:body standard action cannot be nested within another jsp:body or jsp:attribute standard action
  +jsp.error.variable.either.name=either name-given or name-from-attribute attribute must be specified in a variable directive
  +jsp.error.variable.both.name=cannot specified both name-given or name-from-attribute attributes in a variable directive
  +jsp.error.variable.alias=both or none of the name-from-attribute and alias attributes can be specified in a variable directive.
  
  
  
  1.31      +4 -1      jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages_es.properties
  
  Index: messages_es.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages_es.properties,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- messages_es.properties	27 Jan 2003 18:10:47 -0000	1.30
  +++ messages_es.properties	28 Jan 2003 00:13:38 -0000	1.31
  @@ -260,3 +260,6 @@
   jsp.error.attributes.not.allowed=
   jsp.error.nested.jspattribute=
   jsp.error.nested.jspbody=
  +jsp.error.variable.either.name=
  +jsp.error.variable.both.name=
  +jsp.error.variable.alias=
  
  
  
  1.14      +5 -1      jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages_fr.properties
  
  Index: messages_fr.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages_fr.properties,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- messages_fr.properties	27 Jan 2003 18:10:47 -0000	1.13
  +++ messages_fr.properties	28 Jan 2003 00:13:38 -0000	1.14
  @@ -299,3 +299,7 @@
   jsp.error.attributes.not.allowed = {0} ne doit avoir aucun attribut
   jsp.error.nested.jspattribute=
   jsp.error.nested.jspbody=
  +jsp.error.variable.either.name=
  +jsp.error.variable.both.name=
  +jsp.error.variable.alias=
  +
  
  
  
  1.31      +5 -1      jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages_ja.properties
  
  Index: messages_ja.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages_ja.properties,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- messages_ja.properties	27 Jan 2003 18:10:47 -0000	1.30
  +++ messages_ja.properties	28 Jan 2003 00:13:38 -0000	1.31
  @@ -291,3 +291,7 @@
   jsp.error.attributes.not.allowed=
   jsp.error.nested.jspattribute=
   jsp.error.nested.jspbody=
  +jsp.error.variable.either.name=
  +jsp.error.variable.both.name=
  +jsp.error.variable.alias=
  +
  
  
  
  1.11      +31 -5     jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/runtime/JspContextWrapper.java
  
  Index: JspContextWrapper.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/runtime/JspContextWrapper.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- JspContextWrapper.java	18 Dec 2002 18:46:59 -0000	1.10
  +++ JspContextWrapper.java	28 Jan 2003 00:13:39 -0000	1.11
  @@ -68,6 +68,7 @@
   import java.util.Hashtable;
   import java.util.ArrayList;
   import java.util.Iterator;
  +import java.util.Map;
   
   import javax.servlet.Servlet;
   import javax.servlet.ServletConfig;
  @@ -115,15 +116,20 @@
       // ArrayList of AT_END scripting variables
       private ArrayList atEndVars;
   
  +    private Map aliases;
  +
       private Hashtable originalNestedVars;
   
       public JspContextWrapper(JspContext jspContext, ArrayList nestedVars,
  -			     ArrayList atBeginVars, ArrayList atEndVars) {
  +			     ArrayList atBeginVars, ArrayList atEndVars,
  +			     Map aliases) {
           this.invokingJspCtxt = (PageContext) jspContext;
   	this.nestedVars = nestedVars;
   	this.atBeginVars = atBeginVars;
   	this.atEndVars = atEndVars;
   	this.pageAttributes = new Hashtable(16);
  +	this.aliases = aliases;
  +
   	if (nestedVars != null) {
   	    this.originalNestedVars = new Hashtable(nestedVars.size());
   	}
  @@ -338,7 +344,9 @@
   
   	while ((iter != null) && iter.hasNext()) {
   	    String varName = (String) iter.next();
  -	    Object obj = invokingJspCtxt.getAttribute(varName);
  +	    String aliasName = findAlias(varName);
  +
  +	    Object obj = invokingJspCtxt.getAttribute(aliasName);
   	    if (obj != null) {
   		setAttribute(varName, obj);
   	    }
  @@ -375,6 +383,7 @@
   	while ((iter != null) && iter.hasNext()) {
   	    String varName = (String) iter.next();
   	    Object obj = getAttribute(varName);
  +	    varName = findAlias(varName);
   	    if (obj != null) {
   		invokingJspCtxt.setAttribute(varName, obj);
   	    } else {
  @@ -392,6 +401,7 @@
   	    Iterator iter = nestedVars.iterator();
   	    while (iter.hasNext()) {
   		String varName = (String) iter.next();
  +		varName = findAlias(varName);
   		Object obj = invokingJspCtxt.getAttribute(varName);
   		if (obj != null) {
   		    originalNestedVars.put(varName, obj);
  @@ -409,6 +419,7 @@
   	    Iterator iter = nestedVars.iterator();
   	    while (iter.hasNext()) {
   		String varName = (String) iter.next();
  +		varName = findAlias(varName);
   		Object obj = originalNestedVars.get(varName);
   		if (obj != null) {
   		    invokingJspCtxt.setAttribute(varName, obj);
  @@ -417,6 +428,21 @@
   		}
   	    }
   	}
  +    }
  +
  +    /**
  +     * Find the attribute that variable is alised to.
  +     * @param varName a variable
  +     * @return if varName is an alias, then the aliased variable
  +     *         otherwise varName
  +     */
  +    private String findAlias(String varName) {
  +
  +	String alias = (String) aliases.get(varName);
  +	if (alias == null) {
  +	    return varName;
  +	}
  +	return alias;
       }
   }
   
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>