Author: alexsmirnov
Date: 2011-02-25 19:50:53 -0500 (Fri, 25 Feb 2011)
New Revision: 21945
Modified:
branches/4.0.0.CR1/ui/validator/api/src/main/java/org/richfaces/javascript/ScriptNotFoundException.java
branches/4.0.0.CR1/ui/validator/ui/src/main/java/org/richfaces/javascript/ClientScriptServiceImpl.java
Log:
RESOLVED - issue RF-10062: CSV: cache results in services
https://issues.jboss.org/browse/RF-10062
Modified:
branches/4.0.0.CR1/ui/validator/api/src/main/java/org/richfaces/javascript/ScriptNotFoundException.java
===================================================================
---
branches/4.0.0.CR1/ui/validator/api/src/main/java/org/richfaces/javascript/ScriptNotFoundException.java 2011-02-25
23:29:51 UTC (rev 21944)
+++
branches/4.0.0.CR1/ui/validator/api/src/main/java/org/richfaces/javascript/ScriptNotFoundException.java 2011-02-26
00:50:53 UTC (rev 21945)
@@ -1,24 +1,21 @@
package org.richfaces.javascript;
-public class ScriptNotFoundException extends Exception {
+public class ScriptNotFoundException extends RuntimeException {
public ScriptNotFoundException() {
- // TODO Auto-generated constructor stub
+ super();
}
public ScriptNotFoundException(String message) {
super(message);
- // TODO Auto-generated constructor stub
}
public ScriptNotFoundException(Throwable cause) {
super(cause);
- // TODO Auto-generated constructor stub
}
public ScriptNotFoundException(String message, Throwable cause) {
super(message, cause);
- // TODO Auto-generated constructor stub
}
}
Modified:
branches/4.0.0.CR1/ui/validator/ui/src/main/java/org/richfaces/javascript/ClientScriptServiceImpl.java
===================================================================
---
branches/4.0.0.CR1/ui/validator/ui/src/main/java/org/richfaces/javascript/ClientScriptServiceImpl.java 2011-02-25
23:29:51 UTC (rev 21944)
+++
branches/4.0.0.CR1/ui/validator/ui/src/main/java/org/richfaces/javascript/ClientScriptServiceImpl.java 2011-02-26
00:50:53 UTC (rev 21945)
@@ -5,6 +5,8 @@
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import javax.faces.application.Resource;
import javax.faces.application.ResourceDependency;
@@ -14,7 +16,10 @@
import org.richfaces.component.util.Strings;
import org.richfaces.resource.ResourceKey;
+import com.google.common.base.Function;
+import com.google.common.collect.ComputationException;
import com.google.common.collect.Lists;
+import com.google.common.collect.MapMaker;
/**
* @author asmirnov
@@ -26,10 +31,30 @@
private static final String ORG_RICHFACES_CSV = "org.richfaces.csv";
+ private static final Function<Class<?>, ? extends LibraryFunction>
RESOURCE_SCRIPT_FUNCTION = new Function<Class<?>, LibraryFunction>() {
+
+ public LibraryFunction apply(Class<?> arg0) {
+ return getScriptResource(FacesContext.getCurrentInstance(), arg0);
+ }
+ };
+
+ private static final Function<Class<?>, ? extends LibraryFunction>
ANNOTATION_SCRIPT_FUNCTION = new Function<Class<?>, LibraryFunction>() {
+
+ public LibraryFunction apply(Class<?> arg0) {
+ return getScriptFromAnnotation(arg0);
+ }
+ };
+
+ private final ConcurrentMap<Class<?>, LibraryFunction> resourcesMapping;
+
+ private final ConcurrentMap<Class<?>, LibraryFunction>
annotationsMapping;
+
private final Map<Class<?>, LibraryFunction> defaultMapping;
public ClientScriptServiceImpl(Map<Class<?>, LibraryFunction>
defaultMapping) {
this.defaultMapping = defaultMapping;
+ resourcesMapping = new
MapMaker().initialCapacity(10).makeComputingMap(RESOURCE_SCRIPT_FUNCTION);
+ annotationsMapping = new
MapMaker().initialCapacity(10).makeComputingMap(ANNOTATION_SCRIPT_FUNCTION);
}
/*
@@ -43,18 +68,31 @@
}
LibraryFunction function;
try {
- function = getScriptResource(facesContext, javaClass);
+ function = getFromComputationMap(resourcesMapping, javaClass);
} catch (ScriptNotFoundException e) {
if (defaultMapping.containsKey(javaClass)) {
function = defaultMapping.get(javaClass);
} else {
- function = getScriptFromAnnotation(javaClass);
+ function = getFromComputationMap(annotationsMapping, javaClass);
}
}
return function;
}
+
+ private LibraryFunction getFromComputationMap(ConcurrentMap<Class<?>,
LibraryFunction> map, Class<?> clazz) throws ScriptNotFoundException {
+ try {
+ return map.get(clazz);
+ } catch (ComputationException e) {
+ Throwable cause = e.getCause();
+ if (cause instanceof ScriptNotFoundException) {
+ ScriptNotFoundException snfe = (ScriptNotFoundException) cause;
+ throw snfe;
+ }
+ throw e;
+ }
+ }
- private LibraryFunction getScriptFromAnnotation(Class<?> javaClass) throws
ScriptNotFoundException {
+ private static LibraryFunction getScriptFromAnnotation(Class<?> javaClass)
throws ScriptNotFoundException {
if (javaClass.isAnnotationPresent(ClientSideScript.class)) {
ClientSideScript clientSideScript =
javaClass.getAnnotation(ClientSideScript.class);
List<ResourceKey> resources = Lists.newArrayList();
@@ -67,7 +105,7 @@
}
}
- private LibraryFunction getScriptResource(FacesContext facesContext, Class<?>
javaClass)
+ private static LibraryFunction getScriptResource(FacesContext facesContext,
Class<?> javaClass)
throws ScriptNotFoundException {
ResourceHandler resourceHandler =
facesContext.getApplication().getResourceHandler();
String resourceName = javaClass.getSimpleName() + ".js";