1 31 32 package org.opencms.flex; 33 34 import org.opencms.file.CmsObject; 35 import org.opencms.file.CmsResource; 36 import org.opencms.main.CmsLog; 37 import org.opencms.util.CmsRequestUtil; 38 39 import java.util.List ; 40 import java.util.Vector ; 41 42 import javax.servlet.ServletRequest ; 43 import javax.servlet.http.HttpServletRequest ; 44 import javax.servlet.http.HttpServletResponse ; 45 46 import org.apache.commons.logging.Log; 47 48 58 public class CmsFlexController { 59 60 61 public static final String ATTRIBUTE_NAME = "org.opencms.flex.CmsFlexController"; 62 63 64 private static final Log LOG = CmsLog.getLog(CmsFlexController.class); 65 66 67 private CmsFlexCache m_cache; 68 69 70 private CmsObject m_cmsObject; 71 72 73 private List m_flexContextInfoList; 74 75 76 private List m_flexRequestList; 77 78 79 private List m_flexResponseList; 80 81 82 private boolean m_forwardMode; 83 84 85 private HttpServletRequest m_req; 86 87 88 private HttpServletResponse m_res; 89 90 91 private CmsResource m_resource; 92 93 94 private boolean m_streaming; 95 96 97 private Throwable m_throwable; 98 99 100 private String m_throwableResourceUri; 101 102 103 private boolean m_top; 104 105 111 public CmsFlexController(CmsObject cms, CmsFlexController base) { 112 113 m_cmsObject = cms; 114 m_resource = base.m_resource; 115 m_cache = base.m_cache; 116 m_req = base.m_req; 117 m_res = base.m_res; 118 m_streaming = base.m_streaming; 119 m_top = base.m_top; 120 m_flexRequestList = base.m_flexRequestList; 121 m_flexResponseList = base.m_flexResponseList; 122 m_flexContextInfoList = base.m_flexContextInfoList; 123 m_forwardMode = base.m_forwardMode; 124 m_throwableResourceUri = base.m_throwableResourceUri; 125 } 126 127 138 public CmsFlexController( 139 CmsObject cms, 140 CmsResource resource, 141 CmsFlexCache cache, 142 HttpServletRequest req, 143 HttpServletResponse res, 144 boolean streaming, 145 boolean top) { 146 147 m_cmsObject = cms; 148 m_resource = resource; 149 m_cache = cache; 150 m_req = req; 151 m_res = res; 152 m_streaming = streaming; 153 m_top = top; 154 m_flexRequestList = new Vector (); 155 m_flexResponseList = new Vector (); 156 m_flexContextInfoList = new Vector (); 157 m_forwardMode = false; 158 m_throwableResourceUri = null; 159 } 160 161 168 public static CmsObject getCmsObject(ServletRequest req) { 169 170 CmsFlexController controller = (CmsFlexController)req.getAttribute(ATTRIBUTE_NAME); 171 if (controller != null) { 172 return controller.getCmsObject(); 173 } else { 174 return null; 175 } 176 } 177 178 186 public static CmsFlexController getController(ServletRequest req) { 187 188 return (CmsFlexController)req.getAttribute(ATTRIBUTE_NAME); 189 } 190 191 198 public static Throwable getThrowable(ServletRequest req) { 199 200 CmsFlexController controller = (CmsFlexController)req.getAttribute(ATTRIBUTE_NAME); 201 if (controller != null) { 202 return controller.getThrowable(); 203 } else { 204 return null; 205 } 206 } 207 208 215 public static String getThrowableResourceUri(ServletRequest req) { 216 217 CmsFlexController controller = (CmsFlexController)req.getAttribute(ATTRIBUTE_NAME); 218 if (controller != null) { 219 return controller.getThrowableResourceUri(); 220 } else { 221 return null; 222 } 223 } 224 225 233 public static boolean isCmsOnlineRequest(ServletRequest req) { 234 235 if (req == null) { 236 return false; 237 } 238 return getController(req).getCmsObject().getRequestContext().currentProject().isOnlineProject(); 239 } 240 241 247 public static boolean isCmsRequest(ServletRequest req) { 248 249 return ((req != null) && (req.getAttribute(ATTRIBUTE_NAME) != null)); 250 } 251 252 264 public static boolean isNotModifiedSince(HttpServletRequest req, long dateLastModified) { 265 266 long lastModifiedHeader = req.getDateHeader(CmsRequestUtil.HEADER_IF_MODIFIED_SINCE); 268 return ((lastModifiedHeader > -1) && (((dateLastModified / 1000) * 1000) == lastModifiedHeader)); 270 } 271 272 277 public static void removeController(ServletRequest req) { 278 279 CmsFlexController controller = (CmsFlexController)req.getAttribute(ATTRIBUTE_NAME); 280 if (controller != null) { 281 controller.clear(); 282 } 283 } 284 285 291 public static void setController(ServletRequest req, CmsFlexController controller) { 292 293 req.setAttribute(CmsFlexController.ATTRIBUTE_NAME, controller); 294 } 295 296 308 public static void setDateExpiresHeader(HttpServletResponse res, long dateExpires, long maxAge) { 309 310 long now = System.currentTimeMillis(); 311 if ((dateExpires > now) && (dateExpires != CmsResource.DATE_EXPIRED_DEFAULT)) { 312 313 319 if (maxAge < 0L) { 321 maxAge = 86400000; 322 } 323 324 if ((dateExpires - now) > maxAge) { 325 dateExpires = now + maxAge; 327 } 328 res.setDateHeader(CmsRequestUtil.HEADER_EXPIRES, dateExpires); 329 330 res.setHeader(CmsRequestUtil.HEADER_CACHE_CONTROL, CmsRequestUtil.HEADER_VALUE_MAX_AGE + (maxAge / 1000L)); 333 } 334 } 335 336 342 public static void setDateLastModifiedHeader(HttpServletResponse res, long dateLastModified) { 343 344 if (dateLastModified > -1) { 345 res.setDateHeader(CmsRequestUtil.HEADER_LAST_MODIFIED, (dateLastModified / 1000) * 1000); 347 } else { 348 res.setDateHeader(CmsRequestUtil.HEADER_LAST_MODIFIED, System.currentTimeMillis()); 350 } 351 } 352 353 356 public void clear() { 357 358 if (m_flexRequestList != null) { 359 m_flexRequestList.clear(); 360 } 361 m_flexRequestList = null; 362 if (m_flexResponseList != null) { 363 m_flexResponseList.clear(); 364 } 365 m_flexResponseList = null; 366 if (m_req != null) { 367 m_req.removeAttribute(ATTRIBUTE_NAME); 368 } 369 m_req = null; 370 m_res = null; 371 m_cmsObject = null; 372 m_resource = null; 373 m_cache = null; 374 m_throwable = null; 375 } 376 377 385 public CmsFlexCache getCmsCache() { 386 387 return m_cache; 388 } 389 390 395 public CmsObject getCmsObject() { 396 397 return m_cmsObject; 398 } 399 400 408 public CmsResource getCmsResource() { 409 410 return m_resource; 411 } 412 413 418 public CmsFlexRequest getCurrentRequest() { 419 420 return (CmsFlexRequest)m_flexRequestList.get(m_flexRequestList.size() - 1); 421 } 422 423 428 public CmsFlexResponse getCurrentResponse() { 429 430 return (CmsFlexResponse)m_flexResponseList.get(m_flexResponseList.size() - 1); 431 } 432 433 438 public long getDateExpires() { 439 440 int pos = m_flexContextInfoList.size() - 1; 441 if (pos < 0) { 442 return CmsResource.DATE_EXPIRED_DEFAULT; 444 } 445 return ((CmsFlexRequestContextInfo)m_flexContextInfoList.get(pos)).getDateExpires(); 446 } 447 448 453 public long getDateLastModified() { 454 455 int pos = m_flexContextInfoList.size() - 1; 456 if (pos < 0) { 457 return CmsResource.DATE_RELEASED_DEFAULT; 459 } 460 return ((CmsFlexRequestContextInfo)m_flexContextInfoList.get(pos)).getDateLastModified(); 461 } 462 463 468 public int getResponseStackSize() { 469 470 return m_flexResponseList.size(); 471 } 472 473 479 public Throwable getThrowable() { 480 481 return m_throwable; 482 } 483 484 490 public String getThrowableResourceUri() { 491 492 return m_throwableResourceUri; 493 } 494 495 500 public HttpServletRequest getTopRequest() { 501 502 return m_req; 503 } 504 505 510 public HttpServletResponse getTopResponse() { 511 512 return m_res; 513 } 514 515 520 public boolean isEmptyRequestList() { 521 522 return (m_flexRequestList != null) && m_flexRequestList.isEmpty(); 523 } 524 525 530 public boolean isForwardMode() { 531 532 return m_forwardMode; 533 } 534 535 541 public boolean isStreaming() { 542 543 return m_streaming; 544 } 545 546 556 public boolean isTop() { 557 558 return m_top; 559 } 560 561 564 public void pop() { 565 566 if ((m_flexRequestList != null) && !m_flexRequestList.isEmpty()) { 567 m_flexRequestList.remove(m_flexRequestList.size() - 1); 568 } 569 if ((m_flexResponseList != null) && !m_flexRequestList.isEmpty()) { 570 m_flexResponseList.remove(m_flexResponseList.size() - 1); 571 } 572 if ((m_flexContextInfoList != null) && !m_flexContextInfoList.isEmpty()) { 573 CmsFlexRequestContextInfo info = (CmsFlexRequestContextInfo)m_flexContextInfoList.remove(m_flexContextInfoList.size() - 1); 574 if (m_flexContextInfoList.size() > 0) { 575 ((CmsFlexRequestContextInfo)m_flexContextInfoList.get(0)).merge(info); 576 updateRequestContextInfo(); 577 } 578 } 579 } 580 581 587 public void push(CmsFlexRequest req, CmsFlexResponse res) { 588 589 m_flexRequestList.add(req); 590 m_flexResponseList.add(res); 591 m_flexContextInfoList.add(new CmsFlexRequestContextInfo()); 592 updateRequestContextInfo(); 593 } 594 595 600 public void setForwardMode(boolean value) { 601 602 m_forwardMode = value; 603 } 604 605 615 public Throwable setThrowable(Throwable throwable, String resource) { 616 617 if (m_throwable == null) { 618 m_throwable = throwable; 619 m_throwableResourceUri = resource; 620 } else { 621 if (LOG.isDebugEnabled()) { 622 if (resource != null) { 623 LOG.debug(Messages.get().getBundle().key(Messages.LOG_FLEXCONTROLLER_IGNORED_EXCEPTION_1, resource)); 624 } else { 625 LOG.debug(Messages.get().getBundle().key(Messages.LOG_FLEXCONTROLLER_IGNORED_EXCEPTION_0)); 626 } 627 } 628 } 629 return m_throwable; 630 } 631 632 635 public void suspendFlexResponse() { 636 637 for (int i = 0; i < m_flexResponseList.size(); i++) { 638 CmsFlexResponse res = (CmsFlexResponse)m_flexResponseList.get(i); 639 res.setSuspended(true); 640 } 641 } 642 643 658 public void updateDates(long dateLastModified, long dateExpires) { 659 660 int pos = m_flexContextInfoList.size() - 1; 661 if (pos < 0) { 662 return; 664 } 665 ((CmsFlexRequestContextInfo)m_flexContextInfoList.get(pos)).updateDates(dateLastModified, dateExpires); 666 } 667 668 671 private void updateRequestContextInfo() { 672 673 if ((m_flexContextInfoList != null) && !m_flexContextInfoList.isEmpty()) { 674 m_cmsObject.getRequestContext().setAttribute( 675 CmsRequestUtil.HEADER_LAST_MODIFIED, 676 m_flexContextInfoList.get(m_flexContextInfoList.size() - 1)); 677 } 678 } 679 }
| Popular Tags
|