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);