You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gp...@apache.org on 2011/08/18 23:32:03 UTC
svn commit: r1159422 -
/myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java
Author: gpetracek
Date: Thu Aug 18 21:32:02 2011
New Revision: 1159422
URL: http://svn.apache.org/viewvc?rev=1159422&view=rev
Log:
EXTCDI-216 type-safe navigation for h:link and h:button
Modified:
myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java?rev=1159422&r1=1159421&r2=1159422&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java Thu Aug 18 21:32:02 2011
@@ -18,6 +18,11 @@
*/
package org.apache.myfaces.extensions.cdi.jsf2.impl.navigation;
+import org.apache.myfaces.extensions.cdi.core.api.config.view.DefaultErrorView;
+import org.apache.myfaces.extensions.cdi.core.api.config.view.ViewConfig;
+import org.apache.myfaces.extensions.cdi.jsf.api.config.view.Page;
+import org.apache.myfaces.extensions.cdi.jsf.api.config.view.ViewConfigDescriptor;
+import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.ViewConfigCache;
import org.apache.myfaces.extensions.cdi.jsf.impl.navigation.ViewConfigAwareNavigationHandler;
import org.apache.myfaces.extensions.cdi.jsf.api.config.JsfModuleConfig;
import org.apache.myfaces.extensions.cdi.core.api.activation.Deactivatable;
@@ -31,6 +36,9 @@ import javax.faces.context.FacesContext;
import java.util.Set;
import java.util.Map;
import java.util.HashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import static org.apache.myfaces.extensions.cdi.core.api.util.ClassUtils.tryToLoadClassForName;
/**
* We have to ensure the invocation order for the type-safe navigation feature/s.
@@ -39,6 +47,8 @@ import java.util.HashMap;
*/
public class CodiNavigationHandler extends ConfigurableNavigationHandler implements Deactivatable
{
+ private Set<String> otherOutcomes = new CopyOnWriteArraySet<String>();
+
private final NavigationHandler wrapped;
private final boolean deactivated;
private final boolean addViewConfigsAsNavigationCase;
@@ -100,6 +110,47 @@ public class CodiNavigationHandler exten
{
if (this.wrapped instanceof ConfigurableNavigationHandler)
{
+ if(action == null && outcome != null && outcome.contains(".") && outcome.startsWith("class ") &&
+ !otherOutcomes.contains(outcome))
+ {
+ String originalOutcome = outcome;
+
+ outcome = outcome.substring(6);
+
+ ViewConfigDescriptor entry = null;
+
+ if(DefaultErrorView.class.getName().equals(originalOutcome))
+ {
+ entry = ViewConfigCache.getDefaultErrorViewConfigDescriptor();
+ }
+
+ if(entry == null)
+ {
+ Object loadedClass = tryToLoadClassForName(outcome);
+
+ if(loadedClass == null)
+ {
+ this.otherOutcomes.add(originalOutcome);
+ }
+ else if(ViewConfig.class.isAssignableFrom((Class)loadedClass))
+ {
+ //noinspection unchecked
+ entry = ViewConfigCache.getViewConfigDescriptor((Class<? extends ViewConfig>) loadedClass);
+ }
+ }
+
+ if(entry != null)
+ {
+ return new NavigationCase("*",
+ null,
+ null,
+ null,
+ entry.getViewId(),
+ null,
+ Page.NavigationMode.REDIRECT.equals(entry.getNavigationMode()),
+ false);
+ }
+ }
return ((ConfigurableNavigationHandler) this.wrapped).getNavigationCase(context, action, outcome);
}
//TODO add support for implicit navigation in combination with view-config based typesafe navigation