Author: konstantin.mishin
Date: 2008-06-18 13:57:51 -0400 (Wed, 18 Jun 2008)
New Revision: 9101
Modified:
trunk/framework/impl/src/main/java/org/ajax4jsf/context/ViewResourcesPhaseEventHandler.java
Log:
RF-2815
Modified:
trunk/framework/impl/src/main/java/org/ajax4jsf/context/ViewResourcesPhaseEventHandler.java
===================================================================
---
trunk/framework/impl/src/main/java/org/ajax4jsf/context/ViewResourcesPhaseEventHandler.java 2008-06-18
17:21:59 UTC (rev 9100)
+++
trunk/framework/impl/src/main/java/org/ajax4jsf/context/ViewResourcesPhaseEventHandler.java 2008-06-18
17:57:51 UTC (rev 9101)
@@ -3,12 +3,18 @@
*/
package org.ajax4jsf.context;
+import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
+import java.util.regex.Pattern;
+import javax.el.ExpressionFactory;
+import javax.el.ValueExpression;
import javax.faces.FactoryFinder;
+import javax.faces.application.Application;
import javax.faces.component.UIComponent;
+import javax.faces.component.UIViewRoot;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
@@ -16,9 +22,12 @@
import javax.faces.render.RenderKitFactory;
import javax.faces.render.Renderer;
+import org.ajax4jsf.application.AjaxViewHandler;
import org.ajax4jsf.renderkit.HeaderResourceProducer;
import org.ajax4jsf.renderkit.UserResourceRenderer;
import org.ajax4jsf.resource.InternetResourceBuilder;
+import org.ajax4jsf.resource.ResourceNotFoundException;
+import org.ajax4jsf.util.ELUtils;
import org.ajax4jsf.webapp.BaseFilter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -34,48 +43,183 @@
//TODO remove this in other
public static final String RESOURCES_PROCESSED =
"org.ajax4jsf.framework.HEADER_PROCESSED";
-
+ private static final String INIT_PARAMETER_PREFIX = "_init_parameter_";
+ private static final Object NULL = new Object();
+ private static final Pattern USER_AGENTS = Pattern.compile(" AppleWebKit/|^Opera/|
Opera ");
+ //todo
+
/* (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;
-
+
+ LinkedHashSet<String> scripts = new LinkedHashSet<String>();
+ LinkedHashSet<String> styles = new LinkedHashSet<String>();
+ LinkedHashSet<String> userScripts = new LinkedHashSet<String>();
+ LinkedHashSet<String> userStyles = new LinkedHashSet<String>();
+
+ if (log.isDebugEnabled()) {
+ log
+ .debug("Process component tree for collect used scripts and styles");
+ }
+ UIViewRoot root = context.getViewRoot();
try {
Skin skin = SkinFactory.getInstance().getSkin(context);
// For a "NULL" skin, do not collect components stylesheets
- processStyles = !"false".equals(skin.getParameter(context,
- Skin.loadStyleSheets));
+ if ("false".equals(skin.getParameter(context,
+ Skin.loadStyleSheets))) {
+ processStyles = false;
+ }
} catch (SkinNotFoundException e) {
log.warn("Current Skin is not found", e);
}
+ InternetResourceBuilder internetResourceBuilder = InternetResourceBuilder
+ .getInstance();
// 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));
-
+ if (null != scriptStrategy) {
+ if (InternetResourceBuilder.LOAD_NONE
+ .equals(scriptStrategy)) {
+ processScripts = false;
+ } else if (InternetResourceBuilder.LOAD_ALL
+ .equals(scriptStrategy)) {
+ processScripts = false;
+ // For an "ALL" strategy, it is not necessary to load scripts in the ajax
request
+ //TODO add !this.isAjaxRequest(context)
+ if (false) {
+ try {
+ scripts.add(internetResourceBuilder
+ .createResource(
+ this,
+ InternetResourceBuilder.COMMON_FRAMEWORK_SCRIPT)
+ .getUri(context, null));
+ scripts.add(internetResourceBuilder
+ .createResource(
+ this,
+ InternetResourceBuilder.COMMON_UI_SCRIPT)
+ .getUri(context, null));
+
+ } catch (ResourceNotFoundException e) {
+ if (log.isWarnEnabled()) {
+ log
+ .warn("No aggregated javaScript library found "
+ + e.getMessage());
+ }
+ }
+
+ }
+ }
+ }
+
+ boolean useStdControlsSkinning = false;
+
+ String stdControlsSkinning = getInitParameterValue(context,
InternetResourceBuilder.STD_CONTROLS_SKINNING_PARAM);
+ if (stdControlsSkinning != null) {
+ useStdControlsSkinning =
InternetResourceBuilder.ENABLE.equals(stdControlsSkinning);
+ }
+
+ boolean useStdControlsSkinningClasses = true;
+
+ String stdControlsSkinningClasses = getInitParameterValue(context,
InternetResourceBuilder.STD_CONTROLS_SKINNING_CLASSES_PARAM);
+ if (stdControlsSkinningClasses != null) {
+ useStdControlsSkinningClasses =
InternetResourceBuilder.ENABLE.equals(stdControlsSkinningClasses);
+ }
+
+ boolean useExtendedSkinning = isExtendedSkinningEnabled(externalContext);
+
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>();
+
+ if (InternetResourceBuilder.LOAD_NONE.equals(styleStrategy)) {
+ processStyles = false;
+ } else if (InternetResourceBuilder.LOAD_ALL
+ .equals(styleStrategy)) {
+ processStyles = false;
+ // For an "ALL" strategy, it is not necessary to load styles
+ // in the ajax request
+ //TODO add !this.isAjaxRequest(context)
+ if (false) {
+ String commonStyle = InternetResourceBuilder.COMMON_STYLE_PREFIX;
+
+ if (useStdControlsSkinning
+ || useStdControlsSkinningClasses) {
+ if (isExtendedSkinningEnabled(externalContext)) {
+ commonStyle += "-ext";
+ } else {
+ commonStyle += "-bas";
+ }
+
+ if (useStdControlsSkinning
+ && useStdControlsSkinningClasses) {
+ commonStyle += "-both";
+ } else if (useStdControlsSkinning) {
+ commonStyle += "-styles";
+ } else if (useStdControlsSkinningClasses) {
+ commonStyle += "-classes";
+ }
+ }
+
+ commonStyle += InternetResourceBuilder.COMMON_STYLE_EXTENSION;
+
+ try {
+ styles.add(internetResourceBuilder
+ .createResource(this, commonStyle).getUri(
+ context, null));
+
+ } catch (ResourceNotFoundException e) {
+ if (log.isWarnEnabled()) {
+ log.warn("No aggregated stylesheet found "
+ + e.getMessage());
+ }
+ }
+
+ }
+ } else {
+ if (useStdControlsSkinning) {
+ styles.add(
+ internetResourceBuilder.createResource(
+ this, InternetResourceBuilder.STD_CONTROLS_BASIC_STYLE)
+ .getUri(context, null));
+
+ if (useExtendedSkinning) {
+ styles.add(
+ internetResourceBuilder.createResource(
+ this, InternetResourceBuilder.STD_CONTROLS_EXTENDED_STYLE)
+ .getUri(context, null));
+ }
+ }
+
+ if (useStdControlsSkinningClasses) {
+ styles.add(
+ internetResourceBuilder.createResource(
+ this, InternetResourceBuilder.STD_CONTROLS_BASIC_CLASSES_STYLE)
+ .getUri(context, null));
+
+ if (useExtendedSkinning) {
+ styles.add(
+ internetResourceBuilder.createResource(
+ this, InternetResourceBuilder.STD_CONTROLS_EXTENDED_CLASSES_STYLE)
+ .getUri(context, null));
+ }
+ }
+ }
+
+ RenderKitFactory rkFactory = (RenderKitFactory) FactoryFinder
+ .getFactory(FactoryFinder.RENDER_KIT_FACTORY);
+ RenderKit renderKit = rkFactory.getRenderKit(context, context
+ .getViewRoot().getRenderKitId());
+
result = new Object[] {renderKit, processStyles, processScripts, scripts, styles,
userScripts, userStyles};
}
}
@@ -85,14 +229,87 @@
/* (non-Javadoc)
* @see
org.richfaces.event.ComponentPhaseEventHandler#beforePhaseEnd(javax.faces.event.PhaseEvent,
java.lang.Object)
*/
+ @SuppressWarnings("unchecked")
public void beforePhaseEnd(PhaseEvent event, Object state) {
if (!Boolean.FALSE.equals(state)) {
+ FacesContext context = event.getFacesContext();
+ ExternalContext externalContext = context.getExternalContext();
+ Map<String,Object> requestMap = externalContext.getRequestMap();
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
+ Set<String> scripts = (Set<String>) objects[3];
+ Set<String> styles = (Set<String>) objects[4];
+ // TODO remove if possible
+ Set<String> userScripts = (Set<String>) objects[5];
+ Set<String> userStyles = (Set<String>) objects[6];
+ if (scripts.size() > 0) {
+ if (log.isDebugEnabled()) {
+ StringBuffer buff = new StringBuffer(
+ "Scripts for insert into head : \n");
+ for (Iterator<String> iter = scripts.iterator(); iter.hasNext();) {
+ String script = iter.next();
+ buff.append(script).append("\n");
+ }
+ log.debug(buff.toString());
+ }
+ requestMap.put(AjaxContext.SCRIPTS_PARAMETER, scripts);
+ }
+
+ String skinStyleSheetUri = null;
+ String skinExtendedStyleSheetUri = null;
+ try {
+ Skin skin = SkinFactory.getInstance().getSkin(context);
+ // Set default style sheet for current skin.
+ skinStyleSheetUri = (String) skin.getParameter(context,
+ Skin.generalStyleSheet);
+ // Set default style sheet for current skin.
+ skinExtendedStyleSheetUri = (String) skin.getParameter(context,
+ Skin.extendedStyleSheet);
+ } catch (SkinNotFoundException e) {
+ log.warn("Current Skin is not found", e);
+ }
+
+ // Append Skin StyleSheet after a
+ if (null != skinStyleSheetUri) {
+ String resourceURL = context.getApplication()
+ .getViewHandler().getResourceURL(context,
+ skinStyleSheetUri);
+ styles.add(resourceURL);
+ }
+
+ if (null != skinExtendedStyleSheetUri &&
isExtendedSkinningEnabled(externalContext)) {
+ String resourceURL =
context.getApplication().getViewHandler().getResourceURL(context,
+ skinExtendedStyleSheetUri);
+ styles.add(resourceURL);
+ }
+ if (styles.size() > 0) {
+ if (log.isDebugEnabled()) {
+ StringBuffer buff = new StringBuffer(
+ "Styles for insert into head : \n");
+ for (Iterator<String> iter = styles.iterator(); iter.hasNext();) {
+ String style = (String) iter.next();
+ buff.append(style).append("\n");
+ }
+ log.debug(buff.toString());
+ }
+ requestMap.put(AjaxContext.STYLES_PARAMETER, styles);
+ }
+
+ if (userStyles.size() > 0) {
+ if (log.isDebugEnabled()) {
+ StringBuffer buff = new StringBuffer(
+ "User styles for insert into head : \n");
+ for (Iterator<String> iter = userStyles.iterator(); iter.hasNext();) {
+ String style = (String) iter.next();
+ buff.append(style).append("\n");
+ }
+ log.debug(buff.toString());
+ }
+ requestMap.put(AjaxContext.USER_STYLES_PARAMETER, userStyles);
+ }
+ // Mark as processed.
+ requestMap.put(RESOURCES_PROCESSED, Boolean.TRUE);
+ // Save viewId for a parser selection
+ requestMap.put(AjaxViewHandler.VIEW_ID_KEY, context.getViewRoot().getViewId());
}
}
@@ -173,4 +390,75 @@
}
}
+
+ private static String getInitParameterValue(FacesContext context, String parameterName)
{
+
+ String key = INIT_PARAMETER_PREFIX + parameterName;
+
+ ExternalContext externalContext = context.getExternalContext();
+ Map<String, Object> applicationMap = externalContext.getApplicationMap();
+ Object mutex = externalContext.getRequest();
+ Object parameterValue = null;
+
+ synchronized (mutex) {
+ parameterValue = applicationMap.get(key);
+
+ if (parameterValue == null) {
+
+ String initParameter = externalContext.getInitParameter(parameterName);
+ if (initParameter != null) {
+
+ if (ELUtils.isValueReference(initParameter)) {
+ Application application = context.getApplication();
+ ExpressionFactory expressionFactory = application.getExpressionFactory();
+
+ parameterValue = expressionFactory.createValueExpression(context.getELContext(),
+ initParameter,
+ String.class);
+ } else {
+ parameterValue = initParameter;
+ }
+
+ } else {
+ parameterValue = NULL;
+ }
+
+ applicationMap.put(key, parameterValue);
+ }
+ }
+
+ return evaluate(context, parameterValue);
+ }
+
+ private static String evaluate(FacesContext context, Object parameterValue) {
+ if (parameterValue == NULL || parameterValue == null) {
+ return null;
+ } else if (parameterValue instanceof ValueExpression) {
+ ValueExpression expression = (ValueExpression) parameterValue;
+
+ return (String) expression.getValue(context.getELContext());
+ } else {
+ return parameterValue.toString();
+ }
+ }
+
+ private static boolean isExtendedSkinningEnabled(ExternalContext context) {
+ String userAgent = context.getRequestHeaderMap().get("User-Agent");
+ if (userAgent != null) {
+ boolean apply = !USER_AGENTS.matcher(userAgent).find();
+
+ if (log.isDebugEnabled()) {
+ log.debug("Got User-Agent: " + userAgent);
+ log.debug("Applying extended CSS controls styling = " + apply);
+ }
+
+ return apply;
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("User-Agent is null, applying extended CSS controls styling");
+ }
+
+ return true;
+ }
+ }
}