EXTCDI-298 cache for NavigationCase entries based on view-configs
git-svn-id: https://svn.apache.org/repos/asf/myfaces/extensions/cdi/trunk@1360257 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java b/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java
index 0907687..f8fea1d 100644
--- a/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java
+++ b/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java
@@ -36,6 +36,7 @@
import java.util.Set;
import java.util.Map;
import java.util.HashMap;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import static org.apache.myfaces.extensions.cdi.core.api.util.ClassUtils.tryToLoadClassForName;
@@ -47,6 +48,9 @@
{
private Set<String> otherOutcomes = new CopyOnWriteArraySet<String>();
+ private Map<String, NavigationCase> viewConfigBasedNavigationCaseCache
+ = new ConcurrentHashMap<String, NavigationCase>();
+
private final NavigationHandler wrapped;
private final boolean deactivated;
private final boolean addViewConfigsAsNavigationCase;
@@ -120,6 +124,13 @@
{
String originalOutcome = outcome;
+ NavigationCase navigationCase = this.viewConfigBasedNavigationCaseCache.get(originalOutcome);
+
+ if (navigationCase != null)
+ {
+ return navigationCase;
+ }
+
outcome = outcome.substring(6);
ViewConfigDescriptor entry = null;
@@ -146,14 +157,16 @@
if(entry != null)
{
- return new NavigationCase("*",
- null,
- null,
- null,
- entry.getViewId(),
- null,
- Page.NavigationMode.REDIRECT.equals(entry.getNavigationMode()),
- false);
+ navigationCase = new NavigationCase("*",
+ null,
+ null,
+ null,
+ entry.getViewId(),
+ null,
+ Page.NavigationMode.REDIRECT.equals(entry.getNavigationMode()),
+ false);
+ this.viewConfigBasedNavigationCaseCache.put(originalOutcome, navigationCase);
+ return navigationCase;
}
}
return ((ConfigurableNavigationHandler) this.wrapped).getNavigationCase(context, action, outcome);