package org.jboss.seam.ui; import static org.jboss.seam.ScopeType.SESSION; import static org.jboss.seam.annotations.Install.BUILT_IN; import java.io.Serializable; import java.util.Date; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import org.jboss.seam.Component; import org.jboss.seam.annotations.AutoCreate; import org.jboss.seam.annotations.Install; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.intercept.BypassInterceptors; /** * A class that stores render stamps for use with <s:token> when client side * state saving is in use. By default the render stamp store will never remove a * render stamp unless instructed to by a UIToken. If the maxSize property is * larger than zero then it will control the maximum number of tokens stored, * with the oldest token being removed when a token is inserted that will take * the store over the maxSize limit. The default maxSize is 100. * * @author Stuart Douglas */ @Name("org.jboss.seam.ui.renderStampStore") @Scope(SESSION) @Install(precedence = BUILT_IN, value = false) @AutoCreate @BypassInterceptors public class RenderStampStore implements Serializable { class RenderStamp { String stamp; Date timeStamp; } int maxSize = 100; Map<String, RenderStamp> store = new ConcurrentHashMap<String, RenderStamp>(); /** * Stores a stamp in the store, and returns the key it is stored under. */ public String storeStamp(String stamp) { if (maxSize > 0) { if (store.size() == maxSize) { Date oldest = null; String oldestSigniture = null; for (String sig : store.keySet()) { RenderStamp s = store.get(sig); if (oldest == null || s.timeStamp.before(oldest)) { oldestSigniture = sig; } } store.remove(oldestSigniture); } } RenderStamp s = new RenderStamp(); s.stamp = stamp; s.timeStamp = new Date(); String key; do { key = UUID.randomUUID().toString(); } while (!store.containsKey(key)); store.put(key, s); return key; } public void removeStamp(String viewSigniture) { store.remove(viewSigniture); } public String getStamp(String viewSigniture) { RenderStamp s = store.get(viewSigniture); if (s != null) { return store.get(viewSigniture).stamp; } return null; } public static RenderStampStore instance() { return (RenderStampStore) Component.getInstance(RenderStampStore.class); } public int getMaxSize() { return maxSize; } public void setMaxSize(int maxSize) { this.maxSize = maxSize; } }