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/02/06 04:12:38 UTC

svn commit: r1067579 - in /myfaces/extensions/cdi/trunk/jee-modules/jsf-module: api/src/main/java/org/apache/myfaces/extensions/cdi/jsf/api/config/view/ impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ impl/src/main/java/org/a...

Author: gpetracek
Date: Sun Feb  6 03:12:37 2011
New Revision: 1067579

URL: http://svn.apache.org/viewvc?rev=1067579&view=rev
Log:
EXTCDI-125 inline view-configs (initial draft)

Added:
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jsf/api/config/view/InlineViewConfigRoot.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ExtractedInlineViewConfigDefinitionEntry.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ExtractedViewConfigDefinitionEntry.java
      - copied, changed from r1059626, myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultViewConfigDefinitionEntry.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/InlineViewConfigEntry.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/BasefolderViewConfigRootMarker.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/RenamedBasefolderViewConfigRootMarker.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/SubfolderViewConfigRootMarker.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/OrderOverviewPage.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/SecuredPage.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/TestAccessDecisionVoter3.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/registration/
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/registration/RegistrationStep01PageBean.java
Removed:
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultViewConfigDefinitionEntry.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigCacheStore.java
Modified:
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultViewConfigExtractor.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigCache.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigExtension.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/spi/ViewConfigExtractor.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/ExceptionUtils.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/TestableViewConfigExtension.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/ViewConfigTest.java

Added: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jsf/api/config/view/InlineViewConfigRoot.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jsf/api/config/view/InlineViewConfigRoot.java?rev=1067579&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jsf/api/config/view/InlineViewConfigRoot.java (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jsf/api/config/view/InlineViewConfigRoot.java Sun Feb  6 03:12:37 2011
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.cdi.jsf.api.config.view;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * @author Gerhard Petracek
+ */
+@Target(TYPE)
+@Retention(RUNTIME)
+@Documented
+/**
+ * Only required for inline view-configs!
+ *
+ * Annotate a marker class or interface with this annotation for marking the package of the marker as base package.
+ *
+ * Simple example:
+ *
+ * Marker:
+ * my.customPackage.view.InlineViewConfigRootMarker //annotated with @InlineViewConfigRoot(pageBeanPostfix = "Page")
+ *
+ * PageBeans:
+ * my.customPackage.view.IndexPage //annotated with @Page and implements ViewConfig
+ * -> view-id: /index.xhtml
+ *
+ * my.customPackage.view.registration.RegistrationStep01 //annotated with @Page and implements ViewConfig
+ * -> view-id: /registration/registrationStep01.xhtml
+ */
+public @interface InlineViewConfigRoot
+{
+    String basePath() default ".";
+
+    String[] pageBeanPostfix() default "";
+}

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultViewConfigExtractor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultViewConfigExtractor.java?rev=1067579&r1=1067578&r2=1067579&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultViewConfigExtractor.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultViewConfigExtractor.java Sun Feb  6 03:12:37 2011
@@ -26,11 +26,14 @@ import org.apache.myfaces.extensions.cdi
 import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.ViewConfigEntry;
 import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.ViewConfigExtractor;
 
+import javax.inject.Named;
 import java.lang.annotation.Annotation;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Collection;
 
+import static org.apache.myfaces.extensions.cdi.jsf.impl.util.ExceptionUtils.missingInlineViewConfigRootMarkerException;
+
 /**
  * @author Gerhard Petracek
  */
@@ -39,21 +42,53 @@ class DefaultViewConfigExtractor impleme
     public ViewConfigEntry extractViewConfig(Class<? extends ViewConfig> viewDefinitionClass)
     {
         //use the interface to make clear which information we really need
-        ViewConfigEntry scannedViewConfig = new DefaultViewConfigDefinitionEntry(viewDefinitionClass);
+        ViewConfigEntry viewConfigEntry = new ExtractedViewConfigDefinitionEntry(viewDefinitionClass);
+
+        return extractViewConfigEntry(viewDefinitionClass, viewConfigEntry);
+    }
+
+    public boolean isInlineViewConfig(Class<? extends ViewConfig> viewDefinitionClass)
+    {
+        return isResolvable(viewDefinitionClass, new ArrayList<Class<? extends Annotation>>());
+    }
+
+    public ViewConfigEntry extractInlineViewConfig(Class<? extends ViewConfig> viewDefinitionClass)
+    {
+        Class viewConfigRootMarker = ViewConfigCache.getInlineViewConfigRootMarker();
+
+        if(viewConfigRootMarker == null)
+        {
+            throw missingInlineViewConfigRootMarkerException(viewDefinitionClass);
+        }
+
+        int startIndex = viewConfigRootMarker.getPackage().getName().length() + 1;
+        String basePath = viewDefinitionClass.getName()
+                .substring(startIndex, viewDefinitionClass.getName().lastIndexOf("."));
+
+        basePath = basePath.replace(".", "/");
+
+        //use the interface to make clear which information we really need
+        ViewConfigEntry viewConfigEntry = new ExtractedInlineViewConfigDefinitionEntry(viewDefinitionClass, basePath);
+
+        return extractViewConfigEntry(viewDefinitionClass, viewConfigEntry);
+    }
 
-        scanViewConfigClass(viewDefinitionClass, (DefaultViewConfigDefinitionEntry)scannedViewConfig);
+    private ViewConfigEntry extractViewConfigEntry(Class<? extends ViewConfig> viewDefinitionClass,
+                                                   ViewConfigEntry viewConfigEntry)
+    {
+        scanViewConfigClass(viewDefinitionClass, (ExtractedViewConfigDefinitionEntry)viewConfigEntry);
 
-        return new DefaultViewConfigEntry(scannedViewConfig.getViewId(),
+        return new DefaultViewConfigEntry(viewConfigEntry.getViewId(),
                                           viewDefinitionClass,
-                                          scannedViewConfig.getNavigationMode(),
-                                          scannedViewConfig.getViewParameter(),
-                                          scannedViewConfig.getAccessDecisionVoters(),
-                                          scannedViewConfig.getErrorView(),
-                                          scannedViewConfig.getMetaData());
+                                          viewConfigEntry.getNavigationMode(),
+                                          viewConfigEntry.getViewParameter(),
+                                          viewConfigEntry.getAccessDecisionVoters(),
+                                          viewConfigEntry.getErrorView(),
+                                          viewConfigEntry.getMetaData());
     }
 
     private Collection<Annotation> extractViewMetaData(
-            Class<?> targetClass, DefaultViewConfigDefinitionEntry entry)
+            Class<?> targetClass, ExtractedViewConfigDefinitionEntry entry)
     {
         List<Annotation> result = new ArrayList<Annotation>();
 
@@ -78,11 +113,11 @@ class DefaultViewConfigExtractor impleme
         return result;
     }
 
-    private void scanViewConfigClass(Class<?> viewDefinitionClass, DefaultViewConfigDefinitionEntry scannedViewConfig)
+    private void scanViewConfigClass(Class<?> viewDefinitionClass, ExtractedViewConfigDefinitionEntry scannedViewConfig)
     {
-        String defaultExtension = DefaultViewConfigDefinitionEntry.DEFAULT_EXTENSION;
-        String defaultPageName = DefaultViewConfigDefinitionEntry.DEFAULT_PAGE_NAME;
-        String rootPath = DefaultViewConfigDefinitionEntry.ROOT_PATH;
+        String defaultExtension = ExtractedViewConfigDefinitionEntry.DEFAULT_EXTENSION;
+        String defaultPageName = ExtractedViewConfigDefinitionEntry.DEFAULT_PAGE_NAME;
+        String rootPath = ExtractedViewConfigDefinitionEntry.ROOT_PATH;
 
         String currentBasePath;
         Page pageAnnotation;
@@ -162,4 +197,40 @@ class DefaultViewConfigExtractor impleme
             currentClass = currentClass.getSuperclass();
         }
     }
+
+    /**
+     * @param annotated current class to scan
+     * @param scannedAnnotations simple cycle prevention
+     * @return true to signal that the class is resolvable via EL
+     */
+    private boolean isResolvable(Class annotated, List<Class<? extends Annotation>> scannedAnnotations)
+    {
+        if(annotated.isAnnotation())
+        {
+            scannedAnnotations.add(annotated);
+        }
+
+        Class<? extends Annotation> annotationClass;
+        for(Annotation annotation : annotated.getAnnotations())
+        {
+            annotationClass = annotation.annotationType();
+
+            if(scannedAnnotations.contains(annotationClass))
+            {
+                continue;
+            }
+
+            if(Named.class.equals(annotationClass) || "javax.faces.bean.ManagedBean".equals(annotationClass.getName()))
+            {
+                return true;
+            }
+
+            //to support stereotypes
+            if(isResolvable(annotationClass, scannedAnnotations))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
 }

Added: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ExtractedInlineViewConfigDefinitionEntry.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ExtractedInlineViewConfigDefinitionEntry.java?rev=1067579&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ExtractedInlineViewConfigDefinitionEntry.java (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ExtractedInlineViewConfigDefinitionEntry.java Sun Feb  6 03:12:37 2011
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.cdi.jsf.impl.config.view;
+
+import org.apache.myfaces.extensions.cdi.core.api.config.view.ViewConfig;
+import org.apache.myfaces.extensions.cdi.jsf.api.config.view.InlineViewConfigRoot;
+
+/**
+ * @author Gerhard Petracek
+ */
+class ExtractedInlineViewConfigDefinitionEntry extends ExtractedViewConfigDefinitionEntry
+{
+    private static final long serialVersionUID = 4506644013820265055L;
+
+    public ExtractedInlineViewConfigDefinitionEntry(Class<? extends ViewConfig> viewDefinitionClass, String basePath)
+    {
+        super(viewDefinitionClass);
+        this.basePath = basePath + "/";
+    }
+
+    @Override
+    public void setBasePath(String currentBasePath)
+    {
+        //filtered
+    }
+
+    @Override
+    public String getViewId()
+    {
+        Class<?> viewConfigRootMarker = ViewConfigCache.getInlineViewConfigRootMarker();
+        InlineViewConfigRoot viewConfigRoot = viewConfigRootMarker.getAnnotation(InlineViewConfigRoot.class);
+
+        if(!viewConfigRoot.basePath().endsWith("/*") && !".".equals(viewConfigRoot.basePath()))
+        {
+            this.basePath = viewConfigRoot.basePath();
+        }
+
+        if(viewConfigRoot.basePath().endsWith("/*"))
+        {
+            String packageName = viewConfigRoot.basePath();
+            this.basePath = packageName.substring(0, packageName.length() - 2) + "/" + this.basePath;
+        }
+
+        if(".".equals(viewConfigRoot.basePath()))
+        {
+            String packageName = viewConfigRootMarker.getPackage().getName();
+            this.basePath = "/" + packageName.substring(packageName.lastIndexOf(".") + 1) + "/" + this.basePath;
+        }
+
+        if(DEFAULT_PAGE_NAME.equals(this.pageName))
+        {
+            this.pageName = createPageName(this.viewDefinitionClass.getSimpleName());
+
+            for(String postfix : viewConfigRoot.pageBeanPostfix())
+            {
+                if(this.pageName.endsWith(postfix))
+                {
+                    this.pageName = this.pageName.substring(0, this.pageName.length() - postfix.length());
+                    break;
+                }
+            }
+        }
+
+        return super.getViewId();
+    }
+}

Copied: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ExtractedViewConfigDefinitionEntry.java (from r1059626, myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultViewConfigDefinitionEntry.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ExtractedViewConfigDefinitionEntry.java?p2=myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ExtractedViewConfigDefinitionEntry.java&p1=myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultViewConfigDefinitionEntry.java&r1=1059626&r2=1067579&rev=1067579&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultViewConfigDefinitionEntry.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ExtractedViewConfigDefinitionEntry.java Sun Feb  6 03:12:37 2011
@@ -35,7 +35,7 @@ import java.util.Collections;
 /**
  * @author Gerhard Petracek
  */
-class DefaultViewConfigDefinitionEntry implements ViewConfigEntry
+class ExtractedViewConfigDefinitionEntry implements ViewConfigEntry
 {
     private static final long serialVersionUID = -8387356240329549455L;
 
@@ -51,15 +51,15 @@ class DefaultViewConfigDefinitionEntry i
 
     List<Annotation> viewMetaDataList = new ArrayList<Annotation>();
 
-    private Class<? extends ViewConfig> viewDefinitionClass;
-    private String basePath = ROOT_PATH;
+    protected Class<? extends ViewConfig> viewDefinitionClass;
+    protected String basePath = ROOT_PATH;
     private Map<String, String> simpleClassNameToPathMapping = new HashMap<String, String>();
-    private String pageName = DEFAULT_PAGE_NAME;
+    protected String pageName = DEFAULT_PAGE_NAME;
     private String extension = DEFAULT_EXTENSION;
     private Page.NavigationMode navigationMode = null;
     private Page.ViewParameter viewParameter = null;
 
-    public DefaultViewConfigDefinitionEntry(Class<? extends ViewConfig> viewDefinitionClass)
+    public ExtractedViewConfigDefinitionEntry(Class<? extends ViewConfig> viewDefinitionClass)
     {
         this.viewDefinitionClass = viewDefinitionClass;
     }
@@ -179,7 +179,7 @@ class DefaultViewConfigDefinitionEntry i
             {
                 className = className.substring(className.lastIndexOf(".") + 1);
             }
-            className = className.substring(0, 1).toLowerCase() + className.substring(1);
+            className = createPageName(className);
             viewId.append(className);
         }
         //nested classes with manually defined page name and shared basePath
@@ -190,7 +190,7 @@ class DefaultViewConfigDefinitionEntry i
             this.basePath = "";
             className = className.substring(className.lastIndexOf(".") + 1);
             className = convertToPathSyntax(className, this.simpleClassNameToPathMapping);
-            className = className.substring(0, 1).toLowerCase() + className.substring(1);
+            className = createPageName(className);
             className = className.substring(0, className.lastIndexOf("/") + 1);
             className += this.pageName;
             viewId.append(className);
@@ -219,6 +219,12 @@ class DefaultViewConfigDefinitionEntry i
         return result;
     }
 
+    protected String createPageName(String className)
+    {
+        className = className.substring(0, 1).toLowerCase() + className.substring(1);
+        return className;
+    }
+
     /*
      * TODO refactor it!
      */

Added: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/InlineViewConfigEntry.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/InlineViewConfigEntry.java?rev=1067579&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/InlineViewConfigEntry.java (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/InlineViewConfigEntry.java Sun Feb  6 03:12:37 2011
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.cdi.jsf.impl.config.view;
+
+import org.apache.myfaces.extensions.cdi.core.api.config.view.ViewConfig;
+import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.ViewConfigExtractor;
+
+/**
+ * @author Gerhard Petracek
+ */
+class InlineViewConfigEntry
+{
+    private final ViewConfigExtractor viewConfigExtractor;
+    private final Class<? extends ViewConfig> viewConfigDefinition;
+
+    InlineViewConfigEntry(ViewConfigExtractor viewConfigExtractor, Class<? extends ViewConfig> viewConfigDefinition)
+    {
+        this.viewConfigExtractor = viewConfigExtractor;
+        this.viewConfigDefinition = viewConfigDefinition;
+    }
+
+    ViewConfigExtractor getViewConfigExtractor()
+    {
+        return viewConfigExtractor;
+    }
+
+    Class<? extends ViewConfig> getViewConfigDefinition()
+    {
+        return viewConfigDefinition;
+    }
+}

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigCache.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigCache.java?rev=1067579&r1=1067578&r2=1067579&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigCache.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigCache.java Sun Feb  6 03:12:37 2011
@@ -19,15 +19,20 @@
 package org.apache.myfaces.extensions.cdi.jsf.impl.config.view;
 
 import org.apache.myfaces.extensions.cdi.core.api.config.view.ViewConfig;
-import org.apache.myfaces.extensions.cdi.core.api.config.view.DefaultErrorView;
 import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.ViewConfigEntry;
+import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.ViewConfigExtractor;
 
-import static org.apache.myfaces.extensions.cdi.jsf.impl.config.view.ViewConfigCacheStore.*;
-import static org.apache.myfaces.extensions.cdi.jsf.impl.config.view.ViewConfigCacheStore.setDefaultErrorView;
+import org.apache.myfaces.extensions.cdi.core.api.config.view.DefaultErrorView;
+import org.apache.myfaces.extensions.cdi.core.api.util.ClassUtils;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
+import java.util.HashMap;
 import java.util.Collection;
 
+import static org.apache.myfaces.extensions.cdi.jsf.impl.util.ExceptionUtils.*;
+
 /**
  * TODO move exceptions to util class
  *
@@ -35,6 +40,28 @@ import java.util.Collection;
  */
 public class ViewConfigCache
 {
+    //we don't need a ConcurrentHashMap - write access is only allowed during the startup (by one thread)
+
+    private static Map<ClassLoader, Map<String, ViewConfigEntry>>
+            viewIdToViewDefinitionEntryMapping
+            = new HashMap<ClassLoader, Map<String, ViewConfigEntry>>();
+
+    private static Map<ClassLoader, Map<Class<? extends ViewConfig>, ViewConfigEntry>>
+            viewDefinitionToViewDefinitionEntryMapping =
+            new HashMap<ClassLoader, Map<Class<? extends ViewConfig>, ViewConfigEntry>>();
+
+    private static Map<ClassLoader, List<InlineViewConfigEntry>>
+            inlineViewDefinitionEntryList =
+            new HashMap<ClassLoader, List<InlineViewConfigEntry>>();
+
+    private static Map<ClassLoader, ViewConfigEntry>
+            defaultErrorView =
+            new HashMap<ClassLoader, ViewConfigEntry>();
+
+    private static Map<ClassLoader, Class>
+            inlineViewConfigRootMarker =
+            new HashMap<ClassLoader, Class>();
+
     static void addViewDefinition(String viewId, ViewConfigEntry viewDefinitionEntry)
     {
         storeViewDefinition(viewId, viewDefinitionEntry, false);
@@ -45,64 +72,210 @@ public class ViewConfigCache
         storeViewDefinition(viewId, viewDefinitionEntry, true);
     }
 
-    private static void storeViewDefinition(String viewId, ViewConfigEntry viewDefinitionEntry, boolean allowReplace)
+    public static ViewConfigEntry getViewDefinition(String viewId)
     {
-        tryToStorePageAsDefaultErrorPage(viewDefinitionEntry);
+        return getViewIdToViewDefinitionEntryMapping(true).get(viewId);
+    }
+
+    public static Collection<ViewConfigEntry> getViewConfigEntries()
+    {
+        Map<String, ViewConfigEntry> entryMap = getViewIdToViewDefinitionEntryMapping(true);
+
+        return entryMap.values();
+    }
+
+    public static ViewConfigEntry getViewDefinition(Class<? extends ViewConfig> viewDefinitionClass)
+    {
+        return getViewDefinitionToViewDefinitionEntryMapping(true).get(viewDefinitionClass);
+    }
+
+    public static ViewConfigEntry getDefaultErrorView()
+    {
+        lazyInlineViewConfigCompilation();
+        return defaultErrorView.get(getClassloader());
+    }
+
+    /**
+     * resets the whole cache - e.g. needed for junit tests
+     */
+    public static void reset()
+    {
+        getViewIdToViewDefinitionEntryMapping(false).clear();
+        getViewDefinitionToViewDefinitionEntryMapping(false).clear();
+        getInlineViewDefinitionToViewDefinitionEntryList().clear();
+
+        defaultErrorView.put(getClassloader(), null);
+        inlineViewConfigRootMarker.put(getClassloader(), null);
+    }
+
+    static void queueInlineViewConfig(ViewConfigExtractor viewConfigExtractor, Class<? extends ViewConfig> beanClass)
+    {
+        getInlineViewDefinitionToViewDefinitionEntryList()
+                .add(new InlineViewConfigEntry(viewConfigExtractor, beanClass));
+    }
+
+    static void setInlineViewConfigRootMarker(Class viewConfigRootClass)
+    {
+        Class storedPageClass = getInlineViewConfigRootMarker();
+
+        if(storedPageClass != null)
+        {
+            if(!storedPageClass.equals(viewConfigRootClass))
+            {
+                throw ambiguousViewConfigRootException(storedPageClass, viewConfigRootClass);
+            }
+        }
+        else
+        {
+            inlineViewConfigRootMarker.put(getClassloader(), viewConfigRootClass);
+        }
+    }
+
+    static Class getInlineViewConfigRootMarker()
+    {
+        return inlineViewConfigRootMarker.get(getClassloader());
+    }
 
-        if(getViewIdToViewDefinitionEntryMapping().containsKey(viewId) && !allowReplace)
+    static void storeViewDefinition(String viewId,
+                                    ViewConfigEntry viewDefinitionEntry,
+                                    boolean allowReplace,
+                                    boolean lazyInit)
+    {
+        if(getViewIdToViewDefinitionEntryMapping(lazyInit).containsKey(viewId) && !allowReplace)
         {
-            throw new IllegalArgumentException(viewId + " is already mapped to "
-                    + viewId + " via " + getViewIdToViewDefinitionEntryMapping().get(viewId).getViewDefinitionClass()
-                    + " -> a further view definition (" +
-                    viewDefinitionEntry.getViewDefinitionClass().getName() + ") is invalid");
+            throw ambiguousViewDefinitionException(
+                    viewId,
+                    viewDefinitionEntry.getViewDefinitionClass(),
+                    getViewIdToViewDefinitionEntryMapping(lazyInit).get(viewId).getViewDefinitionClass());
         }
-        getViewIdToViewDefinitionEntryMapping().put(viewId, viewDefinitionEntry);
-        getViewDefinitionToViewDefinitionEntryMapping()
+
+        tryToStorePageAsDefaultErrorPage(viewDefinitionEntry);
+
+        getViewIdToViewDefinitionEntryMapping(lazyInit).put(viewId, viewDefinitionEntry);
+        getViewDefinitionToViewDefinitionEntryMapping(lazyInit)
                 .put(viewDefinitionEntry.getViewDefinitionClass(), viewDefinitionEntry);
     }
 
+    static void storeViewDefinition(String viewId, ViewConfigEntry viewDefinitionEntry, boolean allowReplace)
+    {
+        storeViewDefinition(viewId, viewDefinitionEntry, allowReplace, true);
+    }
+
+    private static Map<String, ViewConfigEntry> getViewIdToViewDefinitionEntryMapping(boolean lazyInit)
+    {
+        if(lazyInit)
+        {
+            lazyInlineViewConfigCompilation();
+        }
+
+        Map<String, ViewConfigEntry> result = viewIdToViewDefinitionEntryMapping.get(getClassloader());
+
+        if(result == null)
+        {
+            result = new HashMap<String, ViewConfigEntry>();
+            viewIdToViewDefinitionEntryMapping.put(getClassloader(), result);
+        }
+
+        return result;
+    }
+
+    private static Map<Class<? extends ViewConfig>, ViewConfigEntry>
+        getViewDefinitionToViewDefinitionEntryMapping(boolean lazyInit)
+    {
+        if(lazyInit)
+        {
+            lazyInlineViewConfigCompilation();
+        }
+
+        Map<Class<? extends ViewConfig>, ViewConfigEntry> result =
+                viewDefinitionToViewDefinitionEntryMapping.get(getClassloader());
+
+        if(result == null)
+        {
+            result = new HashMap<Class<? extends ViewConfig>, ViewConfigEntry>();
+            viewDefinitionToViewDefinitionEntryMapping.put(getClassloader(), result);
+        }
+        return result;
+    }
+
+    private static List<InlineViewConfigEntry> getInlineViewDefinitionToViewDefinitionEntryList()
+    {
+        List<InlineViewConfigEntry> inlineViewConfigEntryList = inlineViewDefinitionEntryList.get(getClassloader());
+
+        if(inlineViewConfigEntryList == null)
+        {
+            inlineViewConfigEntryList = new ArrayList<InlineViewConfigEntry>();
+            inlineViewDefinitionEntryList.put(getClassloader(), inlineViewConfigEntryList);
+        }
+        return inlineViewConfigEntryList;
+    }
+
     private static void tryToStorePageAsDefaultErrorPage(ViewConfigEntry viewDefinitionEntry)
     {
         if(DefaultErrorView.class.isAssignableFrom(viewDefinitionEntry.getViewDefinitionClass()))
         {
-            if(getDefaultErrorViewForApplication() != null)
+            ViewConfigEntry defaultErrorView = getDefaultErrorView();
+            if(defaultErrorView != null)
             {
-                throw new IllegalStateException("multiple error pages found " +
-                        getDefaultErrorViewForApplication().getViewDefinitionClass().getClass().getName() + " and " +
-                        viewDefinitionEntry.getViewDefinitionClass().getName());
+                throw ambiguousDefaultErrorViewDefinitionException(viewDefinitionEntry.getViewDefinitionClass(),
+                                                                   defaultErrorView.getViewDefinitionClass());
             }
 
             setDefaultErrorView(viewDefinitionEntry);
         }
     }
 
-    public static ViewConfigEntry getViewDefinition(String viewId)
+    private static void setDefaultErrorView(ViewConfigEntry viewDefinitionEntry)
     {
-        return getViewIdToViewDefinitionEntryMapping().get(viewId);
+        //TODO
+        defaultErrorView.put(getClassloader(), viewDefinitionEntry);
     }
 
-    public static Collection<ViewConfigEntry> getViewConfigEntries()
+    private static ClassLoader getClassloader()
     {
-        Map<String, ViewConfigEntry> entryMap = getViewIdToViewDefinitionEntryMapping();
-
-        return entryMap.values();
+        return ClassUtils.getClassLoader(null);
     }
 
-    public static ViewConfigEntry getViewDefinition(Class<? extends ViewConfig> viewDefinitionClass)
+    private static void lazyInlineViewConfigCompilation()
     {
-        return getViewDefinitionToViewDefinitionEntryMapping().get(viewDefinitionClass);
-    }
+        List<InlineViewConfigEntry> inlineViewConfigEntryList =
+                inlineViewDefinitionEntryList.get(getClassloader());
 
-    public static ViewConfigEntry getDefaultErrorView()
-    {
-        return getDefaultErrorViewForApplication();
+        if(inlineViewConfigEntryList == null)
+        {
+            //there is no inline view config or it is already processed
+            return;
+        }
+
+        registerInlineViewConfigEntry();
     }
 
-    /**
-     * resets the whole cache - e.g. needed for junit tests
-     */
-    public static void reset()
+    private synchronized static void registerInlineViewConfigEntry()
     {
-        clear();
+        List<InlineViewConfigEntry> inlineViewConfigEntryList =
+                inlineViewDefinitionEntryList.get(getClassloader());
+
+        // switch into paranoia mode
+        if(inlineViewConfigEntryList == null)
+        {
+            return;
+        }
+
+        ViewConfigEntry viewConfigEntry;
+        for(InlineViewConfigEntry inlineViewConfigEntry : inlineViewConfigEntryList)
+        {
+            viewConfigEntry = inlineViewConfigEntry.getViewConfigExtractor()
+                    .extractInlineViewConfig(inlineViewConfigEntry.getViewConfigDefinition());
+
+            if(viewConfigEntry != null)
+            {
+                //activate view controller annotations
+                viewConfigEntry.addPageBean(viewConfigEntry.getViewDefinitionClass());
+
+                storeViewDefinition(viewConfigEntry.getViewId(), viewConfigEntry, false, false);
+            }
+        }
+
+        inlineViewDefinitionEntryList.put(getClassloader(), null);
     }
 }

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigExtension.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigExtension.java?rev=1067579&r1=1067578&r2=1067579&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigExtension.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigExtension.java Sun Feb  6 03:12:37 2011
@@ -25,6 +25,7 @@ import org.apache.myfaces.extensions.cdi
 import org.apache.myfaces.extensions.cdi.core.api.Deactivatable;
 import org.apache.myfaces.extensions.cdi.core.impl.util.CodiUtils;
 import org.apache.myfaces.extensions.cdi.jsf.api.config.view.Page;
+import org.apache.myfaces.extensions.cdi.jsf.api.config.view.InlineViewConfigRoot;
 import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.PageBeanConfigEntry;
 import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.ViewConfigEntry;
 import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.ViewConfigExtractor;
@@ -57,10 +58,30 @@ public class ViewConfigExtension impleme
 
         CodiStartupBroadcaster.broadcastStartup();
 
-        if (processAnnotatedType.getAnnotatedType().isAnnotationPresent(Page.class))
+        if(processAnnotatedType.getAnnotatedType().isAnnotationPresent(InlineViewConfigRoot.class))
         {
-            addPageDefinition(processAnnotatedType.getAnnotatedType().getJavaClass());
+            setInlineViewConfigRootMarker(processAnnotatedType.getAnnotatedType().getJavaClass());
             processAnnotatedType.veto();
+            return;
+        }
+
+        if (processAnnotatedType.getAnnotatedType().isAnnotationPresent(Page.class))
+        {
+            validateViewConfigDefinition(processAnnotatedType.getAnnotatedType().getJavaClass());
+
+            @SuppressWarnings({"unchecked"})
+            Class<? extends ViewConfig> beanClass = processAnnotatedType.getAnnotatedType().getJavaClass();
+
+            ViewConfigExtractor viewConfigExtractor = getViewConfigExtractor();
+            if(isInlineViewConfig(viewConfigExtractor, beanClass))
+            {
+                addInlinePageDefinition(viewConfigExtractor, beanClass);
+            }
+            else
+            {
+                addPageDefinition(beanClass);
+                processAnnotatedType.veto();
+            }
         }
 
         if (processAnnotatedType.getAnnotatedType().isAnnotationPresent(View.class) &&
@@ -74,7 +95,12 @@ public class ViewConfigExtension impleme
         }
     }
 
-    protected void addPageDefinition(Class pageDefinitionClass)
+    protected void setInlineViewConfigRootMarker(Class markerClass)
+    {
+        ViewConfigCache.setInlineViewConfigRootMarker(markerClass);
+    }
+
+    protected void addPageDefinition(Class<? extends ViewConfig> pageDefinitionClass)
     {
         ViewConfigEntry newEntry = createViewConfigEntry(pageDefinitionClass);
 
@@ -105,6 +131,26 @@ public class ViewConfigExtension impleme
         }
     }
 
+    protected boolean isInlineViewConfig(Class<? extends ViewConfig> beanClass)
+    {
+        return isInlineViewConfig(getViewConfigExtractor(), beanClass);
+    }
+
+    private boolean isInlineViewConfig(ViewConfigExtractor viewConfigExtractor, Class<? extends ViewConfig> beanClass)
+    {
+        return viewConfigExtractor.isInlineViewConfig(beanClass);
+    }
+
+    protected void addInlinePageDefinition(Class<? extends ViewConfig> beanClass)
+    {
+        addInlinePageDefinition(getViewConfigExtractor(), beanClass);
+    }
+
+    private void addInlinePageDefinition(ViewConfigExtractor viewConfigExtractor, Class<? extends ViewConfig> beanClass)
+    {
+        ViewConfigCache.queueInlineViewConfig(viewConfigExtractor, beanClass);
+    }
+
     /**
      * important: {@link org.apache.myfaces.extensions.cdi.core.api.config.view.View#inline()} isn't supported!
      *
@@ -150,18 +196,8 @@ public class ViewConfigExtension impleme
         }
     }
 
-    protected ViewConfigEntry createViewConfigEntry(Class pageDefinitionClass)
+    protected ViewConfigEntry createViewConfigEntry(Class<? extends ViewConfig> viewDefinitionClass)
     {
-        if(!ViewConfig.class.isAssignableFrom(pageDefinitionClass))
-        {
-            throw new IllegalArgumentException(
-                    "the page definition " + pageDefinitionClass.getName() + " has to implement "
-                            + ViewConfig.class.getName());
-        }
-
-        @SuppressWarnings({"unchecked"})
-        Class<? extends ViewConfig> viewDefinitionClass = (Class<? extends ViewConfig>)pageDefinitionClass;
-
         //we use abstract classes for nesting definitions
         //TODO log a warning in case of project-stage dev
         if(Modifier.isAbstract(viewDefinitionClass.getModifiers()))
@@ -169,17 +205,31 @@ public class ViewConfigExtension impleme
             return null;
         }
 
+        ViewConfigEntry result = getViewConfigExtractor().extractViewConfig(viewDefinitionClass);
+        return result;
+    }
+
+    private void validateViewConfigDefinition(Class beanClass)
+    {
+        if(!ViewConfig.class.isAssignableFrom(beanClass))
+        {
+            throw new IllegalArgumentException(
+                    "the page definition " + beanClass.getName() + " has to implement "
+                            + ViewConfig.class.getName());
+        }
+    }
+
+    private ViewConfigExtractor getViewConfigExtractor()
+    {
         ViewConfigExtractor viewConfigExtractor = CodiUtils.lookupFromEnvironment(VIEW_CONFIG_EXTRACTOR_PROPERTY_NAME,
-                                                                                  VIEW_CONFIG_EXTRACTOR_JNDI_NAME,
-                                                                                  ViewConfigExtractor.class);
-        
+                VIEW_CONFIG_EXTRACTOR_JNDI_NAME,
+                ViewConfigExtractor.class);
+
         if(viewConfigExtractor == null)
         {
             viewConfigExtractor = new DefaultViewConfigExtractor();
         }
-
-        ViewConfigEntry result = viewConfigExtractor.extractViewConfig(viewDefinitionClass);
-        return result;
+        return viewConfigExtractor;
     }
 
     public boolean isActivated()

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/spi/ViewConfigExtractor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/spi/ViewConfigExtractor.java?rev=1067579&r1=1067578&r2=1067579&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/spi/ViewConfigExtractor.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/spi/ViewConfigExtractor.java Sun Feb  6 03:12:37 2011
@@ -26,4 +26,8 @@ import org.apache.myfaces.extensions.cdi
 public interface ViewConfigExtractor
 {
     ViewConfigEntry extractViewConfig(Class<? extends ViewConfig> viewDefinitionClass);
+
+    boolean isInlineViewConfig(Class<? extends ViewConfig> viewDefinitionClass);
+
+    ViewConfigEntry extractInlineViewConfig(Class<? extends ViewConfig> viewDefinitionClass);
 }

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/ExceptionUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/ExceptionUtils.java?rev=1067579&r1=1067578&r2=1067579&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/ExceptionUtils.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/ExceptionUtils.java Sun Feb  6 03:12:37 2011
@@ -18,9 +18,11 @@
  */
 package org.apache.myfaces.extensions.cdi.jsf.impl.util;
 
+import org.apache.myfaces.extensions.cdi.core.api.config.view.ViewConfig;
 import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.WindowContext;
 import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.Conversation;
 import org.apache.myfaces.extensions.cdi.core.impl.scope.conversation.spi.WindowContextManager;
+import org.apache.myfaces.extensions.cdi.jsf.api.config.view.InlineViewConfigRoot;
 import org.apache.myfaces.extensions.cdi.jsf.impl.scope.conversation.spi.EditableWindowContext;
 import org.apache.myfaces.extensions.cdi.jsf.impl.scope.conversation.spi.EditableWindowContextManager;
 import org.apache.myfaces.extensions.cdi.jsf.impl.scope.conversation.spi.EditableConversation;
@@ -88,4 +90,52 @@ public class ExceptionUtils
     {
         return new IllegalArgumentException("Cannot find conversation with key: " + conversationKey);
     }
+
+    public static IllegalStateException missingInlineViewConfigRootMarkerException(
+            Class<? extends ViewConfig> viewDefinitionClass)
+    {
+        StringBuilder message = new StringBuilder();
+
+        message.append(viewDefinitionClass.getName());
+        message.append(" is an inline view-config and no page-root marker has been found. ");
+        message.append("Please remove the @Page annotation ");
+        message.append("or add a marker class or interface in the root package of your page-beans ");
+        message.append("and annotate it with ");
+        message.append(InlineViewConfigRoot.class.getName());
+        message.append(" or refactor it to normal view-configs");
+        
+        throw new IllegalStateException(message.toString());
+    }
+
+    public static IllegalStateException ambiguousViewConfigRootException(
+            Class storedPageClass, Class viewConfigRootClass)
+    {
+        StringBuilder message = new StringBuilder();
+
+        message.append("Inline view-configs don't support multiple page-root markers in the same application.\n");
+        message.append("Refactor to normal view-configs or remove ");
+        message.append(storedPageClass.getName());
+        message.append(" or ");
+        message.append(viewConfigRootClass.getName());
+
+        throw new IllegalStateException(message.toString());
+    }
+
+    public static IllegalArgumentException ambiguousViewDefinitionException(String viewId,
+                                                                            Class<? extends ViewConfig> newDef,
+                                                                            Class<? extends ViewConfig> existingDef)
+    {
+        return new IllegalArgumentException(viewId + " is already mapped to "
+                + viewId + " via " + existingDef.getName()
+                + " -> a further view definition (" +
+                newDef.getName() + ") is invalid");
+    }
+
+    public static IllegalStateException ambiguousDefaultErrorViewDefinitionException(Class<? extends ViewConfig> newDef,
+                                                                         Class<? extends ViewConfig> existingDef)
+    {
+        return new IllegalStateException("multiple error pages found " +
+                        existingDef.getName() + " and " +
+                        newDef.getName());
+    }
 }

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/TestableViewConfigExtension.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/TestableViewConfigExtension.java?rev=1067579&r1=1067578&r2=1067579&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/TestableViewConfigExtension.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/TestableViewConfigExtension.java Sun Feb  6 03:12:37 2011
@@ -18,6 +18,7 @@
  */
 package org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view;
 
+import org.apache.myfaces.extensions.cdi.core.api.config.view.ViewConfig;
 import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.ViewConfigExtension;
 
 /**
@@ -26,8 +27,26 @@ import org.apache.myfaces.extensions.cdi
 class TestableViewConfigExtension extends ViewConfigExtension
 {
     @Override
-    public void addPageDefinition(Class pageDefinitionClass)
+    public void addPageDefinition(Class<? extends ViewConfig> pageDefinitionClass)
     {
         super.addPageDefinition(pageDefinitionClass);
     }
+
+    @Override
+    public void setInlineViewConfigRootMarker(Class viewConfigRootMarker)
+    {
+        super.setInlineViewConfigRootMarker(viewConfigRootMarker);
+    }
+
+    @Override
+    public void addInlinePageDefinition(Class<? extends ViewConfig> beanClass)
+    {
+        super.addInlinePageDefinition(beanClass);
+    }
+
+    @Override
+    public boolean isInlineViewConfig(Class<? extends ViewConfig> beanClass)
+    {
+        return super.isInlineViewConfig(beanClass);
+    }
 }

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/ViewConfigTest.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/ViewConfigTest.java?rev=1067579&r1=1067578&r2=1067579&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/ViewConfigTest.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/ViewConfigTest.java Sun Feb  6 03:12:37 2011
@@ -22,6 +22,12 @@ import org.apache.myfaces.extensions.cdi
 import org.apache.myfaces.extensions.cdi.jsf.api.config.view.Page;
 import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.PageBeanConfigEntry;
 import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.ViewConfigEntry;
+import org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages.BasefolderViewConfigRootMarker;
+import org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages.RenamedBasefolderViewConfigRootMarker;
+import org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages.SubfolderViewConfigRootMarker;
+import org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages.order.OrderOverviewPage;
+import org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages.registration.RegistrationStep01PageBean;
+import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 import static org.testng.Assert.*;
 import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.ViewConfigCache;
@@ -36,6 +42,12 @@ public class ViewConfigTest
 {
     private TestableViewConfigExtension viewConfigExtension = new TestableViewConfigExtension();
 
+    @BeforeMethod
+    public void resetCache()
+    {
+        ViewConfigCache.reset();
+    }
+
     @Test
     public void testSimpleCase()
     {
@@ -266,4 +278,119 @@ public class ViewConfigTest
                        pageBeanConfigEntry.getBeanClass().equals(TestPageBean3.class));
         }
     }
+
+    @Test
+    public void testBasefolderInlineViewConfig()
+    {
+        viewConfigExtension.setInlineViewConfigRootMarker(BasefolderViewConfigRootMarker.class);
+        viewConfigExtension.addInlinePageDefinition(OrderOverviewPage.class);
+        viewConfigExtension.addInlinePageDefinition(RegistrationStep01PageBean.class);
+
+        assertEquals(ViewConfigCache.getViewDefinition(
+                OrderOverviewPage.class).getViewId(),
+                "/pages/order/orderOverview.xhtml");
+        assertEquals(ViewConfigCache.getViewDefinition(
+                RegistrationStep01PageBean.class).getViewId(),
+                "/pages/registration/registrationStep01.xhtml");
+
+        assertEquals(ViewConfigCache.getViewDefinition(
+                OrderOverviewPage.class).getAccessDecisionVoters().iterator().next().getName(),
+                "org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages.order.TestAccessDecisionVoter3");
+
+        PageBeanConfigEntry pageBeanConfigEntry = ViewConfigCache.getViewDefinition(RegistrationStep01PageBean.class)
+                .getPageBeanDefinitions().iterator().next();
+
+        assertEquals(pageBeanConfigEntry.getBeanClass(), RegistrationStep01PageBean.class);
+        assertEquals(pageBeanConfigEntry.getPreRenderViewMethods().size(), 1);
+    }
+
+    @Test
+    public void testRenamvedBasefolderInlineViewConfig()
+    {
+        viewConfigExtension.setInlineViewConfigRootMarker(RenamedBasefolderViewConfigRootMarker.class);
+        viewConfigExtension.addInlinePageDefinition(OrderOverviewPage.class);
+        viewConfigExtension.addInlinePageDefinition(RegistrationStep01PageBean.class);
+
+        assertEquals(ViewConfigCache.getViewDefinition(
+                OrderOverviewPage.class).getViewId(),
+                "/views/order/orderOverview.xhtml");
+        assertEquals(ViewConfigCache.getViewDefinition(
+                RegistrationStep01PageBean.class).getViewId(),
+                "/views/registration/registrationStep01.xhtml");
+
+        assertEquals(ViewConfigCache.getViewDefinition(
+                OrderOverviewPage.class).getAccessDecisionVoters().iterator().next().getName(),
+                "org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages.order.TestAccessDecisionVoter3");
+
+        PageBeanConfigEntry pageBeanConfigEntry = ViewConfigCache.getViewDefinition(RegistrationStep01PageBean.class)
+                .getPageBeanDefinitions().iterator().next();
+
+        assertEquals(pageBeanConfigEntry.getBeanClass(), RegistrationStep01PageBean.class);
+        assertEquals(pageBeanConfigEntry.getPreRenderViewMethods().size(), 1);
+    }
+
+    @Test
+    public void testSubfolderInlineViewConfig()
+    {
+        viewConfigExtension.setInlineViewConfigRootMarker(SubfolderViewConfigRootMarker.class);
+        viewConfigExtension.addInlinePageDefinition(OrderOverviewPage.class);
+        viewConfigExtension.addInlinePageDefinition(RegistrationStep01PageBean.class);
+
+        assertEquals(ViewConfigCache.getViewDefinition(
+                OrderOverviewPage.class).getViewId(),
+                "/order/orderOverview.xhtml");
+        assertEquals(ViewConfigCache.getViewDefinition(
+                RegistrationStep01PageBean.class).getViewId(),
+                "/registration/registrationStep01.xhtml");
+
+        assertEquals(ViewConfigCache.getViewDefinition(
+                OrderOverviewPage.class).getAccessDecisionVoters().iterator().next().getName(),
+                "org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages.order.TestAccessDecisionVoter3");
+
+        PageBeanConfigEntry pageBeanConfigEntry = ViewConfigCache.getViewDefinition(RegistrationStep01PageBean.class)
+                .getPageBeanDefinitions().iterator().next();
+
+        assertEquals(pageBeanConfigEntry.getBeanClass(), RegistrationStep01PageBean.class);
+        assertEquals(pageBeanConfigEntry.getPreRenderViewMethods().size(), 1);
+    }
+
+    @Test
+    public void testInlineViewConfigDetection()
+    {
+        assertTrue(viewConfigExtension.isInlineViewConfig(OrderOverviewPage.class));
+        assertTrue(viewConfigExtension.isInlineViewConfig(RegistrationStep01PageBean.class));
+    }
+
+    @Test
+    public void testMissingInlineViewConfigRootMarkerWithInlineViewConfig()
+    {
+        viewConfigExtension.addInlinePageDefinition(OrderOverviewPage.class);
+
+        try
+        {
+            assertEquals(ViewConfigCache.getViewDefinition(
+                    OrderOverviewPage.class).getViewId(),
+                    "/order/orderOverview.xhtml");
+        }
+        catch (IllegalStateException e)
+        {
+            return;
+        }
+        fail();
+    }
+
+    @Test
+    public void testAmbiguousInlineViewConfigRootMarkerWithInlineViewConfig()
+    {
+        try
+        {
+            viewConfigExtension.setInlineViewConfigRootMarker(SubfolderViewConfigRootMarker.class);
+            viewConfigExtension.setInlineViewConfigRootMarker(getClass());
+        }
+        catch (IllegalStateException e)
+        {
+            return;
+        }
+        fail();
+    }
 }

Added: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/BasefolderViewConfigRootMarker.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/BasefolderViewConfigRootMarker.java?rev=1067579&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/BasefolderViewConfigRootMarker.java (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/BasefolderViewConfigRootMarker.java Sun Feb  6 03:12:37 2011
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages;
+
+import org.apache.myfaces.extensions.cdi.jsf.api.config.view.InlineViewConfigRoot;
+
+/**
+ * @author Gerhard Petracek
+ */
+@InlineViewConfigRoot(pageBeanPostfix = {"Page", "PageBean"})
+public interface BasefolderViewConfigRootMarker
+{
+}

Added: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/RenamedBasefolderViewConfigRootMarker.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/RenamedBasefolderViewConfigRootMarker.java?rev=1067579&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/RenamedBasefolderViewConfigRootMarker.java (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/RenamedBasefolderViewConfigRootMarker.java Sun Feb  6 03:12:37 2011
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages;
+
+import org.apache.myfaces.extensions.cdi.jsf.api.config.view.InlineViewConfigRoot;
+
+/**
+ * @author Gerhard Petracek
+ */
+@InlineViewConfigRoot(basePath = "/views/*", pageBeanPostfix = {"Page", "PageBean"})
+public interface RenamedBasefolderViewConfigRootMarker
+{
+}

Added: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/SubfolderViewConfigRootMarker.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/SubfolderViewConfigRootMarker.java?rev=1067579&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/SubfolderViewConfigRootMarker.java (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/SubfolderViewConfigRootMarker.java Sun Feb  6 03:12:37 2011
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages;
+
+import org.apache.myfaces.extensions.cdi.jsf.api.config.view.InlineViewConfigRoot;
+
+/**
+ * @author Gerhard Petracek
+ */
+@InlineViewConfigRoot(basePath = "/*", pageBeanPostfix = {"Page", "PageBean"})
+public interface SubfolderViewConfigRootMarker
+{
+}

Added: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/OrderOverviewPage.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/OrderOverviewPage.java?rev=1067579&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/OrderOverviewPage.java (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/OrderOverviewPage.java Sun Feb  6 03:12:37 2011
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages.order;
+
+import org.apache.myfaces.extensions.cdi.jsf.api.config.view.Page;
+
+import javax.inject.Named;
+
+/**
+ * @author Gerhard Petracek
+ */
+@Page
+@Named
+public class OrderOverviewPage implements SecuredPage
+{
+}

Added: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/SecuredPage.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/SecuredPage.java?rev=1067579&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/SecuredPage.java (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/SecuredPage.java Sun Feb  6 03:12:37 2011
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages.order;
+
+import org.apache.myfaces.extensions.cdi.core.api.config.view.ViewConfig;
+import org.apache.myfaces.extensions.cdi.core.api.security.Secured;
+
+/**
+ * @author Gerhard Petracek
+ */
+@Secured(value = TestAccessDecisionVoter3.class)
+public interface SecuredPage extends ViewConfig
+{
+}

Added: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/TestAccessDecisionVoter3.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/TestAccessDecisionVoter3.java?rev=1067579&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/TestAccessDecisionVoter3.java (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/order/TestAccessDecisionVoter3.java Sun Feb  6 03:12:37 2011
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages.order;
+
+import org.apache.myfaces.extensions.cdi.core.api.security.AccessDecisionVoter;
+import org.apache.myfaces.extensions.cdi.core.api.security.SecurityViolation;
+
+import javax.interceptor.InvocationContext;
+import java.util.Set;
+
+/**
+ * @author Gerhard Petracek
+ */
+class TestAccessDecisionVoter3 implements AccessDecisionVoter
+{
+    public Set<SecurityViolation> checkPermission(InvocationContext invocationContext)
+    {
+        //do nothing
+        return null;
+    }
+}

Added: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/registration/RegistrationStep01PageBean.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/registration/RegistrationStep01PageBean.java?rev=1067579&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/registration/RegistrationStep01PageBean.java (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/inline/pages/registration/RegistrationStep01PageBean.java Sun Feb  6 03:12:37 2011
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.inline.pages.registration;
+
+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.PreRenderView;
+
+import javax.enterprise.inject.Model;
+
+/**
+ * @author Gerhard Petracek
+ */
+@Page
+@Model
+public class RegistrationStep01PageBean implements ViewConfig
+{
+    private boolean preloaded = false;
+
+    @PreRenderView
+    protected void preload()
+    {
+        this.preloaded = true;
+    }
+
+    public boolean isPreloaded()
+    {
+        return preloaded;
+    }
+}