Author: nbelaevski
Date: 2010-07-06 08:58:11 -0400 (Tue, 06 Jul 2010)
New Revision: 17737
Modified:
root/core/trunk/impl/pom.xml
root/core/trunk/impl/src/main/java/org/richfaces/resource/CompiledCSSResource.java
root/core/trunk/impl/src/main/java/org/richfaces/resource/DefaultResourceCodec.java
root/core/trunk/impl/src/main/java/org/richfaces/resource/ResourceHandlerImpl.java
root/core/trunk/impl/src/main/java/org/richfaces/skin/AbstractChainableSkinImpl.java
root/core/trunk/impl/src/main/java/org/richfaces/skin/BaseSkinImpl.java
root/core/trunk/impl/src/main/java/org/richfaces/skin/BasicSkinImpl.java
root/core/trunk/impl/src/main/java/org/richfaces/skin/DefaultSkinImpl.java
root/core/trunk/impl/src/main/java/org/richfaces/skin/SkinImpl.java
root/core/trunk/impl/src/test/java/org/richfaces/skin/SkinTestCase.java
Log:
Added libraryName support for resources
CompiledCSSResource changed to use ResourceHandler
Hash code computation optimization in skins
Modified: root/core/trunk/impl/pom.xml
===================================================================
--- root/core/trunk/impl/pom.xml 2010-07-06 12:54:22 UTC (rev 17736)
+++ root/core/trunk/impl/pom.xml 2010-07-06 12:58:11 UTC (rev 17737)
@@ -56,6 +56,10 @@
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
</dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
<!-- Provided Dependencies -->
<dependency>
Modified:
root/core/trunk/impl/src/main/java/org/richfaces/resource/CompiledCSSResource.java
===================================================================
---
root/core/trunk/impl/src/main/java/org/richfaces/resource/CompiledCSSResource.java 2010-07-06
12:54:22 UTC (rev 17736)
+++
root/core/trunk/impl/src/main/java/org/richfaces/resource/CompiledCSSResource.java 2010-07-06
12:58:11 UTC (rev 17737)
@@ -31,6 +31,7 @@
import javax.faces.application.ProjectStage;
import javax.faces.application.Resource;
+import javax.faces.application.ResourceHandler;
import javax.faces.context.FacesContext;
import org.richfaces.log.RichfacesLogger;
@@ -51,63 +52,27 @@
*/
public class CompiledCSSResource extends AbstractCacheableResource implements
StateHolderResource {
- private static final String ECSS = ".ecss";
-
- private static final String CLASSPATH_BASE_PATH = "META-INF/resources/";
-
- private static final String WEBAPP_BASE_PATH = "/resources/";
-
private static final Logger LOGGER = RichfacesLogger.RESOURCE.getLogger();
private static final String NULL_STYLESHEET = "Parsed stylesheet for
''{0}'':''{1}'' resource is null.";
- private String resourcePath;
-
- public CompiledCSSResource(String resourcePath) {
- this.resourcePath = resourcePath;
+ private ResourceHandler defaultHandler;
+
+ public CompiledCSSResource(String resourceName, String libraryName, ResourceHandler
defaultHandler) {
+ setResourceName(resourceName);
+ setLibraryName(libraryName);
+ this.defaultHandler = defaultHandler;
}
- @Override
- public String getResourceName() {
- return this.resourcePath;
- }
-
public InputStream getResourceInputStream() throws IOException {
- String path = null;
- if (this.resourcePath.indexOf(ECSS) != -1) {
- path = this.resourcePath.substring(0, this.resourcePath.lastIndexOf(ECSS) +
ECSS.length());
- } else {
- LOGGER.error("This resource is not properly dynamic resource : " +
getResourceName());
+ Resource resource = defaultHandler.createResource(getResourceName(),
getLibraryName(), "text/plain");
+ if (resource == null) {
return null;
}
- InputStream in = null;
- try {
- in =
FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream(WEBAPP_BASE_PATH
+ path);
- } catch (Exception e) {
- // Normal situation, resource not found in webapp resources
- }
- if (in != null) {
- return in;
- }
- ClassLoader loader = getClassLoader();
- in = loader.getResourceAsStream(CLASSPATH_BASE_PATH + path);
- if (in == null) {
- // try using this class' loader (necessary when running in OSGi)
- in = this.getClass().getClassLoader().getResourceAsStream(CLASSPATH_BASE_PATH
+ path);
- }
- return in;
-
+ return resource.getInputStream();
}
- public static ClassLoader getCurrentLoader(Object fallbackClass) {
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
- if (loader == null) {
- loader = fallbackClass.getClass().getClassLoader();
- }
- return loader;
- }
-
@Override
public InputStream getInputStream() throws IOException {
FacesContext ctx = FacesContext.getCurrentInstance();
Modified:
root/core/trunk/impl/src/main/java/org/richfaces/resource/DefaultResourceCodec.java
===================================================================
---
root/core/trunk/impl/src/main/java/org/richfaces/resource/DefaultResourceCodec.java 2010-07-06
12:54:22 UTC (rev 17736)
+++
root/core/trunk/impl/src/main/java/org/richfaces/resource/DefaultResourceCodec.java 2010-07-06
12:58:11 UTC (rev 17737)
@@ -98,6 +98,19 @@
sb.append(Util.encodeURIQueryPart(encodedResourceData));
}
+ if (libraryName != null && libraryName.length() != 0) {
+ if (!parameterAppended) {
+ sb.append('?');
+ parameterAppended = true;
+ } else {
+ sb.append('&');
+ }
+
+ sb.append(LIBRARY_NAME_PARAM);
+ sb.append('=');
+ sb.append(Util.encodeURIQueryPart(libraryName));
+ }
+
return sb.toString();
}
Modified:
root/core/trunk/impl/src/main/java/org/richfaces/resource/ResourceHandlerImpl.java
===================================================================
---
root/core/trunk/impl/src/main/java/org/richfaces/resource/ResourceHandlerImpl.java 2010-07-06
12:54:22 UTC (rev 17736)
+++
root/core/trunk/impl/src/main/java/org/richfaces/resource/ResourceHandlerImpl.java 2010-07-06
12:58:11 UTC (rev 17737)
@@ -201,7 +201,8 @@
}
if (resourceName.lastIndexOf(".ecss") != -1) {
- resource = new CompiledCSSResource(resourceName);
+ String libraryName = resourceCodec.decodeLibraryName(context,
resourcePath);
+ resource = new CompiledCSSResource(resourceName, libraryName,
defaultHandler);
}
if (resource == null) {
@@ -454,18 +455,18 @@
Map<String, String> params = Util.parseResourceParameters(resourceName);
resourceName = extractParametersFromResourceName(resourceName);
if (resourceName.lastIndexOf(".ecss") != -1) {
- result = new CompiledCSSResource(resourceName);
+ //TODO nick - params?
+ result = new CompiledCSSResource(resourceName, libraryName, defaultHandler);
} else {
//TODO nick - libraryName as package name?
if ((resourceName != null) && ((libraryName == null) ||
(libraryName.length() == 0))) {
result = createHandlerDependentResource(resourceName, params);
}
-
- if (result == null) {
- result = defaultHandler.createResource(resourceName, libraryName,
contentType);
- }
}
-
+ if (result == null) {
+ result = defaultHandler.createResource(resourceName, libraryName,
contentType);
+ }
+
return result;
}
Modified:
root/core/trunk/impl/src/main/java/org/richfaces/skin/AbstractChainableSkinImpl.java
===================================================================
---
root/core/trunk/impl/src/main/java/org/richfaces/skin/AbstractChainableSkinImpl.java 2010-07-06
12:54:22 UTC (rev 17736)
+++
root/core/trunk/impl/src/main/java/org/richfaces/skin/AbstractChainableSkinImpl.java 2010-07-06
12:58:11 UTC (rev 17737)
@@ -21,12 +21,13 @@
package org.richfaces.skin;
-import org.ajax4jsf.Messages;
+import java.util.Map;
import javax.faces.FacesException;
import javax.faces.context.FacesContext;
-import java.util.Map;
+import org.ajax4jsf.Messages;
+
/**
* @author nick belaevski
* @since 3.2
@@ -58,7 +59,7 @@
}
};
- AbstractChainableSkinImpl(Map properties) {
+ AbstractChainableSkinImpl(Map<Object, Object> properties) {
super(properties);
}
@@ -134,8 +135,8 @@
}
@Override
- protected int computeHashCode(FacesContext context) {
- int hash = super.computeHashCode(context);
+ public int hashCode(FacesContext context) {
+ int hash = super.hashCode(context);
Skin baseSkin = getBaseSkin(context);
if (baseSkin != null) {
@@ -144,7 +145,7 @@
return hash;
}
-
+
private abstract static class Operation {
public Object doChainedCall(FacesContext context, AbstractChainableSkinImpl impl,
String name,
int[] singleInt) {
Modified: root/core/trunk/impl/src/main/java/org/richfaces/skin/BaseSkinImpl.java
===================================================================
--- root/core/trunk/impl/src/main/java/org/richfaces/skin/BaseSkinImpl.java 2010-07-06
12:54:22 UTC (rev 17736)
+++ root/core/trunk/impl/src/main/java/org/richfaces/skin/BaseSkinImpl.java 2010-07-06
12:58:11 UTC (rev 17737)
@@ -21,9 +21,10 @@
package org.richfaces.skin;
-import javax.faces.context.FacesContext;
import java.util.Map;
+import javax.faces.context.FacesContext;
+
/**
* @author nick belaevski
* @since 3.2
@@ -33,7 +34,7 @@
private SkinFactoryImpl factoryImpl;
- BaseSkinImpl(Map properties, SkinFactoryImpl factory) {
+ BaseSkinImpl(Map<Object, Object> properties, SkinFactoryImpl factory) {
super(properties);
this.factoryImpl = factory;
Modified: root/core/trunk/impl/src/main/java/org/richfaces/skin/BasicSkinImpl.java
===================================================================
--- root/core/trunk/impl/src/main/java/org/richfaces/skin/BasicSkinImpl.java 2010-07-06
12:54:22 UTC (rev 17736)
+++ root/core/trunk/impl/src/main/java/org/richfaces/skin/BasicSkinImpl.java 2010-07-06
12:58:11 UTC (rev 17737)
@@ -22,14 +22,10 @@
package org.richfaces.skin;
import java.awt.Color;
-import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
+import javax.el.Expression;
import javax.el.ValueExpression;
-import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.ajax4jsf.util.HtmlColor;
@@ -42,20 +38,23 @@
* @version $Revision: 1.1.2.1 $ $Date: 2007/01/09 18:59:41 $
*/
public abstract class BasicSkinImpl implements Skin {
+
public static final String RENDER_KIT_PARAMETER = "render.kit";
- public static final String REQUEST_HASH_CODES_MAP_PARAMETER =
"org.ajax4jsf.skin.HASH_CODES_MAP";
- private Map<String, Object> skinParams = new HashMap<String, Object>();
+
+ private int hashCode = 0;
+
+ private final Map<Object, Object> skinParams;
/**
* Skin can instantiate only by factory method.
*
* @param skinName
*/
- BasicSkinImpl(Map properties) {
+ BasicSkinImpl(Map<Object, Object> properties) {
this.skinParams = properties;
}
- protected Map<String, Object> getSkinParams() {
+ protected Map<Object, Object> getSkinParams() {
return skinParams;
}
@@ -141,17 +140,30 @@
}
protected int computeHashCode(FacesContext context) {
- int hash = 0;
+ int localHash = hashCode;
+ if (localHash == 0) {
+ boolean hasDynamicValues = false;
- for (Iterator iter = skinParams.keySet().iterator(); iter.hasNext();) {
- String key = (String) iter.next();
- Object parameter = getLocalParameter(context, key);
+ for (Map.Entry<Object, Object> entry : skinParams.entrySet()) {
+ String key = (String) entry.getKey();
+ Object value = entry.getValue();
+
+ if (value instanceof Expression) {
+ hasDynamicValues = true;
+ }
+
+ Object parameter = getValueReference(context, value);
- hash = 31 * hash + key.hashCode();
- hash = 31 * hash + ((parameter != null) ? parameter.hashCode() : 0);
+ localHash = 31 * localHash + key.hashCode();
+ localHash = 31 * localHash + ((parameter != null) ? parameter.hashCode()
: 0);
+ }
+
+ if (!hasDynamicValues) {
+ hashCode = localHash;
+ }
}
- return hash;
+ return localHash;
}
/*
@@ -159,26 +171,19 @@
* @see org.richfaces.skin.Skin#hashCode(javax.faces.context.FacesContext)
*/
public int hashCode(FacesContext context) {
- ExternalContext externalContext = context.getExternalContext();
- Map<String, Object> requestMap = externalContext.getRequestMap();
- ConcurrentMap<Skin, Integer> map;
-
- synchronized (requestMap) {
- map = (ConcurrentMap<Skin, Integer>)
requestMap.get(REQUEST_HASH_CODES_MAP_PARAMETER);
-
- if (map == null) {
- map = new ConcurrentHashMap<Skin, Integer>();
- requestMap.put(REQUEST_HASH_CODES_MAP_PARAMETER, map);
- }
+ if (hashCode != 0) {
+ return hashCode;
}
+
+ Map<Object, Object> attributesMap = context.getAttributes();
+
+ Integer requestCode = (Integer) attributesMap.get(this);
- Integer requestCode = (Integer) map.get(this);
-
if (null == requestCode) {
requestCode = new Integer(computeHashCode(context));
// store hash for this skin as request-skope parameter - not calculate on
next calls for same request
- map.putIfAbsent(this, requestCode);
+ attributesMap.put(this, requestCode);
}
return requestCode.intValue();
Modified: root/core/trunk/impl/src/main/java/org/richfaces/skin/DefaultSkinImpl.java
===================================================================
--- root/core/trunk/impl/src/main/java/org/richfaces/skin/DefaultSkinImpl.java 2010-07-06
12:54:22 UTC (rev 17736)
+++ root/core/trunk/impl/src/main/java/org/richfaces/skin/DefaultSkinImpl.java 2010-07-06
12:58:11 UTC (rev 17737)
@@ -21,15 +21,17 @@
package org.richfaces.skin;
-import javax.faces.context.FacesContext;
import java.util.Map;
+import javax.faces.context.FacesContext;
+
/**
* @author nick belaevski
* @since 3.2
*/
public class DefaultSkinImpl extends AbstractChainableSkinImpl {
- DefaultSkinImpl(Map properties) {
+
+ DefaultSkinImpl(Map<Object, Object> properties) {
super(properties);
}
Modified: root/core/trunk/impl/src/main/java/org/richfaces/skin/SkinImpl.java
===================================================================
--- root/core/trunk/impl/src/main/java/org/richfaces/skin/SkinImpl.java 2010-07-06
12:54:22 UTC (rev 17736)
+++ root/core/trunk/impl/src/main/java/org/richfaces/skin/SkinImpl.java 2010-07-06
12:58:11 UTC (rev 17737)
@@ -21,9 +21,10 @@
package org.richfaces.skin;
-import javax.faces.context.FacesContext;
import java.util.Map;
+import javax.faces.context.FacesContext;
+
/**
* @author nick belaevski
* @since 3.2
@@ -32,7 +33,7 @@
private SkinFactoryImpl factoryImpl;
- SkinImpl(Map properties, SkinFactoryImpl factoryImpl) {
+ SkinImpl(Map<Object, Object> properties, SkinFactoryImpl factoryImpl) {
super(properties);
this.factoryImpl = factoryImpl;
Modified: root/core/trunk/impl/src/test/java/org/richfaces/skin/SkinTestCase.java
===================================================================
--- root/core/trunk/impl/src/test/java/org/richfaces/skin/SkinTestCase.java 2010-07-06
12:54:22 UTC (rev 17736)
+++ root/core/trunk/impl/src/test/java/org/richfaces/skin/SkinTestCase.java 2010-07-06
12:58:11 UTC (rev 17737)
@@ -249,19 +249,20 @@
});
Skin skin = factory.getSkin(facesContext);
- Map<String, Object> requestMap =
facesContext.getExternalContext().getRequestMap();
+ Map<Object, Object> attributesMap = facesContext.getAttributes();
// test properties
int hash = skin.hashCode(facesContext);
-
assertTrue(requestMap.containsKey(BasicSkinImpl.REQUEST_HASH_CODES_MAP_PARAMETER));
+ assertTrue(attributesMap.containsKey(skin));
assertEquals(hash, skin.hashCode(facesContext));
- requestMap.remove(BasicSkinImpl.REQUEST_HASH_CODES_MAP_PARAMETER);
+ attributesMap.remove(skin);
assertEquals(hash, skin.hashCode(facesContext));
// setup Value binding mock for different value - hash must differ.
- requestMap.remove(BasicSkinImpl.REQUEST_HASH_CODES_MAP_PARAMETER);
+ attributesMap.remove(skin);
+ Map<String, Object> requestMap =
facesContext.getExternalContext().getRequestMap();
Map map = (Map) requestMap.get("test");
map.put("bean", "other.test.value");