1 33 34 package com.icesoft.faces.async.render; 35 36 import com.icesoft.faces.webapp.xmlhttp.FatalRenderingException; 37 import com.icesoft.faces.webapp.xmlhttp.PersistentFacesState; 38 import com.icesoft.faces.webapp.xmlhttp.RenderingException; 39 import com.icesoft.faces.webapp.xmlhttp.TransientRenderingException; 40 import com.icesoft.util.SeamUtilities; 41 import org.apache.commons.logging.Log; 42 import org.apache.commons.logging.LogFactory; 43 44 import javax.faces.context.FacesContext; 45 import javax.servlet.http.HttpSession ; 46 import javax.portlet.PortletSession; 47 48 55 class RunnableRender implements Runnable { 56 57 private static Log log = LogFactory.getLog(RenderHub.class); 58 59 private Renderable renderable; 60 61 public RunnableRender(Renderable renderable) { 62 this.renderable = renderable; 63 } 64 65 public Renderable getRenderable() { 66 return renderable; 67 } 68 69 79 public void run() { 80 if (renderable == null) { 81 return; 82 } 83 84 PersistentFacesState state = renderable.getState(); 85 86 if (state == null) { 95 String msg = "unable to render, PersistentFacesState is null"; 96 if (log.isWarnEnabled()) { 97 log.warn(msg); 98 } 99 renderable.renderingException(new TransientRenderingException(msg)); 100 return; 101 } 102 103 state.setCurrentInstance(); 109 110 try { 122 Thread.currentThread().setContextClassLoader( state.getRenderableClassLoader() ); 123 } catch (SecurityException se) { 124 if (log.isDebugEnabled()) { 125 log.debug("setting context class loader is not permitted", se); 126 } 127 } 128 129 try { 130 131 if (SeamUtilities.isSeamEnvironment() ) { 139 testSession(state); 140 } 141 state.execute(); 142 state.render(); 143 144 } catch (IllegalStateException ise) { 145 renderable.renderingException( new TransientRenderingException( ise )); 146 147 } catch (RenderingException ex) { 148 renderable.renderingException(ex); 149 if (ex instanceof TransientRenderingException) { 150 if (log.isTraceEnabled()) { 151 log.trace("transient render exception", ex); 152 } 153 } else if (ex instanceof FatalRenderingException) { 154 if (log.isDebugEnabled()) { 155 log.debug("fatal render exception", ex); 156 } 157 } else { 158 if (log.isErrorEnabled()) { 159 log.error("unknown render exception", ex); 160 } 161 } 162 } 163 } 164 165 172 private void testSession(PersistentFacesState state) throws IllegalStateException { 173 FacesContext fc = state.getFacesContext(); 174 Object o = fc.getExternalContext().getSession(false); 175 if (o == null) { 176 renderable.renderingException( new FatalRenderingException("Session has ended (User Logout?)") ); 177 } else { 178 if (o instanceof HttpSession ) { 179 HttpSession session = (HttpSession ) o; 180 session.getAttributeNames(); 181 } else if (o instanceof PortletSession) { 182 PortletSession ps = (PortletSession) o; 183 ps.getAttributeNames(); 184 } 185 } 186 } 187 188 189 202 public boolean equals(Object obj) { 203 if (obj == null || 204 !(obj instanceof RunnableRender) || 205 renderable == null) { 206 return false; 207 } 208 209 Renderable comparedRenderable = ((RunnableRender) obj).getRenderable(); 210 if (comparedRenderable == null) { 211 return false; 212 } 213 214 PersistentFacesState comparedState = comparedRenderable.getState(); 215 if (comparedState == null) { 216 return false; 217 } 218 219 PersistentFacesState myState = renderable.getState(); 220 if (myState == null) { 221 return false; 222 } 223 224 return myState.equals(comparedState); 225 } 226 } 227 | Popular Tags |