EXTCDI-277 custom path with nested view-config

git-svn-id: https://svn.apache.org/repos/asf/myfaces/extensions/cdi/trunk@1303556 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultViewConfigExtractor.java b/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultViewConfigExtractor.java
index 9264fde..6130206 100644
--- a/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultViewConfigExtractor.java
+++ b/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultViewConfigExtractor.java
@@ -194,8 +194,7 @@
                         scannedViewConfig

                                 .setSimpleClassNameToPathMapping(currentClass.getSimpleName(), currentBasePath);

                     }

-

-                    if (rootPath.equals(scannedViewConfig.getBasePath()))

+                    else if (rootPath.equals(scannedViewConfig.getBasePath()))

                     {

                         scannedViewConfig.setBasePath(currentBasePath);

                     }

diff --git a/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ExtractedViewConfigDefinitionEntry.java b/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ExtractedViewConfigDefinitionEntry.java
index 881f59a..ef3a0c4 100644
--- a/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ExtractedViewConfigDefinitionEntry.java
+++ b/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ExtractedViewConfigDefinitionEntry.java
@@ -238,23 +238,7 @@
         StringBuilder viewId = new StringBuilder(this.basePath);

         if(this.pageName.equals(""))

         {

-            String className = this.viewDefinitionClass.getName();

-

-            //MyClass$MyInnerClass will be converted to /MyClass/MyInnerClass

-            if(className.contains("$") && ".".equals(this.basePath))

-            {

-                this.basePath = "";

-                className = className.substring(className.lastIndexOf('.') + 1);

-                className = convertToPathSyntax(className, this.simpleClassNameToPathMapping);

-            }

-            else if(className.contains("$"))

-            {

-                className = className.substring(className.lastIndexOf('$') + 1);

-            }

-            else

-            {

-                className = className.substring(className.lastIndexOf('.') + 1);

-            }

+            String className = getNestedConfigAsPath();

             className = createPageName(className);

             viewId.append(className);

         }

@@ -263,14 +247,27 @@
         {

             String className = this.viewDefinitionClass.getName();

 

-            this.basePath = "";

-            className = className.substring(className.lastIndexOf('.') + 1);

-            className = convertToPathSyntax(className, this.simpleClassNameToPathMapping);

-            className = createPageName(className);

-            className = className.substring(0, className.lastIndexOf('/') + 1);

+            //custom base-name for a config (overrides inherited base-path)

+            if ("/".endsWith(this.basePath) && this.simpleClassNameToPathMapping.size() == 1)

+            {

+                className = "/" + this.simpleClassNameToPathMapping.get(this.viewDefinitionClass.getSimpleName()) + "/";

+            }

+            else

+            {

+                className = className.substring(className.lastIndexOf('.') + 1);

+                className = convertToPathSyntax(className, this.simpleClassNameToPathMapping);

+                className = createPageName(className);

+                className = className.substring(0, className.lastIndexOf('/') + 1);

+            }

             className += this.pageName;

             viewId.append(className);

         }

+        //only a custom name for a nested config

+        else if(!this.pageName.equals("") && this.viewDefinitionClass.getName().contains("$"))

+        {

+            String className = getNestedConfigAsPath();

+            viewId.append(className.substring(0, className.lastIndexOf("/") + 1)).append(this.pageName);

+        }

         else

         {

             viewId.append(this.pageName);

@@ -295,6 +292,27 @@
         return result;

     }

 

+    private String getNestedConfigAsPath()

+    {

+        String className = this.viewDefinitionClass.getName();

+

+        //MyClass$MyInnerClass will be converted to /MyClass/MyInnerClass

+        if(className.contains("$") && ".".equals(this.basePath))

+        {

+            className = className.substring(className.lastIndexOf('.') + 1);

+            className = convertToPathSyntax(className, this.simpleClassNameToPathMapping);

+        }

+        else if(className.contains("$"))

+        {

+            className = className.substring(className.lastIndexOf('$') + 1);

+        }

+        else

+        {

+            className = className.substring(className.lastIndexOf('.') + 1);

+        }

+        return className;

+    }

+

     protected String createPageName(String className)

     {

         className = className.substring(0, 1).toLowerCase() + className.substring(1);

diff --git a/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/SimpleNestedViewConfig.java b/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/SimpleNestedViewConfig.java
index 6ab890e..832b37e 100644
--- a/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/SimpleNestedViewConfig.java
+++ b/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/SimpleNestedViewConfig.java
@@ -35,4 +35,31 @@
     public class Page2 extends SimpleNestedViewConfig

     {

     }

+

+    public class SubFolder extends SimpleNestedViewConfig

+    {

+        @Page(name = "customPage3")

+        public class Page3 extends SimpleNestedViewConfig

+        {

+        }

+

+        @Page(basePath = "my", name = "customPage4")

+        public class Page4 extends SimpleNestedViewConfig

+        {

+        }

+    }

+

+    @Page(basePath = "subFolder") //overridden

+    public class SubFolder2 extends SimpleNestedViewConfig

+    {

+        @Page(basePath = "/", name = "customPage5")

+        public class Page5 extends SimpleNestedViewConfig

+        {

+        }

+

+        @Page(basePath = "my", name = "customPage6")

+        public class Page6 extends SimpleNestedViewConfig

+        {

+        }

+    }

 }
\ No newline at end of file
diff --git a/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/ViewConfigTest.java b/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/ViewConfigTest.java
index 7c91303..f4eab89 100644
--- a/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/ViewConfigTest.java
+++ b/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/ViewConfigTest.java
@@ -77,10 +77,26 @@
         viewConfigExtension.addPageDefinition(SimpleNestedViewConfig.Page1.class);

         viewConfigExtension.addPageDefinition(SimpleNestedViewConfig.Page2.class);

 

+        viewConfigExtension.addPageDefinition(SimpleNestedViewConfig.SubFolder.Page3.class);

+        viewConfigExtension.addPageDefinition(SimpleNestedViewConfig.SubFolder.Page4.class);

+

+        viewConfigExtension.addPageDefinition(SimpleNestedViewConfig.SubFolder2.Page5.class);

+        viewConfigExtension.addPageDefinition(SimpleNestedViewConfig.SubFolder2.Page6.class);

+

         assertEquals(ViewConfigCache.getViewConfigDescriptor(SimpleNestedViewConfig.Page1.class).getViewId(),

                                                        "/simpleNestedViewConfig/page1.xhtml");

         assertEquals(ViewConfigCache.getViewConfigDescriptor(SimpleNestedViewConfig.Page2.class).getViewId(),

                                                        "/simpleNestedViewConfig/page2.xhtml");

+

+        assertEquals(ViewConfigCache.getViewConfigDescriptor(SimpleNestedViewConfig.SubFolder.Page3.class).getViewId(),

+                                                       "/simpleNestedViewConfig/subFolder/customPage3.xhtml");

+        assertEquals(ViewConfigCache.getViewConfigDescriptor(SimpleNestedViewConfig.SubFolder.Page4.class).getViewId(),

+                "/my/customPage4.xhtml");

+

+        assertEquals(ViewConfigCache.getViewConfigDescriptor(SimpleNestedViewConfig.SubFolder2.Page5.class).getViewId(),

+                                                       "/customPage5.xhtml");

+        assertEquals(ViewConfigCache.getViewConfigDescriptor(SimpleNestedViewConfig.SubFolder2.Page6.class).getViewId(),

+                "/my/customPage6.xhtml");

     }

 

     @Test