1 33 34 package com.icesoft.faces.async.render; 35 36 import edu.emory.mathcs.backport.java.util.concurrent.CopyOnWriteArraySet; 37 import org.apache.commons.logging.Log; 38 import org.apache.commons.logging.LogFactory; 39 40 import java.lang.ref.WeakReference ; 41 import java.util.Iterator ; 42 import java.util.Set ; 43 44 61 public class GroupAsyncRenderer implements AsyncRenderer { 62 63 private static Log log = LogFactory.getLog(GroupAsyncRenderer.class); 64 65 protected String name; 66 protected Set group; 67 protected RenderManager renderManager; 68 69 protected boolean stopRequested = false; 70 71 public GroupAsyncRenderer() { 72 group = new CopyOnWriteArraySet(); 73 } 74 75 public String getName() { 76 return name; 77 } 78 79 public void setName(String name) { 80 this.name = name; 81 } 82 83 public void setRenderManager(RenderManager renderManager) { 84 this.renderManager = renderManager; 85 } 86 87 93 public void add(Renderable renderable) { 94 synchronized (group) { 95 if (!contains(renderable)) { 96 if (group.add(new WeakReference (renderable))) { 97 if (log.isTraceEnabled()) { 98 log.trace(name + " added " + renderable); 99 } 100 } else { 101 if (log.isWarnEnabled()) { 102 log.warn(name + " already contains " + renderable); 103 } 104 } 105 } 106 } 107 } 108 109 public boolean contains(Renderable renderable) { 110 Iterator iter = group.iterator(); 111 while (iter.hasNext()) { 112 if (renderable == 113 (Renderable) ((WeakReference ) iter.next()).get()) { 114 return true; 115 } 116 } 117 return false; 118 } 119 120 126 public void remove(Renderable renderable) { 127 synchronized (group) { 128 Iterator iter = group.iterator(); 129 while (iter.hasNext()) { 130 WeakReference ref = (WeakReference ) iter.next(); 131 if (renderable == (Renderable) ref.get()) { 132 group.remove(ref); 133 if (log.isTraceEnabled()) { 134 log.trace(name + " removing " + renderable); 135 } 136 return; 137 } 138 } 139 if (log.isWarnEnabled()) { 140 log.warn(name + " does not contain " + renderable); 141 } 142 } 143 } 144 145 148 public void clear() { 149 synchronized (group) { 150 group.clear(); 151 } 152 } 153 154 161 public boolean isEmpty() { 162 return group.isEmpty(); 163 } 164 165 172 public void requestRender() { 173 if (renderManager == null) { 174 String message = "RenderManager has not been set"; 175 if (log.isErrorEnabled()) { 176 log.error(message); 177 } 178 throw new IllegalStateException (message); 179 180 } 181 182 Iterator iter = group.iterator(); 183 if (log.isTraceEnabled()) { 184 log.trace(name + " preparing to render " + group.size()); 185 } 186 187 stopRequested = false; 188 while (iter.hasNext() && !stopRequested) { 189 Renderable renderable = 190 (Renderable) ((WeakReference ) iter.next()).get(); 191 renderManager.requestRender(renderable); 192 } 193 } 194 195 199 public void requestStop() { 200 stopRequested = true; 201 } 202 203 209 public void dispose() { 210 requestStop(); 211 group.clear(); 212 group = null; 213 renderManager.removeRenderer(this); 214 name = null; 215 renderManager = null; 216 } 217 } 218 | Popular Tags |