Author: ard
Date: Wed Sep 12 10:52:25 2012
New Revision: 1383878

URL: http://svn.apache.org/viewvc?rev=1383878&view=rev
Log:
RAVE-697 Merging features for extends of pageFragments

Added:
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/PagesConfigEnhancer.java
      - copied, changed from r1383864, 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/PagesConfigEnhancer.java
    
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/deeperFragmentExtensionPageDefinitions.xml
    
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/mergingPageExtensionPageDefinitions.xml
    
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/nonExistingExtensionPageDefinitions.xml
Removed:
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/PagesConfigEnhancer.java
Modified:
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/EnhancedPagesConfigManager.java
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/ExtendsEnhancer.java
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/FragmentsThatAreAbstractRemoverEnhancer.java
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/SnsFragmentsRemoverEnhancer.java
    
rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/mvc/config/EnhancedPagesConfigManagerTest.java
    
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/enhanced-pages-config-manager-test.xml
    
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/simplePageExtensionPageDefinitions.xml

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/EnhancedPagesConfigManager.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/EnhancedPagesConfigManager.java?rev=1383878&r1=1383877&r2=1383878&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/EnhancedPagesConfigManager.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/EnhancedPagesConfigManager.java
 Wed Sep 12 10:52:25 2012
@@ -18,13 +18,8 @@
  */
 package org.apache.rave.portal.web.mvc.config;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
-import org.apache.rave.portal.web.mvc.config.enhancers.PagesConfigEnhancer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

Copied: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/PagesConfigEnhancer.java
 (from r1383864, 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/PagesConfigEnhancer.java)
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/PagesConfigEnhancer.java?p2=rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/PagesConfigEnhancer.java&p1=rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/PagesConfigEnhancer.java&r1=1383864&r2=1383878&rev=1383878&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/PagesConfigEnhancer.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/PagesConfigEnhancer.java
 Wed Sep 12 10:52:25 2012
@@ -1,4 +1,4 @@
-package org.apache.rave.portal.web.mvc.config.enhancers;
+package org.apache.rave.portal.web.mvc.config;
 
 import org.apache.rave.portal.web.mvc.config.PagesConfig;
 
@@ -6,7 +6,8 @@ public interface PagesConfigEnhancer {
 
     /**
      * @param pagesConfig the <code>pagesConfig</code> to enhance
-     * @return the enhanced {@link 
org.apache.rave.portal.web.mvc.config.PagesConfig} of the 
<code>pagesConfig</code> argument
+     * @return the enhanced {@link PagesConfig} of the 
<code>pagesConfig</code> argument. Note that the returned
+     * {@link PagesConfig} can be a different instance than the {@link 
PagesConfig} from the argument <code>pagesConfig</code>
      */
     PagesConfig enhance(PagesConfig pagesConfig);
 }
\ No newline at end of file

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/ExtendsEnhancer.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/ExtendsEnhancer.java?rev=1383878&r1=1383877&r2=1383878&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/ExtendsEnhancer.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/ExtendsEnhancer.java
 Wed Sep 12 10:52:25 2012
@@ -21,13 +21,17 @@ package org.apache.rave.portal.web.mvc.c
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.rave.portal.web.mvc.config.ExtendablePageFragment;
 import org.apache.rave.portal.web.mvc.config.PageFragment;
 import org.apache.rave.portal.web.mvc.config.PagesConfig;
+import org.apache.rave.portal.web.mvc.config.PagesConfigEnhancer;
+import org.apache.rave.portal.web.mvc.config.PagesConfigImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -35,37 +39,128 @@ public class ExtendsEnhancer implements 
 
     private final static Logger log = 
LoggerFactory.getLogger(ExtendsEnhancer.class);
 
+    private final Map<String, MutablePageFragment> 
allCanonicalPageFragmentsByPath = new HashMap<String, MutablePageFragment>();
+    private final Set<String> alreadyResolved = new HashSet<String>();
+
     @Override
     public PagesConfig enhance(final PagesConfig pagesConfig) {
+        alreadyResolved.clear();
         final Map<String,PageFragment> pages = pagesConfig.getPages();
 
-        final Map<String, MutablePageFragment> allPageFragmentsByPath = new 
HashMap<String, MutablePageFragment>();
-        final Map<String, MutablePageFragment> mutablePages = new 
HashMap<String, MutablePageFragment>();
+        // allCanonicalPageFragmentsByPath contains only page fragments that 
are canonical : In other words, only
+        // fragments that are there BEFORE resolving extensions
+        final Map<String, PageFragment> mutablePages = new HashMap<String, 
PageFragment>();
         
         for (PageFragment page : pages.values()) {
             MutablePageFragment mutablePageFragment = new 
MutablePageFragment((ExtendablePageFragment)page, null);
             mutablePages.put(mutablePageFragment.getName(), 
mutablePageFragment);
-            allPageFragmentsByPath.put(mutablePageFragment.getPath(), 
mutablePageFragment);
+            allCanonicalPageFragmentsByPath.put(mutablePageFragment.getPath(), 
mutablePageFragment);
         }
         
         // start the enhancement by traversing the allPageFragmentsByPath and 
find all the 'extends' and resolve them
-        for (MutablePageFragment page : mutablePages.values()) {
-            resolveExtensions(page, null, allPageFragmentsByPath);
+        for (PageFragment page : mutablePages.values()) {
+            resolveExtensions((MutablePageFragment)page);
         }
 
-        return pagesConfig;
+        return new PagesConfigImpl(pagesConfig.getRoutes(), mutablePages);
     }
 
-    private void resolveExtensions(final MutablePageFragment fragment, final 
MutablePageFragment parent, final Map<String, MutablePageFragment> 
allPageFragmentByPath) {
+    private void resolveExtensions(final MutablePageFragment fragment) {
+        if (alreadyResolved.contains(fragment.getPath())) {
+            return;
+        }
+        alreadyResolved.add(fragment.getPath());
         if (fragment.getExtends() != null) {
             String extendz = fragment.getExtends();
-            MutablePageFragment extendsFrom = 
allPageFragmentByPath.get(extendz);
-           // if (extendsFrom )
+            fragment.setExtendsProcessed();
+            MutablePageFragment extendsFrom = 
allCanonicalPageFragmentsByPath.get(extendz);
+            if (extendsFrom == null) {
+                log.warn("PageFragment '{}' tries to extend non existing 
PageFragment at '{}'. Skipping this extend", fragment.getPath(), extendz);
+            } else if (!isValidExtendsFrom(fragment, extendsFrom)) {
+                log.warn("PageFragment '{}' tries to extend itself or one of 
its descendants by '{}'. This is not allowed. Skipping this extend", 
fragment.getPath(), extendz);
+            } else {
+                merge(fragment, extendsFrom);
+            }
+        }
+        for (MutablePageFragment child : fragment.getChildrenMap().values()) {
+            resolveExtensions(child);
+        }
+    }
+
+    private void merge(final MutablePageFragment fragment, final 
MutablePageFragment extendsFrom) {
+        // first now resolve possible extensions that extendsFrom has
+        resolveExtensions(extendsFrom);
+        mergeFields(fragment, extendsFrom);
+        mergeChilds(fragment, extendsFrom);
+    }
+
+    private void mergeChilds(final MutablePageFragment fragment, final 
MutablePageFragment extendsFrom) {
+        // first resolve possible extension that extendsFrom children have
+        for (MutablePageFragment child : 
extendsFrom.getChildrenMap().values()) {
+            resolveExtensions(child);
+        }
+        // now we resolve possible extension that fragment children already 
have
+        for (MutablePageFragment child : fragment.getChildrenMap().values()) {
+            resolveExtensions(child);
+        }
+        
+        // now, we still need to do the following:
+        // 1) Merge the fields from extendsFrom children with fragment 
children that both have in common (by NAME)
+        // 2) DEEP COPY the children from extendsFrom that fragment does not 
have
+        
+        // merge the fields of children that are in common 
+        for (MutablePageFragment child : fragment.getChildrenMap().values()) {
+            MutablePageFragment extendsFromChild = 
extendsFrom.getChild(child.getName());
+            if (extendsFromChild != null) {
+                mergeFields(child, extendsFromChild);
+            }
+        }
+
+        // DEEP COPY the children that extendsFrom has but that fragment does 
not have
+        for (MutablePageFragment extendsFromChild : 
extendsFrom.getChildrenMap().values()) {
+            MutablePageFragment child = 
fragment.getChild(extendsFromChild.getName());
+            if (child == null) {
+                // now add to fragment a DEEP COPY from extendsFromChild
+                MutablePageFragment deepCopyChild = new 
MutablePageFragment(extendsFromChild, fragment);
+                alreadyResolved.add(deepCopyChild.getPath());
+                fragment.addChild(deepCopyChild);
+            }
         }
     }
 
+    private void mergeFields(final MutablePageFragment fragment, final 
MutablePageFragment extendsFrom) {
+        if (fragment.getController() == null) {
+            fragment.setController(extendsFrom.getController());
+        }
+        if (fragment.getDescription() == null) {
+            fragment.setDescription(extendsFrom.getDescription());
+        }
+        if (fragment.getViewName() == null) {
+            fragment.setViewName(extendsFrom.getViewName());
+        }
+    }
+
+    /**
+     * Check whether the <code>extendsFrom</code> is not the same instance or 
a descendant of <code>fragment</code>
+     * @param fragment the fragment to extend
+     * @param extendsFrom the fragment to extends from
+     * @return <code>false</code> when the <code>extendsFrom</code> is the 
same or a descendant of <code>fragment</code>
+     */
+    private boolean isValidExtendsFrom(final MutablePageFragment fragment, 
final MutablePageFragment extendsFrom) {
+        if (extendsFrom == fragment) {
+            return false;
+        }
+        MutablePageFragment parent = extendsFrom.getParent();
+        while (parent != null) {
+            if (parent == fragment) {
+                return false;
+            }
+            parent = parent.getParent();
+        }
+        return true;
+    }
+
 
-    
     private class MutablePageFragment implements ExtendablePageFragment {
 
         // the path contains the hierarchical information
@@ -77,6 +172,7 @@ public class ExtendsEnhancer implements 
         private String extendz;
         private boolean abstrakt;
         private Map<String, MutablePageFragment> children;
+        private MutablePageFragment parent;
 
         /**
          * constructor that creates a deep copy of PageFragments to 
MutablePageFragment's
@@ -89,8 +185,9 @@ public class ExtendsEnhancer implements 
             if (parent != null) {
                 path = parent.getPath() + "/" + fragment.getName();
             } else {
-                path = fragment.getName();
+                path = "/"+fragment.getName();
             }
+            this.parent = parent;
             this.description = fragment.getDescription();
             this.controller = fragment.getController();
             this.extendz = fragment.getExtends();
@@ -105,14 +202,6 @@ public class ExtendsEnhancer implements 
             }
         }
 
-        /**
-         * Extra needed utility method for enhancing fragments:
-         * @return the hierarchical location relative to the root (thus not 
starting with /) made up of all ancestor names including the fragments own name 
devided by /
-         */
-        public String getPath() {
-            return path;
-        }
-        
         @Override
         public String getViewName() {
             return viewName;
@@ -138,6 +227,11 @@ public class ExtendsEnhancer implements 
             return extendz;
         }
 
+        // when populated or non existing extends, it can be set to null
+        public void setExtendsProcessed() {
+            extendz = null;
+        }
+
         @Override
         public boolean isAbstract() {
             return abstrakt;
@@ -146,9 +240,59 @@ public class ExtendsEnhancer implements 
         @Override
         public List<PageFragment> getChildren() {
             if (children == null) {
-                return Collections.EMPTY_LIST;
+                return Collections.emptyList();
             }
             return new ArrayList<PageFragment>(children.values());
         }
+
+        /**
+         * Extra needed utility method for enhancing fragments:
+         * @return the hierarchical location relative to the root (thus not 
starting with /) made up of all ancestor names including the fragments own name 
devided by /
+         */
+        
+        public String getPath() {
+            return path;
+        }
+
+        public void setViewName(final String viewName) {
+            this.viewName = viewName;
+        }
+
+        public void setDescription(final String description) {
+            this.description = description;
+        }
+
+        public void setController(final String controller) {
+            this.controller = controller;
+        }
+
+        public MutablePageFragment getParent() {
+            return parent;
+        }
+
+        public void setParent(final MutablePageFragment parent) {
+            this.parent = parent;
+        }
+
+        public Map<String, MutablePageFragment> getChildrenMap() {
+            if (children == null) {
+                return Collections.emptyMap();
+            }
+            return children;
+        }
+
+        public MutablePageFragment getChild(final String name) {
+            if (children == null) {
+                return null;
+            }
+            return children.get(name);
+        }
+
+        public void addChild(final MutablePageFragment child) {
+            if (children == null) {
+                children = new LinkedHashMap<String, MutablePageFragment>(1);
+            }
+            children.put(child.getName(), child);
+        }
     }
 }

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/FragmentsThatAreAbstractRemoverEnhancer.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/FragmentsThatAreAbstractRemoverEnhancer.java?rev=1383878&r1=1383877&r2=1383878&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/FragmentsThatAreAbstractRemoverEnhancer.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/FragmentsThatAreAbstractRemoverEnhancer.java
 Wed Sep 12 10:52:25 2012
@@ -24,6 +24,7 @@ import java.util.Set;
 
 import org.apache.rave.portal.web.mvc.config.PageFragment;
 import org.apache.rave.portal.web.mvc.config.PagesConfig;
+import org.apache.rave.portal.web.mvc.config.PagesConfigEnhancer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/SnsFragmentsRemoverEnhancer.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/SnsFragmentsRemoverEnhancer.java?rev=1383878&r1=1383877&r2=1383878&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/SnsFragmentsRemoverEnhancer.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/enhancers/SnsFragmentsRemoverEnhancer.java
 Wed Sep 12 10:52:25 2012
@@ -25,6 +25,7 @@ import java.util.Set;
 
 import org.apache.rave.portal.web.mvc.config.PageFragment;
 import org.apache.rave.portal.web.mvc.config.PagesConfig;
+import org.apache.rave.portal.web.mvc.config.PagesConfigEnhancer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/mvc/config/EnhancedPagesConfigManagerTest.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/mvc/config/EnhancedPagesConfigManagerTest.java?rev=1383878&r1=1383877&r2=1383878&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/mvc/config/EnhancedPagesConfigManagerTest.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/mvc/config/EnhancedPagesConfigManagerTest.java
 Wed Sep 12 10:52:25 2012
@@ -103,11 +103,10 @@ public class EnhancedPagesConfigManagerT
     @Test
     public void simplePageExtensionPageRoutesManager() throws Exception {
         EnhancedPagesConfigManager enhancedPagesConfigManager = 
(EnhancedPagesConfigManager)applicationContext.getBean("simplePageExtensionEnhancedPagesConfigManager");
-        final Map<String,PageFragment> pageDefinitions = 
enhancedPagesConfigManager.getConfig().getPages();
-        assertEquals(2, pageDefinitions.size());
-
 
         final Map<String,PageFragment> pages = 
enhancedPagesConfigManager.getConfig().getPages();
+        assertEquals(2, pages.size());
+
         // home extends from standard and thus should inherit from standard 
and merge from standard
         final PageFragment standard = pages.get("standard");
         assertEquals(3, standard.getChildren().size());
@@ -117,20 +116,38 @@ public class EnhancedPagesConfigManagerT
         assertEquals("sub3",standard.getChildren().get(2).getName());
 
         final PageFragment home = pages.get("home");
+        
+        // home has own description 'home'
+        assertEquals("home", home.getDescription());
+        
+        // home has no 'controller' but should be inherited from 'standard'
+        assertEquals("org.apache.rave.unittest.NonExistingController", 
home.getController());
+        
         // home has three children inherited from 'standard'
         assertEquals(3, home.getChildren().size());
 
+        // The order should be maintained as  well as the children order of 
'standard'
         assertEquals("sub1",home.getChildren().get(0).getName());
         assertEquals("sub2",home.getChildren().get(1).getName());
         assertEquals("sub3",home.getChildren().get(2).getName());
-
+        
         // the inheritance is a DEEP COPY, not a shallow, hence, instances 
should be different
 
         assertFalse(home.getChildren().get(0) == 
standard.getChildren().get(0));
         assertFalse(home.getChildren().get(1) == 
standard.getChildren().get(1));
         assertFalse(home.getChildren().get(2) == 
standard.getChildren().get(2));
+
+        PageFragment sub2 = home.getChildren().get(1);
+        // sub2 has empty string controller
+        assertEquals("", sub2.getController());
+        assertEquals(1, sub2.getChildren().size());
+        assertEquals("sub2sub1", sub2.getChildren().get(0).getName());
+        PageFragment sub2sub1 = sub2.getChildren().get(0);
+        assertEquals("org.apache.rave.unittest.NonExistingController", 
sub2sub1.getController());
+
     }
 
+    
 
 }
 

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/enhanced-pages-config-manager-test.xml
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/enhanced-pages-config-manager-test.xml?rev=1383878&r1=1383877&r2=1383878&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/enhanced-pages-config-manager-test.xml
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/enhanced-pages-config-manager-test.xml
 Wed Sep 12 10:52:25 2012
@@ -37,6 +37,7 @@
         <property name="pageDefinitionsPath" 
value="classpath:config/testenhancingmappings/noExtensionsPageDefinitions.xml"/>
       </bean>
     </constructor-arg>
+    <property name="enhancers" ref="pageEnhancers"/>
   </bean>
 
   <bean id="snsRemovingEnhancedPagesConfigManager" 
class="org.apache.rave.portal.web.mvc.config.EnhancedPagesConfigManager">

Added: 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/deeperFragmentExtensionPageDefinitions.xml
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/deeperFragmentExtensionPageDefinitions.xml?rev=1383878&view=auto
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/deeperFragmentExtensionPageDefinitions.xml
 (added)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/deeperFragmentExtensionPageDefinitions.xml
 Wed Sep 12 10:52:25 2012
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  -->
+<pageDefinitions name="default">
+  <pageFragment name="standard" description="Page that is being extended by 
other pages"
+                  controller="org.apache.rave.unittest.NonExistingController">
+    <pageFragment name="sub1"/>
+    <pageFragment name="sub2" controller="">
+      <pageFragment name="sub2sub1" 
controller="org.apache.rave.unittest.NonExistingController"/>
+    </pageFragment>
+    <pageFragment name="sub3-withcontroller" viewName="pages/test" 
controller="org.apache.rave.unittest.NonExistingController">
+      <pageFragment name="sub3sub1" extends="/some/fragment" 
controller="org.apache.rave.unittest.NonExistingController"/>
+    </pageFragment>
+  </pageFragment>
+
+
+  <pageFragment name="home" description="Page that is being extended by other 
pages"
+                  controller="org.apache.rave.unittest.NonExistingController">
+    <pageFragment name="sub2" controller="">
+      <pageFragment name="sub2sub1" extends="/standard/sub2/sub2sub1"/>
+    </pageFragment>
+  </pageFragment>
+
+</pageDefinitions>
\ No newline at end of file

Added: 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/mergingPageExtensionPageDefinitions.xml
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/mergingPageExtensionPageDefinitions.xml?rev=1383878&view=auto
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/mergingPageExtensionPageDefinitions.xml
 (added)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/mergingPageExtensionPageDefinitions.xml
 Wed Sep 12 10:52:25 2012
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  -->
+<pageDefinitions name="default">
+  <pageFragment name="standard" description="Page that is being extended by 
other pages"
+                  controller="org.apache.rave.unittest.NonExistingController">
+    <pageFragment name="sub1"/>
+    <pageFragment name="sub2" controller="">
+      <pageFragment name="sub2sub1" 
controller="org.apache.rave.unittest.NonExistingController"/>
+    </pageFragment>
+    <pageFragment name="sub3" viewName="pages/test" 
controller="org.apache.rave.unittest.NonExistingController">
+      <pageFragment name="sub3sub1" extends="/some/fragment" 
controller="org.apache.rave.unittest.NonExistingController"/>
+    </pageFragment>
+  </pageFragment>
+
+
+  <pageFragment name="home" extends="/standard" description="Page that is 
being extended by other pages"
+                  controller="org.apache.rave.unittest.NonExistingController">
+  </pageFragment>
+
+  <pageFragment name="agenda" extends="/standard" >
+    <pageFragment name="sub4"/>
+  </pageFragment>
+
+
+  <pageFragment name="news" extends="/standard" description="newsdescription">
+    <!-- override the controller from 'standard' -->
+    <pageFragment name="sub2" 
controller="org.apache.rave.unittest.NonExistingNewsController">
+      <!-- a pageFragment that 'standard' does not have. It should also 
inherit 'sub2sub1' -->
+      <pageFragment name="news" />
+    </pageFragment>
+  </pageFragment>
+
+</pageDefinitions>
\ No newline at end of file

Added: 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/nonExistingExtensionPageDefinitions.xml
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/nonExistingExtensionPageDefinitions.xml?rev=1383878&view=auto
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/nonExistingExtensionPageDefinitions.xml
 (added)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/nonExistingExtensionPageDefinitions.xml
 Wed Sep 12 10:52:25 2012
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  -->
+<pageDefinitions name="default">
+  <pageFragment name="standard" description="Page that is being extended by 
other pages"
+                  controller="org.apache.rave.unittest.NonExistingController">
+    <pageFragment name="sub1"/>
+    <pageFragment name="sub2" controller="">
+      <pageFragment name="sub2sub1" 
controller="org.apache.rave.unittest.NonExistingController"/>
+    </pageFragment>
+    <pageFragment name="sub3" viewName="pages/test" 
controller="org.apache.rave.unittest.NonExistingController">
+      <pageFragment name="sub3sub1" extends="/some/fragment" 
controller="org.apache.rave.unittest.NonExistingController"/>
+    </pageFragment>
+  </pageFragment>
+
+  <pageFragment name="home" extends="/XXX" description="Page that is being 
extended by other pages"
+                  controller="org.apache.rave.unittest.NonExistingController">
+  </pageFragment>
+
+
+</pageDefinitions>
\ No newline at end of file

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/simplePageExtensionPageDefinitions.xml
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/simplePageExtensionPageDefinitions.xml?rev=1383878&r1=1383877&r2=1383878&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/simplePageExtensionPageDefinitions.xml
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/test/resources/config/testenhancingmappings/simplePageExtensionPageDefinitions.xml
 Wed Sep 12 10:52:25 2012
@@ -18,20 +18,19 @@
   under the License.
   -->
 <pageDefinitions name="default">
-  <pageFragment name="standard" description="Page that is being extended by 
other pages"
+  <pageFragment name="standard" description="standard"
                   controller="org.apache.rave.unittest.NonExistingController">
     <pageFragment name="sub1"/>
     <pageFragment name="sub2" controller="">
       <pageFragment name="sub2sub1" 
controller="org.apache.rave.unittest.NonExistingController"/>
     </pageFragment>
     <pageFragment name="sub3" viewName="pages/test" 
controller="org.apache.rave.unittest.NonExistingController">
-      <pageFragment name="sub3sub1" extends="/some/fragment" 
controller="org.apache.rave.unittest.NonExistingController"/>
+      <pageFragment name="sub3sub1" 
controller="org.apache.rave.unittest.NonExistingController"/>
     </pageFragment>
   </pageFragment>
 
 
-  <pageFragment name="home" extends="/standard" description="Page that is 
being extended by other pages"
-                  controller="org.apache.rave.unittest.NonExistingController">
+  <pageFragment name="home" extends="/standard" description="home">
   </pageFragment>
 
 


Reply via email to