1 16 17 package org.apache.taglibs.standard.tlv; 18 19 import java.util.Set ; 20 import java.util.Stack ; 21 22 import javax.servlet.jsp.tagext.PageData ; 23 import javax.servlet.jsp.tagext.ValidationMessage ; 24 25 import org.apache.taglibs.standard.resources.Resources; 26 import org.xml.sax.Attributes ; 27 import org.xml.sax.helpers.DefaultHandler ; 28 29 46 public class JstlCoreTLV extends JstlBaseTLV { 47 48 51 64 65 66 69 private final String CHOOSE = "choose"; 71 private final String WHEN = "when"; 72 private final String OTHERWISE = "otherwise"; 73 private final String EXPR = "out"; 74 private final String SET = "set"; 75 private final String IMPORT = "import"; 76 private final String URL = "url"; 77 private final String REDIRECT = "redirect"; 78 private final String PARAM = "param"; 79 private final String TEXT = "text"; 81 82 private final String VALUE = "value"; 84 private final String DEFAULT = "default"; 85 private final String VAR_READER = "varReader"; 86 87 private final String IMPORT_WITH_READER = "import varReader=''"; 89 private final String IMPORT_WITHOUT_READER = "import var=''"; 90 91 92 public ValidationMessage [] validate( 95 String prefix, String uri, PageData page) { 96 return super.validate( TYPE_CORE, prefix, uri, page ); 97 } 98 99 100 103 protected DefaultHandler getHandler() { 104 return new Handler (); 105 } 106 107 108 111 112 private class Handler extends DefaultHandler { 113 114 private int depth = 0; 116 private Stack chooseDepths = new Stack (); 117 private Stack chooseHasOtherwise = new Stack (); 118 private Stack chooseHasWhen = new Stack (); 119 private Stack urlTags = new Stack (); 120 private String lastElementName = null; 121 private boolean bodyNecessary = false; 122 private boolean bodyIllegal = false; 123 124 public void startElement( 126 String ns, String ln, String qn, Attributes a) { 127 128 if (ln == null) 130 ln = getLocalPart(qn); 131 132 if (isJspTag(ns, ln, TEXT)) 135 return; 136 137 if (bodyIllegal) 139 fail(Resources.getMessage("TLV_ILLEGAL_BODY", lastElementName)); 140 141 Set expAtts; 143 if (qn.startsWith(prefix + ":") 144 && (expAtts = (Set ) config.get(ln)) != null) { 145 for (int i = 0; i < a.getLength(); i++) { 146 String attName = a.getLocalName(i); 147 if (expAtts.contains(attName)) { 148 String vMsg = 149 validateExpression( 150 ln, 151 attName, 152 a.getValue(i)); 153 if (vMsg != null) 154 fail(vMsg); 155 } 156 } 157 } 158 159 if (qn.startsWith(prefix + ":") && !hasNoInvalidScope(a)) 161 fail(Resources.getMessage("TLV_INVALID_ATTRIBUTE", 162 SCOPE, qn, a.getValue(SCOPE))); 163 if (qn.startsWith(prefix + ":") && hasEmptyVar(a)) 164 fail(Resources.getMessage("TLV_EMPTY_VAR", qn)); 165 if (qn.startsWith(prefix + ":") && hasDanglingScope(a)) 166 fail(Resources.getMessage("TLV_DANGLING_SCOPE", qn)); 167 168 if (chooseChild()) { 170 if (isCoreTag(ns, ln, WHEN)) { 172 chooseHasWhen.pop(); 173 chooseHasWhen.push(Boolean.TRUE); 174 } 175 176 if(!isCoreTag(ns, ln, WHEN) && !isCoreTag(ns, ln, OTHERWISE)) { 178 fail(Resources.getMessage("TLV_ILLEGAL_CHILD_TAG", 179 prefix, CHOOSE, qn)); 180 } 181 182 if (((Boolean ) chooseHasOtherwise.peek()).booleanValue()) { 184 fail(Resources.getMessage("TLV_ILLEGAL_ORDER", 185 qn, prefix, OTHERWISE, CHOOSE)); 186 } 187 if (isCoreTag(ns, ln, OTHERWISE)) { 188 chooseHasOtherwise.pop(); 189 chooseHasOtherwise.push(Boolean.TRUE); 190 } 191 192 } 193 194 if (isCoreTag(ns, ln, PARAM)) { 196 if (urlTags.empty() || urlTags.peek().equals(PARAM)) 198 fail(Resources.getMessage("TLV_ILLEGAL_ORPHAN", PARAM)); 199 200 if (!urlTags.empty() && 202 urlTags.peek().equals(IMPORT_WITH_READER)) 203 fail(Resources.getMessage("TLV_ILLEGAL_PARAM", 204 prefix, PARAM, IMPORT, VAR_READER)); 205 } else { 206 if (!urlTags.empty() 208 && urlTags.peek().equals(IMPORT_WITHOUT_READER)) 209 fail(Resources.getMessage("TLV_ILLEGAL_CHILD_TAG", 210 prefix, IMPORT, qn)); 211 } 212 213 215 if (isCoreTag(ns, ln, CHOOSE)) { 217 chooseDepths.push(new Integer (depth)); 218 chooseHasWhen.push(Boolean.FALSE); 219 chooseHasOtherwise.push(Boolean.FALSE); 220 } 221 222 if (isCoreTag(ns, ln, IMPORT)) { 224 if (hasAttribute(a, VAR_READER)) 225 urlTags.push(IMPORT_WITH_READER); 226 else 227 urlTags.push(IMPORT_WITHOUT_READER); 228 } else if (isCoreTag(ns, ln, PARAM)) 229 urlTags.push(PARAM); 230 else if (isCoreTag(ns, ln, REDIRECT)) 231 urlTags.push(REDIRECT); 232 else if (isCoreTag(ns, ln, URL)) 233 urlTags.push(URL); 234 235 bodyIllegal = false; 237 bodyNecessary = false; 238 if (isCoreTag(ns, ln, EXPR)) { 239 if (hasAttribute(a, DEFAULT)) 240 bodyIllegal = true; 241 } else if (isCoreTag(ns, ln, SET)) { 242 if (hasAttribute(a, VALUE)) 243 bodyIllegal = true; 244 } 247 248 lastElementName = qn; 250 lastElementId = a.getValue(JSP, "id"); 251 252 depth++; 254 } 255 256 public void characters(char[] ch, int start, int length) { 257 258 bodyNecessary = false; 260 String s = new String (ch, start, length).trim(); 262 if (s.equals("")) 263 return; 264 265 if (bodyIllegal) 267 fail(Resources.getMessage("TLV_ILLEGAL_BODY", lastElementName)); 268 if (!urlTags.empty() 269 && urlTags.peek().equals(IMPORT_WITHOUT_READER)) { 270 fail(Resources.getMessage("TLV_ILLEGAL_BODY", 273 prefix + ":" + IMPORT)); 274 } 275 276 if (chooseChild()) { 278 String msg = 279 Resources.getMessage("TLV_ILLEGAL_TEXT_BODY", 280 prefix, CHOOSE, 281 (s.length() < 7 ? s : s.substring(0,7))); 282 fail(msg); 283 } 284 } 285 286 public void endElement(String ns, String ln, String qn) { 287 288 if (isJspTag(ns, ln, TEXT)) 290 return; 291 292 if (bodyNecessary) 294 fail(Resources.getMessage("TLV_MISSING_BODY", 295 lastElementName)); 296 bodyIllegal = false; 298 if (isCoreTag(ns, ln, CHOOSE)) { 300 Boolean b = (Boolean ) chooseHasWhen.pop(); 301 if (!b.booleanValue()) 302 fail(Resources.getMessage("TLV_PARENT_WITHOUT_SUBTAG", 303 CHOOSE, WHEN)); 304 chooseDepths.pop(); 305 chooseHasOtherwise.pop(); 306 } 307 308 if (isCoreTag(ns, ln, IMPORT) 310 || isCoreTag(ns, ln, PARAM) 311 || isCoreTag(ns, ln, REDIRECT) 312 || isCoreTag(ns, ln, URL)) 313 urlTags.pop(); 314 315 depth--; 317 } 318 319 private boolean chooseChild() { 321 return (!chooseDepths.empty() 322 && (depth - 1) == ((Integer ) chooseDepths.peek()).intValue()); 323 } 324 325 } 326 } 327 | Popular Tags |