1 33 34 package com.icesoft.faces.webapp.xmlhttp; 35 36 import com.icesoft.faces.context.BridgeFacesContext; 37 import com.icesoft.faces.context.ViewListener; 38 import com.icesoft.faces.webapp.http.common.Configuration; 39 import com.icesoft.faces.webapp.parser.ImplementationUtil; 40 41 import edu.emory.mathcs.backport.java.util.concurrent.ExecutorService; 42 import edu.emory.mathcs.backport.java.util.concurrent.Executors; 43 import org.apache.commons.logging.Log; 44 import org.apache.commons.logging.LogFactory; 45 46 import javax.faces.FactoryFinder; 47 import javax.faces.context.ExternalContext; 48 import javax.faces.context.FacesContext; 49 import javax.faces.lifecycle.Lifecycle; 50 import javax.faces.lifecycle.LifecycleFactory; 51 import java.io.Serializable ; 52 import java.util.Collection ; 53 import java.util.Map ; 54 55 68 public class PersistentFacesState implements Serializable { 69 private static final Log log = LogFactory.getLog(PersistentFacesState.class); 70 private static ExecutorService executorService = Executors.newSingleThreadExecutor(); 71 private static InheritableThreadLocal localInstance = new InheritableThreadLocal (); 72 private BridgeFacesContext facesContext; 73 private Lifecycle lifecycle; 74 75 private ClassLoader renderableClassLoader = null; 76 private boolean synchronousMode; 77 private Collection viewListeners; 78 79 public PersistentFacesState(BridgeFacesContext facesContext, Collection viewListeners, Configuration configuration) { 80 renderableClassLoader = Thread.currentThread().getContextClassLoader(); 84 85 this.facesContext = facesContext; 86 this.viewListeners = viewListeners; 87 this.synchronousMode = configuration.getAttributeAsBoolean("synchronousUpdate", false); 88 LifecycleFactory factory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY); 89 this.lifecycle = factory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE); 90 this.setCurrentInstance(); 91 } 92 93 public void setCurrentInstance() { 94 localInstance.set(this); 95 } 96 97 106 public static PersistentFacesState getInstance() { 107 return (PersistentFacesState) localInstance.get(); 108 } 109 110 118 public static PersistentFacesState getInstance(Map sessionMap) { 119 return getInstance(); 120 } 121 122 127 public FacesContext getFacesContext() { 128 return facesContext; 129 } 130 131 public void setFacesContext(BridgeFacesContext facesContext) { 133 this.facesContext = facesContext; 134 } 135 136 140 public void render() throws RenderingException { 141 warn(); 142 facesContext.setCurrentInstance(); 143 facesContext.setFocusId(""); 144 synchronized (facesContext) { 145 try { 146 lifecycle.render(facesContext); 147 facesContext.release(); 148 } catch (IllegalStateException e) { 149 if (log.isDebugEnabled()) { 150 log.debug("fatal render failure for viewNumber " 151 + facesContext.getViewNumber(), e); 152 } 153 throw new FatalRenderingException( 154 "fatal render failure for viewNumber " 155 + facesContext.getViewNumber(), e); 156 } catch (Exception e) { 157 if (log.isDebugEnabled()) { 158 log.debug("transient render failure for viewNumber " 159 + facesContext.getViewNumber(), e); 160 } 161 throw new TransientRenderingException( 162 "transient render failure for viewNumber " 163 + facesContext.getViewNumber(), e); 164 } 165 } 166 } 167 168 173 public void renderLater() { 174 warn(); 175 executorService.execute(new RenderRunner()); 176 } 177 178 public void renderLater(long miliseconds) { 179 warn(); 180 executorService.execute(new RenderRunner(miliseconds)); 181 } 182 183 189 public void redirectTo(String uri) { 190 warn(); 191 try { 192 facesContext.setCurrentInstance(); 193 ExternalContext externalContext = facesContext.getExternalContext(); 194 externalContext.redirect(uri); 195 } catch (Exception e) { 196 throw new RuntimeException (e); 197 } 198 } 199 200 207 public void navigateTo(String outcome) { 208 warn(); 209 try { 210 facesContext.setCurrentInstance(); 211 facesContext.getApplication().getNavigationHandler() 212 .handleNavigation(facesContext, 213 facesContext.getViewRoot().getViewId(), 214 outcome); 215 } catch (Exception e) { 216 throw new RuntimeException (e); 217 } 218 } 219 220 227 public void release() { 228 localInstance.set(null); 229 } 230 231 236 public void execute() throws RenderingException { 237 facesContext.setCurrentInstance(); 238 synchronized (facesContext) { 239 try { 240 if (ImplementationUtil.isJSF12()){ 241 facesContext.getExternalContext() 245 .getRequestParameterMap().clear(); 246 } 247 else { 248 facesContext.renderResponse(); 249 } 250 lifecycle.execute(facesContext); 251 } catch (IllegalStateException e) { 252 if (log.isDebugEnabled()) { 253 log.debug("fatal render failure for viewNumber " 254 + facesContext.getViewNumber(), e); 255 } 256 throw new FatalRenderingException( 257 "fatal render failure for viewNumber " 258 + facesContext.getViewNumber(), e); 259 } catch (Exception e) { 260 if (log.isDebugEnabled()) { 261 log.debug("transient render failure for viewNumber " 262 + facesContext.getViewNumber(), e); 263 } 264 throw new TransientRenderingException( 265 "transient render failure for viewNumber " 266 + facesContext.getViewNumber(), e); 267 } 268 } 269 } 270 271 272 public ClassLoader getRenderableClassLoader() { 273 return renderableClassLoader; 274 } 275 276 public void addViewListener(ViewListener listener) { 277 viewListeners.add(listener); 278 } 279 280 private class RenderRunner implements Runnable { 281 private long delay = 0; 282 283 public RenderRunner() { 284 } 285 286 public RenderRunner(long miliseconds) { 287 delay = miliseconds; 288 } 289 290 294 public void run() { 295 try { 296 Thread.sleep(delay); 297 execute(); 299 render(); 300 } catch (RenderingException e) { 301 if (log.isDebugEnabled()) { 302 log.debug("renderLater failed ", e); 303 } 304 } catch (InterruptedException e) { 305 } 307 } 308 } 309 310 private void warn() { 311 if (synchronousMode) { 312 log.warn("Running in 'synchronous mode'. The page updates were queued but not sent."); 313 } 314 } 315 } 316 317 318 319 320 321 322 | Popular Tags |