@Override public <T> T get(Contextual<T> bean, CreationalContext<T> crco) { PortletStateScopedBeanHolder holder = PortletStateScopedBeanHolder.getBeanHolder(); if (holder == null) { throw new ContextNotActiveException("The render state context is not active."); } // The bean hoder will return an existing bean instance or create a new one // if no existing instance is available. T inst = holder.getBean(bean, crco); return inst; }
/** * Removes the bean holder for the current request. Deletes all beans contained therein. * If response is provided, the beans are deserialized and stored. * * @param resp The response for setting the bean values */ public static void removeBeanHolder(StateAwareResponse resp) { PortletStateScopedBeanHolder bh = getBeanHolder(); if (bh != null) { bh.removeAll(resp); } holders.remove(); if (isTrace) { StringBuilder txt = new StringBuilder(80); txt.append("Removed render state bean holder."); txt.append(" ThreadId=").append(Thread.currentThread().getId()); LOG.trace(txt.toString()); } }
/** * Called when exiting portlet handling for this thread. The bean holders are deregistered from the thread and any * beans contained are destroyed. */ @Override public void removeContext() { PortletSessionBeanHolder.removeBeanHolder(); PortletStateScopedBeanHolder.removeBeanHolder(null); PortletRequestScopedBeanHolder.removeBeanHolder(); PortletArtifactProducer.remove(); }
PortletStateScopedBeanHolder.getBeanHolder(); Class<? extends PortletSerializable> beanClass = portletSerializable.getClass(); String name; name = portletStateScopedBeanHolder.getParameterName(beanClass);
@Override public boolean isActive() { PortletStateScopedBeanHolder holder = PortletStateScopedBeanHolder.getBeanHolder(); return (holder != null); }
/** * Sets the portlet session bean holder in a ThreadLocal object for the given * portlet session. If no bean holder exists in the session, a new one is created. * * @param req The portlet request * @return The render state bean holder */ public static void setBeanHolder(PortletRequest req, PortletStateScopedConfig config) { if (isTrace) { StringBuilder txt = new StringBuilder(80); txt.append("Setting render state bean holder."); txt.append(" ThreadId=").append(Thread.currentThread().getId()); txt.append(", config: ").append((config == null) ? "null" : config.getConfigAsString()); LOG.trace(txt.toString()); } PortletStateScopedBeanHolder holder = new PortletStateScopedBeanHolder(req, config); holders.set(holder); }
/** * Called when exiting portlet handling for this thread. The bean holders are deregistered from the thread but are * saved rather than destroyed. */ @Override public void deregisterContext(boolean isListener) { if (!complete && (!isListener || doDeregister)) { this.sessbh = PortletSessionBeanHolder.deregister(); this.statebh = PortletStateScopedBeanHolder.deregister(); this.reqbh = PortletRequestScopedBeanHolder.deregister(); PortletArtifactProducer.remove(); } if (isTrace) { StringBuilder txt = new StringBuilder(); txt.append("Deregistered context."); txt.append(" complete: ").append(complete); txt.append(", isListener: ").append(isListener); txt.append(", doRegister: ").append(doDeregister); LOG.trace(txt.toString()); } }
/** * Remove & destroy all beans. if a response is provided, store the bean state. * * @param resp The state aware response */ protected void removeAll(StateAwareResponse resp) { for (Contextual<?> bean : beans.keySet()) { if (resp != null) { PortletSerializable thisBean = (PortletSerializable) beans.get(bean).instance; String[] vals = thisBean.serialize(); String pn = config.getParamName((Bean<?>) bean); resp.getRenderParameters().setValues(pn, vals); if (isTrace) { StringBuilder txt = new StringBuilder(128); txt.append("Stored parameter for portlet with namespace: "); txt.append(resp.getNamespace()); txt.append(", paramName: ").append(pn); txt.append(", Values: ").append(Arrays.toString(vals)); LOG.trace(txt.toString()); } } remove(bean); } } }
/** * Called when a new thread begins running in order to set up contextual support */ @Override public void registerContext(boolean isListener) { // if the context is already active, then ignore register / deregister calls. if (complete || (isListener && PortletRequestScopedBeanHolder.getBeanHolder() != null)) { doDeregister = false; } else { doDeregister = true; PortletSessionBeanHolder.register(sessbh); PortletStateScopedBeanHolder.register(statebh); PortletRequestScopedBeanHolder.register(reqbh); PortletArtifactProducer.setPrecursors(resreq, prctx.getResponse(), prctx.getPortletConfig()); } if (isTrace) { StringBuilder txt = new StringBuilder(); txt.append("Registered context."); txt.append(" complete: ").append(complete); txt.append(", isListener: ").append(isListener); txt.append(", doRegister: ").append(doDeregister); LOG.trace(txt.toString()); } }
/** * To be called before bean method invocation begins */ private void beforeInvoke(PortletRequest req, PortletResponse resp, PortletConfig config) { if (acb != null) { // Set the portlet session bean holder for the thread & session PortletRequestScopedBeanHolder.setBeanHolder(); // Set the portlet session bean holder for the thread & session PortletSessionBeanHolder.setBeanHolder(req, acb.getSessionScopedConfig()); // Set the render state scoped bean holder PortletStateScopedBeanHolder.setBeanHolder(req, acb.getStateScopedConfig()); // Set up the artifact producer with request, response, and portlet config PortletArtifactProducer.setPrecursors(req, resp, config); if (LOG.isTraceEnabled()) { LOG.trace("CDI context is now set up."); } } else { if (LOG.isTraceEnabled()) { LOG.trace("CDI contextual support not available"); } } }
sar = (StateAwareResponse) resp; PortletStateScopedBeanHolder.removeBeanHolder(sar);
@Override public <T> T get(Contextual<T> bean) { PortletStateScopedBeanHolder holder = PortletStateScopedBeanHolder.getBeanHolder(); if (holder == null) { throw new ContextNotActiveException("The render state context is not active."); } return holder.getBean(bean); }