1 31 32 package org.opencms.flex; 33 34 import org.opencms.file.CmsObject; 35 import org.opencms.file.CmsPropertyDefinition; 36 import org.opencms.file.CmsResource; 37 import org.opencms.file.CmsVfsResourceNotFoundException; 38 import org.opencms.loader.I_CmsResourceLoader; 39 import org.opencms.main.CmsException; 40 import org.opencms.main.CmsLog; 41 import org.opencms.main.OpenCms; 42 43 import java.io.IOException ; 44 45 import javax.servlet.RequestDispatcher ; 46 import javax.servlet.ServletException ; 47 import javax.servlet.ServletRequest ; 48 import javax.servlet.ServletResponse ; 49 import javax.servlet.http.HttpServletRequest ; 50 import javax.servlet.http.HttpServletResponse ; 51 52 import org.apache.commons.logging.Log; 53 54 72 public class CmsFlexRequestDispatcher implements RequestDispatcher { 73 74 75 private static final Log LOG = CmsLog.getLog(CmsFlexRequestDispatcher.class); 76 77 78 private String m_extTarget; 79 80 81 private RequestDispatcher m_rd; 82 83 84 private String m_vfsTarget; 85 86 93 public CmsFlexRequestDispatcher(RequestDispatcher rd, String vfs_target, String ext_target) { 94 95 m_rd = rd; 96 m_vfsTarget = vfs_target; 97 m_extTarget = ext_target; 98 } 99 100 113 public void forward(ServletRequest req, ServletResponse res) throws ServletException , IOException { 114 115 CmsFlexController controller = CmsFlexController.getController(req); 116 controller.setForwardMode(true); 117 m_rd.forward(req, res); 118 } 119 120 142 public void include(ServletRequest req, ServletResponse res) throws ServletException , IOException { 143 144 if (LOG.isDebugEnabled()) { 145 LOG.debug(Messages.get().getBundle().key( 146 Messages.LOG_FLEXREQUESTDISPATCHER_INCLUDING_TARGET_2, 147 m_vfsTarget, 148 m_extTarget)); 149 } 150 151 CmsFlexController controller = CmsFlexController.getController(req); 152 CmsObject cms = controller.getCmsObject(); 153 CmsResource resource = null; 154 155 if ((m_extTarget == null) && (controller != null)) { 156 try { 158 resource = cms.readResource(m_vfsTarget); 159 } catch (CmsVfsResourceNotFoundException e) { 160 m_extTarget = m_vfsTarget; 162 } catch (CmsException e) { 163 throw new ServletException (Messages.get().getBundle().key( 165 Messages.ERR_FLEXREQUESTDISPATCHER_VFS_ACCESS_EXCEPTION_0), e); 166 } 167 } 168 169 if ((m_extTarget != null) || (controller == null)) { 170 includeExternal(req, res); 171 } else if (controller.isForwardMode()) { 172 includeInternalNoCache(req, res, controller, cms, resource); 173 } else { 174 includeInternalWithCache(req, res, controller, cms, resource); 175 } 176 } 177 178 186 private void includeExternal(ServletRequest req, ServletResponse res) throws ServletException , IOException { 187 188 if (LOG.isDebugEnabled()) { 190 LOG.debug(Messages.get().getBundle().key( 191 Messages.LOG_FLEXREQUESTDISPATCHER_INCLUDING_EXTERNAL_TARGET_1, 192 m_extTarget)); 193 } 194 m_rd.include(req, res); 195 } 196 197 209 private void includeInternalNoCache( 210 ServletRequest req, 211 ServletResponse res, 212 CmsFlexController controller, 213 CmsObject cms, 214 CmsResource resource) throws ServletException , IOException { 215 216 I_CmsResourceLoader loader; 218 219 try { 220 if (resource == null) { 221 resource = cms.readResource(m_vfsTarget); 222 } 223 if (LOG.isDebugEnabled()) { 224 LOG.debug(Messages.get().getBundle().key( 225 Messages.LOG_FLEXREQUESTDISPATCHER_LOADING_RESOURCE_TYPE_1, 226 new Integer (resource.getTypeId()))); 227 } 228 loader = OpenCms.getResourceManager().getLoader(resource); 229 } catch (CmsException e) { 230 controller.setThrowable(e, m_vfsTarget); 232 throw new ServletException (Messages.get().getBundle().key( 233 Messages.ERR_FLEXREQUESTDISPATCHER_ERROR_READING_RESOURCE_1, 234 m_vfsTarget), e); 235 } 236 237 if (LOG.isDebugEnabled()) { 238 LOG.debug(Messages.get().getBundle().key(Messages.LOG_FLEXREQUESTDISPATCHER_INCLUDE_RESOURCE_1, m_vfsTarget)); 239 } 240 try { 241 loader.service(cms, resource, req, res); 242 } catch (CmsException e) { 243 controller.setThrowable(e, m_vfsTarget); 245 throw new ServletException (e); 246 } 247 } 248 249 261 private void includeInternalWithCache( 262 ServletRequest req, 263 ServletResponse res, 264 CmsFlexController controller, 265 CmsObject cms, 266 CmsResource resource) throws ServletException , IOException { 267 268 CmsFlexCache cache = controller.getCmsCache(); 269 270 CmsFlexRequest f_req = controller.getCurrentRequest(); 272 CmsFlexResponse f_res = controller.getCurrentResponse(); 273 274 if (f_req.containsIncludeCall(m_vfsTarget)) { 275 throw new ServletException (Messages.get().getBundle().key( 277 Messages.ERR_FLEXREQUESTDISPATCHER_INCLUSION_LOOP_1, 278 m_vfsTarget)); 279 } else { 280 f_req.addInlucdeCall(m_vfsTarget); 281 } 282 283 if (f_res.isSuspended()) { 285 f_res.setCmsIncludeMode(false); 287 f_req.removeIncludeCall(m_vfsTarget); 288 return; 289 } 290 291 f_res.setCmsIncludeMode(true); 293 294 CmsFlexRequest w_req = new CmsFlexRequest((HttpServletRequest )req, controller, m_vfsTarget); 296 CmsFlexResponse w_res = new CmsFlexResponse((HttpServletResponse )res, controller); 297 298 controller.push(w_req, w_res); 300 301 try { 304 CmsFlexCacheEntry entry = null; 305 if (f_req.isCacheable()) { 306 entry = cache.get(w_req.getCmsCacheKey()); 308 if (entry != null) { 309 try { 311 if (LOG.isDebugEnabled()) { 312 LOG.debug(Messages.get().getBundle().key( 313 Messages.LOG_FLEXREQUESTDISPATCHER_LOADING_RESOURCE_FROM_CACHE_1, 314 m_vfsTarget)); 315 } 316 controller.updateDates(entry.getDateLastModified(), entry.getDateExpires()); 317 entry.service(w_req, w_res); 318 } catch (CmsException e) { 319 Throwable t; 320 if (e.getCause() != null) { 321 t = e.getCause(); 322 } else { 323 t = e; 324 } 325 t = controller.setThrowable(e, m_vfsTarget); 326 throw new ServletException (Messages.get().getBundle().key( 327 Messages.ERR_FLEXREQUESTDISPATCHER_ERROR_LOADING_RESOURCE_FROM_CACHE_1, 328 m_vfsTarget), t); 329 } 330 } else { 331 CmsFlexCacheKey res_key = cache.getKey(CmsFlexCacheKey.getKeyName(m_vfsTarget, w_req.isOnline())); 333 if (res_key != null) { 334 w_res.setCmsCacheKey(res_key); 336 } else { 337 String cacheProperty = null; 339 try { 340 if (resource == null) { 342 resource = cms.readResource(m_vfsTarget); 343 } 344 cacheProperty = cms.readPropertyObject(resource, CmsPropertyDefinition.PROPERTY_CACHE, true).getValue(); 345 if (cacheProperty == null) { 346 cacheProperty = OpenCms.getResourceManager().getResourceType(resource.getTypeId()).getCachePropertyDefault(); 348 } 349 cache.putKey(w_res.setCmsCacheKey( 350 cms.getRequestContext().addSiteRoot(m_vfsTarget), 351 cacheProperty, 352 f_req.isOnline())); 353 } catch (CmsFlexCacheException e) { 354 355 if (LOG.isWarnEnabled()) { 357 LOG.warn(Messages.get().getBundle().key( 358 Messages.LOG_FLEXREQUESTDISPATCHER_INVALID_CACHE_KEY_2, 359 m_vfsTarget, 360 cacheProperty)); 361 } 362 cache.putKey(w_res.getCmsCacheKey()); 364 } catch (CmsException e) { 365 366 controller.setThrowable(e, m_vfsTarget); 368 throw new ServletException (Messages.get().getBundle().key( 369 Messages.ERR_FLEXREQUESTDISPATCHER_ERROR_LOADING_CACHE_PROPERTIES_1, 370 m_vfsTarget), e); 371 } 372 if (LOG.isDebugEnabled()) { 373 LOG.debug(Messages.get().getBundle().key( 374 Messages.LOG_FLEXREQUESTDISPATCHER_ADDING_CACHE_PROPERTIES_2, 375 m_vfsTarget, 376 cacheProperty)); 377 } 378 } 379 } 380 } 381 382 if (entry == null) { 383 I_CmsResourceLoader loader = null; 385 386 String variation = null; 387 if (w_req.isCacheable()) { 389 variation = w_res.getCmsCacheKey().matchRequestKey(w_req.getCmsCacheKey()); 390 } 391 w_res.setCmsCachingRequired(!controller.isForwardMode() && (variation != null)); 393 394 try { 395 if (resource == null) { 396 resource = cms.readResource(m_vfsTarget); 397 } 398 if (LOG.isDebugEnabled()) { 399 LOG.debug(Messages.get().getBundle().key( 400 Messages.LOG_FLEXREQUESTDISPATCHER_LOADING_RESOURCE_TYPE_1, 401 new Integer (resource.getTypeId()))); 402 } 403 loader = OpenCms.getResourceManager().getLoader(resource); 404 } catch (ClassCastException e) { 405 controller.setThrowable(e, m_vfsTarget); 406 throw new ServletException (Messages.get().getBundle().key( 407 Messages.ERR_FLEXREQUESTDISPATCHER_CLASSCAST_EXCEPTION_1, 408 m_vfsTarget), e); 409 } catch (CmsException e) { 410 controller.setThrowable(e, m_vfsTarget); 412 throw new ServletException (Messages.get().getBundle().key( 413 Messages.ERR_FLEXREQUESTDISPATCHER_ERROR_READING_RESOURCE_1, 414 m_vfsTarget), e); 415 } 416 417 if (LOG.isDebugEnabled()) { 418 LOG.debug(Messages.get().getBundle().key( 419 Messages.LOG_FLEXREQUESTDISPATCHER_INCLUDE_RESOURCE_1, 420 m_vfsTarget)); 421 } 422 try { 423 loader.service(cms, resource, w_req, w_res); 424 } catch (CmsException e) { 425 controller.setThrowable(e, m_vfsTarget); 427 throw new ServletException (e); 428 } 429 430 entry = w_res.processCacheEntry(); 431 if ((entry != null) && (variation != null) && w_req.isCacheable()) { 432 if (w_res.getCmsCacheKey().getTimeout() > 0) { 434 entry.setDateLastModifiedToPreviousTimeout(w_res.getCmsCacheKey().getTimeout()); 436 entry.setDateExpiresToNextTimeout(w_res.getCmsCacheKey().getTimeout()); 437 controller.updateDates(entry.getDateLastModified(), entry.getDateExpires()); 438 } else { 439 entry.setDateLastModified(controller.getDateLastModified()); 441 entry.setDateExpires(controller.getDateExpires()); 442 } 443 cache.put(w_res.getCmsCacheKey(), entry, variation); 444 } else { 445 controller.updateDates(-1, controller.getDateExpires()); 447 } 448 } 449 450 if (f_res.hasIncludeList()) { 451 java.util.Map headers = w_res.getHeaders(); 453 byte[] result = w_res.getWriterBytes(); 454 if (LOG.isDebugEnabled()) { 455 LOG.debug(Messages.get().getBundle().key( 456 Messages.LOG_FLEXREQUESTDISPATCHER_RESULT_1, 457 new String (result))); 458 } 459 CmsFlexResponse.processHeaders(headers, f_res); 460 f_res.addToIncludeResults(result); 461 result = null; 462 } 463 } finally { 464 f_res.setCmsIncludeMode(false); 466 f_req.removeIncludeCall(m_vfsTarget); 467 468 controller.pop(); 470 } 471 } 472 } | Popular Tags |