1 17 18 19 package org.apache.jasper.tagplugins.jstl.core; 20 21 import org.apache.jasper.compiler.tagplugin.TagPlugin; 22 import org.apache.jasper.compiler.tagplugin.TagPluginContext; 23 import org.apache.jasper.tagplugins.jstl.Util; 24 25 public class Set implements TagPlugin { 26 27 public void doTag(TagPluginContext ctxt) { 28 29 boolean hasValue = false, hasVar = false, hasScope = false, 31 hasTarget = false; 32 33 String strScope; 35 int iScope; 37 38 hasValue = ctxt.isAttributeSpecified("value"); 40 hasVar = ctxt.isAttributeSpecified("var"); 41 hasScope = ctxt.isAttributeSpecified("scope"); 42 hasTarget = ctxt.isAttributeSpecified("target"); 43 44 String resultName = ctxt.getTemporaryVariableName(); 46 String targetName = ctxt.getTemporaryVariableName(); 47 String propertyName = ctxt.getTemporaryVariableName(); 48 49 ctxt.generateJavaSource("Object " + resultName + " = null;"); 51 if(hasValue){ 52 ctxt.generateJavaSource(resultName + " = "); 53 ctxt.generateAttribute("value"); 54 ctxt.generateJavaSource(";"); 55 }else{ 56 ctxt.dontUseTagPlugin(); 57 return; 58 } 59 60 if(hasScope){ 62 strScope = ctxt.getConstantAttribute("scope"); 63 }else{ 64 strScope = "page"; 65 } 66 67 iScope = Util.getScope(strScope); 69 70 if(hasVar){ 72 String strVar = ctxt.getConstantAttribute("var"); 73 ctxt.generateJavaSource("if(null != " + resultName + "){"); 74 ctxt.generateJavaSource(" pageContext.setAttribute(\"" + strVar + "\"," + resultName + "," + iScope + ");"); 75 ctxt.generateJavaSource("} else {"); 76 if(hasScope){ 77 ctxt.generateJavaSource(" pageContext.removeAttribute(\"" + strVar + "\"," + iScope + ");"); 78 }else{ 79 ctxt.generateJavaSource(" pageContext.removeAttribute(\"" + strVar + "\");"); 80 } 81 ctxt.generateJavaSource("}"); 82 83 }else if(hasTarget){ 85 86 String pdName = ctxt.getTemporaryVariableName(); 88 String successFlagName = ctxt.getTemporaryVariableName(); 89 String index = ctxt.getTemporaryVariableName(); 90 String methodName = ctxt.getTemporaryVariableName(); 91 92 ctxt.generateJavaSource("String " + propertyName + " = null;"); 94 ctxt.generateJavaSource("if("); 95 ctxt.generateAttribute("property"); 96 ctxt.generateJavaSource(" != null){"); 97 ctxt.generateJavaSource(" " + propertyName + " = ("); 98 ctxt.generateAttribute("property"); 99 ctxt.generateJavaSource(").toString();"); 100 ctxt.generateJavaSource("}"); 101 102 ctxt.generateJavaSource("Object " + targetName + " = "); 104 ctxt.generateAttribute("target"); 105 ctxt.generateJavaSource(";"); 106 107 ctxt.generateJavaSource("if(" + targetName + " != null){"); 109 110 ctxt.generateJavaSource(" if(" + targetName + " instanceof java.util.Map){"); 112 ctxt.generateJavaSource(" if(null != " + resultName + "){"); 113 ctxt.generateJavaSource(" ((java.util.Map) " + targetName + ").put(" + propertyName + "," + resultName + ");"); 114 ctxt.generateJavaSource(" }else{"); 115 ctxt.generateJavaSource(" ((java.util.Map) " + targetName + ").remove(" + propertyName + ");"); 116 ctxt.generateJavaSource(" }"); 117 118 ctxt.generateJavaSource(" }else{"); 120 ctxt.generateJavaSource(" try{"); 121 122 ctxt.generateJavaSource(" java.beans.PropertyDescriptor " + pdName + "[] = java.beans.Introspector.getBeanInfo(" + targetName + ".getClass()).getPropertyDescriptors();"); 124 125 ctxt.generateJavaSource(" boolean " + successFlagName + " = false;"); 127 128 ctxt.generateJavaSource(" for(int " + index + "=0;" + index + "<" + pdName + ".length;" + index + "++){"); 130 ctxt.generateJavaSource(" if(" + pdName + "[" + index + "].getName().equals(" + propertyName + ")){"); 131 132 ctxt.generateJavaSource(" java.lang.reflect.Method " + methodName + " = " + pdName + "[" + index + "].getWriteMethod();"); 134 ctxt.generateJavaSource(" if(null == " + methodName + "){"); 135 ctxt.generateJavaSource(" throw new JspException(\"No setter method in <set> for property \"+" + propertyName + ");"); 136 ctxt.generateJavaSource(" }"); 137 138 ctxt.generateJavaSource(" if(" + resultName + " != null){"); 140 ctxt.generateJavaSource(" " + methodName + ".invoke(" + targetName + ", new Object[]{(" + methodName + ".getParameterTypes()[0]).cast(" + resultName + ")});"); 141 ctxt.generateJavaSource(" }else{"); 142 ctxt.generateJavaSource(" " + methodName + ".invoke(" + targetName + ", new Object[]{null});"); 143 ctxt.generateJavaSource(" }"); 144 ctxt.generateJavaSource(" " + successFlagName + " = true;"); 145 ctxt.generateJavaSource(" }"); 146 ctxt.generateJavaSource(" }"); 147 ctxt.generateJavaSource(" if(!" + successFlagName + "){"); 148 ctxt.generateJavaSource(" throw new JspException(\"Invalid property in <set>:\"+" + propertyName + ");"); 149 ctxt.generateJavaSource(" }"); 150 ctxt.generateJavaSource(" }"); 151 152 ctxt.generateJavaSource(" catch (IllegalAccessException ex) {"); 154 ctxt.generateJavaSource(" throw new JspException(ex);"); 155 ctxt.generateJavaSource(" } catch (java.beans.IntrospectionException ex) {"); 156 ctxt.generateJavaSource(" throw new JspException(ex);"); 157 ctxt.generateJavaSource(" } catch (java.lang.reflect.InvocationTargetException ex) {"); 158 ctxt.generateJavaSource(" throw new JspException(ex);"); 159 ctxt.generateJavaSource(" }"); 160 ctxt.generateJavaSource(" }"); 161 ctxt.generateJavaSource("}else{"); 162 ctxt.generateJavaSource(" throw new JspException();"); 163 ctxt.generateJavaSource("}"); 164 } 165 } 166 167 } 168 | Popular Tags |