You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by ma...@apache.org on 2012/08/15 12:13:17 UTC

svn commit: r1373306 - in /rave/sandbox/content-services: rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/ rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/ rave-jcr-integration/pag...

Author: marijan
Date: Wed Aug 15 10:13:16 2012
New Revision: 1373306

URL: http://svn.apache.org/viewvc?rev=1373306&view=rev
Log:
RAVE-695 Create new rave-jcr-ocm module providing JCR based Object Content Mapping (OCM) support

- refactorings
- add file based (XML) configuration
- add testcases

Added:
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/ConfigUtils.java   (contents, props changed)
      - copied, changed from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/FileConfigDao.java
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/FileConfigManager.java   (contents, props changed)
      - copied, changed from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/FilePageConfigDao.java
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageConfiguration.java   (with props)
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageDefinition.java   (contents, props changed)
      - copied, changed from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/PageDefinitionConfig.java
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageFragment.java   (contents, props changed)
      - copied, changed from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/PageFragmentConfig.java
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/FileUrlConfigDao.java   (contents, props changed)
      - copied, changed from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/FileUrlConfigDao.java
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/RenderMapping.java   (contents, props changed)
      - copied, changed from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/RenderMapping.java
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlConfig.java   (contents, props changed)
      - copied, changed from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlConfig.java
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlConfigDao.java   (contents, props changed)
      - copied, changed from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlConfigDao.java
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlMapping.java   (contents, props changed)
      - copied, changed from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlMapping.java
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/resources/example_configuration.xml   (with props)
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/resources/example_url_mapping.xml   (contents, props changed)
      - copied, changed from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/test/resources/example_url_mapping.xml
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/FileConfigManagerTest.java   (contents, props changed)
      - copied, changed from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/model/config/FilePageConfigDaoTest.java
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/url/
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/url/FileUrlConfigDaoTest.java   (contents, props changed)
      - copied, changed from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/model/config/url/FileUrlConfigDaoTest.java
Removed:
    rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/PageDefinition.java
    rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/PageFragment.java
    rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/FileConfigDao.java
    rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/FilePageConfigDao.java
    rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/PageConfig.java
    rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/PageConfigDao.java
    rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/PageDefinitionConfig.java
    rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/PageFragmentConfig.java
    rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/FileUrlConfigDao.java
    rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/RenderMapping.java
    rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlConfig.java
    rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlConfigDao.java
    rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlMapping.java
    rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/service/APageService.java
    rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/model/PageDefinitionTest.java
    rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/model/PageFragmentTest.java
    rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/model/config/FilePageConfigDaoTest.java
    rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/model/config/url/FileUrlConfigDaoTest.java
    rave/sandbox/content-services/rave-web-hmvc/src/test/resources/example_configuration.xml
    rave/sandbox/content-services/rave-web-hmvc/src/test/resources/example_url_mapping.xml
Modified:
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/JcrPageConfiguration.java
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/JcrPageFragment.java
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/api/PageConfiguration.java
    rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/JcrConfigManagerTest.java

Copied: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/ConfigUtils.java (from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/FileConfigDao.java)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/ConfigUtils.java?p2=rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/ConfigUtils.java&p1=rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/FileConfigDao.java&r1=1372943&r2=1373306&rev=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/FileConfigDao.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/ConfigUtils.java Wed Aug 15 10:13:16 2012
@@ -17,29 +17,33 @@
  * under the License.
  */
 
-package org.apache.rave.portal.web.model.config;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+package org.apache.rave.jcr.config;
 
 import java.io.File;
 import java.io.UnsupportedEncodingException;
 import java.net.URL;
 import java.net.URLDecoder;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
+ * Utility class used by page configuration related classes
+ *
  * @version "$Id$"
  */
-public abstract class FileConfigDao {
-
-    private static Logger log = LoggerFactory.getLogger(FileConfigDao.class);
+public final class ConfigUtils {
 
+    private static Logger log = LoggerFactory.getLogger(ConfigUtils.class);
 
     public static final String FILE_PATH_PREFIX = "file:";
-
     public static final String CLASSPATH_PREFIX = "classpath:";
 
 
+    private ConfigUtils() {
+    }
+
+
     /**
      * Returns the physical resource file object. <p> <ul> <li>When the resourcePath starts with 'file:', it is assumed
      * as a file path on the file system.</li> <li>When the resourcePath starts with 'classpath:', it is assumed as a
@@ -49,7 +53,7 @@ public abstract class FileConfigDao {
      * @param resourcePath the path of the resource.
      * @return File or null if nothing is found or encoding exception is thrown
      */
-    protected File getResourceFile(String resourcePath) {
+    public static File getResourceFile(String resourcePath) {
         if (resourcePath == null) {
             throw new IllegalArgumentException("resourcePath parameter cannot be <null>");
         }
@@ -58,7 +62,7 @@ public abstract class FileConfigDao {
             return new File(fileName);
         } else if (resourcePath.startsWith(CLASSPATH_PREFIX)) {
             String classPath = resourcePath.substring(CLASSPATH_PREFIX.length());
-            URL url = FilePageConfigDao.class.getClassLoader().getResource(classPath);
+            URL url = FileConfigManager.class.getClassLoader().getResource(classPath);
             try {
                 if (url == null) {
                     return null;
@@ -75,4 +79,5 @@ public abstract class FileConfigDao {
             return new File(resourcePath);
         }
     }
+
 }

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/ConfigUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/ConfigUtils.java
------------------------------------------------------------------------------
    svn:keywords = Id

Copied: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/FileConfigManager.java (from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/FilePageConfigDao.java)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/FileConfigManager.java?p2=rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/FileConfigManager.java&p1=rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/FilePageConfigDao.java&r1=1372943&r2=1373306&rev=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/FilePageConfigDao.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/FileConfigManager.java Wed Aug 15 10:13:16 2012
@@ -17,47 +17,52 @@
  * under the License.
  */
 
-package org.apache.rave.portal.web.model.config;
+package org.apache.rave.jcr.config;
 
-import org.apache.commons.io.IOUtils;
-import org.apache.rave.portal.web.exceptions.InvalidConfigurationException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.StringWriter;
 
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.rave.jcr.config.exc.InvalidConfigurationException;
+import org.apache.rave.jcr.config.model.FilePageConfiguration;
+import org.apache.rave.jcr.config.model.api.PageConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @version "$Id$"
  */
-public class FilePageConfigDao extends FileConfigDao implements PageConfigDao {
+public class FileConfigManager implements ConfigManager {
 
-    private static Logger log = LoggerFactory.getLogger(FilePageConfigDao.class);
+    private static Logger log = LoggerFactory.getLogger(FileConfigManager.class);
 
 
     @Override
-    public PageConfig loadConfig(String path) throws InvalidConfigurationException {
+    public PageConfiguration loadConfiguration(String path) {
         log.info("Loading configuration: {}", path);
 
         FileInputStream is = null;
         try {
-            File file = getResourceFile(path);
+            File file = ConfigUtils.getResourceFile(path);
             if (file == null) {
                 throw new InvalidConfigurationException("Configuration file not found for path: " + path);
             }
-            JAXBContext context = JAXBContext.newInstance(PageConfig.class);
+            JAXBContext context = JAXBContext.newInstance(FilePageConfiguration.class);
             Unmarshaller unmarshaller = context.createUnmarshaller();
             is = new FileInputStream(file);
-            final PageConfig pageConfig = (PageConfig) unmarshaller.unmarshal(is);
-            if (pageConfig != null) {
-                pageConfig.initialize();
+            final PageConfiguration filePageConfiguration = (PageConfiguration) unmarshaller.unmarshal(is);
+            if (filePageConfiguration != null) {
+                filePageConfiguration.initialize();
             }
 
-            return pageConfig;
+            return filePageConfiguration;
         } catch (JAXBException e) {
             throw new InvalidConfigurationException("Error parsing configuration file: " + path, e);
         } catch (FileNotFoundException e) {
@@ -66,6 +71,22 @@ public class FilePageConfigDao extends F
             IOUtils.closeQuietly(is);
         }
 
+    }
+
+    @Override
+    public void saveConfiguration(PageConfiguration configuration) {
+        try {
+            JAXBContext context = JAXBContext.newInstance(FilePageConfiguration.class);
+
+            Marshaller marshaller = context.createMarshaller();
+            final StringWriter writer = new StringWriter();
+            marshaller.marshal(configuration, writer);
+            // TODO write XML to file system
+            log.info("{}", writer);
+        } catch (JAXBException e) {
+            log.error("Error writing configuration", e);
+        }
+
 
     }
 

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/FileConfigManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/FileConfigManager.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageConfiguration.java
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageConfiguration.java?rev=1373306&view=auto
==============================================================================
--- rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageConfiguration.java (added)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageConfiguration.java Wed Aug 15 10:13:16 2012
@@ -0,0 +1,262 @@
+/*
+ * 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.rave.jcr.config.model;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.rave.jcr.config.model.api.PageConfiguration;
+import org.apache.rave.jcr.config.model.api.PageDefinition;
+import org.apache.rave.jcr.config.model.api.PageFragment;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @version "$Id$"
+ */
+@XmlRootElement(name = "configuration")
+public class FilePageConfiguration implements PageConfiguration {
+
+
+    private static final Logger log = LoggerFactory.getLogger(FilePageConfiguration.class);
+    private String name;
+
+    /**
+     * Flag which indicates if all components are parsed and initialized.
+     */
+    private boolean initialized;
+
+    private Map<String, PageDefinition> filteredDefinitons;
+    private Map<String, PageFragment> filteredFragments;
+
+    private List<PageDefinition> pageDefinitions;
+    private List<PageFragment> pageFragments;
+
+
+    @Override
+    public final void initialize() {
+        if (!initialized) {
+            // filter invalid entries (e.g. entries without a name and duplicates)
+            filterDefinitions();
+            filterFragments();
+            // resolve references/overrides
+            if (initialized) {
+                return;
+            }
+            // merge with parent child components
+            for (PageFragment pageFragment : pageFragments) {
+                final String reference = pageFragment.getReference();
+                if (StringUtils.isNotBlank(reference)) {
+                    // lookup parent:
+                    final PageDefinition pageDefinition = filteredDefinitons.get(reference);
+                    if (pageDefinition != null) {
+                        final PageFragment fragment = filteredFragments.get(pageFragment.getName());
+                        if (fragment != null) {
+                            fragment.setParent(pageDefinition);
+                            mergeFragment(fragment);
+                            continue;
+                        } else {
+                            log.warn("*** INVALID PARENT for PageDefinition {}", pageDefinition);
+                        }
+                    }
+                    // check if fragment is our parent
+                    final PageFragment parentFragment = filteredFragments.get(reference);
+                    if (parentFragment != null) {
+                        final PageFragment fragment = filteredFragments.get(pageFragment.getName());
+                        fragment.setParent(parentFragment);
+                        mergeFragment(fragment);
+                        continue;
+                    }
+                    // we could not find parent reference
+                    log.warn("**** SKIPPING populating of item: parent with name [{}]  could not be found for PageFragment with name  [{}].", reference, pageFragment.getName());
+                }
+
+            }
+            initialized = true;
+        }
+    }
+
+
+    private void mergeFragmentChildren(PageFragment owner, PageFragment pageFragment) {
+        final List<PageFragment> fragmentChildren = pageFragment.getChildren();
+        if (fragmentChildren != null) {
+            final List<PageFragment> children = owner.getChildren();
+            log.debug("@Merging fragment children {} with parent children {}", fragmentChildren, children);
+            for (PageFragment child : fragmentChildren) {
+                final PageFragment fragment = createFragment(child);
+                // process children
+                fragment.setParent(owner);
+                mergeFragmentChildren(fragment, child);
+                children.add(fragment);
+            }
+        }
+    }
+
+    private PageFragment createFragment(PageFragment pageFragment) {
+        final PageFragment fragment = new FilePageFragment(null, pageFragment.getName());
+        fragment.setController(pageFragment.getController());
+        fragment.setDescription(pageFragment.getDescription());
+        return fragment;
+    }
+
+    public void mergeFragment(PageFragment fragment) {
+        final PageFragment parent = fragment.getParent();
+        if (parent != null) {
+            log.debug("@merging fragment:[ {} ] with parent:[ {} ]", fragment.getName(), parent.getName());
+            // merge first level and it's kids
+            final List<PageFragment> parentChildren = parent.getChildren();
+            final List<PageFragment> children = fragment.getChildren();
+            for (PageFragment parentChild : parentChildren) {
+                if (!contains(fragment, parentChild)) {
+                    log.info("Adding child fragment:[ {} ] from parent", parentChild.getName());
+                    children.add(parentChild);
+                } else {
+                    log.debug("*** SKIPPING parent:[ {} ] fragment because are overriding it.", parentChild.getName());
+                }
+            }
+
+        }
+    }
+
+    private boolean contains(PageFragment fragment, PageFragment parentChild) {
+        final List<PageFragment> children = fragment.getChildren();
+        for (PageFragment child : children) {
+            if (parentChild.getName().equals(child.getName())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    @XmlAttribute
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+    @Override
+    public void setPageDefinitions(List<PageDefinition> definitions) {
+
+        this.pageDefinitions = definitions;
+    }
+
+
+    @XmlElement(name = "page-definition", type = FilePageDefinition.class)
+    @Override
+    public List<PageDefinition> getPageDefinitions() {
+        if (pageDefinitions == null) {
+            pageDefinitions = new ArrayList<PageDefinition>();
+        }
+        return pageDefinitions;
+    }
+
+
+    @XmlElement(name = "page-fragment", type = FilePageFragment.class)
+    public List<PageFragment> getPageFragments() {
+        if (pageFragments == null) {
+            pageFragments = new ArrayList<PageFragment>();
+        }
+        return pageFragments;
+    }
+
+    @Override
+    public void setPageFragments(List<PageFragment> pageFragments) {
+        this.pageFragments = pageFragments;
+
+    }
+
+    @Override
+    public void addPageFragment(PageFragment fragment) {
+        getPageFragments().add(fragment);
+    }
+
+    @Override
+    public void addPageDefinition(PageDefinition definition) {
+        getPageDefinitions().add(definition);
+    }
+
+
+    //*************************************************************************************
+    // UTILITIES
+    //*************************************************************************************
+    private void filterDefinitions() {
+
+        filteredDefinitons = new HashMap<String, PageDefinition>();
+        final Iterator<PageDefinition> iterator = pageDefinitions.iterator();
+        while (iterator.hasNext()) {
+            PageDefinition definition = iterator.next();
+            final String definitionName = definition.getName();
+            if (StringUtils.isBlank(definitionName)) {
+                log.warn("*** SKIPPING Pagedefinition because it has no name: {}", definition);
+                iterator.remove();
+                continue;
+            }
+            if (filteredDefinitons.containsKey(definitionName)) {
+                log.warn("*** SKIPPING Pagedefinition [{}] because it was already defined", definitionName);
+                iterator.remove();
+                continue;
+            }
+            filteredDefinitons.put(definitionName, definition);
+        }
+    }
+
+    private void filterFragments() {
+        filteredFragments = new HashMap<String, PageFragment>();
+        final Iterator<PageFragment> iterator = pageFragments.iterator();
+        while (iterator.hasNext()) {
+            PageFragment fragment = iterator.next();
+            final String fragmentName = fragment.getName();
+            if (StringUtils.isBlank(fragmentName)) {
+                log.warn("*** SKIPPING PageFragment because it has no name: {}", fragment);
+                iterator.remove();
+                continue;
+            }
+            if (filteredFragments.containsKey(fragmentName)) {
+                log.warn("*** SKIPPING PageFragment [{}] was already defined", fragmentName);
+                iterator.remove();
+                continue;
+            }
+            filteredFragments.put(fragmentName, fragment);
+        }
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("FilePageConfiguration");
+        sb.append("{name='").append(name).append('\'');
+        sb.append('}');
+        return sb.toString();
+    }
+
+}

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageConfiguration.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageConfiguration.java
------------------------------------------------------------------------------
    svn:keywords = Id

Copied: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageDefinition.java (from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/PageDefinitionConfig.java)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageDefinition.java?p2=rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageDefinition.java&p1=rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/PageDefinitionConfig.java&r1=1372943&r2=1373306&rev=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/PageDefinitionConfig.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageDefinition.java Wed Aug 15 10:13:16 2012
@@ -17,32 +17,47 @@
  * under the License.
  */
 
-package org.apache.rave.portal.web.model.config;
+package org.apache.rave.jcr.config.model;
 
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.rave.jcr.config.model.api.PageDefinition;
+import org.apache.rave.jcr.config.model.api.PageFragment;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.xml.bind.annotation.XmlRootElement;
-
 /**
  * @version "$Id$"
  */
 @XmlRootElement(name = "page-definition")
-public class PageDefinitionConfig extends PageFragmentConfig {
+public class FilePageDefinition extends FilePageFragment implements PageDefinition {
+
+    private static Logger log = LoggerFactory.getLogger(FilePageDefinition.class);
 
-    private static Logger log = LoggerFactory.getLogger(PageDefinitionConfig.class);
 
+    public FilePageDefinition() {
+    }
+
+    public FilePageDefinition(String name) {
+        super(name);
+    }
+
+    public FilePageDefinition(String path, String name) {
+        super(path, name);
+    }
 
     @Override
-    public String getParent() {
+    @XmlTransient
+    public PageFragment getParent() {
         // page definition cannot have a parent
         return null;
     }
 
     @Override
-    public void setParent(String parent) {
+    public void setParent(PageFragment parent) {
         // we have no parent
-        //throw new InvalidConfigurationException("PageDefinition cannot have a parent");
+        log.warn("*** INVALID: Trying to set parent on PageDefinition {}, parent is: {}", this, parent);
     }
 
 
@@ -55,4 +70,5 @@ public class PageDefinitionConfig extend
         sb.append('}');
         return sb.toString();
     }
+
 }

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageDefinition.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageDefinition.java
------------------------------------------------------------------------------
    svn:keywords = Id

Copied: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageFragment.java (from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/PageFragmentConfig.java)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageFragment.java?p2=rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageFragment.java&p1=rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/PageFragmentConfig.java&r1=1372943&r2=1373306&rev=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/PageFragmentConfig.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageFragment.java Wed Aug 15 10:13:16 2012
@@ -17,129 +17,147 @@
  * under the License.
  */
 
-package org.apache.rave.portal.web.model.config;
+package org.apache.rave.jcr.config.model;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
-import java.util.List;
+import javax.xml.bind.annotation.XmlTransient;
 
-import static org.apache.rave.portal.web.model.PageFragment.TYPE;
+import org.apache.rave.jcr.config.model.api.PageFragment;
 
 /**
  * @version "$Id$"
  */
 @XmlRootElement(name = "page-fragment")
-public class PageFragmentConfig {
-
-    private static Logger log = LoggerFactory.getLogger(PageFragmentConfig.class);
+public class FilePageFragment implements PageFragment {
 
 
-    private String parent;
+    private PageFragment parent;
     private String reference;
     private String name;
     private String path;
     private String displayName;
     private String description;
-    private TYPE type = TYPE.TEMPLATE;
-    private String src;
+
     private String controller;
-    private List<PageFragmentConfig> children;
+    private List<PageFragment> children;
 
 
-    @XmlAttribute
+    public FilePageFragment() {
+    }
+
+
+    public FilePageFragment(String name) {
+        this.name = name;
+    }
+
+    public FilePageFragment(String path, String name) {
+        this(name);
+        this.path = path;
+    }
+
+    @XmlAttribute(name = "parent")
+    @Override
     public String getReference() {
         return reference;
     }
 
+    @Override
     public void setReference(String reference) {
         this.reference = reference;
     }
 
     @XmlAttribute
+    @Override
     public String getPath() {
         return path;
     }
 
+    @Override
     public void setPath(String path) {
         this.path = path;
     }
 
     @XmlAttribute
+    @Override
     public String getDisplayName() {
         return displayName;
     }
 
+    @Override
     public void setDisplayName(String displayName) {
         this.displayName = displayName;
     }
 
     @XmlAttribute
+    @Override
     public String getDescription() {
         return description;
     }
 
+    @Override
     public void setDescription(String description) {
         this.description = description;
     }
 
-    @XmlAttribute
-    public TYPE getType() {
-        return type;
-    }
-
-    public void setType(TYPE type) {
-        this.type = type;
-    }
-
-    @XmlAttribute
-    public String getSrc() {
-        return src;
-    }
-
-    public void setSrc(String src) {
-        this.src = src;
-    }
 
     @XmlAttribute
+    @Override
     public String getController() {
         return controller;
     }
 
+    @Override
     public void setController(String controller) {
         this.controller = controller;
     }
 
 
-    @XmlElementRef(name = "page-fragment", type = PageFragmentConfig.class)
-    public List<PageFragmentConfig> getChildren() {
+    @XmlElementRef(name = "page-fragment", type = FilePageFragment.class)
+    @Override
+    public List<PageFragment> getChildren() {
+        if (children == null) {
+            children = new ArrayList<PageFragment>();
+        }
         return children;
     }
 
-    public void setChildren(List<PageFragmentConfig> children) {
+    @Override
+    public void setChildren(List<PageFragment> children) {
         this.children = children;
     }
 
+    @Override
+    public void addChild(PageFragment child) {
+
+        getChildren().add(child);
+    }
+
     @XmlAttribute
+    @Override
     public String getName() {
         return name;
     }
 
+    @Override
     public void setName(String name) {
         this.name = name;
     }
 
 
-    @XmlAttribute
-    public String getParent() {
+    @XmlTransient
+    @Override
+    public PageFragment getParent() {
         return parent;
     }
 
-    public void setParent(String parentName) {
-        this.parent = parentName;
+    @Override
+    public void setParent(PageFragment parent) {
+        this.parent = parent;
     }
 
     @Override
@@ -152,11 +170,9 @@ public class PageFragmentConfig {
         sb.append(", path='").append(path).append('\'');
         sb.append(", displayName='").append(displayName).append('\'');
         sb.append(", description='").append(description).append('\'');
-        sb.append(", type=").append(type);
-        sb.append(", src='").append(src).append('\'');
         sb.append(", controller='").append(controller).append('\'');
-        sb.append(", children=").append(children);
         sb.append('}');
         return sb.toString();
     }
 }
+

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageFragment.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/FilePageFragment.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/JcrPageConfiguration.java
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/JcrPageConfiguration.java?rev=1373306&r1=1373305&r2=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/JcrPageConfiguration.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/JcrPageConfiguration.java Wed Aug 15 10:13:16 2012
@@ -50,6 +50,11 @@ public class JcrPageConfiguration implem
 
 
     @Override
+    public void initialize() {
+        // TODO implement
+    }
+
+    @Override
     public String getName() {
         return name;
     }

Modified: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/JcrPageFragment.java
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/JcrPageFragment.java?rev=1373306&r1=1373305&r2=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/JcrPageFragment.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/JcrPageFragment.java Wed Aug 15 10:13:16 2012
@@ -38,6 +38,12 @@ public class JcrPageFragment implements 
 
     private static Logger log = LoggerFactory.getLogger(JcrPageFragment.class);
 
+    public JcrPageFragment() {
+    }
+
+    public JcrPageFragment(String name) {
+        this.name = name;
+    }
 
     @Field(path = true, id = true)
     private String path;

Modified: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/api/PageConfiguration.java
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/api/PageConfiguration.java?rev=1373306&r1=1373305&r2=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/api/PageConfiguration.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/model/api/PageConfiguration.java Wed Aug 15 10:13:16 2012
@@ -34,6 +34,11 @@ import org.apache.jackrabbit.ocm.mapper.
 public interface PageConfiguration {
 
     /**
+     * Method called after configuration is loaded to do initialization
+     */
+    void initialize();
+
+    /**
      * Configuration name
      *
      * @return config name,
@@ -54,6 +59,7 @@ public interface PageConfiguration {
      */
     List<PageDefinition> getPageDefinitions();
 
+
     void setPageDefinitions(List<PageDefinition> definitions);
 
     /**
@@ -63,6 +69,7 @@ public interface PageConfiguration {
      */
     List<PageFragment> getPageFragments();
 
+
     void setPageFragments(List<PageFragment> fragments);
 
 

Copied: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/FileUrlConfigDao.java (from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/FileUrlConfigDao.java)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/FileUrlConfigDao.java?p2=rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/FileUrlConfigDao.java&p1=rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/FileUrlConfigDao.java&r1=1372943&r2=1373306&rev=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/FileUrlConfigDao.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/FileUrlConfigDao.java Wed Aug 15 10:13:16 2012
@@ -17,25 +17,26 @@
  * under the License.
  */
 
-package org.apache.rave.portal.web.model.config.url;
+package org.apache.rave.jcr.config.url;
 
-import org.apache.commons.io.IOUtils;
-import org.apache.rave.portal.web.exceptions.InvalidConfigurationException;
-import org.apache.rave.portal.web.model.config.FileConfigDao;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Unmarshaller;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.rave.jcr.config.ConfigUtils;
+import org.apache.rave.jcr.config.exc.InvalidConfigurationException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @version "$Id$"
  */
-public class FileUrlConfigDao extends FileConfigDao implements UrlConfigDao {
+public class FileUrlConfigDao implements UrlConfigDao {
 
     private static Logger log = LoggerFactory.getLogger(FileUrlConfigDao.class);
 
@@ -44,7 +45,7 @@ public class FileUrlConfigDao extends Fi
         log.info("Loading configuration: {}", path);
         FileInputStream is = null;
         try {
-            File file = getResourceFile(path);
+            File file = ConfigUtils.getResourceFile(path);
             if (file == null) {
                 throw new InvalidConfigurationException("Configuration file not found for path: " + path);
             }

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/FileUrlConfigDao.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/FileUrlConfigDao.java
------------------------------------------------------------------------------
    svn:keywords = Id

Copied: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/RenderMapping.java (from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/RenderMapping.java)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/RenderMapping.java?p2=rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/RenderMapping.java&p1=rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/RenderMapping.java&r1=1372943&r2=1373306&rev=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/RenderMapping.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/RenderMapping.java Wed Aug 15 10:13:16 2012
@@ -17,14 +17,14 @@
  * under the License.
  */
 
-package org.apache.rave.portal.web.model.config.url;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+package org.apache.rave.jcr.config.url;
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * @version "$Id$"
  */

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/RenderMapping.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/RenderMapping.java
------------------------------------------------------------------------------
    svn:keywords = Id

Copied: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlConfig.java (from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlConfig.java)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlConfig.java?p2=rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlConfig.java&p1=rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlConfig.java&r1=1372943&r2=1373306&rev=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlConfig.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlConfig.java Wed Aug 15 10:13:16 2012
@@ -17,15 +17,16 @@
  * under the License.
  */
 
-package org.apache.rave.portal.web.model.config.url;
+package org.apache.rave.jcr.config.url;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.util.List;
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
-import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @version "$Id$"

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlConfig.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlConfig.java
------------------------------------------------------------------------------
    svn:keywords = Id

Copied: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlConfigDao.java (from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlConfigDao.java)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlConfigDao.java?p2=rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlConfigDao.java&p1=rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlConfigDao.java&r1=1372943&r2=1373306&rev=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlConfigDao.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlConfigDao.java Wed Aug 15 10:13:16 2012
@@ -17,9 +17,10 @@
  * under the License.
  */
 
-package org.apache.rave.portal.web.model.config.url;
+package org.apache.rave.jcr.config.url;
 
-import org.apache.rave.portal.web.exceptions.InvalidConfigurationException;
+
+import org.apache.rave.jcr.config.exc.InvalidConfigurationException;
 
 /**
  * @version "$Id$"

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlConfigDao.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlConfigDao.java
------------------------------------------------------------------------------
    svn:keywords = Id

Copied: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlMapping.java (from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlMapping.java)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlMapping.java?p2=rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlMapping.java&p1=rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlMapping.java&r1=1372943&r2=1373306&rev=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/model/config/url/UrlMapping.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlMapping.java Wed Aug 15 10:13:16 2012
@@ -17,14 +17,15 @@
  * under the License.
  */
 
-package org.apache.rave.portal.web.model.config.url;
+package org.apache.rave.jcr.config.url;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.util.List;
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
-import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @version "$Id$"

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlMapping.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/java/org/apache/rave/jcr/config/url/UrlMapping.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/resources/example_configuration.xml
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/resources/example_configuration.xml?rev=1373306&view=auto
==============================================================================
--- rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/resources/example_configuration.xml (added)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/resources/example_configuration.xml Wed Aug 15 10:13:16 2012
@@ -0,0 +1,100 @@
+<?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.
+  -->
+<configuration name="default">
+  <!--
+      STANDARD PAGE (HAS NO PARENT)
+  -->
+  <page-definition name="standard" description="Page that is being extended by other pages"
+                   displayname="Standard page"
+                   owner="testUser" type="TEMPLATE" path="/standard">
+    <page-fragment name="menuController" class="org.apache.rave.portal.web.hmvc.example.MyMenuController"
+                   type="COMPONENT"/>
+    <page-fragment name="header" path="/header">
+      <page-fragment name="headerController" class="org.apache.rave.portal.web.hmvc.example.MyHeaderController"
+                     type="COMPONENT"/>
+    </page-fragment>
+    <page-fragment name="footer" path="/footer">
+      <page-fragment name="footerController" class="org.apache.rave.portal.web.hmvc.example.MyFooterController"
+                     type="COMPONENT"/>
+    </page-fragment>
+  </page-definition>
+  <!-- INVALID PAGE DEFINITION (ALREADY DEFINED) -->
+  <page-definition name="standard" description="Page that is being extended by other pages"
+                   displayname="Standard page -INVALID"
+                   owner="testUser" type="TEMPLATE" path="/standard">
+
+  </page-definition>
+
+
+  <!--
+      LOGIN PAGE (extends STANDARD page)
+  -->
+  <page-fragment name="loginPage" path="/login" description="Login screen" parent="standard">
+    <page-fragment name="header" path="/header">
+      <page-fragment name="headerController" class="com.test.LoginHeaderController"/>
+    </page-fragment>
+    <page-fragment name="body" path="/body">
+      <page-fragment name="headerController" class="com.test.LoginHeaderController"/>
+    </page-fragment>
+  </page-fragment>
+
+  <!--
+      ADMIN PAGE (extends ADMIN page, see below)
+  -->
+  <page-fragment name="userAdminPage" path="/admin/user" description="User administration pages"
+                 parent="adminPage">
+    <!-- @overrides footer-->
+    <page-fragment name="footer" path="/footer">
+      <page-fragment name="footerController" class="org.apache.rave.portal.web.hmvc.example.MyFooterController"/>
+    </page-fragment>
+    <!-- @overrides admin header-->
+    <page-fragment name="header" path="/header">
+      <page-fragment name="headerController" class="org.apache.rave.portal.web.hmvc.example.MyHeaderController"
+        />
+    </page-fragment>
+    <!-- add body-->
+    <page-fragment name="body" path="/body">
+      <page-fragment name="bodyController" class="org.apache.rave.portal.web.hmvc.example.MyBodyController"/>
+
+    </page-fragment>
+  </page-fragment>
+  <!-- INVALID USER ADMIN PAGE (ALREADY DEFINED ABOVE)-->
+  <page-fragment name="userAdminPage" path="/admin/user" description="User administration pages"
+                 parent="adminPage">
+    <!-- add body-->
+    <page-fragment name="body" path="/body">
+      <page-fragment name="bodyController" class="org.apache.rave.portal.web.hmvc.example.MyBodyController"/>
+    </page-fragment>
+  </page-fragment>
+
+
+  <!--
+      ADMIN PAGE (extends STANDARD page)
+  -->
+  <page-fragment name="adminPage" path="/admin" description="Administration pages"
+                 parent="standard">
+    <!-- @overrides footer-->
+    <page-fragment name="footer" path="/footer"
+                   controller="org.apache.rave.portal.web.hmvc.example.MyFooterController">
+      <page-fragment name="footerController" class="org.apache.rave.portal.web.hmvc.example.MyFooterController"/>
+    </page-fragment>
+  </page-fragment>
+
+</configuration>

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/resources/example_configuration.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/resources/example_configuration.xml
------------------------------------------------------------------------------
    svn:keywords = Id

Copied: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/resources/example_url_mapping.xml (from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/test/resources/example_url_mapping.xml)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/resources/example_url_mapping.xml?p2=rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/resources/example_url_mapping.xml&p1=rave/sandbox/content-services/rave-web-hmvc/src/test/resources/example_url_mapping.xml&r1=1372943&r2=1373306&rev=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-web-hmvc/src/test/resources/example_url_mapping.xml (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/resources/example_url_mapping.xml Wed Aug 15 10:13:16 2012
@@ -8,7 +8,7 @@
   "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
+       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
@@ -16,22 +16,22 @@
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
--->
+  -->
 <url-configuration name="default">
 
-    <!--admin page mapping -->
-    <url-mapping url="/login" page="loginPage">
-        <render-mapping name="loginPage/header" path="/login/login.jsp"/>
-        <render-mapping name="loginPage/footer" path="/login/login.jsp"/>
-    </url-mapping>
-    <url-mapping url="/admin" page="adminPage"/>
-    <url-mapping url="/user" page="userAdminPage">
-        <url-mapping url="admin" page="userAdminPage">
-            <url-mapping url="edit" page="userAdminPage">
-                <render-mapping name="userAdminPage/footer" path="/user/pages/footer.jsp"/>
-            </url-mapping>
-            <url-mapping url="add" page="userAdminPage"/>
-            <url-mapping url="delete" page="userAdminPage"/>
-        </url-mapping>
+  <!--admin page mapping -->
+  <url-mapping url="/login" page="loginPage">
+    <render-mapping name="loginPage/header" path="/login/login.jsp"/>
+    <render-mapping name="loginPage/footer" path="/login/login.jsp"/>
+  </url-mapping>
+  <url-mapping url="/admin" page="adminPage"/>
+  <url-mapping url="/user" page="userAdminPage">
+    <url-mapping url="admin" page="userAdminPage">
+      <url-mapping url="edit" page="userAdminPage">
+        <render-mapping name="userAdminPage/footer" path="/user/pages/footer.jsp"/>
+      </url-mapping>
+      <url-mapping url="add" page="userAdminPage"/>
+      <url-mapping url="delete" page="userAdminPage"/>
     </url-mapping>
+  </url-mapping>
 </url-configuration>

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/resources/example_url_mapping.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/main/resources/example_url_mapping.xml
------------------------------------------------------------------------------
    svn:keywords = Id

Copied: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/FileConfigManagerTest.java (from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/model/config/FilePageConfigDaoTest.java)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/FileConfigManagerTest.java?p2=rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/FileConfigManagerTest.java&p1=rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/model/config/FilePageConfigDaoTest.java&r1=1372943&r2=1373306&rev=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/model/config/FilePageConfigDaoTest.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/FileConfigManagerTest.java Wed Aug 15 10:13:16 2012
@@ -17,57 +17,60 @@
  * under the License.
  */
 
-package org.apache.rave.portal.web.model.config;
+package org.apache.rave.jcr.config;
 
-import org.apache.rave.portal.web.exceptions.InvalidConfigurationException;
-import org.apache.rave.portal.web.model.PageDefinition;
-import org.apache.rave.portal.web.model.PageFragment;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.rave.jcr.config.exc.InvalidConfigurationException;
+import org.apache.rave.jcr.config.model.JcrPageFragment;
+import org.apache.rave.jcr.config.model.api.PageConfiguration;
+import org.apache.rave.jcr.config.model.api.PageDefinition;
+import org.apache.rave.jcr.config.model.api.PageFragment;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import static junit.framework.Assert.*;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertTrue;
 
 /**
  * @version "$Id$"
  */
-public class FilePageConfigDaoTest {
+public class FileConfigManagerTest {
+
+    private static Logger log = LoggerFactory.getLogger(FileConfigManagerTest.class);
 
-    private static Logger log = LoggerFactory.getLogger(FilePageConfigDaoTest.class);
 
     @Test
     public void testLoadConfig() throws Exception {
-        PageConfigDao dao = new FilePageConfigDao();
-        final PageConfig config = dao.loadConfig(FileConfigDao.CLASSPATH_PREFIX + "example_configuration.xml");
+        ConfigManager dao = new FileConfigManager();
+        final PageConfiguration config = dao.loadConfiguration(ConfigUtils.CLASSPATH_PREFIX + "example_configuration.xml");
         assertNotNull(config);
         assertEquals("default", config.getName());
-        final List<PageDefinitionConfig> definitions = config.getDefinitions();
+        final Collection<PageDefinition> definitions = config.getPageDefinitions();
         assertEquals("expected only (1) definition (name=standard) page", 1, definitions.size());
         final Collection<PageDefinition> pageDefinitions = config.getPageDefinitions();
         assertEquals("Expected one page definition", 1, pageDefinitions.size());
-        final Collection<PageFragment> kids = config.getFragmentDefinitions();
-        assertEquals("expected 3 page fragments", 3, kids.size());
-        final Map<String, PageFragment> fragmentDefinitionsMap = config.getFragmentDefinitionsMap();
-        final PageFragment adminFragment = fragmentDefinitionsMap.get("adminPage");
-        final PageDefinitionConfig standardPage = definitions.get(0);
-        for (PageFragment kid : kids) {
-            final PageFragment parent = kid.getParent();
-            assertTrue("Expected valid parent, but found null", parent != null);
-            if (kid.getName().equals("userAdminPage")) {
-                assertEquals("Expected that userAdmin extends adminPage", parent.getName(), adminFragment.getName());
-            } else {
-                assertEquals("Expected that other pages extend standard page", parent.getName(), standardPage.getName());
+        final List<PageFragment> kids = config.getPageFragments();
+        assertNotNull("Expected child fragments", kids);
+        assertEquals("Expected 3 kids", 3, kids.size());
+        PageFragment adminFragment = null;
+        List<PageFragment> fragments = config.getPageFragments();
+        for (PageFragment fragment : fragments) {
+            if (fragment.getName().equals("adminPage")) {
+                adminFragment = fragment;
+                break;
             }
-
         }
 
+        assertTrue(adminFragment != null);
+        final PageDefinition standardPage = definitions.iterator().next();
+        assertTrue(standardPage != null);
 
         final List<PageFragment> adminKids = adminFragment.getChildren();
-        assertEquals(3, adminKids.size());
+        assertEquals("AdminFragment should have 3 kids", 3, adminKids.size());
         // admin should have header from page definition
         PageDefinition standard = pageDefinitions.iterator().next();
         final List<PageFragment> children = standard.getChildren();
@@ -90,27 +93,37 @@ public class FilePageConfigDaoTest {
 
         assertTrue("Expected that footer has a child nodes", adminFooter != null);
         assertEquals(1, adminFooter.getChildren().size());
-        final PageFragment userAdminFragment = fragmentDefinitionsMap.get("userAdminPage");
-        assertEquals(4, userAdminFragment.getChildren().size());
+        PageFragment userAdminFragment = null;
+
+        for (PageFragment fragment : fragments) {
+            if (fragment.getName().equals("userAdminPage")) {
+                userAdminFragment = fragment;
+                break;
+            }
+        }
+        assertTrue(userAdminFragment != null);
+        assertEquals(3, userAdminFragment.getChildren().size());
 
     }
 
     @Test(expected = InvalidConfigurationException.class)
     public void testLoadConfigFail() throws Exception {
-        PageConfigDao dao = new FilePageConfigDao();
+        ConfigManager dao = new FileConfigManager();
         // this should throw InvalidConfigurationException exception
-        dao.loadConfig(FileConfigDao.CLASSPATH_PREFIX + "NONE_EXISTING_example_configuration.xml");
+        dao.loadConfiguration(ConfigUtils.CLASSPATH_PREFIX + "NONE_EXISTING_example_configuration.xml");
     }
 
     @Test
     public void testNoParent() throws Exception {
-        PageConfigDao dao = new FilePageConfigDao();
-        final PageConfig config = dao.loadConfig(FileConfigDao.CLASSPATH_PREFIX + "example_configuration.xml");
+        ConfigManager dao = new FileConfigManager();
+        final PageConfiguration config = dao.loadConfiguration(ConfigUtils.CLASSPATH_PREFIX + "example_configuration.xml");
         assertNotNull(config);
-        final List<PageDefinitionConfig> definitions = config.getDefinitions();
-        final PageDefinitionConfig standardPage = definitions.get(0);
-        standardPage.setParent("test");
+        final Collection<PageDefinition> definitions = config.getPageDefinitions();
+        final PageDefinition standardPage = definitions.iterator().next();
+        standardPage.setParent(new JcrPageFragment("test"));
         assertTrue(standardPage.getParent() == null);
+
     }
 
-}
+
+}
\ No newline at end of file

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/FileConfigManagerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/FileConfigManagerTest.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/JcrConfigManagerTest.java
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/JcrConfigManagerTest.java?rev=1373306&r1=1373305&r2=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/JcrConfigManagerTest.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/JcrConfigManagerTest.java Wed Aug 15 10:13:16 2012
@@ -19,7 +19,7 @@
 
 package org.apache.rave.jcr.config;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.apache.rave.jcr.config.model.JcrPageConfiguration;
 import org.apache.rave.jcr.config.model.JcrPageDefinition;
@@ -87,7 +87,7 @@ public class JcrConfigManagerTest extend
         manager.saveConfiguration(configuration);
         retrievedConfiguration = manager.loadConfiguration(configName);
         assertTrue(retrievedConfiguration != null);
-        final List<PageFragment> pageFragments = retrievedConfiguration.getPageFragments();
+        final Collection<PageFragment> pageFragments = retrievedConfiguration.getPageFragments();
         assertEquals(pageFragments.size(), 2);
         assertEquals(retrievedConfiguration.getPageDefinitions().size(), 2);
         for (PageFragment pageFragment : pageFragments) {

Copied: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/url/FileUrlConfigDaoTest.java (from r1372943, rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/model/config/url/FileUrlConfigDaoTest.java)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/url/FileUrlConfigDaoTest.java?p2=rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/url/FileUrlConfigDaoTest.java&p1=rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/model/config/url/FileUrlConfigDaoTest.java&r1=1372943&r2=1373306&rev=1373306&view=diff
==============================================================================
--- rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/model/config/url/FileUrlConfigDaoTest.java (original)
+++ rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/url/FileUrlConfigDaoTest.java Wed Aug 15 10:13:16 2012
@@ -17,15 +17,15 @@
  * under the License.
  */
 
-package org.apache.rave.portal.web.model.config.url;
+package org.apache.rave.jcr.config.url;
 
-import org.apache.rave.portal.web.model.config.FileConfigDao;
+import java.util.List;
+
+import org.apache.rave.jcr.config.ConfigUtils;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
-
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertTrue;
 
@@ -39,7 +39,7 @@ public class FileUrlConfigDaoTest {
     @Test
     public void testLoadUrlConfig() throws Exception {
         FileUrlConfigDao dao = new FileUrlConfigDao();
-        final UrlConfig config = dao.loadUrlConfig(FileConfigDao.CLASSPATH_PREFIX + "example_url_mapping.xml");
+        final UrlConfig config = dao.loadUrlConfig(ConfigUtils.CLASSPATH_PREFIX + "example_url_mapping.xml");
         log.info("config {}", config);
         assertTrue(config != null);
         assertEquals("default", config.getName());
@@ -75,3 +75,4 @@ public class FileUrlConfigDaoTest {
 
     }
 }
+

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/url/FileUrlConfigDaoTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/rave-jcr-integration/page-configuration/src/test/java/org/apache/rave/jcr/config/url/FileUrlConfigDaoTest.java
------------------------------------------------------------------------------
    svn:keywords = Id