1 33 34 package com.icesoft.faces.async.render; 35 36 import com.icesoft.faces.util.event.servlet.ContextEventRepeater; 37 import edu.emory.mathcs.backport.java.util.concurrent.ScheduledThreadPoolExecutor; 38 import org.apache.commons.logging.Log; 39 import org.apache.commons.logging.LogFactory; 40 41 import java.util.ArrayList ; 42 import java.util.Collections ; 43 import java.util.HashMap ; 44 import java.util.Iterator ; 45 import java.util.Map ; 46 47 63 public class RenderManager implements Disposable { 64 65 private static Log log = LogFactory.getLog(RenderManager.class); 66 67 static final int MIN = 1; 68 public static final int ON_DEMAND = 2; 69 public static final int INTERVAL = 3; 70 public static final int DELAY = 4; 71 static final int MAX = 4; 72 73 private RenderHub renderHub; 74 private Map groupMap; 75 76 private ContextDestroyedListener shutdownListener; 79 80 83 public RenderManager() { 84 shutdownListener = new ContextDestroyedListener(this); 85 ContextEventRepeater.addListener(shutdownListener); 86 groupMap = Collections.synchronizedMap(new HashMap ()); 87 renderHub = new RenderHub(); 88 } 89 90 99 private synchronized AsyncRenderer getRenderer(String name, int type) { 100 if (name == null || name.trim().length() == 0) { 101 throw new IllegalArgumentException ( 102 "illegal renderer name: " + name); 103 } 104 105 if (type < MIN || type > MAX) { 106 throw new IllegalArgumentException ( 107 "illegal renderer type: " + type); 108 } 109 110 Object obj = groupMap.get(name); 111 if (obj != null) { 112 if (log.isTraceEnabled()) { 113 log.trace("existing renderer retrieved: " + name); 114 } 115 return (AsyncRenderer) obj; 116 } 117 118 AsyncRenderer renderer = null; 119 switch (type) { 120 case ON_DEMAND: 121 renderer = new OnDemandRenderer(); 122 break; 123 case INTERVAL: 124 renderer = new IntervalRenderer(); 125 break; 126 case DELAY: 127 renderer = new DelayRenderer(); 128 break; 129 } 130 131 renderer.setName(name); 132 renderer.setRenderManager(this); 133 groupMap.put(name, renderer); 134 135 if (log.isTraceEnabled()) { 136 log.trace("new renderer retrieved: " + name); 137 } 138 139 return renderer; 140 } 141 142 148 protected void removeRenderer(AsyncRenderer renderer) { 149 if (renderer == null) { 150 if (log.isInfoEnabled()) { 151 log.info("renderer is null"); 152 } 153 return; 154 } 155 156 Object removedRenderer = groupMap.remove(renderer.getName()); 157 if (removedRenderer == null) { 158 if (log.isTraceEnabled()) { 159 log.trace("renderer " + renderer.getName() + " not found"); 160 } 161 } else { 162 if (log.isTraceEnabled()) { 163 log.trace("renderer " + renderer.getName() + " removed"); 164 } 165 } 166 } 167 168 174 public void requestRender(Renderable renderable) { 175 renderHub.requestRender(renderable); 176 } 177 178 void relayRender(String rendererName) { 179 } 181 182 196 public OnDemandRenderer getOnDemandRenderer(String name) { 197 return (OnDemandRenderer) getRenderer(name, ON_DEMAND); 198 } 199 200 214 public IntervalRenderer getIntervalRenderer(String name) { 215 return (IntervalRenderer) getRenderer(name, INTERVAL); 216 } 217 218 232 public DelayRenderer getDelayRenderer(String name) { 233 return (DelayRenderer) getRenderer(name, DELAY); 234 } 235 236 243 ScheduledThreadPoolExecutor getScheduledService() { 244 return renderHub.getScheduledService(); 245 } 246 247 254 public void dispose() { 255 synchronized (groupMap) { 256 257 ArrayList renderList = new ArrayList (groupMap.size()); 263 renderList.addAll( groupMap.values() ); 264 Iterator renderers = renderList.iterator(); 265 while (renderers.hasNext()) { 266 AsyncRenderer renderer = (AsyncRenderer) renderers.next(); 267 renderer.dispose(); 268 if (log.isTraceEnabled()) { 269 log.trace("renderer disposed: " + renderer); 270 } 271 } 272 groupMap.clear(); 273 } 274 renderHub.dispose(); 275 if (log.isDebugEnabled()) { 276 log.debug("all renderers and hub have been disposed"); 277 } 278 279 } 280 281 289 public AsyncRenderer getRenderer(String rendererName) { 290 if (rendererName == null) { 291 return null; 292 } 293 return (AsyncRenderer) groupMap.get(rendererName); 294 } 295 } 296 | Popular Tags |