1 18 package org.apache.beehive.netui.tags.template; 19 20 import org.apache.beehive.netui.tags.AbstractClassicTag; 21 import org.apache.beehive.netui.tags.AbstractPageError; 22 import org.apache.beehive.netui.tags.IErrorReporter; 23 import org.apache.beehive.netui.tags.html.Html; 24 import org.apache.beehive.netui.tags.rendering.TagRenderingBase; 25 import org.apache.beehive.netui.util.Bundle; 26 import org.apache.beehive.netui.util.logging.Logger; 27 import org.apache.beehive.netui.pageflow.internal.InternalUtils; 28 29 import javax.servlet.RequestDispatcher ; 30 import javax.servlet.ServletException ; 31 import javax.servlet.ServletRequest ; 32 import javax.servlet.ServletResponse ; 33 import javax.servlet.http.HttpServletRequest ; 34 import javax.servlet.jsp.JspException ; 35 import javax.servlet.jsp.JspWriter ; 36 import javax.servlet.jsp.tagext.Tag ; 37 import java.io.IOException ; 38 import java.net.MalformedURLException ; 39 import java.net.URL ; 40 import java.util.ArrayList ; 41 import java.util.HashMap ; 42 43 93 public class Template extends AbstractClassicTag 94 implements TemplateConstants, IErrorReporter 95 { 96 private static final Logger logger = Logger.getInstance(Template.class); 97 98 public static class TemplateContext 99 { 100 HashMap secs = null; 101 } 102 103 106 private TemplateContext _savedContext = null; 107 108 private boolean _fatalError = false; 109 110 113 private org.apache.beehive.netui.tags.IErrorReporter _innerErrors; 114 115 119 public String getTagName() { 120 return "Template"; 121 } 122 123 126 private String _templatePage; 127 128 131 private boolean _reportErrors = false; 132 133 151 public void setReportErrors(boolean reportErrors) { 152 _reportErrors = reportErrors; 153 } 154 155 172 public void setTemplatePage(String templatePage) { 173 _templatePage = templatePage; 174 } 175 176 180 public void setDocumentType(String docType) 181 { 182 int rendering = 0; 183 if (docType != null) { 184 if (docType.equals(Html.HTML_401)) 185 rendering = TagRenderingBase.HTML_RENDERING; 186 else if (docType.equals(Html.HTML_401_QUIRKS)) 187 rendering = TagRenderingBase.HTML_RENDERING_QUIRKS; 188 else if (docType.equals(Html.XHTML_10)) 189 rendering = TagRenderingBase.XHTML_RENDERING; 190 else 191 rendering = TagRenderingBase.getDefaultDocType(); 192 } 193 else { 194 rendering = TagRenderingBase.getDefaultDocType(); 195 } 196 pageContext.getRequest().setAttribute(Html.DOC_TYPE_OVERRIDE, new Integer (rendering)); 197 } 198 199 206 public int doStartTag() 207 throws JspException { 208 209 Tag parent = getParent(); 210 if (parent != null) { 211 String s = Bundle.getString("TempExcp_ContainedTemplate"); 212 registerTagError(s,null); 213 reportErrors(); 214 _fatalError = true; 215 return SKIP_BODY; 216 } 217 218 ServletRequest req = pageContext.getRequest(); 219 _savedContext = (TemplateContext) req.getAttribute(TEMPLATE_SECTIONS); 220 TemplateContext ctxt = new TemplateContext(); 221 req.setAttribute(TEMPLATE_SECTIONS,ctxt); 222 223 return EVAL_BODY_INCLUDE; 224 } 225 226 236 public int doEndTag() 237 throws JspException { 238 239 if (_fatalError) { 241 localRelease(); 242 return EVAL_PAGE; 243 } 244 245 ServletRequest req = pageContext.getRequest(); 247 ServletResponse resp = pageContext.getResponse(); 248 249 if (_innerErrors != null) { 250 req.setAttribute(CONTAINER_ERRORS,_innerErrors); 251 } 252 253 String realURI = getRealURI((HttpServletRequest ) req,_templatePage); 254 if (!templateExists(realURI)) { 255 String s = Bundle.getString("TempExcp_MissingTemplate", 256 new Object []{_templatePage}); 257 registerTagError(s,null); 258 reportErrors(); 259 localRelease(); 260 return SKIP_BODY; 261 } 262 263 RequestDispatcher rd = req.getRequestDispatcher(realURI); 264 if (rd == null) { 265 String s = Bundle.getString("Temp_RequestDispatcherReturnNull",new Object []{"realURI"}); 266 registerTagError(s,null); 267 reportErrors(); 268 localRelease(); 269 return SKIP_PAGE; 270 } 271 try { 272 JspWriter out = pageContext.getOut(); 274 out.flush(); 275 InternalUtils.setIgnoreIncludeServletPath( req, true ); 279 try { 280 rd.include(req,resp); 281 } 282 finally { 283 InternalUtils.setIgnoreIncludeServletPath( req, false ); 284 } 285 } 286 catch (IOException e) { 287 String s = Bundle.getString("TempExcp_ExceptIncludeTemplate", 288 new Object []{"IOException", 289 _templatePage}); 290 registerTagError(s,null); 291 reportErrors(); 292 localRelease(); 293 return SKIP_PAGE; 294 } 295 catch (ServletException se) { 296 297 System.err.println("Servlet Excepiton"); 298 299 String s = Bundle.getString("TempLog_ServletException", 301 new Object []{se.getMessage()}); 302 registerTagError(s,null); 303 304 Throwable t = se.getRootCause(); 306 if (t == null) { 307 s = Bundle.getString("TempLog_ServletError", 308 new Object [] 309 {_templatePage, 310 se.getMessage() 311 }); 312 registerTagError(s,null); 313 reportErrors(); 314 localRelease(); 315 return SKIP_PAGE; 316 } 317 318 while (t != null && (t instanceof ServletException || 320 t instanceof JspException )) { 321 322 s = Bundle.getString("TempLog_Cause", 323 new Object [] 324 {t.getClass().getName(), 325 t.getMessage() 326 }); 327 logger.error(s); 328 329 if (t.getMessage() == null) { 330 logger.error("Unwinding Servlet Exception",t); 331 t.printStackTrace(); 332 } 333 if (t instanceof ServletException ) 334 t = ((ServletException ) t).getRootCause(); 335 else 336 t = ((JspException ) t).getRootCause(); 337 } 338 if (t == null) { 339 s = Bundle.getString("TempLog_ServletError", 340 new Object [] 341 {_templatePage, 342 se.getMessage() 343 }); 344 registerTagError(s,null); 345 reportErrors(); 346 logger.error(s); 347 localRelease(); 348 return SKIP_PAGE; 349 } 350 if (t instanceof AssertionError ) { 351 s = Bundle.getString("TempLog_AssertCause", 352 new Object [] 353 {t.getStackTrace().toString(), 354 }); 355 registerTagError(s,null); 356 } 357 else { 358 s = Bundle.getString("TempLog_Cause", 359 new Object [] 360 {t.getClass().getName(), 361 t.getMessage() 362 }); 363 registerTagError(s,null); 364 } 365 s = Bundle.getString("TempExcp_ExceptIncludeTemplate", 366 new Object []{"ServletException", 367 _templatePage}); 368 registerTagError(s,null); 369 reportErrors(); 370 localRelease(); 371 return SKIP_PAGE; 372 } 373 374 req.setAttribute(TEMPLATE_SECTIONS,_savedContext); 377 localRelease(); 378 return SKIP_PAGE; 379 } 380 381 private boolean templateExists(String realURI) 382 throws JspException  383 { 384 try { 385 URL uri = pageContext.getServletContext().getResource(realURI); 386 return (uri != null); 387 } 388 catch (MalformedURLException e) { 389 String s = Bundle.getString("TempExcp_ExceptIncludeDefault", 390 new Object []{"MalformedURLException", 391 realURI}); 392 logger.error(s,e); 393 throw new JspException (s,e); 394 } 395 } 396 397 static String getRealURI(HttpServletRequest req,String uri) { 398 if (uri.charAt(0) == '/') { 399 return uri; 400 } 401 String path = req.getServletPath(); 402 int pos = path.lastIndexOf('/'); 403 if (pos != -1) { 404 path = path.substring(0,pos+1); 405 } 406 return path+uri; 407 } 408 409 412 protected void localRelease() { 413 super.localRelease(); 414 _fatalError = false; 415 _templatePage = null; 416 _innerErrors = null; 417 _reportErrors = false; 418 _savedContext = null; 419 } 420 421 425 public void addError(AbstractPageError ape) { 426 if (_innerErrors == null) { 427 _innerErrors = new InnerErrorReporter(); 428 } 429 _innerErrors.addError(ape); 430 } 431 432 436 public ArrayList returnErrors() { 437 if (_innerErrors == null) { 438 _innerErrors = new InnerErrorReporter(); 439 } 440 return _innerErrors.returnErrors(); 441 } 442 443 449 public boolean isReporting() { 450 return _reportErrors; 451 } 452 453 static class InnerErrorReporter implements org.apache.beehive.netui.tags.IErrorReporter 454 { 455 458 private ArrayList _errors; 459 460 464 public void addError(AbstractPageError ape) { 465 assert (ape != null); 466 if (_errors == null) { 467 _errors = new ArrayList (); 468 } 469 470 _errors.add(ape); 472 ape.errorNo = _errors.size(); 473 } 474 475 481 public boolean isReporting() { 482 return true; 483 } 484 485 489 public ArrayList returnErrors() { 490 ArrayList ret = _errors; 491 _errors = null; 492 return ret; 493 } 494 } 495 } 496 | Popular Tags |