Author: konstantin.mishin
Date: 2008-06-18 13:21:59 -0400 (Wed, 18 Jun 2008)
New Revision: 9100
Added:
trunk/framework/impl/src/main/java/org/ajax4jsf/context/ViewResourcesPhaseEventHandler.java
Log:
RF-2815
Added:
trunk/framework/impl/src/main/java/org/ajax4jsf/context/ViewResourcesPhaseEventHandler.java
===================================================================
---
trunk/framework/impl/src/main/java/org/ajax4jsf/context/ViewResourcesPhaseEventHandler.java
(rev 0)
+++
trunk/framework/impl/src/main/java/org/ajax4jsf/context/ViewResourcesPhaseEventHandler.java 2008-06-18
17:21:59 UTC (rev 9100)
@@ -0,0 +1,176 @@
+/**
+ *
+ */
+package org.ajax4jsf.context;
+
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.faces.FactoryFinder;
+import javax.faces.component.UIComponent;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+import javax.faces.event.PhaseEvent;
+import javax.faces.render.RenderKit;
+import javax.faces.render.RenderKitFactory;
+import javax.faces.render.Renderer;
+
+import org.ajax4jsf.renderkit.HeaderResourceProducer;
+import org.ajax4jsf.renderkit.UserResourceRenderer;
+import org.ajax4jsf.resource.InternetResourceBuilder;
+import org.ajax4jsf.webapp.BaseFilter;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.richfaces.event.ComponentPhaseEventHandler;
+import org.richfaces.skin.Skin;
+import org.richfaces.skin.SkinFactory;
+import org.richfaces.skin.SkinNotFoundException;
+
+public class ViewResourcesPhaseEventHandler implements
+ ComponentPhaseEventHandler {
+
+ private static final Log log = LogFactory.getLog(ViewResourcesPhaseEventHandler.class);
+
+ //TODO remove this in other
+ public static final String RESOURCES_PROCESSED =
"org.ajax4jsf.framework.HEADER_PROCESSED";
+
+ /* (non-Javadoc)
+ * @see
org.richfaces.event.ComponentPhaseEventHandler#beforePhaseBegin(javax.faces.event.PhaseEvent)
+ */
+ public Object beforePhaseBegin(PhaseEvent event) {
+ Object result = false;
+ FacesContext context = event.getFacesContext();
+ ExternalContext externalContext = context.getExternalContext();
+ Map<String,Object> requestMap = externalContext.getRequestMap();
+ if (!Boolean.TRUE.equals(requestMap.get(RESOURCES_PROCESSED))) {
+ if (null != requestMap.get(BaseFilter.RESPONSE_WRAPPER_ATTRIBUTE)) {
+ RenderKitFactory rkFactory = (RenderKitFactory) FactoryFinder
+ .getFactory(FactoryFinder.RENDER_KIT_FACTORY);
+ RenderKit renderKit = rkFactory.getRenderKit(context, context
+ .getViewRoot().getRenderKitId());
+
+ Boolean processStyles = true;
+ Boolean processScripts = true;
+
+ try {
+ Skin skin = SkinFactory.getInstance().getSkin(context);
+ // For a "NULL" skin, do not collect components stylesheets
+ processStyles = !"false".equals(skin.getParameter(context,
+ Skin.loadStyleSheets));
+ } catch (SkinNotFoundException e) {
+ log.warn("Current Skin is not found", e);
+ }
+ // Check init parameters for a resources processing.
+ String scriptStrategy = externalContext
+ .getInitParameter(InternetResourceBuilder.LOAD_SCRIPT_STRATEGY_PARAM);
+ processScripts = !(InternetResourceBuilder.LOAD_NONE .equals(scriptStrategy)
+ || InternetResourceBuilder.LOAD_ALL .equals(scriptStrategy));
+
+ String styleStrategy = externalContext
+ .getInitParameter(InternetResourceBuilder.LOAD_STYLE_STRATEGY_PARAM);
+ processStyles = !(InternetResourceBuilder.LOAD_NONE.equals(styleStrategy)
+ || InternetResourceBuilder.LOAD_ALL.equals(styleStrategy));
+
+ LinkedHashSet<String> scripts = new LinkedHashSet<String>();
+ LinkedHashSet<String> styles = new LinkedHashSet<String>();
+ LinkedHashSet<String> userScripts = new LinkedHashSet<String>();
+ LinkedHashSet<String> userStyles = new LinkedHashSet<String>();
+ result = new Object[] {renderKit, processStyles, processScripts, scripts, styles,
userScripts, userStyles};
+ }
+ }
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see
org.richfaces.event.ComponentPhaseEventHandler#beforePhaseEnd(javax.faces.event.PhaseEvent,
java.lang.Object)
+ */
+ public void beforePhaseEnd(PhaseEvent event, Object state) {
+ if (!Boolean.FALSE.equals(state)) {
+ Object[] objects = (Object[]) state;
+ Set<?> scripts = (Set<?>) objects[3];
+ Set<?> styles = (Set<?>) objects[4];
+ Set<?> userScripts = (Set<?>) objects[5];
+ Set<?> userStyles = (Set<?>) objects[6];
+ //TODO save these sets
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see
org.richfaces.event.ComponentPhaseEventHandler#componentBegin(javax.faces.component.UIComponent,
javax.faces.event.PhaseEvent, java.lang.Object)
+ */
+ @SuppressWarnings("unchecked")
+ public void componentBegin(UIComponent component, PhaseEvent event,
+ Object state) {
+ if (!Boolean.FALSE.equals(state)) {
+ Object[] objects = (Object[]) state;
+ RenderKit renderKit = (RenderKit) objects[0];
+ boolean processStyles = (Boolean) objects[1];
+ boolean processScripts = (Boolean) objects[2];
+ Set<String> scripts = (Set<String>) objects[3];
+ Set<String> styles = (Set<String>) objects[4];
+ Set<String> userScripts = (Set<String>) objects[5];
+ Set<String> userStyles = (Set<String>) objects[6];
+ FacesContext context = event.getFacesContext();
+ Renderer renderer = getRenderer(context, component, renderKit);
+ if (null != renderer) {
+ if ((processScripts || processStyles)
+ && renderer instanceof HeaderResourceProducer) {
+ HeaderResourceProducer producer = (HeaderResourceProducer) renderer;
+ if (processScripts) {
+ Set<String> set = producer.getHeaderScripts(context,
+ component);
+ if (null != set) {
+ scripts.addAll(set);
+ }
+
+ }
+ if (processStyles) {
+ Set<String> set = producer.getHeaderStyles(context,
+ component);
+ if (null != set) {
+ styles.addAll(set);
+ }
+
+ }
+ } else if (renderer instanceof UserResourceRenderer) {
+ UserResourceRenderer producer = (UserResourceRenderer) renderer;
+ Set<String> set = producer.getHeaderScripts(context,
+ component);
+ if (null != set) {
+ userScripts.addAll(set);
+ }
+ set = producer.getHeaderStyles(context, component);
+ if (null != set) {
+ userStyles.addAll(set);
+ }
+ }
+
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see
org.richfaces.event.ComponentPhaseEventHandler#componentEnd(javax.faces.component.UIComponent,
javax.faces.event.PhaseEvent, java.lang.Object)
+ */
+ public void componentEnd(UIComponent component, PhaseEvent event,
+ Object state) {}
+
+ /**
+ * Find renderer for given component.
+ *
+ * @param context
+ * @param comp
+ * @param renderKit
+ * @return
+ */
+ private static Renderer getRenderer(FacesContext context, UIComponent comp, RenderKit
renderKit) {
+ String rendererType = comp.getRendererType();
+ if (rendererType != null) {
+ return (renderKit.getRenderer(comp.getFamily(), rendererType));
+ } else {
+ return (null);
+ }
+
+ }
+}
Show replies by date