[gatein-commits] gatein SVN: r6885 - in epp/portal/branches/EPP_5_2_Branch: component and 70 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Mon Jul 18 18:48:41 EDT 2011


Author: theute
Date: 2011-07-18 18:48:36 -0400 (Mon, 18 Jul 2011)
New Revision: 6885

Added:
   epp/portal/branches/EPP_5_2_Branch/component/common/src/main/java/org/exoplatform/commons/utils/Queues.java
   epp/portal/branches/EPP_5_2_Branch/component/common/src/main/java/org/exoplatform/commons/utils/Spliterator.java
   epp/portal/branches/EPP_5_2_Branch/component/common/src/test/java/org/exoplatform/commons/utils/TestQueues.java
   epp/portal/branches/EPP_5_2_Branch/component/common/src/test/java/org/exoplatform/commons/utils/TestSpliterator.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/ImportMode.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/NavigationImporter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/EventType.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/SiteKey.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/SiteType.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/DataCache.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/ExoDataCache.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/FederatingVisitor.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/GenericScope.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/InvalidationBridge.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationContext.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationData.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationError.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationService.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceException.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceImpl.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceWrapper.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationState.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChange.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeListener.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeQueue.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContext.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContextChangeAdapter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeData.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeFilter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeModel.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeState.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Scope.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/SimpleDataCache.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeContext.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeMerge.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdate.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdateAdapter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Utils.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/VisitMode.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNavigation.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNode.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeContext.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilterConfig.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortal.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalContext.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalException.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalImpl.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/Utils.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/tasks/MOPAccess.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NodeData.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/Adapters.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyAdapter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeIterator.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeType.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyContext.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyDiff.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListAdapter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeIterator.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeType.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListDiff.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/list/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/list/ListTree.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/Builder.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/TestNavigationImporter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/AbstractTestNavigationService.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/Node.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationService.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceRebase.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceSave.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceUpdate.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceWrapper.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestScope.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestSerialization.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestParsePath.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestUserPortal.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/tree/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/tree/list/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/tree/list/TestListTree.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/portal/portal/large/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/portal/portal/large/navigation.xml
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/TreeNode.java
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UINavigationManagement.java
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UINavigationNodeSelector.java
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UIPageNodeForm.java
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/BasePartialUpdateToolbar.java
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/navigation/webui/component/UINavigationManagement.gtmpl
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/javascript/
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/javascript/eXo/
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/javascript/eXo/webui/
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/javascript/eXo/webui/UISiteMap.js
   epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/skin/DefaultSkin/webui/component/UIPageSearch/
   epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/skin/DefaultSkin/webui/component/UIPageSearch/Stylesheet.css
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/page/UIPageSearchForm.gtmpl
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageSearchForm.java
Removed:
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/ImportMode.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/NavigationImporter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/DataCache.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/ExoDataCache.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/FederatingVisitor.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/GenericScope.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/InvalidationBridge.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationContext.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationData.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationError.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationService.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceException.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceImpl.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceWrapper.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationState.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChange.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeListener.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeQueue.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContext.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContextChangeAdapter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeData.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeFilter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeModel.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeState.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Scope.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/SimpleDataCache.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeContext.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeMerge.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdate.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdateAdapter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Utils.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/VisitMode.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNavigation.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNode.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeContext.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilterConfig.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortal.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalContext.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalException.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalImpl.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/Utils.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/tasks/PageNavigationTask.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NavigationData.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NavigationNodeContainerData.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NavigationNodeData.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/Adapters.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyAdapter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeIterator.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeType.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyContext.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyDiff.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListAdapter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeIterator.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeType.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListDiff.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/list/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/list/ListTree.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSystemNavigation.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/Builder.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/TestNavigationImporter.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/AbstractTestNavigationService.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/Node.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationService.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceRebase.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceSave.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceUpdate.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceWrapper.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestScope.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestSerialization.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestParsePath.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestUserPortal.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/tree/list/
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/tree/list/TestListTree.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/portal/portal/large/navigation.xml
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/navigation/webui/component/NewUIGroupManagement.gtmpl
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UIPortalNavigationPortlet.java
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/WEB-INF/conf/portlet/web/PortalNavigationPortlet/webui/configuration.xml
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/groovy/portal/webui/component/UIPortalNavigation2.gtmpl
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/javascript/eXo/
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/javascript/eXo/webui/
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/javascript/eXo/webui/UISiteMap.js
   epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/skin/DefaultSkin/webui/component/UIPageSearch/Stylesheet.css
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/navigation/UINavigationManagement.gtmpl
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/portal/NewUIGroupManagement.gtmpl
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/webui/core/UISitemap2.gtmpl
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/PageNavigationUtils.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/ParentChildPair.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UINavigationManagement.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UINavigationNodeSelector.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPortalNavigation2.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPortalNodeSelector.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/PageUtils.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageNodeForm.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageSelector2.java
Modified:
   epp/portal/branches/EPP_5_2_Branch/
   epp/portal/branches/EPP_5_2_Branch/component/
   epp/portal/branches/EPP_5_2_Branch/component/common/src/main/java/org/exoplatform/commons/utils/Safe.java
   epp/portal/branches/EPP_5_2_Branch/component/common/src/test/java/org/exoplatform/commons/utils/TestSafe.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/gatein_objects_1_2.xsd
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/DataStorage.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/DataStorageImpl.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/GroupPortalConfigListener.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/NewPortalConfigListener.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/UserACL.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/UserPortalConfig.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/UserPortalConfigService.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PageNavigation.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PageNode.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PageNodeContainer.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PortalConfig.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/SiteConfig.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/ExecutorDispatcher.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/POMDataStorage.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/POMSession.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/POMSessionManager.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/tasks/SearchTask.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/MappedAttributes.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/Mapper.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/ModelDataStorage.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/resources/binding.xml
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/TestXSDCorruption.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestDataStorage.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestLoadedPOM.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestPortalConfig.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSavedPOM.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSearch.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSerialization.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestUserPortalConfigService.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/AbstractTestUserACL.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/nav/TestGroupNavACL.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/nav/TestPortalNavACL.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/nav/TestUserNavACL.java
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/conf/exo.portal.component.portal-configuration1.xml
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/conf/exo.portal.component.portal-configuration2.xml
   epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/portal/portal/test/navigation.xml
   epp/portal/branches/EPP_5_2_Branch/examples/skins/simpleskin/src/main/webapp/WEB-INF/gatein-resources.xml
   epp/portal/branches/EPP_5_2_Branch/pom.xml
   epp/portal/branches/EPP_5_2_Branch/portlet/dashboard/src/main/java/org/exoplatform/dashboard/webui/component/UIDashboardPortlet.java
   epp/portal/branches/EPP_5_2_Branch/portlet/dashboard/src/main/java/org/exoplatform/dashboard/webui/component/UITabPaneDashboard.java
   epp/portal/branches/EPP_5_2_Branch/portlet/dashboard/src/main/webapp/groovy/dashboard/webui/component/UITabPaneDashboard.gtmpl
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UIGroupNavigationManagement.java
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UISiteManagement.java
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIAdminToolbarPortlet.java
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIUserToolBarDashboardPortlet.java
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIUserToolBarGroupPortlet.java
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIUserToolBarSitePortlet.java
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/WEB-INF/portlet.xml
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIAdminToolbarPortlet.gtmpl
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIUserToolBarDashboardPortlet.gtmpl
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIUserToolBarGroupPortlet.gtmpl
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIUserToolBarSitePortlet.gtmpl
   epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/navigation/webui/component/UINavigationGrid.gtmpl
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UIBreadcumbsPortlet.java
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UILogoPortlet.java
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UINavigationPortlet.java
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UISitemapPortlet.java
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/WEB-INF/gatein-resources.xml
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/WEB-INF/portlet.xml
   epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/groovy/portal/webui/component/UIPortalNavigation.gtmpl
   epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/portal/UIPortal.js
   epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/portal/UIPortalControl.js
   epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/portal/UIPortalNavigation.js
   epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/webui/UITabbedDashboard.js
   epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/webui/UIVirtualList.js
   epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/skin/DefaultSkin/webui/component/Stylesheet.css
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ar.xml
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_de.properties
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_en.properties
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_es.properties
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_fr.properties
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_it.properties
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ja.properties
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ko.xml
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ne.properties
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_nl.properties
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_pt_BR.properties
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ru.properties
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_uk.properties
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_vi.properties
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_zh.xml
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_zh_TW.xml
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/conf/portal/portal-configuration.xml
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/conf/portal/portal/classic/navigation.xml
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/navigation/UINavigationNodeSelector.gtmpl
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/navigation/UIPageNodeSelector.gtmpl
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/page/UIPageSelector.gtmpl
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/page/UIWizardPageSetInfo.gtmpl
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/webui/core/UISitemap.gtmpl
   epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/webui/core/UISitemapTree.gtmpl
   epp/portal/branches/EPP_5_2_Branch/webui/core/src/main/java/org/exoplatform/webui/core/UITree.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestContext.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/PortalStateManager.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationLifecycle.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/state/PublicPropertiesPlugin.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/TreeNode.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIAddGroupNavigation.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPageNavigationForm.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPageNodeSelector.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPortalNavigation.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/PageQueryAccessList.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageActionListener.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageBody.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageBrowser.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageCreationWizard.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageSelector.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIWizardPageSetInfo.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UILanguageSelector.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortal.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComponentActionListener.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComposer.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalForm.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/util/PortalDataMapper.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/util/Util.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/workspace/UIMainActionListener.java
   epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/workspace/UIPortalApplication.java
   epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/application/portlet/PortletApplication.java
   epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/application/portlet/PortletApplicationController.java
   epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/application/portlet/PortletRequestContext.java
   epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/core/UIPortletApplication.java
Log:
JBEPP-933
EPP52-EID_101: Navigations optimizations


Property changes on: epp/portal/branches/EPP_5_2_Branch
___________________________________________________________________
Modified: svn:mergeinfo
   - /epp/portal/branches/EPP_5_1_0_GA_JBEPP-795:5868
/portal/branches/branch-GTNPORTAL-1592:4894
/portal/branches/branch-GTNPORTAL-1643:5002,5063,5167
/portal/branches/branch-GTNPORTAL-1700:5348,5363,5402,5445
/portal/branches/branch-GTNPORTAL-1731:5622,5668
/portal/branches/branch-GTNPORTAL-1745:5765
/portal/branches/branch-GTNPORTAL-1822:5943,5952
/portal/branches/branch-GTNPORTAL-1832:6030,6063
/portal/branches/branch-GTNPORTAL-1872:6400
/portal/branches/decoupled-webos:6214-6243
/portal/branches/global-portlet-metadata:6298-6384
/portal/branches/site-describability:6171-6235
/portal/trunk:4891,5744,5822,5943,6168,6196,6201-6203,6205-6206,6437,6440,6449,6452,6573
   + /epp/portal/branches/EPP_5_1_0_GA_JBEPP-795:5868
/portal/branches/branch-GTNPORTAL-1592:4894
/portal/branches/branch-GTNPORTAL-1643:5002,5063,5167
/portal/branches/branch-GTNPORTAL-1700:5348,5363,5402,5445
/portal/branches/branch-GTNPORTAL-1731:5622,5668
/portal/branches/branch-GTNPORTAL-1745:5765
/portal/branches/branch-GTNPORTAL-1822:5943,5952
/portal/branches/branch-GTNPORTAL-1832:6030,6063
/portal/branches/branch-GTNPORTAL-1872:6400
/portal/branches/decoupled-webos:6214-6243
/portal/branches/global-portlet-metadata:6298-6384
/portal/branches/site-describability:6171-6235
/portal/trunk:4891,5744,5822,5943,6168,6196,6201-6203,6205-6206,6437,6440,6449,6452,6573,6783


Property changes on: epp/portal/branches/EPP_5_2_Branch/component
___________________________________________________________________
Modified: svn:mergeinfo
   - /epp/portal/branches/EPP_5_1_0_GA_JBEPP-795/component:5868
/portal/branches/branch-GTNPORTAL-1592/component:4894
/portal/branches/branch-GTNPORTAL-1643/component:5002,5063,5167
/portal/branches/branch-GTNPORTAL-1700/component:5348,5363,5402,5445
/portal/branches/branch-GTNPORTAL-1731/component:5622,5668
/portal/branches/branch-GTNPORTAL-1745/component:5765
/portal/branches/branch-GTNPORTAL-1822/component:5943,5952
/portal/branches/branch-GTNPORTAL-1832/component:6030,6063
/portal/branches/branch-GTNPORTAL-1872/component:6400
/portal/trunk/component:4891,5744,5822,5943,6031,6033,6168,6196,6201-6203,6205-6206,6437,6440,6449,6452,6573
   + /epp/portal/branches/EPP_5_1_0_GA_JBEPP-795/component:5868
/portal/branches/branch-GTNPORTAL-1592/component:4894
/portal/branches/branch-GTNPORTAL-1643/component:5002,5063,5167
/portal/branches/branch-GTNPORTAL-1700/component:5348,5363,5402,5445
/portal/branches/branch-GTNPORTAL-1731/component:5622,5668
/portal/branches/branch-GTNPORTAL-1745/component:5765
/portal/branches/branch-GTNPORTAL-1822/component:5943,5952
/portal/branches/branch-GTNPORTAL-1832/component:6030,6063
/portal/branches/branch-GTNPORTAL-1872/component:6400
/portal/trunk/component:4891,5744,5822,5943,6031,6033,6168,6196,6201-6203,6205-6206,6437,6440,6449,6452,6573,6783

Copied: epp/portal/branches/EPP_5_2_Branch/component/common/src/main/java/org/exoplatform/commons/utils/Queues.java (from rev 6783, portal/trunk/component/common/src/main/java/org/exoplatform/commons/utils/Queues.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/common/src/main/java/org/exoplatform/commons/utils/Queues.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/common/src/main/java/org/exoplatform/commons/utils/Queues.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.commons.utils;
+
+import java.util.AbstractQueue;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Queue;
+
+/**
+ * A LIFO stack implementing the {@link java.util.Queue} interface backed by an array.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class Queues
+{
+
+   /** . */
+   private static final Queue<Object> EMPTY = new AbstractQueue<Object>()
+   {
+      @Override
+      public Iterator<Object> iterator()
+      {
+         return Collections.emptyList().iterator();
+      }
+
+      @Override
+      public int size()
+      {
+         return 0;
+      }
+
+      public boolean offer(Object o)
+      {
+         return false;
+      }
+
+      public Object poll()
+      {
+         return null;
+      }
+
+      public Object peek()
+      {
+         return null;
+      }
+   };
+
+   private static class LIFO<E> extends AbstractQueue<E>
+   {
+      /** . */
+      private Object[] elements;
+
+      /** . */
+      private int size;
+
+      public LIFO(int initialCapacity)
+      {
+         this.elements = new Object[initialCapacity];
+         this.size = 0;
+      }
+
+      @Override
+      public Iterator<E> iterator()
+      {
+         return new Iterator<E>()
+         {
+            int count = size;
+            public boolean hasNext()
+            {
+               return count > 0;
+            }
+            public E next()
+            {
+               if (!hasNext())
+               {
+                  throw new NoSuchElementException();
+               }
+               else
+               {
+                  @SuppressWarnings("unchecked")
+                  E element = (E)elements[--count];
+                  return element;
+               }
+            }
+            public void remove()
+            {
+               throw new UnsupportedOperationException();
+            }
+         };
+      }
+
+      @Override
+      public int size()
+      {
+         return size;
+      }
+
+      public boolean offer(E e)
+      {
+         int length = elements.length;
+         if (size == length)
+         {
+            Object[] tmp = new Object[(length * 3) / 2 + 1];
+            System.arraycopy(elements, 0, tmp, 0, length);
+            elements = tmp;
+         }
+         elements[size++] = e;
+         return true;
+      }
+
+      public E poll()
+      {
+         if (size > 0)
+         {
+            int index = --size;
+            @SuppressWarnings("unchecked")
+            E element = (E)elements[index];
+            elements[index] = null;
+            return element;
+         }
+         else
+         {
+            return null;
+         }
+      }
+
+      public E peek()
+      {
+         if (size > 0)
+         {
+            @SuppressWarnings("unchecked")
+            E element = (E)elements[size - 1];
+            return element;
+         }
+         else
+         {
+            return null;
+         }
+      }
+   }
+
+   public static <E> Queue<E> empty()
+   {
+      @SuppressWarnings("unchecked")
+      Queue<E> queue = (Queue<E>)EMPTY;
+      return queue;
+   }
+
+   public static <E> Queue<E> lifo()
+   {
+      return lifo(10);
+   }
+
+   public static <E> Queue<E> lifo(int initialCapacity)
+   {
+      return new LIFO<E>(initialCapacity);
+   }
+}

Modified: epp/portal/branches/EPP_5_2_Branch/component/common/src/main/java/org/exoplatform/commons/utils/Safe.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/common/src/main/java/org/exoplatform/commons/utils/Safe.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/common/src/main/java/org/exoplatform/commons/utils/Safe.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -26,6 +26,8 @@
 import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.lang.reflect.UndeclaredThrowableException;
+import java.util.Collections;
+import java.util.Set;
 
 /**
  * A class that contains utility method that make the caller not worry much about the unexpectable expected such as
@@ -113,6 +115,26 @@
       }
    }
 
+   /**
+    * Wrap the set so that it is unmodifiable when it is not null, otherwise returns null.
+    *
+    * @todo it would be nice to avoid to rewrap unmodifiable set (not sure it is non proprietary possible)
+    * @param set the set to wrap
+    * @param <E> the set generic element type
+    * @return the unmodifiable set
+    */
+   public static <E> Set<E> unmodifiableSet(Set<E> set)
+   {
+      if (set == null)
+      {
+         return null;
+      }
+      else
+      {
+         return Collections.unmodifiableSet(set);
+      }
+   }
+
    // THIS CODE IS TEMPORARY
 
    /** . */

Copied: epp/portal/branches/EPP_5_2_Branch/component/common/src/main/java/org/exoplatform/commons/utils/Spliterator.java (from rev 6783, portal/trunk/component/common/src/main/java/org/exoplatform/commons/utils/Spliterator.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/common/src/main/java/org/exoplatform/commons/utils/Spliterator.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/common/src/main/java/org/exoplatform/commons/utils/Spliterator.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.commons.utils;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * An iterator that splits a string into chunks without requiring to allocate an array to hold
+ * the various chunks of the splitted string.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class Spliterator implements Iterator<String>
+{
+
+   /** . */
+   private final String s;
+
+   /** . */
+   private final char separator;
+
+   /** . */
+   private int from;
+
+   /** . */
+   private Integer to;
+
+   /**
+    * Creates a spliterator.
+    *
+    * @param s the string to split
+    * @param separator the separator
+    * @throws NullPointerException if the string is null
+    */
+   public Spliterator(String s, char separator) throws NullPointerException
+   {
+      if (s == null)
+      {
+         throw new NullPointerException();
+      }
+
+      //
+      this.s = s;
+      this.separator = separator;
+      this.from = 0;
+      this.to = null;
+   }
+
+   public boolean hasNext()
+   {
+      if (from == -1)
+      {
+         return false;
+      }
+      else
+      {
+         if (to == null)
+         {
+            to = s.indexOf(separator, from);
+         }
+         return true;
+      }
+   }
+
+   public String next()
+   {
+      if (hasNext())
+      {
+         String next;
+         if (to == -1)
+         {
+            next = s.substring(from);
+            from = -1;
+         }
+         else
+         {
+            next = s.substring(from, to);
+            from = to + 1;
+         }
+         to = null;
+         return next;
+      }
+      else
+      {
+         throw new NoSuchElementException();
+      }
+   }
+
+   public void remove()
+   {
+      throw new UnsupportedOperationException();
+   }
+}

Copied: epp/portal/branches/EPP_5_2_Branch/component/common/src/test/java/org/exoplatform/commons/utils/TestQueues.java (from rev 6783, portal/trunk/component/common/src/test/java/org/exoplatform/commons/utils/TestQueues.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/common/src/test/java/org/exoplatform/commons/utils/TestQueues.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/common/src/test/java/org/exoplatform/commons/utils/TestQueues.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.commons.utils;
+
+import junit.framework.TestCase;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Queue;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class TestQueues extends TestCase
+{
+   public void testLIFO()
+   {
+      Queue<String> lifo = Queues.lifo();
+      assertEquals(0, lifo.size());
+      assertTrue(lifo.add("a"));
+      assertEquals(1, lifo.size());
+      assertTrue(lifo.add("b"));
+      assertEquals(2, lifo.size());
+      assertTrue(lifo.add("c"));
+      assertEquals(3, lifo.size());
+      Iterator<String> it = lifo.iterator();
+      assertEquals("c", it.next());
+      assertEquals("b", it.next());
+      assertEquals("a", it.next());
+      assertFalse(it.hasNext());
+      assertEquals("c", lifo.peek());
+      assertEquals(3, lifo.size());
+      assertEquals("c", lifo.poll());
+      assertEquals(2, lifo.size());
+      assertEquals("b", lifo.poll());
+      assertEquals(1, lifo.size());
+      assertEquals("a", lifo.poll());
+      assertEquals(0, lifo.size());
+      assertEquals(null, lifo.poll());
+      assertEquals(null, lifo.peek());
+      assertEquals(0, lifo.size());
+      assertEquals(null, lifo.poll());
+      assertEquals(null, lifo.peek());
+      assertEquals(0, lifo.size());
+   }
+
+   public void testLIFOResize()
+   {
+      Queue<String> lifo = Queues.lifo(0);
+      assertEquals(0, lifo.size());
+      lifo.add("a");
+      assertEquals(1, lifo.size());
+      assertEquals("a", lifo.peek());
+      assertEquals("a", lifo.poll());
+      assertEquals(0, lifo.size());
+   }
+
+   public void testEmpty()
+   {
+      Queue<String> lifo = Queues.empty();
+      assertFalse(lifo.offer(""));
+      try
+      {
+         lifo.add("");
+         fail();
+      }
+      catch (IllegalStateException ignore)
+      {
+      }
+      assertEquals(0, lifo.size());
+      assertNull(lifo.peek());
+      assertNull(lifo.poll());
+      try
+      {
+         lifo.element();
+         fail();
+      }
+      catch (NoSuchElementException ignore)
+      {
+      }
+   }
+}

Modified: epp/portal/branches/EPP_5_2_Branch/component/common/src/test/java/org/exoplatform/commons/utils/TestSafe.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/common/src/test/java/org/exoplatform/commons/utils/TestSafe.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/common/src/test/java/org/exoplatform/commons/utils/TestSafe.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -25,6 +25,9 @@
 import java.io.ByteArrayOutputStream;
 import java.io.Closeable;
 import java.io.IOException;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
@@ -139,4 +142,21 @@
       }
    }
 
+   public void testSetUnmodifiable()
+   {
+      assertNull(Safe.unmodifiableSet(null));
+      Set<String> strings = new HashSet<String>();
+      strings.add("a");
+      strings = Safe.unmodifiableSet(strings);
+      try
+      {
+         strings.add("b");
+         fail();
+      }
+      catch (Exception e)
+      {
+      }
+      assertEquals(Collections.singleton("a"), strings);
+   }
+
 }

Copied: epp/portal/branches/EPP_5_2_Branch/component/common/src/test/java/org/exoplatform/commons/utils/TestSpliterator.java (from rev 6783, portal/trunk/component/common/src/test/java/org/exoplatform/commons/utils/TestSpliterator.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/common/src/test/java/org/exoplatform/commons/utils/TestSpliterator.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/common/src/test/java/org/exoplatform/commons/utils/TestSpliterator.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.commons.utils;
+
+import org.exoplatform.component.test.AbstractGateInTest;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class TestSpliterator extends AbstractGateInTest
+{
+
+   public void testEmptyString()
+   {
+      Spliterator i = new Spliterator("", ' ');
+      assertTrue(i.hasNext());
+      assertEquals("", i.next());
+      assertFalse(i.hasNext());
+   }
+
+   public void testSeparatorString()
+   {
+      Spliterator i = new Spliterator(" ", ' ');
+      assertTrue(i.hasNext());
+      assertEquals("", i.next());
+      assertTrue(i.hasNext());
+      assertEquals("", i.next());
+      assertFalse(i.hasNext());
+   }
+
+   public void testEntireString()
+   {
+      Spliterator i = new Spliterator("a", ' ');
+      assertTrue(i.hasNext());
+      assertEquals("a", i.next());
+      assertFalse(i.hasNext());
+   }
+
+   public void testNormal()
+   {
+      Spliterator i = new Spliterator("a b", ' ');
+      assertTrue(i.hasNext());
+      assertEquals("a", i.next());
+      assertTrue(i.hasNext());
+      assertEquals("b", i.next());
+      assertFalse(i.hasNext());
+   }
+}

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/gatein_objects_1_2.xsd
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/gatein_objects_1_2.xsd	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/gatein_objects_1_2.xsd	2011-07-18 22:48:36 UTC (rev 6885)
@@ -32,197 +32,176 @@
    attributeFormDefault="unqualified"
    version="1.0">
 
-   <!-- A top page element -->
-   <xs:element name="page" type="pageType"/>
+  <!-- A top page element -->
+  <xs:element name="page" type="pageType"/>
 
-   <!-- A top page-set element -->
-   <xs:element name="page-set" type="pageSetType"/>
+  <!-- A top page-set element -->
+  <xs:element name="page-set" type="pageSetType"/>
 
-   <!-- A top portal-config element -->
-   <xs:element name="portal-config" type="portalConfigType"/>
+  <!-- A top portal-config element -->
+  <xs:element name="portal-config" type="portalConfigType"/>
 
-   <!-- A top container element -->
-   <xs:element name="container" type="containerType"/>
+  <!-- A top container element -->
+  <xs:element name="container" type="containerType"/>
 
-   <!-- A top node-navigation element -->
-   <xs:element name="node-navigation" type="nodeNavigationType"/>
+  <!-- A top node-navigation element -->
+  <xs:element name="node-navigation" type="nodeNavigationType"/>
 
-   <!-- The type of a top navigation node -->
-   <xs:complexType name="nodeNavigationType">
-      <xs:sequence>
-         <xs:element name="priority" type="xs:positiveInteger"/>
-         <xs:element name="page-nodes" minOccurs="0" maxOccurs="1">
-            <xs:complexType>
-               <xs:sequence>
-                  <xs:element name="node" type="nodeType" minOccurs="0" maxOccurs="unbounded"/>
-               </xs:sequence>
-            </xs:complexType>
-         </xs:element>
-      </xs:sequence>
-   </xs:complexType>
+  <!-- A localized string -->
+  <xs:complexType name="localizedString">
+    <xs:simpleContent>
+      <xs:extension base="xs:string">
+        <xs:attribute ref="xml:lang"/>
+      </xs:extension>
+    </xs:simpleContent>
+  </xs:complexType>
 
-   <!-- The type of a navigation node -->
-   <xs:complexType name="nodeType">
-      <xs:sequence>
-         <xs:element name="uri" type="xs:string"/>
-         <xs:element name="name" type="xs:string"/>
-         <xs:element name="label" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="icon" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="start-publication-date" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="end-publication-date" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="visibility" type="visibility" default="DISPLAYED" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="page-reference" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="node" type="nodeType" minOccurs="0" maxOccurs="unbounded"/>
-      </xs:sequence>
-   </xs:complexType>
+  <!-- The type of a top navigation node -->
+  <xs:complexType name="nodeNavigationType">
+    <xs:sequence>
+      <xs:element name="priority" type="xs:positiveInteger"/>
+      <xs:element name="page-nodes" minOccurs="0" maxOccurs="1">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="node" type="nodeType" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
 
-   <xs:simpleType name="visibility">
-      <xs:restriction base='xs:string'>
-         <xs:enumeration value="DISPLAYED"/>
-         <xs:enumeration value="HIDDEN"/>
-         <xs:enumeration value="TEMPORAL"/>
-         <xs:enumeration value="SYSTEM"/>
-      </xs:restriction>
-   </xs:simpleType>
+  <!-- The type of a navigation node -->
+  <xs:complexType name="nodeType">
+    <xs:sequence>
+      <xs:element name="uri" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="name" type="xs:string"/>
+      <xs:element name="label" type="localizedString" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="icon" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="start-publication-date" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="end-publication-date" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="visibility" type="visibility" default="VISIBLE" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="page-reference" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="node" type="nodeType" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
 
-   <xs:complexType name="pageSetType">
-      <xs:sequence>
-         <xs:element name="page" type="pageType" minOccurs="0" maxOccurs="unbounded"/>
-      </xs:sequence>
-   </xs:complexType>
+  <xs:simpleType name="visibility">
+    <xs:restriction base='xs:string'>
+      <xs:enumeration value="DISPLAYED"/>
+      <xs:enumeration value="HIDDEN"/>
+      <xs:enumeration value="TEMPORAL"/>
+      <xs:enumeration value="SYSTEM"/>
+    </xs:restriction>
+  </xs:simpleType>
 
-   <xs:complexType name="portalConfigType">
-      <xs:sequence>
-         <xs:element name="portal-name" type="xs:string" minOccurs="1" maxOccurs="1"/>
-         <xs:element name="label" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="locale" type="xs:string" minOccurs="1" maxOccurs="1"/>
-         <xs:element name="access-permissions" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="edit-permission" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="skin" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="properties" type="propertiesType" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="portal-layout" minOccurs="1" maxOccurs="1">
-            <xs:complexType>
-               <xs:group ref="containerChildrenGroup"/>
-            </xs:complexType>
-         </xs:element>
-      </xs:sequence>
-   </xs:complexType>
+  <xs:complexType name="pageSetType">
+    <xs:sequence>
+      <xs:element name="page" type="pageType" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
 
-   <xs:complexType name="propertiesType">
-      <xs:sequence minOccurs="0" maxOccurs="unbounded">
-         <xs:element name="entry" type="propertiesEntryType" minOccurs="1" maxOccurs="1"/>
-      </xs:sequence>
-   </xs:complexType>
+  <xs:complexType name="portalConfigType">
+    <xs:sequence>
+      <xs:element name="portal-name" type="xs:string" minOccurs="1" maxOccurs="1"/>
+      <xs:element name="locale" type="xs:string" minOccurs="1" maxOccurs="1"/>
+      <xs:element name="access-permissions" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="edit-permission" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="skin" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="properties" type="propertiesType" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="portal-layout" minOccurs="1" maxOccurs="1">
+        <xs:complexType>
+          <xs:group ref="containerChildrenGroup"/>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
 
-   <xs:complexType name="propertiesEntryType">
-      <xs:simpleContent>
-         <xs:extension base="xs:string">
-            <xs:attribute name="key" type="xs:string"/>
-         </xs:extension>
-      </xs:simpleContent>
-   </xs:complexType>
+  <xs:complexType name="propertiesType">
+    <xs:sequence minOccurs="0" maxOccurs="unbounded">
+      <xs:element name="entry" type="propertiesEntryType" minOccurs="1" maxOccurs="1"/>
+    </xs:sequence>
+  </xs:complexType>
 
-   <xs:group name="containerChildrenGroup">
-      <xs:sequence>
-         <xs:choice minOccurs="0" maxOccurs="unbounded">
-            <xs:element name="portlet-application" type="portletApplicationType" minOccurs="1" maxOccurs="1"/>
-            <xs:element name="gadget-application" type="gadgetApplicationType" minOccurs="1" maxOccurs="1"/>
-            <xs:element name="container" type="containerType" minOccurs="1" maxOccurs="1"/>
-            <xs:element name="page-body" type="xs:string" minOccurs="1" maxOccurs="1"/>
-            <xs:element name="site-body" type="xs:string" minOccurs="1" maxOccurs="1"/>
-         </xs:choice>
-      </xs:sequence>
-   </xs:group>
+  <xs:complexType name="propertiesEntryType">
+    <xs:simpleContent>
+      <xs:extension base="xs:string">
+        <xs:attribute name="key" type="xs:string"/>
+      </xs:extension>
+    </xs:simpleContent>
+  </xs:complexType>
 
-   <xs:complexType name="pageType">
-      <xs:sequence>
-         <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"/>
-         <xs:element name="title" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="factory-id" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="access-permissions" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="edit-permission" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="show-max-window" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
-         <xs:group ref="containerChildrenGroup"/>
-      </xs:sequence>
-   </xs:complexType>
+  <xs:group name="containerChildrenGroup">
+    <xs:sequence>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element name="portlet-application" type="portletApplicationType" minOccurs="1" maxOccurs="1"/>
+        <xs:element name="container" type="containerType" minOccurs="1" maxOccurs="1"/>
+        <xs:element name="page-body" type="xs:string" minOccurs="1" maxOccurs="1"/>
+        <xs:element name="site-body" type="xs:string" minOccurs="1" maxOccurs="1"/>
+      </xs:choice>
+    </xs:sequence>
+  </xs:group>
 
-   <xs:complexType name="containerType">
-      <xs:sequence>
-         <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="title" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="icon" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="access-permissions" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="factory-id" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:group ref="containerChildrenGroup"/>
-      </xs:sequence>
-      <xs:attribute name="id" type="xs:string"/>
-      <xs:attribute name="template" type="xs:string"/>
-      <xs:attribute name="attribute" type="xs:string"/>
-      <xs:attribute name="width" type="xs:string"/>
-      <xs:attribute name="height" type="xs:string"/>
-   </xs:complexType>
+  <xs:complexType name="pageType">
+    <xs:sequence>
+      <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"/>
+      <xs:element name="title" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="factory-id" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="access-permissions" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="edit-permission" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="show-max-window" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
+      <xs:group ref="containerChildrenGroup"/>
+    </xs:sequence>
+  </xs:complexType>
 
-   <xs:complexType name="portletApplicationType">
-      <xs:sequence>
-       <xs:choice>
-          <xs:element name="portlet" type="portletType"/>
-          <xs:element name="wsrp" type="xs:string"/>
-       </xs:choice>
-         <xs:element name="title" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="access-permissions" type="xs:string" minOccurs="1" maxOccurs="1"/>
-         <xs:element name="show-info-bar" type="xs:boolean" minOccurs="1" maxOccurs="1"/>
-         <xs:element name="show-application-state" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="show-application-mode" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="icon" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="width" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="height" type="xs:string" minOccurs="0" maxOccurs="1"/>
-      </xs:sequence>
-   </xs:complexType>
+  <xs:complexType name="containerType">
+    <xs:sequence>
+      <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="title" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="icon" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="access-permissions" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="factory-id" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="width" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="height" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:group ref="containerChildrenGroup"/>
+    </xs:sequence>
+    <xs:attribute name="id" type="xs:string"/>
+    <xs:attribute name="template" type="xs:string"/>
+    <xs:attribute name="attribute" type="xs:string"/>
+  </xs:complexType>
 
-   <xs:complexType name="gadgetApplicationType">
-      <xs:sequence>
-         <xs:element name="gadget" type="gadgetType" minOccurs="1" maxOccurs="1"/>
-         <xs:element name="theme" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="title" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="access-permissions" type="xs:string" minOccurs="1" maxOccurs="1"/>
-         <xs:element name="show-info-bar" type="xs:boolean" minOccurs="1" maxOccurs="1"/>
-         <xs:element name="show-application-state" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="show-application-mode" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="icon" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="width" type="xs:string" minOccurs="0" maxOccurs="1"/>
-         <xs:element name="height" type="xs:string" minOccurs="0" maxOccurs="1"/>
-      </xs:sequence>
-   </xs:complexType>
+  <xs:complexType name="portletApplicationType">
+    <xs:sequence>
+      <xs:element name="portlet" type="portletType" minOccurs="1" maxOccurs="1"/>
+      <xs:element name="title" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="access-permissions" type="xs:string" minOccurs="1" maxOccurs="1"/>
+      <xs:element name="show-info-bar" type="xs:boolean" minOccurs="1" maxOccurs="1"/>
+      <xs:element name="show-application-state" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="show-application-mode" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="width" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ 	 	 	<xs:element name="height" type="xs:string" minOccurs="0" maxOccurs="1"/>
+    </xs:sequence>
+  </xs:complexType>
 
-   <xs:complexType name="portletType">
-      <xs:sequence>
-         <xs:element name="application-ref" type="xs:string" minOccurs="1" maxOccurs="1"/>
-         <xs:element name="portlet-ref" type="xs:string" minOccurs="1" maxOccurs="1"/>
-         <xs:element name="preferences" type="portletPreferencesType" minOccurs="0" maxOccurs="1"/>
-      </xs:sequence>
-   </xs:complexType>
+  <xs:complexType name="portletType">
+    <xs:sequence>
+      <xs:element name="application-ref" type="xs:string" minOccurs="1" maxOccurs="1"/>
+      <xs:element name="portlet-ref" type="xs:string" minOccurs="1" maxOccurs="1"/>
+      <xs:element name="preferences" type="portletPreferencesType" minOccurs="0" maxOccurs="1"/>
+    </xs:sequence>
+  </xs:complexType>
 
-   <xs:complexType name="gadgetType">
-      <xs:sequence>
-         <xs:element name="gadget-ref" type="xs:string" minOccurs="1" maxOccurs="1"/>
-      </xs:sequence>
-   </xs:complexType>
+  <xs:complexType name="portletPreferencesType">
+    <xs:sequence>
+      <xs:element name="preference" type="portletPreferenceType" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
 
-   <xs:complexType name="portletPreferencesType">
-      <xs:sequence>
-         <xs:element name="preference" type="portletPreferenceType" minOccurs="0" maxOccurs="unbounded"/>
-      </xs:sequence>
-   </xs:complexType>
-
-   <xs:complexType name="portletPreferenceType">
-      <xs:sequence>
-         <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"/>
-         <xs:element name="value" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
-         <xs:element name="read-only" type="xs:string" minOccurs="0" maxOccurs="1"/>
-      </xs:sequence>
-   </xs:complexType>
+  <xs:complexType name="portletPreferenceType">
+    <xs:sequence>
+      <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"/>
+      <xs:element name="value" type="xs:string" minOccurs="0" maxOccurs="1"/>
+      <xs:element name="read-only" type="xs:string" minOccurs="0" maxOccurs="1"/>
+    </xs:sequence>
+  </xs:complexType>
 </xs:schema>
\ No newline at end of file

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/DataStorage.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/DataStorage.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/DataStorage.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -27,10 +27,10 @@
 import org.exoplatform.portal.config.model.Container;
 import org.exoplatform.portal.config.model.Dashboard;
 import org.exoplatform.portal.config.model.ModelObject;
-import org.exoplatform.portal.pom.data.ModelChange;
 import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.pom.config.tasks.PreferencesTask;
+import org.exoplatform.portal.pom.data.ModelChange;
 
 import java.util.Comparator;
 import java.util.List;
@@ -50,12 +50,6 @@
 
    public final static String PAGE_UPDATED = "org.exoplatform.portal.config.DataStorage.pageUpdated".intern();
 
-   public final static String NAVIGATION_CREATED = "org.exoplatform.portal.config.DataStorage.navigationCreated".intern();
-
-   public final static String NAVIGATION_REMOVED = "org.exoplatform.portal.config.DataStorage.navigationRemoved".intern();
-
-   public final static String NAVIGATION_UPDATED = "org.exoplatform.portal.config.DataStorage.navigationUpdated".intern();
-   
    public final static String PORTAL_CONFIG_CREATED = "org.exoplatform.portal.config.DataStorage.portalConfigCreated".intern();
 
    public final static String PORTAL_CONFIG_REMOVED = "org.exoplatform.portal.config.DataStorage.portalConfigRemoved".intern();
@@ -148,47 +142,6 @@
    public List<ModelChange> save(Page page) throws Exception;
 
    /**
-    * Return PageNavigation object from the database according to the fullId <br />
-    * If can't find, return null
-    * @param fullId - must be valid (2 parts, split by :: )
-    * @throws Exception
-    */
-   public PageNavigation getPageNavigation(String fullId) throws Exception;
-
-   /**
-    * Return PageNavigation object from the database according to the onwnerType (portal, group or user) and id
-    * @param ownerType
-    * @param id
-    * @throws Exception
-    */
-   public PageNavigation getPageNavigation(String ownerType, String id) throws Exception;
-
-   /**
-    * This method should update the navigation object in the database <br />
-    * Then broadcast NAVIGATION_UPDATED event
-    * @param navigation - PageNavigation object to update
-    * @throws Exception
-    */
-   public void save(PageNavigation navigation) throws Exception;
-
-   /**
-    * This method should create the navigation object in the database <br />
-    * Then broadcast NAVIGATION_CREATED event
-    * @param navigation - PageNavigation object to create
-    * @throws Exception
-    */
-   public void create(PageNavigation navigation) throws Exception;
-
-   /**
-    * Remove the navigation object from the database <br />
-    * If can't find it in database, ignore
-    * Then broadcast NAVIGATION_REMOVED event
-    * @param navigation - PageNavigation object to remove
-    * @throws Exception
-    */
-   public void remove(PageNavigation navigation) throws Exception;
-
-   /**
     * Save PortletPreferences config node
     * @param portletPreferences - PortletPreferences object
     */

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/DataStorageImpl.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/DataStorageImpl.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/DataStorageImpl.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -18,13 +18,6 @@
  */
 package org.exoplatform.portal.config;
 
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedList;
-import java.util.List;
-
 import org.exoplatform.commons.utils.LazyPageList;
 import org.exoplatform.commons.utils.ListAccess;
 import org.exoplatform.portal.application.PortletPreferences;
@@ -34,20 +27,24 @@
 import org.exoplatform.portal.config.model.Dashboard;
 import org.exoplatform.portal.config.model.ModelObject;
 import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.model.PortalConfig;
 import org.exoplatform.portal.pom.data.DashboardData;
 import org.exoplatform.portal.pom.data.ModelChange;
 import org.exoplatform.portal.pom.data.ModelData;
 import org.exoplatform.portal.pom.data.ModelDataStorage;
-import org.exoplatform.portal.pom.data.NavigationData;
-import org.exoplatform.portal.pom.data.NavigationKey;
 import org.exoplatform.portal.pom.data.PageData;
 import org.exoplatform.portal.pom.data.PageKey;
 import org.exoplatform.portal.pom.data.PortalData;
 import org.exoplatform.portal.pom.data.PortalKey;
 import org.exoplatform.services.listener.ListenerService;
 
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedList;
+import java.util.List;
+
 /**
  * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
  * @version $Revision$
@@ -72,12 +69,6 @@
       return new Page(delegate.clonePage(key, cloneKey));
    }
 
-   public PageNavigation getPageNavigation(String ownerType, String id) throws Exception
-   {
-      NavigationData data = delegate.getPageNavigation(new NavigationKey(ownerType, id));
-      return data != null ? new PageNavigation(data) : null;
-   }
-
    public void create(PortalConfig config) throws Exception
    {
       delegate.create(config.build());
@@ -115,24 +106,6 @@
       listenerServ_.broadcast(PAGE_REMOVED, this, page);
    }
 
-   public void create(PageNavigation navigation) throws Exception
-   {
-      delegate.create(navigation.build());
-      listenerServ_.broadcast(NAVIGATION_CREATED, this, navigation);
-   }
-
-   public void save(PageNavigation navigation) throws Exception
-   {
-      delegate.save(navigation.build());
-      listenerServ_.broadcast(NAVIGATION_UPDATED, this, navigation);
-   }
-
-   public void remove(PageNavigation navigation) throws Exception
-   {
-      delegate.remove(navigation.build());
-      listenerServ_.broadcast(NAVIGATION_REMOVED, this, navigation);
-   }
-
    public <S> S load(ApplicationState<S> state, ApplicationType<S> type) throws Exception
    {
       return delegate.load(state, type);
@@ -158,13 +131,6 @@
       return getPortalConfig(PortalConfig.PORTAL_TYPE, portalName);
    }
 
-   public PageNavigation getPageNavigation(String fullId) throws Exception
-   {
-      NavigationKey key = NavigationKey.create(fullId);
-      NavigationData data = delegate.getPageNavigation(key);
-      return data != null ? new PageNavigation(data) : null;
-   }
-
    public Page getPage(String pageId) throws Exception
    {
       PageKey key = PageKey.create(pageId);
@@ -225,23 +191,27 @@
       
 
       private List<D> sort(List<D> list, final Comparator<O> comparator) {
-         List<D> tmpList = new ArrayList<D>();
-         for (int i=0; i<list.size();i++) {
-            tmpList.add(list.get(i));
-         }
-         Collections.sort(tmpList, new Comparator<D>() {
-            public int compare(D d1, D d2)
-            {
-               if (comparator == null) {
-                  return d1.getStorageId().compareTo(d2.getStorageId());
-               }
-               O o1 = create(d1);
-               O o2 = create(d2);
-               return comparator.compare(o1, o2);
+         if (comparator != null)
+         {
+            List<D> tmpList = new ArrayList<D>();
+            for (int i=0; i<list.size();i++) {
+               tmpList.add(list.get(i));
             }
-            
-         });
-         return tmpList;         
+            Collections.sort(tmpList, new Comparator<D>() {
+               public int compare(D d1, D d2)
+               {
+                  O o1 = create(d1);
+                  O o2 = create(d2);
+                  return comparator.compare(o1, o2);
+               }
+
+            });
+            return tmpList;
+         }
+         else
+         {
+            return list;
+         }
       }
    }
 
@@ -282,18 +252,6 @@
          };
          return (ListAccess<T>)bilto.execute();
       }
-      else if (type == PageNavigation.class)
-      {
-         Bilto<PageNavigation, NavigationData> bilto = new Bilto<PageNavigation, NavigationData>((Query<PageNavigation>)q, NavigationData.class, (Comparator<PageNavigation>)sortComparator)
-         {
-            @Override
-            protected PageNavigation create(NavigationData page)
-            {
-               return new PageNavigation(page);
-            }
-         };
-         return (ListAccess<T>)bilto.execute();
-      }
       else if (type == PortalConfig.class)
       {
          Bilto<PortalConfig, PortalData> bilto = new Bilto<PortalConfig, PortalData>((Query<PortalConfig>)q, PortalData.class, (Comparator<PortalConfig>)sortComparator)

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/GroupPortalConfigListener.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/GroupPortalConfigListener.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/GroupPortalConfigListener.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -21,9 +21,10 @@
 
 import org.exoplatform.container.PortalContainer;
 import org.exoplatform.container.component.RequestLifeCycle;
-import org.exoplatform.portal.config.model.Container;
-import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.navigation.NavigationContext;
+import org.exoplatform.portal.mop.navigation.NavigationService;
 import org.exoplatform.services.organization.Group;
 import org.exoplatform.services.organization.GroupEventListener;
 import org.exoplatform.services.organization.GroupHandler;
@@ -44,16 +45,11 @@
    private final UserPortalConfigService portalConfigService;
 
    /** . */
-   private final DataStorage dataStorage;
-
-   /** . */
    private final OrganizationService orgService;
 
-   public GroupPortalConfigListener(UserPortalConfigService portalConfigService, DataStorage dataStorage,
-      OrganizationService orgService)
+   public GroupPortalConfigListener(UserPortalConfigService portalConfigService, OrganizationService orgService)
    {
       this.portalConfigService = portalConfigService;
-      this.dataStorage = dataStorage;
       this.orgService = orgService;
    }
 
@@ -65,7 +61,7 @@
          String groupId = group.getId().trim();
 
          // Remove all descendant navigations
-         removeGroupNavigation(group, dataStorage);
+         removeGroupNavigation(group);
 
          portalConfigService.removeUserPortalConfig(PortalConfig.GROUP_TYPE, groupId);
       }
@@ -150,19 +146,22 @@
       }
    }
 
-   private void removeGroupNavigation(Group group, DataStorage dataService) throws Exception
+   private void removeGroupNavigation(Group group) throws Exception
    {
       GroupHandler groupHandler = orgService.getGroupHandler();
       Collection<String> descendantGroups = getDescendantGroups(group, groupHandler);
       Collection<String> deletedNavigationGroups = new ArrayList<String>();
       deletedNavigationGroups.addAll(descendantGroups);
       deletedNavigationGroups.add(group.getId());
-      PageNavigation navigation = null;
       for (String childGroup : deletedNavigationGroups)
       {
-         navigation = dataService.getPageNavigation(PortalConfig.GROUP_TYPE, childGroup);
-         if (navigation != null)
-            dataService.remove(navigation);
+         SiteKey key = SiteKey.group(childGroup);
+         NavigationService navService = portalConfigService.getNavigationService();
+         NavigationContext nav = navService.loadNavigation(key);
+         if (nav != null)
+         {
+            navService.destroyNavigation(nav);
+         }
       }
    }
 

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/NewPortalConfigListener.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/NewPortalConfigListener.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/NewPortalConfigListener.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -28,12 +28,16 @@
 import org.exoplatform.container.xml.ValueParam;
 import org.exoplatform.portal.application.PortletPreferences;
 import org.exoplatform.portal.application.PortletPreferences.PortletPreferencesSet;
+import org.exoplatform.portal.config.importer.ImportMode;
+import org.exoplatform.portal.config.importer.NavigationImporter;
 import org.exoplatform.portal.config.model.Container;
 import org.exoplatform.portal.config.model.Page;
 import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.model.PageNode;
 import org.exoplatform.portal.config.model.PortalConfig;
 import org.exoplatform.portal.config.model.Page.PageSet;
+import org.exoplatform.portal.mop.navigation.NavigationService;
+import org.exoplatform.portal.pom.config.POMSessionManager;
 import org.gatein.common.logging.Logger;
 import org.gatein.common.logging.LoggerFactory;
 import org.jibx.runtime.*;
@@ -92,11 +96,18 @@
    /** . */
    private Logger log = LoggerFactory.getLogger(getClass());
 
-   public NewPortalConfigListener(DataStorage dataStorage, ConfigurationManager cmanager, InitParams params)
+   /** . */
+   private final POMSessionManager pomMgr;
+
+   /** . */
+   private NavigationService navigationService_;
+
+   public NewPortalConfigListener(POMSessionManager pomMgr, DataStorage dataStorage, ConfigurationManager cmanager, InitParams params, NavigationService navigationService)
       throws Exception
    {
       cmanager_ = cmanager;
       dataStorage_ = dataStorage;
+      navigationService_ = navigationService;
 
       ValueParam valueParam = params.getValueParam("page.templates.location");
       if (valueParam != null)
@@ -143,15 +154,16 @@
          overrideExistingData = false;
       }
 
+      this.pomMgr = pomMgr;
    }
 
    public void run() throws Exception
    {
+      //DANGEROUS! If the user delete the defaultPortal (ie: classic), the next time he restarts
+      //the server. Data of predefined owners would be overriden      
       RequestLifeCycle.begin(PortalContainer.getInstance());
       try
       {
-         //DANGEROUS! If the user delete the defaultPortal (ie: classic), the next time he restarts
-         //the server. Data of predefined owners would be overriden
          if (dataStorage_.getPortalConfig(defaultPortal) != null && !overrideExistingData)
             return;
       }
@@ -451,24 +463,15 @@
       {
          return;
       }
-      PageNavigation currentNavigation = dataStorage_.getPageNavigation(navigation.getOwner());
-      if (currentNavigation == null)
-      {
-         dataStorage_.create(navigation);
-      }
-      else
-      {
-         if(overrideExistingData)
-         {
-            dataStorage_.remove(currentNavigation);
-            dataStorage_.create(navigation);
-         }
-         else
-         {
-            navigation.merge(currentNavigation);
-            dataStorage_.save(navigation);
-         }
-      }
+
+      //
+      ImportMode importMode = overrideExistingData ? ImportMode.REIMPORT : ImportMode.MERGE;
+
+      //
+      NavigationImporter merge =new NavigationImporter(importMode, navigation, navigationService_);
+
+      //
+      merge.perform();
    }
 
    public void createPortletPreferences(NewPortalConfig config, String owner) throws Exception
@@ -702,9 +705,9 @@
          pageRef = type + "::" + owner + "::" + name;
          pageNode.setPageReference(pageRef);
       }
-      if (pageNode.getChildren() != null)
+      if (pageNode.getNodes() != null)
       {
-         for (PageNode childPageNode : pageNode.getChildren())
+         for (PageNode childPageNode : pageNode.getNodes())
          {
             fixOwnerName(childPageNode);
          }

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/UserACL.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/UserACL.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/UserACL.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -23,8 +23,8 @@
 import org.exoplatform.container.xml.ValueParam;
 import org.exoplatform.container.xml.ValuesParam;
 import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.SiteKey;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
 import org.exoplatform.services.security.ConversationState;
@@ -293,43 +293,46 @@
       return false;
    }
 
-   public boolean hasEditPermission(PageNavigation pageNav)
+   // copied from @link{#hasEditPermission}
+   public boolean hasEditPermissionOnNavigation(SiteKey siteKey)
    {
       Identity identity = getIdentity();
       if (superUser_.equals(identity.getUserId()))
       {
-         pageNav.setModifiable(true);
          return true;
       }
-      String ownerType = pageNav.getOwnerType();
-      
-      if (PortalConfig.GROUP_TYPE.equals(ownerType))
+
+      //
+      switch (siteKey.getType())
       {
-         String temp = pageNav.getOwnerId().trim();
-         String expAdminGroup = getAdminGroups();
-         String expPerm = null;
+         case PORTAL:
+            //TODO: We should also take care of Portal's navigation
+            return false;
+         case GROUP:
+            String temp = siteKey.getName().trim();
+            String expAdminGroup = getAdminGroups();
+            String expPerm = null;
 
-         // Check to see whether current user is member of admin group or not,
-         // if so grant
-         // edit permission for group navigation for that user.
-         if (expAdminGroup != null)
-         {
-            expAdminGroup = expAdminGroup.startsWith("/") ? expAdminGroup : "/" + expAdminGroup;
-            expPerm = temp.startsWith("/") ? temp : "/" + temp;
-            if (isUserInGroup(expPerm) && isUserInGroup(expAdminGroup))
+            // Check to see whether current user is member of admin group or not,
+            // if so grant
+            // edit permission for group navigation for that user.
+            if (expAdminGroup != null)
             {
-               return true;
+               expAdminGroup = expAdminGroup.startsWith("/") ? expAdminGroup : "/" + expAdminGroup;
+               expPerm = temp.startsWith("/") ? temp : "/" + temp;
+               if (isUserInGroup(expPerm) && isUserInGroup(expAdminGroup))
+               {
+                  return true;
+               }
             }
-         }
 
-         expPerm = navigationCreatorMembershipType_ + (temp.startsWith("/") ? ":" + temp : ":/" + temp);
-         return hasPermission(identity, expPerm);
+            expPerm = navigationCreatorMembershipType_ + (temp.startsWith("/") ? ":" + temp : ":/" + temp);
+            return hasPermission(identity, expPerm);
+         case USER:
+            return siteKey.getName().equals(identity.getUserId());
+         default:
+            return false;
       }
-      else if (PortalConfig.USER_TYPE.equals(ownerType))
-      {
-         return pageNav.getOwnerId().equals(identity.getUserId());
-      }
-      return false;
    }
 
    public boolean hasPermission(Page page)

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/UserPortalConfig.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/UserPortalConfig.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/UserPortalConfig.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,92 +19,68 @@
 
 package org.exoplatform.portal.config;
 
-import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.user.UserPortalContext;
+import org.exoplatform.portal.mop.user.UserPortal;
+import org.exoplatform.portal.mop.user.UserPortalImpl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 public class UserPortalConfig
 {
 
-   private PortalConfig portal;
+   PortalConfig portal;
 
-   private List<PageNavigation> navigations;
-   
-   /** Added by Minh Hoang TO */
-   private PageNavigation selectedNavigation;
+   final UserPortalConfigService service;
 
-   public UserPortalConfig()
-   {
+   final String portalName;
 
-   }
+   final String accessUser;
 
-   public UserPortalConfig(PortalConfig portal, List<PageNavigation> navigations)
-   {
-      this.portal = portal;
-      this.navigations = navigations;
-   }
+   /** . */
+   private UserPortalImpl userPortal;
 
-   public PortalConfig getPortalConfig()
+   /** . */
+   private UserPortalContext bundleResolver;
+
+   public UserPortalConfig()
    {
-      return portal;
+      this.portal = null;
+      this.service = null;
+      this.portalName = null;
+      this.accessUser = null;
+      this.bundleResolver = null;
    }
 
-   public void setPortal(PortalConfig portal)
+   public UserPortalConfig(PortalConfig portal, UserPortalConfigService service, String portalName, String accessUser, UserPortalContext bundleResolver)
    {
       this.portal = portal;
+      this.service = service;
+      this.portalName = portalName;
+      this.accessUser = accessUser;
+      this.bundleResolver = bundleResolver;
    }
-   
-   public void setSelectedNavigation(PageNavigation _selectedNavigation)
-   {
-      this.selectedNavigation = _selectedNavigation;
-   }
 
-   /** Fetch navigation (specified by ownerType, ownerId) from the list of all navigations and set it as selected navigation **/
-   public void updateSelectedNavigation(String ownerType, String ownerId)
+   public UserPortal getUserPortal()
    {
-      PageNavigation targetNavigation = null;
-      for (PageNavigation nav : navigations)
-      {
-         if (nav.getOwnerType().equals(ownerType) && nav.getOwnerId().equals(ownerId))
-         {
-            targetNavigation = nav;
-            break;
-         }
-      }
-
-      if (targetNavigation != null)
-      {
-         this.setSelectedNavigation(targetNavigation);
-      }
+         userPortal = new UserPortalImpl(
+            service,
+            service.navService,
+            service.orgService_,
+            service.userACL_,
+            portalName,
+            portal,
+            accessUser,
+            bundleResolver
+         );
+      return userPortal;
    }
-   
-   public PageNavigation getSelectedNavigation()
-   {
-      if(this.selectedNavigation != null)
-      {
-         return this.selectedNavigation;
-      }
-      return navigations.get(0);
-   }
-   
-   public void setNavigations(List<PageNavigation> navs)
-   {
-      navigations = navs;
-   }
 
-   public List<PageNavigation> getNavigations()
+   public PortalConfig getPortalConfig()
    {
-      return navigations;
+      return portal;
    }
 
-   public void addNavigation(PageNavigation nav)
+   public void setPortal(PortalConfig portal)
    {
-      if (navigations == null)
-         navigations = new ArrayList<PageNavigation>();
-      if (nav == null)
-         return;
-      navigations.add(nav);
+      this.portal = portal;
    }
 }
\ No newline at end of file

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/UserPortalConfigService.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/UserPortalConfigService.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/UserPortalConfigService.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -20,17 +20,18 @@
 package org.exoplatform.portal.config;
 
 import org.exoplatform.commons.utils.LazyPageList;
-import org.exoplatform.container.PortalContainer;
 import org.exoplatform.container.component.ComponentPlugin;
-import org.exoplatform.container.component.RequestLifeCycle;
 import org.exoplatform.portal.config.model.Application;
 import org.exoplatform.portal.config.model.Container;
 import org.exoplatform.portal.config.model.ModelObject;
 import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
 import org.exoplatform.portal.config.model.PortalConfig;
 import org.exoplatform.portal.config.model.TransientApplicationState;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.navigation.NavigationContext;
+import org.exoplatform.portal.mop.navigation.NavigationService;
+import org.exoplatform.portal.mop.navigation.NavigationState;
+import org.exoplatform.portal.mop.user.UserPortalContext;
 import org.exoplatform.portal.pom.data.ModelChange;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
@@ -46,26 +47,41 @@
  */
 public class UserPortalConfigService implements Startable
 {
-   private DataStorage storage_;
+   DataStorage storage_;
 
-   private UserACL userACL_;
+   UserACL userACL_;
 
-   private OrganizationService orgService_;
+   OrganizationService orgService_;
 
    private NewPortalConfigListener newPortalConfigListener_;
+
+   /** . */
+   final NavigationService navService;
    
    private Log log = ExoLogger.getLogger("Portal:UserPortalConfigService");
 
    public UserPortalConfigService(
       UserACL userACL, DataStorage storage,
-      OrganizationService orgService) throws Exception
+      OrganizationService orgService,
+      NavigationService navService) throws Exception
    {
       this.storage_ = storage;
       this.orgService_ = orgService;
       this.userACL_ = userACL;
+      this.navService = navService;
    }
 
    /**
+    * Returns the navigation service associated with this service.
+    *
+    * @return the navigation service;
+    */
+   public NavigationService getNavigationService()
+   {
+      return navService;
+   }
+
+   /**
     * <p> Build and returns an instance of <tt>UserPortalConfig</tt>. </p>
     * <p/>
     * <p> To return a valid config, the current thread must be associated with an identity that will grant him access to
@@ -92,71 +108,19 @@
     */
    public UserPortalConfig getUserPortalConfig(String portalName, String accessUser) throws Exception
    {
+      return getUserPortalConfig(portalName, accessUser, null);
+   }
+
+   public UserPortalConfig getUserPortalConfig(String portalName, String accessUser, UserPortalContext bundleResolver) throws Exception
+   {
       PortalConfig portal = storage_.getPortalConfig(portalName);
       if (portal == null || !userACL_.hasPermission(portal))
       {
          return null;
       }
 
-      List<PageNavigation> navigations = new ArrayList<PageNavigation>();
-      PageNavigation navigation = storage_.getPageNavigation(PortalConfig.PORTAL_TYPE, portalName);
-      if (navigation != null)
-      {
-         navigation.setModifiable(userACL_.hasPermission(portal.getEditPermission()));
-         navigations.add(navigation);
-      }
 
-      if (accessUser == null)
-      {
-         // navigation = getPageNavigation(PortalConfig.GROUP_TYPE,
-         // userACL_.getGuestsGroup());
-         // if (navigation != null)
-         // navigations.add(navigation);
-      }
-      else
-      {
-         navigation = storage_.getPageNavigation(PortalConfig.USER_TYPE, accessUser);
-         if (navigation != null)
-         {
-            navigation.setModifiable(true);
-            navigations.add(navigation);
-         }
-
-         Collection<?> groups = null;
-         if (userACL_.getSuperUser().equals(accessUser))
-         {
-            groups = orgService_.getGroupHandler().getAllGroups();
-         }
-         else
-         {
-            groups = orgService_.getGroupHandler().findGroupsOfUser(accessUser);
-         }
-         for (Object group : groups)
-         {
-            Group m = (Group)group;
-            String groupId = m.getId().trim();
-            if (groupId.equals(userACL_.getGuestsGroup()))
-            {
-               continue;
-            }
-            navigation = storage_.getPageNavigation(PortalConfig.GROUP_TYPE, groupId);
-            if (navigation == null)
-            {
-               continue;
-            }
-            navigation.setModifiable(userACL_.hasEditPermission(navigation));
-            navigations.add(navigation);
-         }
-      }
-      Collections.sort(navigations, new Comparator<PageNavigation>()
-      {
-         public int compare(PageNavigation nav1, PageNavigation nav2)
-         {
-            return nav1.getPriority() - nav2.getPriority();
-         }
-      });
-
-      return new UserPortalConfig(portal, navigations);
+      return new UserPortalConfig(portal, this, portalName, accessUser, bundleResolver);
    }
 
    /**
@@ -240,15 +204,12 @@
       }
 
       // Create a blank navigation if needed
-      PageNavigation navigation = storage_.getPageNavigation(PortalConfig.USER_TYPE, userName);
-      if (navigation == null)
+      SiteKey key = SiteKey.user(userName);
+      NavigationContext nav = navService.loadNavigation(key);
+      if (nav == null)
       {
-         PageNavigation pageNav = new PageNavigation();
-         pageNav.setOwnerType(PortalConfig.USER_TYPE);
-         pageNav.setOwnerId(userName);
-         pageNav.setPriority(5);
-         pageNav.setNodes(new ArrayList<PageNode>());
-         storage_.create(pageNav);
+         nav = new NavigationContext(key, new NavigationState(5));
+         navService.saveNavigation(nav);
       }
    }
 
@@ -435,96 +396,6 @@
    }
 
    /**
-    * Creates a navigation and broadcast an event labelled as {@link org.exoplatform.portal.config.UserPortalConfigService#CREATE_NAVIGATION_EVENT}
-    * when the creation is successful.
-    * 
-    * @deprecated This method is not useful anymore. The preferred way to do this is 
-    * using directly {@link org.exoplatform.portal.config.DataStorage#create(PageNavigation)}
-    *
-    * @param navigation the navigation to create
-    * @throws Exception any exception
-    */
-   @Deprecated
-   public void create(PageNavigation navigation) throws Exception
-   {
-      storage_.create(navigation);
-   }
-
-   /**
-    * Updates a page navigation broadcast an event labelled as {@link org.exoplatform.portal.config.UserPortalConfigService#NAVIGATION_UPDATED}
-    * when the creation is successful.
-    * 
-    * @deprecated This method is not useful anymore. The preferred way to do this is 
-    * using directly {@link org.exoplatform.portal.config.DataStorage#save(PageNavigation)}
-    *
-    * @param navigation the navigation to update
-    * @throws Exception any exception
-    */
-   @Deprecated
-   public void update(PageNavigation navigation) throws Exception
-   {
-      storage_.save(navigation);
-   }
-
-   /**
-    * Removes a navigation and broadcast an event labelled as {@link org.exoplatform.portal.config.UserPortalConfigService#NAVIGATION_REMOVED}
-    * when the removal is successful.
-    * 
-    * @deprecated This method is not useful anymore. The preferred way to do this is 
-    * using directly {@link org.exoplatform.portal.config.DataStorage#remove(PageNavigation)}
-    *
-    * @param navigation the navigation to remove
-    * @throws Exception any exception
-    */
-   @Deprecated
-   public void remove(PageNavigation navigation) throws Exception
-   {
-      storage_.remove(navigation);
-   }
-
-   /**
-    * @deprecated This method is not useful anymore. The preferred way to do this is 
-    * using directly {@link org.exoplatform.portal.config.DataStorage#getPageNavigation(String, String)}
-    * 
-    * @param ownerType
-    * @param id
-    * @return
-    * @throws Exception
-    */
-   @Deprecated
-   public PageNavigation getPageNavigation(String ownerType, String id) throws Exception
-   {
-      PageNavigation navigation = storage_.getPageNavigation(ownerType, id);
-      return navigation;
-   }
-
-   /**
-    * This method creates new page from an existing page and links new page to a PageNode.
-    *
-    * @param nodeName
-    * @param nodeLabel
-    * @param pageId
-    * @param ownerType
-    * @param ownerId
-    * @return
-    * @throws Exception
-    */
-   public PageNode createNodeFromPageTemplate(String nodeName, String nodeLabel, String pageId, String ownerType,
-                                              String ownerId) throws Exception
-   {
-      Page page = storage_.clonePage(pageId, nodeName, ownerType, ownerId);
-      PageNode pageNode = new PageNode();
-      if (nodeLabel == null || nodeLabel.trim().length() < 1)
-      {
-         nodeLabel = nodeName;
-      }
-      pageNode.setName(nodeName);
-      pageNode.setLabel(nodeLabel);
-      pageNode.setPageReference(page.getPageId());
-      return pageNode;
-   }
-
-   /**
     * Clones a page.
     * 
     * @deprecated This method is not useful anymore. The preferred way to do this is 
@@ -560,53 +431,6 @@
    }
 
    /**
-    * Load all navigation that user has edit permission.
-    *
-    * @return the navigation the user can edit
-    * @throws Exception any exception
-    */
-   public List<PageNavigation> loadEditableNavigations() throws Exception
-   {
-      Query<PageNavigation> query = new Query<PageNavigation>(PortalConfig.GROUP_TYPE, null, PageNavigation.class);
-      List<PageNavigation> navis = storage_.find(query, new Comparator<PageNavigation>()
-      {
-         public int compare(PageNavigation pconfig1, PageNavigation pconfig2)
-         {
-            return pconfig1.getOwnerId().compareTo(pconfig2.getOwnerId());
-         }
-      }).getAll();
-
-      //
-      List<PageNavigation> navigations = new ArrayList<PageNavigation>();
-      for (PageNavigation ele : navis)
-      {
-         if (userACL_.hasEditPermission(ele))
-         {
-            navigations.add(ele);
-         }
-      }
-      return navigations;
-   }
-
-   /**
-    * Returns the list of group ids having navigation.
-    *
-    * @return the group id having navigation
-    * @throws Exception any exception
-    */
-   public Set<String> findGroupHavingNavigation() throws Exception
-   {
-      Query<PageNavigation> query = new Query<PageNavigation>(PortalConfig.GROUP_TYPE, null, PageNavigation.class);
-      Set<String> groupIds = new HashSet<String>();
-      List<PageNavigation> navis = storage_.find(query).getAll();
-      for (PageNavigation ele : navis)
-      {
-         groupIds.add(ele.getOwnerId());
-      }
-      return groupIds;
-   }
-
-   /**
     * Returns the list of all portal names.
     *
     * @return the list of all portal names

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/ImportMode.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/config/importer/ImportMode.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/ImportMode.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.config.importer;
-
-/**
- * The import mode.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public enum ImportMode
-{
-
-   /**
-    * Import data when it does not exist, otherwise do nothing.
-    */
-   CONSERVE,
-
-   /**
-    * Import data when it does not exist, otherwise try a merge strategy that adds new data but ignore other modifications.
-    */
-   MERGE,
-
-   /**
-    * Reimport data whatsoever.
-    */
-   REIMPORT
-
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/ImportMode.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/config/importer/ImportMode.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/ImportMode.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/ImportMode.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.config.importer;
+
+/**
+ * The import mode.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public enum ImportMode
+{
+
+   /**
+    * Import data when it does not exist, otherwise do nothing.
+    */
+   CONSERVE,
+
+   /**
+    * Import data when it does not exist, otherwise try a merge strategy that adds new data but ignore other modifications.
+    */
+   MERGE,
+
+   /**
+    * Reimport data whatsoever.
+    */
+   REIMPORT
+
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/NavigationImporter.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/config/importer/NavigationImporter.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/NavigationImporter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,275 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.config.importer;
-
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
-import org.exoplatform.portal.config.model.PageNodeContainer;
-import org.exoplatform.portal.mop.SiteKey;
-import org.exoplatform.portal.mop.navigation.NavigationContext;
-import org.exoplatform.portal.mop.navigation.NavigationService;
-import org.exoplatform.portal.mop.navigation.NavigationState;
-import org.exoplatform.portal.mop.navigation.NodeChangeListener;
-import org.exoplatform.portal.mop.navigation.NodeChangeQueue;
-import org.exoplatform.portal.mop.navigation.NodeContext;
-import org.exoplatform.portal.mop.navigation.NodeModel;
-import org.exoplatform.portal.mop.navigation.NodeState;
-import org.exoplatform.portal.mop.navigation.Scope;
-import org.exoplatform.portal.tree.diff.Adapters;
-import org.exoplatform.portal.tree.diff.ListAdapter;
-import org.exoplatform.portal.tree.diff.ListChangeIterator;
-import org.exoplatform.portal.tree.diff.ListChangeType;
-import org.exoplatform.portal.tree.diff.ListDiff;
-
-import java.util.Collections;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class NavigationImporter
-{
-
-   private static final ListAdapter<PageNodeContainer, String> PAGE_NODE_CONTAINER_ADAPTER = new ListAdapter<PageNodeContainer, String>()
-   {
-      public int size(PageNodeContainer list)
-      {
-         List<PageNode> nodes = list.getNodes();
-         if (nodes == null)
-         {
-            return 0;
-         }
-         else
-         {
-            return nodes.size();
-         }
-      }
-
-      public Iterator<String> iterator(PageNodeContainer list, boolean reverse)
-      {
-         List<PageNode> nodes = list.getNodes();
-         if (nodes == null)
-         {
-            return Collections.<String>emptyList().iterator();
-         }
-         else {
-            String[] names = new String[nodes.size()];
-            int index = 0;
-            for (PageNode child : nodes)
-            {
-               names[index++] = child.getName();
-            }
-            return Adapters.<String>list().iterator(names, reverse);
-         }
-      }
-   };
-
-   private static final ListAdapter<NodeContext<?>, String> NODE_ADAPTER = new ListAdapter<NodeContext<?>, String>()
-   {
-      public int size(NodeContext<?> list)
-      {
-         return list.getNodeCount();
-      }
-
-      public Iterator<String> iterator(NodeContext<?> list, boolean reverse)
-      {
-         int size = list.getNodeCount();
-         String[] names = new String[size];
-         int index = 0;
-         for (NodeContext<?> child = list.getFirst();child != null;child = child.getNext())
-         {
-            names[index++] = child.getName();
-         }
-         return Adapters.<String>list().iterator(names, reverse);
-      }
-   };
-
-   /** . */
-   private final PageNavigation src;
-
-   /** . */
-   private final NavigationService service;
-
-   /** . */
-   private final ImportMode mode;
-
-   public NavigationImporter(ImportMode mode, PageNavigation src, NavigationService service)
-   {
-      this.mode = mode;
-      this.src = src;
-      this.service = service;
-   }
-
-   public void perform()
-   {
-
-      //
-      SiteKey key = new SiteKey(src.getOwnerType(), src.getOwnerId());
-
-      //
-      NavigationContext dst = service.loadNavigation(key);
-
-      //
-      switch (mode)
-      {
-         case CONSERVE:
-            if (dst == null)
-            {
-               dst = new NavigationContext(key, new NavigationState(src.getPriority()));
-               service.saveNavigation(dst);
-            }
-            else
-            {
-               dst = null;
-            }
-            break;
-         case MERGE:
-            if (dst == null)
-            {
-               dst = new NavigationContext(key, new NavigationState(src.getPriority()));
-               service.saveNavigation(dst);
-            }
-            break;
-         case REIMPORT:
-            if (dst != null)
-            {
-               service.destroyNavigation(dst);
-            }
-            else
-            {
-               dst = new NavigationContext(key, new NavigationState(src.getPriority()));
-            }
-            service.saveNavigation(dst);
-            break;
-      }
-
-      //
-      if (dst != null)
-      {
-         NodeContext<?> node = service.loadNode(NodeModel.SELF_MODEL, dst, Scope.SINGLE, null).getNode();
-         perform(src, node);
-         service.saveNode(node, null);
-      }
-   }
-
-   private void perform(PageNodeContainer src, final NodeContext<?> dst)
-   {
-      service.rebaseNode(dst, Scope.CHILDREN, null);
-
-      //
-      ListDiff<PageNodeContainer, NodeContext<?>, String> diff = new ListDiff<PageNodeContainer, NodeContext<?>, String>(
-         PAGE_NODE_CONTAINER_ADAPTER,
-         NODE_ADAPTER);
-
-      //
-      List<PageNode> srcChildren = src.getNodes();
-      ListChangeIterator<PageNodeContainer, NodeContext<?>, String> it = diff.iterator(src, dst);
-      NodeChangeQueue<PageNodeContainer> changes = new NodeChangeQueue<PageNodeContainer>();
-
-      //
-      while (it.hasNext())
-      {
-         ListChangeType changeType = it.next();
-         String name = it.getElement();
-         PageNode srcChild = src.getNode(name);
-         NodeContext<?> dstChild = dst.get(name);
-
-         //
-         switch (changeType)
-         {
-            case SAME:
-               perform(srcChild, dstChild);
-               break;
-            case REMOVE:
-               if (dst.getNode(name) != null)
-               {
-                  // It's a move we do nothing
-               }
-               else
-               {
-                  // It's an addition
-                  int index = srcChildren.indexOf(srcChild);
-                  PageNode previous = index == 0 ? null : srcChildren.get(index - 1);
-                  changes.onAdd(srcChild, src, previous);
-               }
-               break;
-            case ADD:
-               if (src.getNode(name) != null)
-               {
-                  // It's a move
-                  int index = srcChildren.indexOf(srcChild);
-                  PageNode previous = index == 0 ? null : srcChildren.get(index - 1);
-                  changes.onMove(srcChild, src, src, previous);
-               }
-               else
-               {
-                  // It's a removal we do nothing
-               }
-               break;
-         }
-      }
-
-      //
-      changes.broadcast(new NodeChangeListener.Base<PageNodeContainer>()
-      {
-         @Override
-         public void onAdd(PageNodeContainer target, PageNodeContainer parent, PageNodeContainer previous)
-         {
-            add((PageNode)target, (PageNode)previous, dst);
-         }
-
-         private void add(PageNode target, PageNode previous, NodeContext<?> dst)
-         {
-            String name = target.getName();
-            int index = 0;
-            if (previous != null)
-            {
-               index = dst.get((previous).getName()).getIndex() + 1;
-            }
-            NodeContext<?> child = dst.add(index, name);
-            Date start = target.getStartPublicationDate();
-            Date end = target.getEndPublicationDate();
-            NodeState state = new NodeState(
-               target.getLabel(),
-               target.getIcon(),
-               start == null ? -1 : start.getTime(),
-               end == null ? -1 : end.getTime(),
-               target.getVisibility(),
-               target.getPageReference()
-            );
-            child.setState(state);
-
-            //
-            List<PageNode> targetChildren = target.getNodes();
-            if (targetChildren != null)
-            {
-               PageNode targetPrevious = null;
-               for (PageNode targetChild : targetChildren)
-               {
-                  add(targetChild, targetPrevious, child);
-                  targetPrevious = targetChild;
-               }
-            }
-         }
-      });
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/NavigationImporter.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/config/importer/NavigationImporter.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/NavigationImporter.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/importer/NavigationImporter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,275 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.config.importer;
+
+import org.exoplatform.portal.config.model.PageNavigation;
+import org.exoplatform.portal.config.model.PageNode;
+import org.exoplatform.portal.config.model.PageNodeContainer;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.navigation.NavigationContext;
+import org.exoplatform.portal.mop.navigation.NavigationService;
+import org.exoplatform.portal.mop.navigation.NavigationState;
+import org.exoplatform.portal.mop.navigation.NodeChangeListener;
+import org.exoplatform.portal.mop.navigation.NodeChangeQueue;
+import org.exoplatform.portal.mop.navigation.NodeContext;
+import org.exoplatform.portal.mop.navigation.NodeModel;
+import org.exoplatform.portal.mop.navigation.NodeState;
+import org.exoplatform.portal.mop.navigation.Scope;
+import org.exoplatform.portal.tree.diff.Adapters;
+import org.exoplatform.portal.tree.diff.ListAdapter;
+import org.exoplatform.portal.tree.diff.ListChangeIterator;
+import org.exoplatform.portal.tree.diff.ListChangeType;
+import org.exoplatform.portal.tree.diff.ListDiff;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class NavigationImporter
+{
+
+   private static final ListAdapter<PageNodeContainer, String> PAGE_NODE_CONTAINER_ADAPTER = new ListAdapter<PageNodeContainer, String>()
+   {
+      public int size(PageNodeContainer list)
+      {
+         List<PageNode> nodes = list.getNodes();
+         if (nodes == null)
+         {
+            return 0;
+         }
+         else
+         {
+            return nodes.size();
+         }
+      }
+
+      public Iterator<String> iterator(PageNodeContainer list, boolean reverse)
+      {
+         List<PageNode> nodes = list.getNodes();
+         if (nodes == null)
+         {
+            return Collections.<String>emptyList().iterator();
+         }
+         else {
+            String[] names = new String[nodes.size()];
+            int index = 0;
+            for (PageNode child : nodes)
+            {
+               names[index++] = child.getName();
+            }
+            return Adapters.<String>list().iterator(names, reverse);
+         }
+      }
+   };
+
+   private static final ListAdapter<NodeContext<?>, String> NODE_ADAPTER = new ListAdapter<NodeContext<?>, String>()
+   {
+      public int size(NodeContext<?> list)
+      {
+         return list.getNodeCount();
+      }
+
+      public Iterator<String> iterator(NodeContext<?> list, boolean reverse)
+      {
+         int size = list.getNodeCount();
+         String[] names = new String[size];
+         int index = 0;
+         for (NodeContext<?> child = list.getFirst();child != null;child = child.getNext())
+         {
+            names[index++] = child.getName();
+         }
+         return Adapters.<String>list().iterator(names, reverse);
+      }
+   };
+
+   /** . */
+   private final PageNavigation src;
+
+   /** . */
+   private final NavigationService service;
+
+   /** . */
+   private final ImportMode mode;
+
+   public NavigationImporter(ImportMode mode, PageNavigation src, NavigationService service)
+   {
+      this.mode = mode;
+      this.src = src;
+      this.service = service;
+   }
+
+   public void perform()
+   {
+
+      //
+      SiteKey key = new SiteKey(src.getOwnerType(), src.getOwnerId());
+
+      //
+      NavigationContext dst = service.loadNavigation(key);
+
+      //
+      switch (mode)
+      {
+         case CONSERVE:
+            if (dst == null)
+            {
+               dst = new NavigationContext(key, new NavigationState(src.getPriority()));
+               service.saveNavigation(dst);
+            }
+            else
+            {
+               dst = null;
+            }
+            break;
+         case MERGE:
+            if (dst == null)
+            {
+               dst = new NavigationContext(key, new NavigationState(src.getPriority()));
+               service.saveNavigation(dst);
+            }
+            break;
+         case REIMPORT:
+            if (dst != null)
+            {
+               service.destroyNavigation(dst);
+            }
+            else
+            {
+               dst = new NavigationContext(key, new NavigationState(src.getPriority()));
+            }
+            service.saveNavigation(dst);
+            break;
+      }
+
+      //
+      if (dst != null)
+      {
+         NodeContext<?> node = service.loadNode(NodeModel.SELF_MODEL, dst, Scope.SINGLE, null).getNode();
+         perform(src, node);
+         service.saveNode(node, null);
+      }
+   }
+
+   private void perform(PageNodeContainer src, final NodeContext<?> dst)
+   {
+      service.rebaseNode(dst, Scope.CHILDREN, null);
+
+      //
+      ListDiff<PageNodeContainer, NodeContext<?>, String> diff = new ListDiff<PageNodeContainer, NodeContext<?>, String>(
+         PAGE_NODE_CONTAINER_ADAPTER,
+         NODE_ADAPTER);
+
+      //
+      List<PageNode> srcChildren = src.getNodes();
+      ListChangeIterator<PageNodeContainer, NodeContext<?>, String> it = diff.iterator(src, dst);
+      NodeChangeQueue<PageNodeContainer> changes = new NodeChangeQueue<PageNodeContainer>();
+
+      //
+      while (it.hasNext())
+      {
+         ListChangeType changeType = it.next();
+         String name = it.getElement();
+         PageNode srcChild = src.getNode(name);
+         NodeContext<?> dstChild = dst.get(name);
+
+         //
+         switch (changeType)
+         {
+            case SAME:
+               perform(srcChild, dstChild);
+               break;
+            case REMOVE:
+               if (dst.getNode(name) != null)
+               {
+                  // It's a move we do nothing
+               }
+               else
+               {
+                  // It's an addition
+                  int index = srcChildren.indexOf(srcChild);
+                  PageNode previous = index == 0 ? null : srcChildren.get(index - 1);
+                  changes.onAdd(srcChild, src, previous);
+               }
+               break;
+            case ADD:
+               if (src.getNode(name) != null)
+               {
+                  // It's a move
+                  int index = srcChildren.indexOf(srcChild);
+                  PageNode previous = index == 0 ? null : srcChildren.get(index - 1);
+                  changes.onMove(srcChild, src, src, previous);
+               }
+               else
+               {
+                  // It's a removal we do nothing
+               }
+               break;
+         }
+      }
+
+      //
+      changes.broadcast(new NodeChangeListener.Base<PageNodeContainer>()
+      {
+         @Override
+         public void onAdd(PageNodeContainer target, PageNodeContainer parent, PageNodeContainer previous)
+         {
+            add((PageNode)target, (PageNode)previous, dst);
+         }
+
+         private void add(PageNode target, PageNode previous, NodeContext<?> dst)
+         {
+            String name = target.getName();
+            int index = 0;
+            if (previous != null)
+            {
+               index = dst.get((previous).getName()).getIndex() + 1;
+            }
+            NodeContext<?> child = dst.add(index, name);
+            Date start = target.getStartPublicationDate();
+            Date end = target.getEndPublicationDate();
+            NodeState state = new NodeState(
+               target.getLabel(),
+               target.getIcon(),
+               start == null ? -1 : start.getTime(),
+               end == null ? -1 : end.getTime(),
+               target.getVisibility(),
+               target.getPageReference()
+            );
+            child.setState(state);
+
+            //
+            List<PageNode> targetChildren = target.getNodes();
+            if (targetChildren != null)
+            {
+               PageNode targetPrevious = null;
+               for (PageNode targetChild : targetChildren)
+               {
+                  add(targetChild, targetPrevious, child);
+                  targetPrevious = targetChild;
+               }
+            }
+         }
+      });
+   }
+}

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PageNavigation.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PageNavigation.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PageNavigation.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,69 +19,28 @@
 
 package org.exoplatform.portal.config.model;
 
-import org.exoplatform.portal.pom.data.NavigationData;
-import org.exoplatform.portal.pom.data.NavigationNodeData;
-
 import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
 
 public class PageNavigation extends PageNodeContainer
 {
 
+   /** . */
    private String ownerType;
 
+   /** . */
    private String ownerId;
 
-   private transient boolean modifiable;
-
+   /** . */
    private ArrayList<PageNode> pageNodes;
 
+   /** . */
    private int priority = 1;
 
-   PageNavigation(String storageId)
+   public PageNavigation()
    {
-      super(storageId);
-
-      //
       this.pageNodes = new ArrayList<PageNode>();
    }
 
-   public PageNavigation()
-   {
-      this((String)null);
-   }
-
-   public PageNavigation(NavigationData nav)
-   {
-      super(nav.getStorageId());
-
-      ArrayList<PageNode> children = new ArrayList<PageNode>(nav.getNodes().size());
-      for (NavigationNodeData child : nav.getNodes())
-      {
-         PageNode node = new PageNode(child);
-         children.add(node);
-      }
-
-      //
-      this.ownerType = nav.getOwnerType();
-      this.ownerId = nav.getOwnerId();
-      this.priority = nav.getPriority();
-      this.pageNodes = children;
-   }
-
-   // Make gtmpl happy with that for now
-   public String getDescription()
-   {
-      return null;
-   }
-
-   public int getId()
-   {
-      return getOwner().hashCode();
-   }
-
    public String getOwnerId()
    {
       return ownerId;
@@ -102,16 +61,6 @@
       this.ownerType = ownerType;
    }
 
-   public boolean isModifiable()
-   {
-      return modifiable;
-   }
-
-   public void setModifiable(boolean b)
-   {
-      modifiable = b;
-   }
-
    public int getPriority()
    {
       return priority;
@@ -122,18 +71,6 @@
       priority = i;
    }
 
-   public String getOwner()
-   {
-      return ownerType + "::" + ownerId;
-   }
-
-   public void addNode(PageNode node)
-   {
-      if (pageNodes == null)
-         pageNodes = new ArrayList<PageNode>();
-      pageNodes.add(node);
-   }
-
    public ArrayList<PageNode> getNodes()
    {
       return pageNodes;
@@ -144,78 +81,9 @@
       pageNodes = nodes;
    }
 
-   public PageNode getNode(String name)
-   {
-      for (PageNode node : pageNodes)
-      {
-         if (node.getName().equals(name))
-            return node;
-      }
-      return null;
-   }
-
-   public PageNavigation clone()
-   {
-      PageNavigation newNav = new PageNavigation();
-      newNav.setOwnerId(ownerId);
-      newNav.setOwnerType(ownerType);
-      newNav.setPriority(priority);
-      newNav.setModifiable(modifiable);
-
-      if (pageNodes == null || pageNodes.isEmpty())
-         return newNav;
-      for (PageNode ele : pageNodes)
-      {
-         newNav.getNodes().add(ele.clone());
-      }
-      return newNav;
-   }
-
-   public void merge(PageNavigation nav)
-   {
-      if (ownerId == null)
-         setOwnerId(nav.ownerId);
-      if (ownerType == null)
-         setOwnerType(nav.ownerType);
-      if (priority == 1)
-         setPriority(nav.priority);
-      if (!modifiable)
-         setModifiable(nav.modifiable);
-
-      if (nav.pageNodes == null || nav.pageNodes.isEmpty())
-      {
-         return;
-      }
-      if (pageNodes == null || pageNodes.isEmpty())
-      {
-         this.pageNodes = nav.pageNodes;
-         return;
-      }
-      Map<String, PageNode> mPageNodes = new LinkedHashMap<String, PageNode>();
-      for (PageNode node : nav.pageNodes)
-      {
-         mPageNodes.put(node.getName(), node);
-      }
-      if (pageNodes != null)
-      {
-         for (PageNode node : pageNodes)
-         {
-            mPageNodes.put(node.getName(), node);
-         }
-      }
-      this.pageNodes = new ArrayList<PageNode>(mPageNodes.values());
-   }
-
    @Override
    public String toString()
    {
       return "PageNavigation[ownerType=" + ownerType + ",ownerId=" + ownerId + "]";
    }
-
-   @Override
-   public NavigationData build()
-   {
-      List<NavigationNodeData> children = buildNavigationChildren();
-      return new NavigationData(storageId, ownerType, ownerId, priority, children);
-   }
 }
\ No newline at end of file

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PageNode.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PageNode.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PageNode.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,82 +19,47 @@
 
 package org.exoplatform.portal.config.model;
 
-import org.exoplatform.commons.utils.ExpressionUtil;
 import org.exoplatform.portal.mop.Visibility;
-import org.exoplatform.portal.pom.data.NavigationNodeData;
-import org.gatein.common.text.EntityEncoder;
 
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import java.util.ResourceBundle;
 
 public class PageNode extends PageNodeContainer
 {
 
+   /** . */
    private ArrayList<PageNode> children;
 
+   /** . */
    private String uri;
 
+   /** . */
    private String label;
 
+   /** . */
    private String icon;
 
+   /** . */
    private String name;
 
-   private String resolvedLabel;
-   
-   private String encodedResolvedLabel;
-
+   /** . */
    private Date startPublicationDate;
 
+   /** . */
    private Date endPublicationDate;
 
+   /** . */
    private Visibility visibility = Visibility.DISPLAYED;
 
+   /** . */
    private String pageReference;
 
-   private transient boolean modifiable;
-
-   public PageNode(NavigationNodeData nav)
+   public PageNode()
    {
-      super(nav.getStorageId());
-
-      //
-      ArrayList<PageNode> children = new ArrayList<PageNode>(nav.getNodes().size());
-      for (NavigationNodeData child : nav.getNodes())
-      {
-         PageNode node = new PageNode(child);
-         children.add(node);
-      }
-
-      //
-      this.uri = nav.getURI();
-      this.label = nav.getLabel();
-      this.resolvedLabel = nav.getLabel();
-      this.encodedResolvedLabel = null;
-      this.icon = nav.getIcon();
-      this.name = nav.getName();
-      this.startPublicationDate = nav.getStartPublicationDate();
-      this.endPublicationDate = nav.getEndPublicationDate();
-      this.visibility = nav.getVisibility();
-      this.pageReference = nav.getPageReference();
-      this.children = children;
-   }
-
-   public PageNode(String storageId)
-   {
-      super(storageId);
-
-      //
       this.children = new ArrayList<PageNode>();
    }
 
-   public PageNode()
-   {
-      this((String)null);
-   }
-
    public String getUri()
    {
       return uri;
@@ -113,8 +78,6 @@
    public void setLabel(String s)
    {
       label = s;
-      resolvedLabel = s;
-      encodedResolvedLabel = null;
    }
 
    public String getIcon()
@@ -147,35 +110,6 @@
       this.name = name;
    }
 
-   public String getResolvedLabel()
-   {
-      return resolvedLabel;
-   }
-   
-   public String getEncodedResolvedLabel()
-   {
-	   EntityEncoder encoder = EntityEncoder.FULL;
-	   if (encodedResolvedLabel == null)
-	   {
-		   encodedResolvedLabel = encoder.encode(resolvedLabel);
-	   }
-	   return encodedResolvedLabel;
-   }
-
-   public void setResolvedLabel(String res)
-   {
-      resolvedLabel = res;
-      encodedResolvedLabel = null;
-   }
-
-   public void setResolvedLabel(ResourceBundle res)
-   {
-      resolvedLabel = ExpressionUtil.getExpressionValue(res, label);
-      if (resolvedLabel == null)
-         resolvedLabel = getName();
-      encodedResolvedLabel = null;
-   }
-
    public List<PageNode> getChildren()
    {
       return children;
@@ -186,16 +120,6 @@
       children = list;
    }
 
-   public boolean isModifiable()
-   {
-      return modifiable;
-   }
-
-   public void setModifiable(boolean b)
-   {
-      modifiable = b;
-   }
-
    public Date getStartPublicationDate()
    {
       return startPublicationDate;
@@ -216,67 +140,6 @@
       endPublicationDate = endDate;
    }
 
-   public boolean isDisplay()
-   {
-      switch (visibility)
-      {
-         case DISPLAYED:
-            return true;
-         case HIDDEN:
-            return false;
-         case TEMPORAL:
-            return isInPublicationDate();
-         case SYSTEM:
-            return false;
-         default:
-            throw new AssertionError();
-      }
-   }
-
-   public boolean isVisible()
-   {
-      switch (visibility)
-      {
-         case DISPLAYED:
-         case TEMPORAL:
-            return true;
-         case SYSTEM:
-         case HIDDEN:
-            return false;
-         default:
-            throw new AssertionError();
-      }
-   }
-
-   public boolean isSystem() {
-	  switch(visibility) {
-	   	 case SYSTEM:
-	   		 return true;
-	   	 case TEMPORAL:
-	   	 case HIDDEN:
-	   	 case DISPLAYED:
-	   		 return false;
-	   	 default:
-	   		 throw new AssertionError();
-	  }
-   }
-   public void setVisible(Boolean b)
-   {
-      if (b != null)
-      {
-         switch (visibility)
-         {
-            case SYSTEM:
-               break;
-            case HIDDEN:
-            case DISPLAYED:
-            case TEMPORAL:
-               visibility = b ? Visibility.DISPLAYED : Visibility.HIDDEN;
-               break;
-         }
-      }
-   }
-
    public void setVisibility(Visibility visibility)
    {
       this.visibility = visibility;
@@ -287,47 +150,6 @@
       return this.visibility;
    }
 
-   private boolean isInPublicationDate()
-   {
-      Date currentDate = new Date();
-      
-      // Case 1: start date, end date are not null and current date is between start and end date
-      boolean case1 = (startPublicationDate != null) && (endPublicationDate != null) && (currentDate.compareTo(startPublicationDate) >= 0 && currentDate.compareTo(endPublicationDate) <= 0);
-      
-      // Case 2: start date is null, end date is not null and current date is before end date
-      boolean case2 = (startPublicationDate == null) && (endPublicationDate != null) && (currentDate.compareTo(endPublicationDate) <= 0);
-      
-      // Case 3: start date is not null, end date is null and current date is after start date
-      boolean case3 = (startPublicationDate != null) && (endPublicationDate == null) && (currentDate.compareTo(startPublicationDate) >= 0);
-      
-      // Case 4: start date and end date are null both
-      boolean case4 = (startPublicationDate == null) && (endPublicationDate == null);
-      
-      return case1 || case2 || case3 || case4;
-   }
-
-   public void setShowPublicationDate(Boolean show)
-   {
-      if (show != null)
-      {
-         switch (visibility)
-         {
-            case SYSTEM:
-            case HIDDEN:
-               break;
-            case TEMPORAL:
-            case DISPLAYED:
-               visibility = show ? Visibility.TEMPORAL : Visibility.DISPLAYED;
-               break;
-         }
-      }
-   }
-
-   public boolean isShowPublicationDate()
-   {
-      return visibility == Visibility.TEMPORAL;
-   }
-
    public PageNode getChild(String name)
    {
       if (children == null)
@@ -345,43 +167,9 @@
       return children;
    }
 
-   public PageNode clone()
-   {
-      PageNode newNode = new PageNode();
-      newNode.setUri(uri);
-      newNode.setLabel(label);
-      newNode.setIcon(icon);
-      newNode.setName(name);
-      newNode.setResolvedLabel(resolvedLabel);
-      newNode.setPageReference(pageReference);
-      newNode.setModifiable(modifiable);
-      newNode.setStartPublicationDate(startPublicationDate);
-      newNode.setEndPublicationDate(endPublicationDate);
-      newNode.setVisibility(visibility);
-      if (children == null || children.size() < 1)
-         return newNode;
-      for (PageNode ele : children)
-      {
-         newNode.getChildren().add(ele.clone());
-      }
-      return newNode;
-   }
-
    @Override
-   public NavigationNodeData build()
+   public String toString()
    {
-      List<NavigationNodeData> children = buildNavigationChildren();
-      return new NavigationNodeData(
-         storageId,
-         uri,
-         label,
-         icon,
-         name,
-         startPublicationDate,
-         endPublicationDate,
-         visibility,
-         pageReference,
-         children
-      );
+      return "PageNode[" + name + "]";
    }
 }
\ No newline at end of file

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PageNodeContainer.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PageNodeContainer.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PageNodeContainer.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,51 +19,28 @@
 
 package org.exoplatform.portal.config.model;
 
-import org.exoplatform.portal.pom.data.NavigationNodeContainerData;
-import org.exoplatform.portal.pom.data.NavigationNodeData;
-
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
 /**
  * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
  * @version $Revision$
  */
-public abstract class PageNodeContainer extends ModelObject
+public abstract class PageNodeContainer
 {
 
-   public PageNodeContainer(String storageId)
-   {
-      super(storageId);
-   }
-
    public PageNodeContainer()
    {
    }
 
    public abstract List<PageNode> getNodes();
 
-   protected List<NavigationNodeData> buildNavigationChildren()
+   public PageNode getNode(String name)
    {
-      List<PageNode> nodes = getNodes();
-      if (nodes != null)
+      for (PageNode node : getNodes())
       {
-         ArrayList<NavigationNodeData> children = new ArrayList<NavigationNodeData>();
-         for (int i = 0;i < nodes.size();i++)
-         {
-            PageNode node = nodes.get(i);
-            NavigationNodeData child = node.build();
-            children.add(child);
-         }
-         return Collections.unmodifiableList(children);
+         if (node.getName().equals(name))
+            return node;
       }
-      else
-      {
-         return Collections.emptyList();
-      }
+      return null;
    }
-
-   public abstract NavigationNodeContainerData build();
-
 }

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PortalConfig.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PortalConfig.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/PortalConfig.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,6 +19,7 @@
 
 package org.exoplatform.portal.config.model;
 
+import org.exoplatform.portal.mop.SiteType;
 import org.exoplatform.portal.pom.config.Utils;
 import org.exoplatform.portal.pom.data.PortalData;
 
@@ -35,11 +36,11 @@
 public class PortalConfig extends ModelObject
 {
 
-   final public static String USER_TYPE = "user";
+   final public static String USER_TYPE = SiteType.USER.getName();
 
-   final public static String GROUP_TYPE = "group";
+   final public static String GROUP_TYPE = SiteType.GROUP.getName();
 
-   final public static String PORTAL_TYPE = "portal";
+   final public static String PORTAL_TYPE = SiteType.PORTAL.getName();
 
    final public static Container DEFAULT_LAYOUT = initDefaultLayout();
 

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/SiteConfig.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/SiteConfig.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/config/model/SiteConfig.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -20,9 +20,7 @@
    private String ownerType;
    
    private String ownerId;
-   
-   private PageNavigation navigation;
-   
+
    /** Access permissions on UI */
    private String[] accessPermissions;
    

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/EventType.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/EventType.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/EventType.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/EventType.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop;
+
+/**
+ * Group various event types.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class EventType
+{
+   /** . */
+   public final static String NAVIGATION_CREATED = "org.exoplatform.portal.mop.navigation.navigation_created";
+
+   /** . */
+   public final static String NAVIGATION_DESTROYED = "org.exoplatform.portal.mop.navigation.navigation_destroyed";
+
+   /** . */
+   public final static String NAVIGATION_UPDATED = "org.exoplatform.portal.mop.navigation.navigation_updated";
+
+}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/SiteKey.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/SiteKey.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/SiteKey.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/SiteKey.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop;
+
+import org.exoplatform.portal.config.model.PortalConfig;
+
+import java.io.Serializable;
+
+/**
+* @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+* @version $Revision$
+*/
+public final class SiteKey implements Serializable
+{
+
+   public static SiteKey portal(String name)
+   {
+      return new SiteKey(SiteType.PORTAL, name);
+   }
+
+   public static SiteKey group(String name)
+   {
+      return new SiteKey(SiteType.GROUP, name);
+   }
+
+   public static SiteKey user(String name)
+   {
+      return new SiteKey(SiteType.USER, name);
+   }
+
+   /** . */
+   private final SiteType type;
+
+   /** . */
+   private final String name;
+
+   public SiteKey(SiteType type, String name)
+   {
+      if (type == null)
+      {
+         throw new NullPointerException("No null type can be provided");
+      }
+      if (name == null)
+      {
+         throw new NullPointerException("No null name can be provided");
+      }
+
+      //
+      this.type = type;
+      this.name = name;
+   }
+   
+   // This will be used for transition in usage from PortalKey and SiteKey
+   public SiteKey(String type, String name)
+   {
+      if (PortalConfig.PORTAL_TYPE.equals(type))
+      {
+         this.type = SiteType.PORTAL;
+      }
+      else if (PortalConfig.GROUP_TYPE.equals(type))
+      {
+         this.type = SiteType.GROUP;
+      }
+      else if (PortalConfig.USER_TYPE.equals(type))
+      {
+         this.type = SiteType.USER;
+      }
+      else
+      {
+         throw new NullPointerException("No null name can be provided");
+      }
+      
+      this.name = name;
+   }
+
+   public SiteType getType()
+   {
+      return type;
+   }
+   
+   public String getTypeName()
+   {
+      return type.getName();
+   }
+
+   public String getName()
+   {
+      return name;
+   }
+
+   @Override
+   public int hashCode()
+   {
+      return name.hashCode() ^ type.hashCode();
+   }
+
+   @Override
+   public boolean equals(Object obj)
+   {
+      if (obj == this)
+      {
+         return true;
+      }
+
+      // We need to use class equality here
+      if (obj != null && getClass().equals(obj.getClass()))
+      {
+         SiteKey that = (SiteKey)obj;
+         return type.equals(that.type) && name.equals(that.name);
+      }
+
+      //
+      return false;
+   }
+
+   @Override
+   public String toString()
+   {
+      return "SiteKey[type=" + type.toString() + ",name=" + name + "]";
+   }
+}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/SiteType.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/SiteType.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/SiteType.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/SiteType.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public enum SiteType
+{
+
+   PORTAL, GROUP, USER ;
+
+   /** ; */
+   final String name;
+
+   SiteType()
+   {
+      this.name = name().toLowerCase();
+   }
+
+   public String getName()
+   {
+      return name;
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/DataCache.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/DataCache.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/DataCache.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.mop.SiteKey;
-import org.exoplatform.portal.pom.config.POMSession;
-import org.gatein.mop.api.workspace.Navigation;
-import org.gatein.mop.api.workspace.ObjectType;
-import org.gatein.mop.api.workspace.Site;
-import org.gatein.mop.api.workspace.Workspace;
-
-import java.util.Collection;
-
-import static org.exoplatform.portal.mop.navigation.Utils.objectType;
-
-/**
- * todo : see if it makes sense to use a bloom filter for not found site black list
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-abstract class DataCache
-{
-
-   protected abstract void removeNodes(Collection<String> keys);
-
-   protected abstract NodeData getNode(POMSession session, String key);
-
-   protected abstract NavigationData getNavigation(POMSession session, SiteKey key);
-
-   protected abstract void removeNavigation(SiteKey key);
-
-   protected abstract void clear();
-
-   final NodeData getNodeData(POMSession session, String nodeId)
-   {
-      NodeData data;
-      if (session.isModified())
-      {
-         data = loadNode(session, nodeId);
-      }
-      else
-      {
-         data = getNode(session, nodeId);
-      }
-      return data;
-   }
-
-   final NavigationData getNavigationData(POMSession session, SiteKey key)
-   {
-      NavigationData data;
-      if (session.isModified())
-      {
-         data = loadNavigation(session, key);
-      }
-      else
-      {
-         data = getNavigation(session, key);
-      }
-
-      //
-      return data;
-   }
-
-   final void removeNodeData(POMSession session, Collection<String> ids)
-   {
-      removeNodes(ids);
-   }
-
-   final void removeNavigationData(POMSession session, SiteKey key)
-   {
-      removeNavigation(key);
-   }
-
-   protected final NodeData loadNode(POMSession session, String nodeId)
-   {
-      Navigation navigation = session.findObjectById(ObjectType.NAVIGATION, nodeId);
-      if (navigation != null)
-      {
-         return new NodeData(navigation);
-      }
-      else
-      {
-         return null;
-      }
-   }
-
-
-   protected final  NavigationData loadNavigation(POMSession session, SiteKey key)
-   {
-      Workspace workspace = session.getWorkspace();
-      ObjectType<Site> objectType = objectType(key.getType());
-      Site site = workspace.getSite(objectType, key.getName());
-      if (site != null)
-      {
-         Navigation defaultNavigation = site.getRootNavigation().getChild("default");
-         if (defaultNavigation != null)
-         {
-            return new NavigationData(key, defaultNavigation);
-         }
-         else
-         {
-            return NavigationData.EMPTY;
-         }
-      }
-      else
-      {
-         return NavigationData.EMPTY;
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/DataCache.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/DataCache.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/DataCache.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/DataCache.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.pom.config.POMSession;
+import org.gatein.mop.api.workspace.Navigation;
+import org.gatein.mop.api.workspace.ObjectType;
+import org.gatein.mop.api.workspace.Site;
+import org.gatein.mop.api.workspace.Workspace;
+
+import java.util.Collection;
+
+import static org.exoplatform.portal.mop.navigation.Utils.objectType;
+
+/**
+ * todo : see if it makes sense to use a bloom filter for not found site black list
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+abstract class DataCache
+{
+
+   protected abstract void removeNodes(Collection<String> keys);
+
+   protected abstract NodeData getNode(POMSession session, String key);
+
+   protected abstract NavigationData getNavigation(POMSession session, SiteKey key);
+
+   protected abstract void removeNavigation(SiteKey key);
+
+   protected abstract void clear();
+
+   final NodeData getNodeData(POMSession session, String nodeId)
+   {
+      NodeData data;
+      if (session.isModified())
+      {
+         data = loadNode(session, nodeId);
+      }
+      else
+      {
+         data = getNode(session, nodeId);
+      }
+      return data;
+   }
+
+   final NavigationData getNavigationData(POMSession session, SiteKey key)
+   {
+      NavigationData data;
+      if (session.isModified())
+      {
+         data = loadNavigation(session, key);
+      }
+      else
+      {
+         data = getNavigation(session, key);
+      }
+
+      //
+      return data;
+   }
+
+   final void removeNodeData(POMSession session, Collection<String> ids)
+   {
+      removeNodes(ids);
+   }
+
+   final void removeNavigationData(POMSession session, SiteKey key)
+   {
+      removeNavigation(key);
+   }
+
+   protected final NodeData loadNode(POMSession session, String nodeId)
+   {
+      Navigation navigation = session.findObjectById(ObjectType.NAVIGATION, nodeId);
+      if (navigation != null)
+      {
+         return new NodeData(navigation);
+      }
+      else
+      {
+         return null;
+      }
+   }
+
+
+   protected final  NavigationData loadNavigation(POMSession session, SiteKey key)
+   {
+      Workspace workspace = session.getWorkspace();
+      ObjectType<Site> objectType = objectType(key.getType());
+      Site site = workspace.getSite(objectType, key.getName());
+      if (site != null)
+      {
+         Navigation defaultNavigation = site.getRootNavigation().getChild("default");
+         if (defaultNavigation != null)
+         {
+            return new NavigationData(key, defaultNavigation);
+         }
+         else
+         {
+            return NavigationData.EMPTY;
+         }
+      }
+      else
+      {
+         return NavigationData.EMPTY;
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/ExoDataCache.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/ExoDataCache.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/ExoDataCache.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.commons.cache.future.FutureExoCache;
-import org.exoplatform.commons.cache.future.Loader;
-import org.exoplatform.portal.mop.SiteKey;
-import org.exoplatform.portal.pom.config.POMSession;
-import org.exoplatform.services.cache.CacheService;
-import org.exoplatform.services.cache.ExoCache;
-
-import java.io.Serializable;
-import java.util.Collection;
-
-/**
- * An implementation using the cache service.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class ExoDataCache extends DataCache
-{
-
-   /** . */
-   protected ExoCache<Serializable, Serializable> cache;
-
-   /** . */
-   protected FutureExoCache<Serializable, Serializable, POMSession> objects;
-
-   /** . */
-   private Loader<Serializable, Serializable, POMSession> navigationLoader = new Loader<Serializable, Serializable, POMSession>()
-   {
-      public Serializable retrieve(POMSession session, Serializable key) throws Exception
-      {
-         if (key instanceof SiteKey)
-         {
-            return loadNavigation(session, (SiteKey)key);
-         }
-         else
-         {
-            return loadNode(session, (String)key);
-         }
-      }
-   };
-
-   public ExoDataCache(CacheService cacheService)
-   {
-      this.cache = cacheService.getCacheInstance("NavigationService");
-      this.objects = new FutureExoCache<Serializable, Serializable, POMSession>(navigationLoader, cache);
-   }
-
-   @Override
-   protected void removeNodes(Collection<String> keys)
-   {
-      for (String key : keys)
-      {
-         cache.remove(key);
-      }
-   }
-
-   @Override
-   protected NodeData getNode(POMSession session, String key)
-   {
-      return (NodeData)objects.get(session, key);
-   }
-
-   @Override
-   protected void removeNavigation(SiteKey key)
-   {
-      cache.remove(key);
-   }
-
-   @Override
-   protected NavigationData getNavigation(POMSession session, SiteKey key)
-   {
-      return (NavigationData)objects.get(session, key);
-   }
-
-   @Override
-   protected void clear()
-   {
-      cache.clearCache();
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/ExoDataCache.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/ExoDataCache.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/ExoDataCache.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/ExoDataCache.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.commons.cache.future.FutureExoCache;
+import org.exoplatform.commons.cache.future.Loader;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.pom.config.POMSession;
+import org.exoplatform.services.cache.CacheService;
+import org.exoplatform.services.cache.ExoCache;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+/**
+ * An implementation using the cache service.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class ExoDataCache extends DataCache
+{
+
+   /** . */
+   protected ExoCache<Serializable, Serializable> cache;
+
+   /** . */
+   protected FutureExoCache<Serializable, Serializable, POMSession> objects;
+
+   /** . */
+   private Loader<Serializable, Serializable, POMSession> navigationLoader = new Loader<Serializable, Serializable, POMSession>()
+   {
+      public Serializable retrieve(POMSession session, Serializable key) throws Exception
+      {
+         if (key instanceof SiteKey)
+         {
+            return loadNavigation(session, (SiteKey)key);
+         }
+         else
+         {
+            return loadNode(session, (String)key);
+         }
+      }
+   };
+
+   public ExoDataCache(CacheService cacheService)
+   {
+      this.cache = cacheService.getCacheInstance("NavigationService");
+      this.objects = new FutureExoCache<Serializable, Serializable, POMSession>(navigationLoader, cache);
+   }
+
+   @Override
+   protected void removeNodes(Collection<String> keys)
+   {
+      for (String key : keys)
+      {
+         cache.remove(key);
+      }
+   }
+
+   @Override
+   protected NodeData getNode(POMSession session, String key)
+   {
+      return (NodeData)objects.get(session, key);
+   }
+
+   @Override
+   protected void removeNavigation(SiteKey key)
+   {
+      cache.remove(key);
+   }
+
+   @Override
+   protected NavigationData getNavigation(POMSession session, SiteKey key)
+   {
+      return (NavigationData)objects.get(session, key);
+   }
+
+   @Override
+   protected void clear()
+   {
+      cache.clearCache();
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/FederatingVisitor.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/FederatingVisitor.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/FederatingVisitor.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-/**
- * A visitor implementation that federates a scope along with a federation root.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-class FederatingVisitor<N> implements Scope.Visitor
-{
-
-   /** . */
-   private final Scope.Visitor visitor;
-
-   /** . */
-   private final NodeContext<N> federationRoot;
-
-   /** . */
-   private final int federationDepth;
-
-   /** . */
-   private final Scope federatedScope;
-
-   /** . */
-   private Scope.Visitor federated;
-
-   FederatingVisitor(Scope.Visitor visitor, NodeContext<N> federationRoot, Scope federatedScope)
-   {
-      this.visitor = visitor;
-      this.federationRoot = federationRoot;
-      this.federatedScope = federatedScope;
-      this.federated = null;
-      this.federationDepth = federationRoot.getDepth(federationRoot.tree.root);
-   }
-
-   public VisitMode enter(int depth, String id, String name, NodeState state)
-   {
-      if (federationRoot.handle.equals(id))
-      {
-         federated = federatedScope.get();
-      }
-
-      //
-      VisitMode visit;
-      if (federated != null)
-      {
-         visit = federated.enter(depth - federationDepth, id, name, state);
-      }
-      else
-      {
-         visit = VisitMode.NO_CHILDREN;
-      }
-
-      // Override
-      VisitMode override = visitor.enter(depth, id, name, state);
-      if (override == VisitMode.ALL_CHILDREN)
-      {
-         visit = VisitMode.ALL_CHILDREN;
-      }
-
-      //
-      return visit;
-   }
-
-   public void leave(int depth, String id, String name, NodeState state)
-   {
-      if (federationRoot.handle.equals(id))
-      {
-         federated = null;
-      }
-
-      //
-      if (federated != null)
-      {
-         federated.leave(depth - federationDepth, id, name, state);
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/FederatingVisitor.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/FederatingVisitor.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/FederatingVisitor.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/FederatingVisitor.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+/**
+ * A visitor implementation that federates a scope along with a federation root.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+class FederatingVisitor<N> implements Scope.Visitor
+{
+
+   /** . */
+   private final Scope.Visitor visitor;
+
+   /** . */
+   private final NodeContext<N> federationRoot;
+
+   /** . */
+   private final int federationDepth;
+
+   /** . */
+   private final Scope federatedScope;
+
+   /** . */
+   private Scope.Visitor federated;
+
+   FederatingVisitor(Scope.Visitor visitor, NodeContext<N> federationRoot, Scope federatedScope)
+   {
+      this.visitor = visitor;
+      this.federationRoot = federationRoot;
+      this.federatedScope = federatedScope;
+      this.federated = null;
+      this.federationDepth = federationRoot.getDepth(federationRoot.tree.root);
+   }
+
+   public VisitMode enter(int depth, String id, String name, NodeState state)
+   {
+      if (federationRoot.handle.equals(id))
+      {
+         federated = federatedScope.get();
+      }
+
+      //
+      VisitMode visit;
+      if (federated != null)
+      {
+         visit = federated.enter(depth - federationDepth, id, name, state);
+      }
+      else
+      {
+         visit = VisitMode.NO_CHILDREN;
+      }
+
+      // Override
+      VisitMode override = visitor.enter(depth, id, name, state);
+      if (override == VisitMode.ALL_CHILDREN)
+      {
+         visit = VisitMode.ALL_CHILDREN;
+      }
+
+      //
+      return visit;
+   }
+
+   public void leave(int depth, String id, String name, NodeState state)
+   {
+      if (federationRoot.handle.equals(id))
+      {
+         federated = null;
+      }
+
+      //
+      if (federated != null)
+      {
+         federated.leave(depth - federationDepth, id, name, state);
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/GenericScope.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/GenericScope.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/GenericScope.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
-* A flexible scope implementation.
-*/
-public class GenericScope implements Scope
-{
-
-   public static Scope branchShape(String[] path)
-   {
-      return branchShape(Arrays.asList(path), Scope.CHILDREN);
-   }
-
-   public static Scope branchShape(List<String> path)
-   {
-      return branchShape(path, Scope.CHILDREN);
-   }
-
-   public static Scope branchShape(String[] path, Scope federated)
-   {
-      return branchShape(Arrays.asList(path), federated);
-   }
-
-   /**
-    * <p>A scope with the shape of a tree branch following the rules:
-    * <ul>
-    *    <li>the first node with depth 0 will have all of its children visited</li>
-    *    <li>any node above the root node that fits in the <code>path</code> array will be matched
-    *    only if the node name matches the corresponding value in the <code>path</code> array. The last
-    *    node whose depth is equals to the <code>path</code> list size will have its visit mode value delegated
-    *    to the <code>federated</code> scope argument with a depth of 0 and the same other arguments, any other node
-    *    will have all of its children visited.</li>
-    *    <li>any other node will have its visit mode delegated to the <code>federated</code> scope argument
-    *    with the same arguments except the depth that will be subtracted the <code>path</code> list argument size.</li>
-    * </ul></p>
-    *
-    * @param path the names that describing the tree path
-    * @param federated the federated scope
-    * @return the branch shape scope
-    * @throws NullPointerException if any argument is null
-    */
-   public static Scope branchShape(final List<String> path, final Scope federated) throws NullPointerException
-   {
-      if (path == null)
-      {
-         throw new NullPointerException("no null path accepted");
-      }
-      if (federated == null)
-      {
-         throw new NullPointerException("no null federated scope accepted");
-      }
-      return new Scope()
-      {
-         public Visitor get()
-         {
-            return new Visitor()
-            {
-               public VisitMode enter(int depth, String id, String name, NodeState state)
-               {
-                  if (depth == 0)
-                  {
-                     return VisitMode.ALL_CHILDREN;
-                  }
-                  else if (depth > 0)
-                  {
-                     if (depth < path.size())
-                     {
-                        if ((name.equals(path.get(depth - 1))))
-                        {
-                           return VisitMode.ALL_CHILDREN;
-                        }
-                        else
-                        {
-                           return VisitMode.NO_CHILDREN;
-                        }
-                     }
-                     else if (depth == path.size())
-                     {
-                        if ((name.equals(path.get(path.size() - 1))))
-                        {
-                           return federated.get().enter(0, id, name, state);
-                        }
-                        else
-                        {
-                           return VisitMode.NO_CHILDREN;
-                        }
-                     }
-                     else
-                     {
-                        return federated.get().enter(depth - path.size(), id, name, state);
-                     }
-                  }
-                  throw new AssertionError();
-               }
-
-               public void leave(int depth, String id, String name, NodeState state)
-               {
-               }
-            };
-         }
-      };
-   }
-
-
-   /** . */
-   private final Visitor visitor;
-
-   /**
-    * Creates a new navigation scope. When the height is positive or null, the tree will be pruned to the specified
-    * height, when the height is negative  no pruning will occur.
-    *
-    * @param height the max height of the pruned tree
-    */
-   public GenericScope(final int height)
-   {
-      this.visitor = new Visitor()
-      {
-         public VisitMode enter(int depth, String id, String name, NodeState state)
-         {
-            if (height < 0 || depth < height)
-            {
-               return VisitMode.ALL_CHILDREN;
-            }
-            else
-            {
-               return VisitMode.NO_CHILDREN;
-            }
-         }
-
-         public void leave(int depth, String id, String name, NodeState state)
-         {
-         }
-      };
-   }
-
-   public Visitor get()
-   {
-      return visitor;
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/GenericScope.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/GenericScope.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/GenericScope.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/GenericScope.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+* A flexible scope implementation.
+*/
+public class GenericScope implements Scope
+{
+
+   public static Scope branchShape(String[] path)
+   {
+      return branchShape(Arrays.asList(path), Scope.CHILDREN);
+   }
+
+   public static Scope branchShape(List<String> path)
+   {
+      return branchShape(path, Scope.CHILDREN);
+   }
+
+   public static Scope branchShape(String[] path, Scope federated)
+   {
+      return branchShape(Arrays.asList(path), federated);
+   }
+
+   /**
+    * <p>A scope with the shape of a tree branch following the rules:
+    * <ul>
+    *    <li>the first node with depth 0 will have all of its children visited</li>
+    *    <li>any node above the root node that fits in the <code>path</code> array will be matched
+    *    only if the node name matches the corresponding value in the <code>path</code> array. The last
+    *    node whose depth is equals to the <code>path</code> list size will have its visit mode value delegated
+    *    to the <code>federated</code> scope argument with a depth of 0 and the same other arguments, any other node
+    *    will have all of its children visited.</li>
+    *    <li>any other node will have its visit mode delegated to the <code>federated</code> scope argument
+    *    with the same arguments except the depth that will be subtracted the <code>path</code> list argument size.</li>
+    * </ul></p>
+    *
+    * @param path the names that describing the tree path
+    * @param federated the federated scope
+    * @return the branch shape scope
+    * @throws NullPointerException if any argument is null
+    */
+   public static Scope branchShape(final List<String> path, final Scope federated) throws NullPointerException
+   {
+      if (path == null)
+      {
+         throw new NullPointerException("no null path accepted");
+      }
+      if (federated == null)
+      {
+         throw new NullPointerException("no null federated scope accepted");
+      }
+      return new Scope()
+      {
+         public Visitor get()
+         {
+            return new Visitor()
+            {
+               public VisitMode enter(int depth, String id, String name, NodeState state)
+               {
+                  if (depth == 0)
+                  {
+                     return VisitMode.ALL_CHILDREN;
+                  }
+                  else if (depth > 0)
+                  {
+                     if (depth < path.size())
+                     {
+                        if ((name.equals(path.get(depth - 1))))
+                        {
+                           return VisitMode.ALL_CHILDREN;
+                        }
+                        else
+                        {
+                           return VisitMode.NO_CHILDREN;
+                        }
+                     }
+                     else if (depth == path.size())
+                     {
+                        if ((name.equals(path.get(path.size() - 1))))
+                        {
+                           return federated.get().enter(0, id, name, state);
+                        }
+                        else
+                        {
+                           return VisitMode.NO_CHILDREN;
+                        }
+                     }
+                     else
+                     {
+                        return federated.get().enter(depth - path.size(), id, name, state);
+                     }
+                  }
+                  throw new AssertionError();
+               }
+
+               public void leave(int depth, String id, String name, NodeState state)
+               {
+               }
+            };
+         }
+      };
+   }
+
+
+   /** . */
+   private final Visitor visitor;
+
+   /**
+    * Creates a new navigation scope. When the height is positive or null, the tree will be pruned to the specified
+    * height, when the height is negative  no pruning will occur.
+    *
+    * @param height the max height of the pruned tree
+    */
+   public GenericScope(final int height)
+   {
+      this.visitor = new Visitor()
+      {
+         public VisitMode enter(int depth, String id, String name, NodeState state)
+         {
+            if (height < 0 || depth < height)
+            {
+               return VisitMode.ALL_CHILDREN;
+            }
+            else
+            {
+               return VisitMode.NO_CHILDREN;
+            }
+         }
+
+         public void leave(int depth, String id, String name, NodeState state)
+         {
+         }
+      };
+   }
+
+   public Visitor get()
+   {
+      return visitor;
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/InvalidationBridge.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/InvalidationBridge.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/InvalidationBridge.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.mop.SiteType;
-
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.observation.Event;
-import javax.jcr.observation.EventIterator;
-import javax.jcr.observation.EventListener;
-import javax.jcr.observation.ObservationManager;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-class InvalidationBridge
-{
-
-   /** . */
-   private final DataCache cache;
-
-   /** . */
-   private ObservationManager mgr;
-
-   /** . */
-   private final EventListenerImpl portalBridge;
-
-   /** . */
-   private final EventListenerImpl groupBridge;
-
-   /** . */
-   private final EventListenerImpl userBridge;
-
-   public InvalidationBridge(DataCache cache)
-   {
-      this.cache = cache;
-      this.portalBridge = new EventListenerImpl("mop:portalsites", SiteType.PORTAL);
-      this.groupBridge = new EventListenerImpl("mop:groupsites", SiteType.GROUP);
-      this.userBridge = new EventListenerImpl("mop:usersites", SiteType.USER);
-   }
-
-   void start(Session session) throws RepositoryException
-   {
-      mgr = session.getWorkspace().getObservationManager();
-
-      //
-      portalBridge.register(mgr);
-      groupBridge.register(mgr);
-      userBridge.register(mgr);
-   }
-
-   void stop()
-   {
-      portalBridge.unregister();
-      groupBridge.unregister();
-      userBridge.unregister();
-   }
-
-   private class EventListenerImpl implements EventListener
-   {
-
-      /** . */
-      private final String nodeType;
-
-      /** . */
-      private final SiteType type;
-
-      /** . */
-      private ObservationManager mgr;
-
-      private EventListenerImpl(String nodeType, SiteType type)
-      {
-         this.nodeType = nodeType;
-         this.type = type;
-      }
-
-      void register(ObservationManager mgr) throws RepositoryException
-      {
-         mgr.addEventListener(this, Event.NODE_REMOVED, "/", true, null, new String[]{nodeType}, false);
-
-         //
-         this.mgr = mgr;
-      }
-
-      void unregister()
-      {
-         if (mgr != null)
-         {
-            try
-            {
-               mgr.removeEventListener(this);
-            }
-            catch (RepositoryException ignore)
-            {
-            }
-         }
-      }
-
-      public void onEvent(EventIterator events)
-      {
-         // We clear the cache when a site is removed in order to remove all the related navigations
-         cache.clear();
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/InvalidationBridge.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/InvalidationBridge.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/InvalidationBridge.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/InvalidationBridge.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.mop.SiteType;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.observation.Event;
+import javax.jcr.observation.EventIterator;
+import javax.jcr.observation.EventListener;
+import javax.jcr.observation.ObservationManager;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+class InvalidationBridge
+{
+
+   /** . */
+   private final DataCache cache;
+
+   /** . */
+   private ObservationManager mgr;
+
+   /** . */
+   private final EventListenerImpl portalBridge;
+
+   /** . */
+   private final EventListenerImpl groupBridge;
+
+   /** . */
+   private final EventListenerImpl userBridge;
+
+   public InvalidationBridge(DataCache cache)
+   {
+      this.cache = cache;
+      this.portalBridge = new EventListenerImpl("mop:portalsites", SiteType.PORTAL);
+      this.groupBridge = new EventListenerImpl("mop:groupsites", SiteType.GROUP);
+      this.userBridge = new EventListenerImpl("mop:usersites", SiteType.USER);
+   }
+
+   void start(Session session) throws RepositoryException
+   {
+      mgr = session.getWorkspace().getObservationManager();
+
+      //
+      portalBridge.register(mgr);
+      groupBridge.register(mgr);
+      userBridge.register(mgr);
+   }
+
+   void stop()
+   {
+      portalBridge.unregister();
+      groupBridge.unregister();
+      userBridge.unregister();
+   }
+
+   private class EventListenerImpl implements EventListener
+   {
+
+      /** . */
+      private final String nodeType;
+
+      /** . */
+      private final SiteType type;
+
+      /** . */
+      private ObservationManager mgr;
+
+      private EventListenerImpl(String nodeType, SiteType type)
+      {
+         this.nodeType = nodeType;
+         this.type = type;
+      }
+
+      void register(ObservationManager mgr) throws RepositoryException
+      {
+         mgr.addEventListener(this, Event.NODE_REMOVED, "/", true, null, new String[]{nodeType}, false);
+
+         //
+         this.mgr = mgr;
+      }
+
+      void unregister()
+      {
+         if (mgr != null)
+         {
+            try
+            {
+               mgr.removeEventListener(this);
+            }
+            catch (RepositoryException ignore)
+            {
+            }
+         }
+      }
+
+      public void onEvent(EventIterator events)
+      {
+         // We clear the cache when a site is removed in order to remove all the related navigations
+         cache.clear();
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationContext.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationContext.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationContext.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.mop.SiteKey;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class NavigationContext
-{
-
-   /** . */
-   SiteKey key;
-
-   /** . */
-   NavigationState state;
-
-   /** . */
-   NavigationData data;
-
-   NavigationContext(NavigationData data)
-   {
-      if (data == null)
-      {
-         throw new NullPointerException();
-      }
-
-      //
-      this.key = data.key;
-      this.data = data;
-   }
-
-   public NavigationContext(SiteKey key, NavigationState state)
-   {
-      if (key == null)
-      {
-         throw new NullPointerException();
-      }
-      if (state == null)
-      {
-         throw new NullPointerException();
-      }
-
-      //
-      this.key = key;
-      this.state = state;
-   }
-
-   /**
-    * Returns the navigation key.
-    *
-    * @return the navigation key
-    */
-   public SiteKey getKey()
-   {
-      return data.key;
-   }
-
-   /**
-    * Returns the navigation state.
-    *
-    * @return the navigation state
-    */
-   public NavigationState getState()
-   {
-      if (state != null)
-      {
-         return state;
-      }
-      else if (data != null)
-      {
-         return data.state;
-      }
-      else
-      {
-         return null;
-      }
-   }
-
-   /**
-    * Updates the navigation state the behavior is not the same wether or not the navigation is persistent:
-    * <ul>
-    *    <li>When the navigation is persistent, any state is allowed:
-    *    <li>A non null state overrides the current persistent state.</li>
-    *    <li>The null state means to reset the state to the persistent state.</li>
-    *    </li>
-    *    <li>When the navigation is transient, only a non null state is allowed as it will be used for creation
-    *    purpose.</li>
-    * </ul>
-    *
-    * @param state the new state
-    * @throws IllegalStateException when the state is cleared and the navigation is not persistent
-    */
-   public void setState(NavigationState state) throws IllegalStateException
-   {
-      if (data == null && state == null)
-      {
-         throw new IllegalStateException("Cannot clear state on a transient navigation");
-      }
-      this.state = state;
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationContext.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationContext.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationContext.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationContext.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.mop.SiteKey;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class NavigationContext
+{
+
+   /** . */
+   SiteKey key;
+
+   /** . */
+   NavigationState state;
+
+   /** . */
+   NavigationData data;
+
+   NavigationContext(NavigationData data)
+   {
+      if (data == null)
+      {
+         throw new NullPointerException();
+      }
+
+      //
+      this.key = data.key;
+      this.data = data;
+   }
+
+   public NavigationContext(SiteKey key, NavigationState state)
+   {
+      if (key == null)
+      {
+         throw new NullPointerException();
+      }
+      if (state == null)
+      {
+         throw new NullPointerException();
+      }
+
+      //
+      this.key = key;
+      this.state = state;
+   }
+
+   /**
+    * Returns the navigation key.
+    *
+    * @return the navigation key
+    */
+   public SiteKey getKey()
+   {
+      return data.key;
+   }
+
+   /**
+    * Returns the navigation state.
+    *
+    * @return the navigation state
+    */
+   public NavigationState getState()
+   {
+      if (state != null)
+      {
+         return state;
+      }
+      else if (data != null)
+      {
+         return data.state;
+      }
+      else
+      {
+         return null;
+      }
+   }
+
+   /**
+    * Updates the navigation state the behavior is not the same wether or not the navigation is persistent:
+    * <ul>
+    *    <li>When the navigation is persistent, any state is allowed:
+    *    <li>A non null state overrides the current persistent state.</li>
+    *    <li>The null state means to reset the state to the persistent state.</li>
+    *    </li>
+    *    <li>When the navigation is transient, only a non null state is allowed as it will be used for creation
+    *    purpose.</li>
+    * </ul>
+    *
+    * @param state the new state
+    * @throws IllegalStateException when the state is cleared and the navigation is not persistent
+    */
+   public void setState(NavigationState state) throws IllegalStateException
+   {
+      if (data == null && state == null)
+      {
+         throw new IllegalStateException("Cannot clear state on a transient navigation");
+      }
+      this.state = state;
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationData.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationData.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationData.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.mop.SiteKey;
-import org.exoplatform.portal.pom.data.MappedAttributes;
-import org.gatein.mop.api.workspace.Navigation;
-
-import java.io.Serializable;
-
-/**
- * An immutable navigation data class.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class NavigationData implements Serializable
-{
-
-   /** Useful. */
-   static final NavigationData EMPTY = new NavigationData();
-
-   /** . */
-   final SiteKey key;
-
-   /** . */
-   final NavigationState state;
-
-   /** . */
-   final String rootId;
-
-   private NavigationData()
-   {
-      this.key = null;
-      this.state = null;
-      this.rootId = null;
-   }
-
-   NavigationData(SiteKey key, Navigation node)
-   {
-      String rootId = node.getObjectId();
-      NavigationState state = new NavigationState(node.getAttributes().getValue(MappedAttributes.PRIORITY, 1));
-
-      //
-      this.key = key;
-      this.state = state;
-      this.rootId = rootId;
-   }
-
-   NavigationData(SiteKey key, NavigationState state, String rootId)
-   {
-      this.key = key;
-      this.state = state;
-      this.rootId = rootId;
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationData.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationData.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationData.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationData.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.pom.data.MappedAttributes;
+import org.gatein.mop.api.workspace.Navigation;
+
+import java.io.Serializable;
+
+/**
+ * An immutable navigation data class.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class NavigationData implements Serializable
+{
+
+   /** Useful. */
+   static final NavigationData EMPTY = new NavigationData();
+
+   /** . */
+   final SiteKey key;
+
+   /** . */
+   final NavigationState state;
+
+   /** . */
+   final String rootId;
+
+   private NavigationData()
+   {
+      this.key = null;
+      this.state = null;
+      this.rootId = null;
+   }
+
+   NavigationData(SiteKey key, Navigation node)
+   {
+      String rootId = node.getObjectId();
+      NavigationState state = new NavigationState(node.getAttributes().getValue(MappedAttributes.PRIORITY, 1));
+
+      //
+      this.key = key;
+      this.state = state;
+      this.rootId = rootId;
+   }
+
+   NavigationData(SiteKey key, NavigationState state, String rootId)
+   {
+      this.key = key;
+      this.state = state;
+      this.rootId = rootId;
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationError.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationError.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationError.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public enum NavigationError
-{
-
-   MOVE_CONCURRENTLY_REMOVED_SRC_NODE,
-
-   MOVE_CONCURRENTLY_REMOVED_DST_NODE,
-
-   MOVE_CONCURRENTLY_REMOVED_MOVED_NODE,
-
-   MOVE_CONCURRENTLY_CHANGED_SRC_NODE,
-
-   MOVE_CONCURRENTLY_REMOVED_PREVIOUS_NODE,
-
-   MOVE_CONCURRENTLY_DUPLICATE_NAME,
-
-   ADD_CONCURRENTLY_REMOVED_PARENT_NODE,
-
-   ADD_CONCURRENTLY_ADDED_NODE,
-
-   ADD_CONCURRENTLY_REMOVED_PREVIOUS_NODE,
-
-   UPDATE_CONCURRENTLY_REMOVED_NODE,
-
-   RENAME_CONCURRENTLY_REMOVED_NODE,
-
-   RENAME_CONCURRENTLY_DUPLICATE_NAME,
-
-   NAVIGATION_NO_SITE,
-
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationError.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationError.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationError.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationError.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public enum NavigationError
+{
+
+   MOVE_CONCURRENTLY_REMOVED_SRC_NODE,
+
+   MOVE_CONCURRENTLY_REMOVED_DST_NODE,
+
+   MOVE_CONCURRENTLY_REMOVED_MOVED_NODE,
+
+   MOVE_CONCURRENTLY_CHANGED_SRC_NODE,
+
+   MOVE_CONCURRENTLY_REMOVED_PREVIOUS_NODE,
+
+   MOVE_CONCURRENTLY_DUPLICATE_NAME,
+
+   ADD_CONCURRENTLY_REMOVED_PARENT_NODE,
+
+   ADD_CONCURRENTLY_ADDED_NODE,
+
+   ADD_CONCURRENTLY_REMOVED_PREVIOUS_NODE,
+
+   UPDATE_CONCURRENTLY_REMOVED_NODE,
+
+   RENAME_CONCURRENTLY_REMOVED_NODE,
+
+   RENAME_CONCURRENTLY_DUPLICATE_NAME,
+
+   NAVIGATION_NO_SITE,
+
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationService.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationService.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationService.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.mop.SiteKey;
-
-/**
- * <p>The navigation service takes care of managing the various portal navigations and their nodes. In order to manage
- * an efficient loading of the nodes, a {@link Scope} is used to describe the set of nodes that should be retrieved
- * when a loading operation is performed.</p>
- *
- * <p>The node operations does not provide a model per se, but instead use the {@link NodeModel} interface to plug
- * an API model. Various node operations are quite complex and any API in front of this service would need to perform
- * a manual, error prone and tedious synchronization. Instead the model interface allows the navigation service to
- * operate directly on an existing model.</p>
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public interface NavigationService
-{
-
-   /**
-    * Find and returns a navigation, if no such site exist, null is returned instead.
-    *
-    * @param key the navigation key
-    * @return the matching navigation
-    * @throws NullPointerException if the key is null
-    * @throws NavigationServiceException anything that would prevent the operation to succeed
-    */
-   NavigationContext loadNavigation(SiteKey key) throws NullPointerException, NavigationServiceException;
-
-   /**
-    * Create, update a navigation. When the navigation state is not null, the navigation
-    * will be created or updated depending on whether or not the navigation already exists.
-    *
-    * @param navigation the navigation
-    * @throws NullPointerException if the key is null
-    * @throws IllegalArgumentException if the navigation is already destroyed
-    * @throws NavigationServiceException anything that would prevent the operation to succeed
-    */
-   void saveNavigation(NavigationContext navigation) throws NullPointerException, IllegalArgumentException, NavigationServiceException;
-
-   /**
-    * Destroy a navigation.
-    *
-    * @param navigation the navigation
-    * @return true if the navigation was destroyed
-    * @throws NullPointerException if the navigation is null
-    * @throws IllegalArgumentException if the navigation is destroyed
-    * @throws NavigationServiceException anything that would prevent the operation to succeed
-    */
-   boolean destroyNavigation(NavigationContext navigation) throws NullPointerException, IllegalArgumentException, NavigationServiceException;
-
-   /**
-    * Load a navigation node from a specified navigation. The returned context will be the root node of the navigation.
-    *
-    * @param model the node model
-    * @param navigation the navigation
-    * @param scope the scope
-    * @param listener the optional listener
-    * @param <N> the node generic type
-    * @return the loaded node
-    * @throws NullPointerException if any argument is null
-    * @throws NavigationServiceException anything that would prevent the operation to succeed
-    */
-   <N> NodeContext<N> loadNode(NodeModel<N> model, NavigationContext navigation, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException;
-
-   /**
-    * <p>Save the specified context state to the persistent storage. The operation takes the pending changes done to
-    * the tree and attempt to save them to the persistent storage. When conflicts happens, a merge will be attempted
-    * however it can lead to a failure.</p>
-    *
-    * @param context the context to save
-    * @param listener the optional listener
-    * @throws NullPointerException if the context argument is null
-    * @throws NavigationServiceException anything that would prevent the operation to succeed
-    */
-   <N> void saveNode(NodeContext<N> context, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException;
-
-   /**
-    * <p>Update the specified <code>context</code> argument with the most recent state. The update operation will
-    * affect the entire tree even if the <code>context</code> argument is not the root of the tree. The <code>context</code>
-    * argument determines the root from which the <code>scope</code> argument applies to.</p>
-    *
-    * <p>The update operation compares the actual tree and the most recent version of the same tree. When the
-    * <code>scope</scope> argument is not null, it will be used to augment the tree with new nodes. During the
-    * operation, any modification done to the tree wil be reported as a change to the optional <code>listener</code>
-    * argument.</p>
-    *
-    * <p>The update operates recursively by doing a comparison of the node intrisic state (name or state) and its
-    * structural state (the children). The comparison between the children of two nodes is done thanks to the
-    * Longest Common Subsequence algorithm to minimize the number of changes to perform. The operation assumes
-    * that no changes have been performed on the actual tree.</p>
-    *
-    * @param context the context to update
-    * @param scope the optional scope
-    * @param listener the optional node change listener
-    * @param <N> the node generic type
-    * @throws NullPointerException if the context argument is null
-    * @throws NavigationServiceException anything that would prevent the operation to succeed
-    * @throws IllegalArgumentException if the context argument has pending changes
-    */
-   <N> void updateNode(NodeContext<N> context, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, IllegalArgumentException, NavigationServiceException;
-
-   /**
-    * <p>Rebase the specified <code>context</code> argument with the most recent state. The rebase operation will
-    * affect the entire tree even if the <code>context</code> argument is not the root of the tree. The <code>context</code>
-    * argument determines the root from which the <code>scope</code> argument applies to.</p>
-    *
-    * <p>The rebase operation compares the actual tree and the most recent version of the same tree. When the
-    * <code>scope</scope> argument is not null, it will be used to augment the tree with new nodes. During the
-    * operation, any modification done to the tree wil be reported as a change to the optional <code>listener</code>
-    * argument.</p>
-    *
-    * <p>The rebase operates in a similar way of the update operation, however it assumes that it can have pending changes
-    * done to the tree (i.e changes that have not been saved). Actually a rebase operation with no changes will do the
-    * same than an update operation. The rebase operation attempts to bring the most recent changes to the tree, by
-    * doing a rebase of the pending operations on the actual tree. When conflicting changes exist, a merge will be
-    * attempted, however it could fail and lead to a non resolvable situation.</p>
-    *
-    * @param context the context to rebase
-    * @param scope the optional scope
-    * @param listener the option node change listener  @throws NullPointerException if the context argument is null
-    * @param <N> the node generic type
-    * @throws NullPointerException if the context argument is null
-    * @throws NavigationServiceException anything that would prevent the operation to succeed
-    */
-   <N> void rebaseNode(NodeContext<N> context, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException;
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationService.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationService.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationService.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationService.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.mop.SiteKey;
+
+/**
+ * <p>The navigation service takes care of managing the various portal navigations and their nodes. In order to manage
+ * an efficient loading of the nodes, a {@link Scope} is used to describe the set of nodes that should be retrieved
+ * when a loading operation is performed.</p>
+ *
+ * <p>The node operations does not provide a model per se, but instead use the {@link NodeModel} interface to plug
+ * an API model. Various node operations are quite complex and any API in front of this service would need to perform
+ * a manual, error prone and tedious synchronization. Instead the model interface allows the navigation service to
+ * operate directly on an existing model.</p>
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public interface NavigationService
+{
+
+   /**
+    * Find and returns a navigation, if no such site exist, null is returned instead.
+    *
+    * @param key the navigation key
+    * @return the matching navigation
+    * @throws NullPointerException if the key is null
+    * @throws NavigationServiceException anything that would prevent the operation to succeed
+    */
+   NavigationContext loadNavigation(SiteKey key) throws NullPointerException, NavigationServiceException;
+
+   /**
+    * Create, update a navigation. When the navigation state is not null, the navigation
+    * will be created or updated depending on whether or not the navigation already exists.
+    *
+    * @param navigation the navigation
+    * @throws NullPointerException if the key is null
+    * @throws IllegalArgumentException if the navigation is already destroyed
+    * @throws NavigationServiceException anything that would prevent the operation to succeed
+    */
+   void saveNavigation(NavigationContext navigation) throws NullPointerException, IllegalArgumentException, NavigationServiceException;
+
+   /**
+    * Destroy a navigation.
+    *
+    * @param navigation the navigation
+    * @return true if the navigation was destroyed
+    * @throws NullPointerException if the navigation is null
+    * @throws IllegalArgumentException if the navigation is destroyed
+    * @throws NavigationServiceException anything that would prevent the operation to succeed
+    */
+   boolean destroyNavigation(NavigationContext navigation) throws NullPointerException, IllegalArgumentException, NavigationServiceException;
+
+   /**
+    * Load a navigation node from a specified navigation. The returned context will be the root node of the navigation.
+    *
+    * @param model the node model
+    * @param navigation the navigation
+    * @param scope the scope
+    * @param listener the optional listener
+    * @param <N> the node generic type
+    * @return the loaded node
+    * @throws NullPointerException if any argument is null
+    * @throws NavigationServiceException anything that would prevent the operation to succeed
+    */
+   <N> NodeContext<N> loadNode(NodeModel<N> model, NavigationContext navigation, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException;
+
+   /**
+    * <p>Save the specified context state to the persistent storage. The operation takes the pending changes done to
+    * the tree and attempt to save them to the persistent storage. When conflicts happens, a merge will be attempted
+    * however it can lead to a failure.</p>
+    *
+    * @param context the context to save
+    * @param listener the optional listener
+    * @throws NullPointerException if the context argument is null
+    * @throws NavigationServiceException anything that would prevent the operation to succeed
+    */
+   <N> void saveNode(NodeContext<N> context, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException;
+
+   /**
+    * <p>Update the specified <code>context</code> argument with the most recent state. The update operation will
+    * affect the entire tree even if the <code>context</code> argument is not the root of the tree. The <code>context</code>
+    * argument determines the root from which the <code>scope</code> argument applies to.</p>
+    *
+    * <p>The update operation compares the actual tree and the most recent version of the same tree. When the
+    * <code>scope</scope> argument is not null, it will be used to augment the tree with new nodes. During the
+    * operation, any modification done to the tree wil be reported as a change to the optional <code>listener</code>
+    * argument.</p>
+    *
+    * <p>The update operates recursively by doing a comparison of the node intrisic state (name or state) and its
+    * structural state (the children). The comparison between the children of two nodes is done thanks to the
+    * Longest Common Subsequence algorithm to minimize the number of changes to perform. The operation assumes
+    * that no changes have been performed on the actual tree.</p>
+    *
+    * @param context the context to update
+    * @param scope the optional scope
+    * @param listener the optional node change listener
+    * @param <N> the node generic type
+    * @throws NullPointerException if the context argument is null
+    * @throws NavigationServiceException anything that would prevent the operation to succeed
+    * @throws IllegalArgumentException if the context argument has pending changes
+    */
+   <N> void updateNode(NodeContext<N> context, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, IllegalArgumentException, NavigationServiceException;
+
+   /**
+    * <p>Rebase the specified <code>context</code> argument with the most recent state. The rebase operation will
+    * affect the entire tree even if the <code>context</code> argument is not the root of the tree. The <code>context</code>
+    * argument determines the root from which the <code>scope</code> argument applies to.</p>
+    *
+    * <p>The rebase operation compares the actual tree and the most recent version of the same tree. When the
+    * <code>scope</scope> argument is not null, it will be used to augment the tree with new nodes. During the
+    * operation, any modification done to the tree wil be reported as a change to the optional <code>listener</code>
+    * argument.</p>
+    *
+    * <p>The rebase operates in a similar way of the update operation, however it assumes that it can have pending changes
+    * done to the tree (i.e changes that have not been saved). Actually a rebase operation with no changes will do the
+    * same than an update operation. The rebase operation attempts to bring the most recent changes to the tree, by
+    * doing a rebase of the pending operations on the actual tree. When conflicting changes exist, a merge will be
+    * attempted, however it could fail and lead to a non resolvable situation.</p>
+    *
+    * @param context the context to rebase
+    * @param scope the optional scope
+    * @param listener the option node change listener  @throws NullPointerException if the context argument is null
+    * @param <N> the node generic type
+    * @throws NullPointerException if the context argument is null
+    * @throws NavigationServiceException anything that would prevent the operation to succeed
+    */
+   <N> void rebaseNode(NodeContext<N> context, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException;
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceException.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceException.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceException.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class NavigationServiceException extends RuntimeException
-{
-
-   /** . */
-   private final NavigationError error;
-
-   public NavigationServiceException(NavigationError error)
-   {
-      super(error.toString());
-      this.error = error;
-   }
-
-   public NavigationServiceException(NavigationError error, String message)
-   {
-      super(message);
-
-      //
-      this.error = error;
-   }
-
-   public NavigationServiceException(NavigationError error, String message, Throwable cause)
-   {
-      super(message, cause);
-
-      //
-      this.error = error;
-   }
-
-   public NavigationServiceException(NavigationError error, Throwable cause)
-   {
-      super(cause);
-
-      //
-      this.error = error;
-   }
-
-   public NavigationError getError()
-   {
-      return error;
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceException.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceException.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceException.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceException.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class NavigationServiceException extends RuntimeException
+{
+
+   /** . */
+   private final NavigationError error;
+
+   public NavigationServiceException(NavigationError error)
+   {
+      super(error.toString());
+      this.error = error;
+   }
+
+   public NavigationServiceException(NavigationError error, String message)
+   {
+      super(message);
+
+      //
+      this.error = error;
+   }
+
+   public NavigationServiceException(NavigationError error, String message, Throwable cause)
+   {
+      super(message, cause);
+
+      //
+      this.error = error;
+   }
+
+   public NavigationServiceException(NavigationError error, Throwable cause)
+   {
+      super(cause);
+
+      //
+      this.error = error;
+   }
+
+   public NavigationError getError()
+   {
+      return error;
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceImpl.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceImpl.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceImpl.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,740 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.mop.Described;
-import org.exoplatform.portal.mop.SiteKey;
-import org.exoplatform.portal.mop.Visible;
-import org.exoplatform.portal.pom.config.POMSession;
-import org.exoplatform.portal.pom.config.POMSessionManager;
-import org.exoplatform.portal.pom.data.MappedAttributes;
-import static org.exoplatform.portal.mop.navigation.Utils.*;
-import static org.exoplatform.portal.pom.config.Utils.split;
-
-import org.exoplatform.portal.pom.data.Mapper;
-import org.gatein.common.logging.Logger;
-import org.gatein.common.logging.LoggerFactory;
-import org.gatein.mop.api.Attributes;
-import org.gatein.mop.api.workspace.Navigation;
-import org.gatein.mop.api.workspace.ObjectType;
-import org.gatein.mop.api.workspace.Site;
-import org.gatein.mop.api.workspace.Workspace;
-import org.gatein.mop.api.workspace.link.PageLink;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class NavigationServiceImpl implements NavigationService
-{
-
-   /** . */
-   final POMSessionManager manager;
-
-   /** . */
-   private final DataCache dataCache;
-
-   /** . */
-   final Logger log = LoggerFactory.getLogger(NavigationServiceImpl.class);
-
-   public NavigationServiceImpl(POMSessionManager manager) throws NullPointerException
-   {
-      this(manager, new SimpleDataCache());
-   }
-
-   public NavigationServiceImpl(POMSessionManager manager, DataCache dataCache) throws NullPointerException
-   {
-      if (manager == null)
-      {
-         throw new NullPointerException("No null pom session manager allowed");
-      }
-      if (dataCache == null)
-      {
-         throw new NullPointerException("No null data cache allowed");
-      }
-      this.manager = manager;
-      this.dataCache = dataCache;
-   }
-
-   public NavigationContext loadNavigation(SiteKey key)
-   {
-      if (key == null)
-      {
-         throw new NullPointerException();
-      }
-
-      //
-      POMSession session = manager.getSession();
-      NavigationData data = dataCache.getNavigationData(session, key);
-      return data != null && data != NavigationData.EMPTY ? new NavigationContext(data) : null;
-   }
-
-   public void saveNavigation(NavigationContext navigation) throws NullPointerException, NavigationServiceException
-   {
-      if (navigation == null)
-      {
-         throw new NullPointerException();
-      }
-
-      //
-      POMSession session = manager.getSession();
-      ObjectType<Site> objectType = objectType(navigation.key.getType());
-      Workspace workspace = session.getWorkspace();
-      Site site = workspace.getSite(objectType, navigation.key.getName());
-
-      //
-      if (site == null)
-      {
-         throw new NavigationServiceException(NavigationError.NAVIGATION_NO_SITE);
-      }
-
-      //
-      Navigation rootNode = site.getRootNavigation();
-
-      //
-      Navigation defaultNode = rootNode.getChild("default");
-      if (defaultNode == null)
-      {
-         defaultNode = rootNode.addChild("default");
-      }
-
-      //
-      NavigationState state = navigation.state;
-      if (state != null)
-      {
-         Integer priority = state.getPriority();
-         defaultNode.getAttributes().setValue(MappedAttributes.PRIORITY, priority);
-      }
-
-      //
-      dataCache.removeNavigationData(session, navigation.key);
-
-      // Update state
-      navigation.data = dataCache.getNavigationData(session, navigation.key);
-      navigation.state = null;
-   }
-
-   public boolean destroyNavigation(NavigationContext navigation) throws NullPointerException, NavigationServiceException
-   {
-      if (navigation == null)
-      {
-         throw new NullPointerException("No null navigation argument");
-      }
-      if (navigation.data == null)
-      {
-         throw new IllegalArgumentException("Already removed");
-      }
-
-      //
-      POMSession session = manager.getSession();
-      ObjectType<Site> objectType = objectType(navigation.key.getType());
-      Workspace workspace = session.getWorkspace();
-      Site site = workspace.getSite(objectType, navigation.key.getName());
-
-      //
-      if (site == null)
-      {
-         throw new NavigationServiceException(NavigationError.NAVIGATION_NO_SITE);
-      }
-
-      //
-      Navigation rootNode = site.getRootNavigation();
-      Navigation defaultNode = rootNode.getChild("default");
-
-      //
-      if (defaultNode != null)
-      {
-         // Invalidate cache
-         dataCache.removeNavigation(navigation.key);
-         String rootId = navigation.data.rootId;
-         if (rootId != null)
-         {
-            dataCache.removeNodes(Collections.singleton(rootId));
-         }
-
-         // Destroy nav
-         defaultNode.destroy();
-
-         // Update state
-         navigation.data = null;
-
-         //
-         return true;
-      }
-      else
-      {
-         return false;
-      }
-   }
-
-   public <N> NodeContext<N> loadNode(NodeModel<N> model, NavigationContext navigation, Scope scope, NodeChangeListener<NodeContext<N>> listener)
-   {
-      if (model == null)
-      {
-         throw new NullPointerException();
-      }
-      if (navigation == null)
-      {
-         throw new NullPointerException();
-      }
-      if (scope == null)
-      {
-         throw new NullPointerException();
-      }
-      String nodeId = navigation.data.rootId;
-      if (navigation.data.rootId != null)
-      {
-         POMSession session = manager.getSession();
-         NodeData data = dataCache.getNodeData(session, nodeId);
-         if (data != null)
-         {
-            NodeContext<N> context = new NodeContext<N>(model, data);
-            updateNode(context, scope, listener);
-            return context;
-         }
-         else
-         {
-            return null;
-         }
-      }
-      else
-      {
-         return null;
-      }
-   }
-
-   public <N> void updateNode(NodeContext<N> root, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, IllegalArgumentException, NavigationServiceException
-   {
-
-      Scope.Visitor visitor;
-      if (scope != null)
-      {
-         visitor = new FederatingVisitor<N>(root.tree, root, scope);
-      }
-      else
-      {
-         visitor = root.tree;
-      }
-
-      //
-      updateTree(root.tree, visitor, listener);
-   }
-
-   public <N> void saveNode(NodeContext<N> context, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException
-   {
-      saveTree(context.tree, listener);
-   }
-
-
-   public <N> void rebaseNode(NodeContext<N> context, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NavigationServiceException
-   {
-      Scope.Visitor visitor;
-      if (scope != null)
-      {
-         visitor = new FederatingVisitor<N>(context.tree.origin(), context, scope);
-      }
-      else
-      {
-         visitor = context.tree.origin();
-      }
-
-      //
-      rebaseTree(context.tree, visitor, listener);
-   }
-
-   private <N> void updateTree(TreeContext<N> tree, Scope.Visitor visitor, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, IllegalArgumentException, NavigationServiceException
-   {
-      if (tree.hasChanges())
-      {
-         throw new IllegalArgumentException("For now we don't accept to update a context that has pending changes");
-      }
-
-      //
-      POMSession session = manager.getSession();
-      NodeData data = dataCache.getNodeData(session, tree.root.data.id);
-      if (data == null)
-      {
-         throw new NavigationServiceException(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE);
-      }
-
-      // Switch to edit mode
-      tree.editMode = true;
-
-      // Apply diff changes to the model
-      try
-      {
-
-         TreeUpdate.perform(
-            tree,
-            NodeContextUpdateAdapter.<N>create(),
-            data,
-            NodeDataUpdateAdapter.create(dataCache, session),
-            listener,
-            visitor);
-      }
-      finally
-      {
-         // Disable edit mode
-         tree.editMode = false;
-      }
-   }
-
-   public void clearCache()
-   {
-      dataCache.clear();
-   }
-
-   private <N> void saveTree(TreeContext<N> tree, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException
-   {
-      POMSession session = manager.getSession();
-
-      //
-      NodeData data = dataCache.getNodeData(session, tree.root.data.id);
-      if (data == null)
-      {
-         throw new NavigationServiceException(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE);
-      }
-
-      // Attempt to rebase
-      TreeContext<N> rebased = rebase(tree, tree.origin());
-
-      //
-      NavigationPersister<N> persister = new NavigationPersister<N>(session);
-
-      //
-      NodeChangeQueue<NodeContext<N>> changes = rebased.getChanges();
-      if (changes != null)
-      {
-         changes.broadcast(persister);
-
-         // Update the tree handles to the persistent values
-         for (Map.Entry<String, String> entry : persister.toPersist.entrySet())
-         {
-            NodeContext<N> a = tree.getNode(entry.getKey());
-            a.handle = entry.getValue();
-         }
-
-         // Update data
-         for (String ddd : persister.toUpdate)
-         {
-            NodeContext<N> a = tree.getNode(ddd);
-            a.data = new NodeData(a);
-            a.name =  null;
-            a.state = null;
-         }
-
-         // Clear changes
-         changes.clear();
-         tree.getChanges().clear();
-      }
-
-      // Update
-      TreeUpdate.perform(
-         tree,
-         NodeContextUpdateAdapter.<N>create(),
-         rebased.root,
-         NodeContextUpdateAdapter.<N>create(),
-         listener,
-         rebased);
-
-      //
-      dataCache.removeNodeData(session, persister.toEvict);
-   }
-
-   private <N> void rebaseTree(TreeContext<N> tree, Scope.Visitor visitor, NodeChangeListener<NodeContext<N>> listener) throws NavigationServiceException
-   {
-      if (!tree.hasChanges())
-      {
-         updateTree(tree, visitor, listener);
-      }
-      else
-      {
-         TreeContext<N> rebased = rebase(tree, visitor);
-
-         //
-         TreeUpdate.perform(
-            tree,
-            NodeContextUpdateAdapter.<N>create(),
-            rebased.root,
-            NodeContextUpdateAdapter.<N>create(),
-            listener,
-            rebased);
-      }
-   }
-
-   private <N> TreeContext<N> rebase(TreeContext<N> tree, Scope.Visitor visitor) throws NavigationServiceException
-   {
-      POMSession session = manager.getSession();
-      NodeData data = dataCache.getNodeData(session, tree.root.getId());
-      if (data == null)
-      {
-         throw new NavigationServiceException(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE);
-      }
-
-      //
-      TreeContext<N> rebased = new NodeContext<N>(tree.model, data).tree;
-
-      //
-      TreeUpdate.perform(
-         rebased,
-         NodeContextUpdateAdapter.<N>create(),
-         data,
-         NodeDataUpdateAdapter.create(dataCache, session),
-         null,
-         visitor);
-
-      //
-      NodeChangeQueue<NodeContext<N>> changes = tree.getChanges();
-
-      //
-      NodeChangeListener<NodeContext<N>> merger = new TreeMerge<N>(rebased, rebased);
-
-      //
-      if (changes != null)
-      {
-         changes.broadcast(merger);
-      }
-
-      //
-      return rebased;
-   }
-
-   private static class NodeContextUpdateAdapter<N> implements TreeUpdateAdapter<NodeContext<N>>
-   {
-
-      /** . */
-      private static final NodeContextUpdateAdapter<?> _instance = new NodeContextUpdateAdapter();
-
-      static <N> NodeContextUpdateAdapter<N> create()
-      {
-         @SuppressWarnings("unchecked")
-         NodeContextUpdateAdapter<N> instance = (NodeContextUpdateAdapter<N>)_instance;
-         return instance;
-      }
-
-      public String getHandle(NodeContext<N> node)
-      {
-         return node.handle;
-      }
-
-      public String[] getChildren(NodeContext<N> node)
-      {
-         if (node.getFirst() != null)
-         {
-            ArrayList<String> tmp = new ArrayList<String>();
-            for (NodeContext<N> current = node.getFirst(); current != null; current = current.getNext())
-            {
-               tmp.add(current.handle);
-            }
-            return tmp.toArray(new String[tmp.size()]);
-         }
-         else
-         {
-            return Utils.EMPTY_STRING_ARRAY;
-         }
-      }
-
-      public NodeContext<N> getDescendant(NodeContext<N> node, String handle)
-      {
-         return node.getDescendant(handle);
-      }
-
-      public NodeData getData(NodeContext<N> node)
-      {
-         return node.data;
-      }
-
-      public NodeState getState(NodeContext<N> node)
-      {
-         return node.state;
-      }
-
-      public String getName(NodeContext<N> node)
-      {
-         return node.name;
-      }
-   }
-
-   private static class NodeDataUpdateAdapter implements TreeUpdateAdapter<NodeData>
-   {
-
-      static NodeDataUpdateAdapter create(DataCache dataCache, POMSession session)
-      {
-         return new NodeDataUpdateAdapter(dataCache, session);
-      }
-
-      /** . */
-      private final DataCache dataCache;
-
-      /** . */
-      private final POMSession session;
-
-      private NodeDataUpdateAdapter(DataCache dataCache, POMSession session)
-      {
-         this.dataCache = dataCache;
-         this.session = session;
-      }
-
-      public String getHandle(NodeData node)
-      {
-         return node.id;
-      }
-
-      public String[] getChildren(NodeData node)
-      {
-         return node.children;
-      }
-
-      public NodeData getDescendant(NodeData node, String handle)
-      {
-         NodeData data = dataCache.getNodeData(session, handle);
-         NodeData current = data;
-         while (current != null)
-         {
-            if (node.id.equals(current.id))
-            {
-               return data;
-            }
-            else
-            {
-               if (current.parentId != null)
-               {
-                  current = dataCache.getNodeData(session, current.parentId);
-               }
-               else
-               {
-                  current = null;
-               }
-            }
-         }
-         return null;
-      }
-
-      public NodeData getData(NodeData node)
-      {
-         return node;
-      }
-
-      public NodeState getState(NodeData node)
-      {
-         return null;
-      }
-
-      public String getName(NodeData node)
-      {
-         return null;
-      }
-   }
-
-   private static class NavigationPersister<N> extends NodeChangeListener.Base<NodeContext<N>>
-   {
-
-      /** The persisted handles to assign. */
-      private final Map<String, String> toPersist;
-
-      /** The handles to update. */
-      private final Set<String> toUpdate;
-
-      /** The handles to evict. */
-      private final Set<String> toEvict;
-
-      /** . */
-      private final POMSession session;
-
-      private NavigationPersister(POMSession session)
-      {
-         this.toPersist = new HashMap<String, String>();
-         this.toUpdate = new HashSet<String>();
-         this.session = session;
-         this.toEvict = new HashSet<String>();
-      }
-
-      @Override
-      public void onCreate(NodeContext<N> target, NodeContext<N> parent, NodeContext<N> previous, String name) throws NavigationServiceException
-      {
-         Navigation parentNav = session.findObjectById(ObjectType.NAVIGATION, parent.data.id);
-         toEvict.add(parentNav.getObjectId());
-         int index = 0;
-         if (previous != null)
-         {
-            Navigation previousNav = session.findObjectById(ObjectType.NAVIGATION, previous.data.id);
-            index = previousNav.getIndex() + 1;
-         }
-
-         //
-         Navigation sourceNav = parentNav.addChild(index, name);
-
-         //
-         parent.data = new NodeData(parentNav);
-
-         // Save the handle
-         toPersist.put(target.handle, sourceNav.getObjectId());
-
-         //
-         target.data = new NodeData(sourceNav);
-         target.handle = target.data.id;
-         target.name = null;
-         target.state = null;
-
-         //
-         toUpdate.add(parent.handle);
-         toUpdate.add(target.handle);
-      }
-      @Override
-      public void onDestroy(NodeContext<N> target, NodeContext<N> parent)
-      {
-         Navigation parentNav = session.findObjectById(ObjectType.NAVIGATION, parent.data.id);
-         Navigation sourceNav = session.findObjectById(ObjectType.NAVIGATION, target.data.id);
-
-         //
-         String objectId = sourceNav.getObjectId();
-
-         //
-         toEvict.add(objectId);
-         toEvict.add(parentNav.getObjectId());
-         sourceNav.destroy();
-
-         //
-         parent.data = new NodeData(parentNav);
-
-         //
-         toUpdate.add(parent.handle);
-
-         //
-         if (toPersist.values().contains(objectId))
-         {
-            toPersist.values().remove(objectId);
-         }
-         toUpdate.remove(objectId);
-      }
-      @Override
-      public void onUpdate(NodeContext<N> source, NodeState state) throws NavigationServiceException
-      {
-         Navigation sourceNav = session.findObjectById(ObjectType.NAVIGATION, source.data.id);
-
-         //
-         toEvict.add(sourceNav.getObjectId());
-         Workspace workspace = sourceNav.getSite().getWorkspace();
-         String reference = state.getPageRef();
-         if (reference != null)
-         {
-            String[] pageChunks = split("::", reference);
-            ObjectType<? extends Site> siteType = Mapper.parseSiteType(pageChunks[0]);
-            Site site = workspace.getSite(siteType, pageChunks[1]);
-            org.gatein.mop.api.workspace.Page target = site.getRootPage().getChild("pages").getChild(pageChunks[2]);
-            PageLink link = sourceNav.linkTo(ObjectType.PAGE_LINK);
-            link.setPage(target);
-         }
-         else
-         {
-            PageLink link = sourceNav.linkTo(ObjectType.PAGE_LINK);
-            link.setPage(null);
-         }
-
-         //
-         Described described = sourceNav.adapt(Described.class);
-         described.setName(state.getLabel());
-
-         //
-         Visible visible = sourceNav.adapt(Visible.class);
-         visible.setVisibility(state.getVisibility());
-
-         //
-         visible.setStartPublicationDate(state.getStartPublicationDate());
-         visible.setEndPublicationDate(state.getEndPublicationDate());
-
-         //
-         Attributes attrs = sourceNav.getAttributes();
-         attrs.setValue(MappedAttributes.ICON, state.getIcon());
-
-         //
-         source.data = new NodeData(sourceNav);
-         source.state = null;
-
-         //
-         toUpdate.add(source.handle);
-      }
-      @Override
-      public void onMove(NodeContext<N> target, NodeContext<N> from, NodeContext<N> to, NodeContext<N> previous) throws NavigationServiceException
-      {
-         Navigation sourceNav = session.findObjectById(ObjectType.NAVIGATION, target.data.id);
-         Navigation fromNav = session.findObjectById(ObjectType.NAVIGATION, from.data.id);
-         Navigation toNav = session.findObjectById(ObjectType.NAVIGATION, to.data.id);
-
-         //
-         toEvict.add(sourceNav.getObjectId());
-         toEvict.add(fromNav.getObjectId());
-         toEvict.add(toNav.getObjectId());
-         int index;
-         if (previous != null)
-         {
-            Navigation previousNav = session.findObjectById(ObjectType.NAVIGATION, previous.data.id);
-            index = previousNav.getIndex() + 1;
-         }
-         else
-         {
-            index = 0;
-         }
-         toNav.getChildren().add(index, sourceNav);
-
-         //
-         from.data = new NodeData(fromNav);
-
-         //
-         to.data = new NodeData(toNav);
-
-         //
-         target.data = new NodeData(sourceNav);
-
-         //
-         toUpdate.add(target.handle);
-         toUpdate.add(from.handle);
-         toUpdate.add(to.handle);
-      }
-      public void onRename(NodeContext<N> target, NodeContext<N> parent, String name) throws NavigationServiceException
-      {
-         Navigation sourceNav = session.findObjectById(ObjectType.NAVIGATION, target.data.id);
-         Navigation parentNav = session.findObjectById(ObjectType.NAVIGATION, parent.data.id);
-
-         //
-         toEvict.add(sourceNav.getObjectId());
-         toEvict.add(parentNav.getObjectId());
-         sourceNav.setName(name);
-
-         //
-         target.data = new NodeData(sourceNav);
-         target.name = null;
-
-         //
-         parent.data = new NodeData(parentNav);
-
-         //
-         toUpdate.add(parent.handle);
-         toUpdate.add(target.handle);
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceImpl.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceImpl.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceImpl.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceImpl.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,740 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.mop.Described;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.Visible;
+import org.exoplatform.portal.pom.config.POMSession;
+import org.exoplatform.portal.pom.config.POMSessionManager;
+import org.exoplatform.portal.pom.data.MappedAttributes;
+import static org.exoplatform.portal.mop.navigation.Utils.*;
+import static org.exoplatform.portal.pom.config.Utils.split;
+
+import org.exoplatform.portal.pom.data.Mapper;
+import org.gatein.common.logging.Logger;
+import org.gatein.common.logging.LoggerFactory;
+import org.gatein.mop.api.Attributes;
+import org.gatein.mop.api.workspace.Navigation;
+import org.gatein.mop.api.workspace.ObjectType;
+import org.gatein.mop.api.workspace.Site;
+import org.gatein.mop.api.workspace.Workspace;
+import org.gatein.mop.api.workspace.link.PageLink;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class NavigationServiceImpl implements NavigationService
+{
+
+   /** . */
+   final POMSessionManager manager;
+
+   /** . */
+   private final DataCache dataCache;
+
+   /** . */
+   final Logger log = LoggerFactory.getLogger(NavigationServiceImpl.class);
+
+   public NavigationServiceImpl(POMSessionManager manager) throws NullPointerException
+   {
+      this(manager, new SimpleDataCache());
+   }
+
+   public NavigationServiceImpl(POMSessionManager manager, DataCache dataCache) throws NullPointerException
+   {
+      if (manager == null)
+      {
+         throw new NullPointerException("No null pom session manager allowed");
+      }
+      if (dataCache == null)
+      {
+         throw new NullPointerException("No null data cache allowed");
+      }
+      this.manager = manager;
+      this.dataCache = dataCache;
+   }
+
+   public NavigationContext loadNavigation(SiteKey key)
+   {
+      if (key == null)
+      {
+         throw new NullPointerException();
+      }
+
+      //
+      POMSession session = manager.getSession();
+      NavigationData data = dataCache.getNavigationData(session, key);
+      return data != null && data != NavigationData.EMPTY ? new NavigationContext(data) : null;
+   }
+
+   public void saveNavigation(NavigationContext navigation) throws NullPointerException, NavigationServiceException
+   {
+      if (navigation == null)
+      {
+         throw new NullPointerException();
+      }
+
+      //
+      POMSession session = manager.getSession();
+      ObjectType<Site> objectType = objectType(navigation.key.getType());
+      Workspace workspace = session.getWorkspace();
+      Site site = workspace.getSite(objectType, navigation.key.getName());
+
+      //
+      if (site == null)
+      {
+         throw new NavigationServiceException(NavigationError.NAVIGATION_NO_SITE);
+      }
+
+      //
+      Navigation rootNode = site.getRootNavigation();
+
+      //
+      Navigation defaultNode = rootNode.getChild("default");
+      if (defaultNode == null)
+      {
+         defaultNode = rootNode.addChild("default");
+      }
+
+      //
+      NavigationState state = navigation.state;
+      if (state != null)
+      {
+         Integer priority = state.getPriority();
+         defaultNode.getAttributes().setValue(MappedAttributes.PRIORITY, priority);
+      }
+
+      //
+      dataCache.removeNavigationData(session, navigation.key);
+
+      // Update state
+      navigation.data = dataCache.getNavigationData(session, navigation.key);
+      navigation.state = null;
+   }
+
+   public boolean destroyNavigation(NavigationContext navigation) throws NullPointerException, NavigationServiceException
+   {
+      if (navigation == null)
+      {
+         throw new NullPointerException("No null navigation argument");
+      }
+      if (navigation.data == null)
+      {
+         throw new IllegalArgumentException("Already removed");
+      }
+
+      //
+      POMSession session = manager.getSession();
+      ObjectType<Site> objectType = objectType(navigation.key.getType());
+      Workspace workspace = session.getWorkspace();
+      Site site = workspace.getSite(objectType, navigation.key.getName());
+
+      //
+      if (site == null)
+      {
+         throw new NavigationServiceException(NavigationError.NAVIGATION_NO_SITE);
+      }
+
+      //
+      Navigation rootNode = site.getRootNavigation();
+      Navigation defaultNode = rootNode.getChild("default");
+
+      //
+      if (defaultNode != null)
+      {
+         // Invalidate cache
+         dataCache.removeNavigation(navigation.key);
+         String rootId = navigation.data.rootId;
+         if (rootId != null)
+         {
+            dataCache.removeNodes(Collections.singleton(rootId));
+         }
+
+         // Destroy nav
+         defaultNode.destroy();
+
+         // Update state
+         navigation.data = null;
+
+         //
+         return true;
+      }
+      else
+      {
+         return false;
+      }
+   }
+
+   public <N> NodeContext<N> loadNode(NodeModel<N> model, NavigationContext navigation, Scope scope, NodeChangeListener<NodeContext<N>> listener)
+   {
+      if (model == null)
+      {
+         throw new NullPointerException();
+      }
+      if (navigation == null)
+      {
+         throw new NullPointerException();
+      }
+      if (scope == null)
+      {
+         throw new NullPointerException();
+      }
+      String nodeId = navigation.data.rootId;
+      if (navigation.data.rootId != null)
+      {
+         POMSession session = manager.getSession();
+         NodeData data = dataCache.getNodeData(session, nodeId);
+         if (data != null)
+         {
+            NodeContext<N> context = new NodeContext<N>(model, data);
+            updateNode(context, scope, listener);
+            return context;
+         }
+         else
+         {
+            return null;
+         }
+      }
+      else
+      {
+         return null;
+      }
+   }
+
+   public <N> void updateNode(NodeContext<N> root, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, IllegalArgumentException, NavigationServiceException
+   {
+
+      Scope.Visitor visitor;
+      if (scope != null)
+      {
+         visitor = new FederatingVisitor<N>(root.tree, root, scope);
+      }
+      else
+      {
+         visitor = root.tree;
+      }
+
+      //
+      updateTree(root.tree, visitor, listener);
+   }
+
+   public <N> void saveNode(NodeContext<N> context, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException
+   {
+      saveTree(context.tree, listener);
+   }
+
+
+   public <N> void rebaseNode(NodeContext<N> context, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NavigationServiceException
+   {
+      Scope.Visitor visitor;
+      if (scope != null)
+      {
+         visitor = new FederatingVisitor<N>(context.tree.origin(), context, scope);
+      }
+      else
+      {
+         visitor = context.tree.origin();
+      }
+
+      //
+      rebaseTree(context.tree, visitor, listener);
+   }
+
+   private <N> void updateTree(TreeContext<N> tree, Scope.Visitor visitor, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, IllegalArgumentException, NavigationServiceException
+   {
+      if (tree.hasChanges())
+      {
+         throw new IllegalArgumentException("For now we don't accept to update a context that has pending changes");
+      }
+
+      //
+      POMSession session = manager.getSession();
+      NodeData data = dataCache.getNodeData(session, tree.root.data.id);
+      if (data == null)
+      {
+         throw new NavigationServiceException(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE);
+      }
+
+      // Switch to edit mode
+      tree.editMode = true;
+
+      // Apply diff changes to the model
+      try
+      {
+
+         TreeUpdate.perform(
+            tree,
+            NodeContextUpdateAdapter.<N>create(),
+            data,
+            NodeDataUpdateAdapter.create(dataCache, session),
+            listener,
+            visitor);
+      }
+      finally
+      {
+         // Disable edit mode
+         tree.editMode = false;
+      }
+   }
+
+   public void clearCache()
+   {
+      dataCache.clear();
+   }
+
+   private <N> void saveTree(TreeContext<N> tree, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException
+   {
+      POMSession session = manager.getSession();
+
+      //
+      NodeData data = dataCache.getNodeData(session, tree.root.data.id);
+      if (data == null)
+      {
+         throw new NavigationServiceException(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE);
+      }
+
+      // Attempt to rebase
+      TreeContext<N> rebased = rebase(tree, tree.origin());
+
+      //
+      NavigationPersister<N> persister = new NavigationPersister<N>(session);
+
+      //
+      NodeChangeQueue<NodeContext<N>> changes = rebased.getChanges();
+      if (changes != null)
+      {
+         changes.broadcast(persister);
+
+         // Update the tree handles to the persistent values
+         for (Map.Entry<String, String> entry : persister.toPersist.entrySet())
+         {
+            NodeContext<N> a = tree.getNode(entry.getKey());
+            a.handle = entry.getValue();
+         }
+
+         // Update data
+         for (String ddd : persister.toUpdate)
+         {
+            NodeContext<N> a = tree.getNode(ddd);
+            a.data = new NodeData(a);
+            a.name =  null;
+            a.state = null;
+         }
+
+         // Clear changes
+         changes.clear();
+         tree.getChanges().clear();
+      }
+
+      // Update
+      TreeUpdate.perform(
+         tree,
+         NodeContextUpdateAdapter.<N>create(),
+         rebased.root,
+         NodeContextUpdateAdapter.<N>create(),
+         listener,
+         rebased);
+
+      //
+      dataCache.removeNodeData(session, persister.toEvict);
+   }
+
+   private <N> void rebaseTree(TreeContext<N> tree, Scope.Visitor visitor, NodeChangeListener<NodeContext<N>> listener) throws NavigationServiceException
+   {
+      if (!tree.hasChanges())
+      {
+         updateTree(tree, visitor, listener);
+      }
+      else
+      {
+         TreeContext<N> rebased = rebase(tree, visitor);
+
+         //
+         TreeUpdate.perform(
+            tree,
+            NodeContextUpdateAdapter.<N>create(),
+            rebased.root,
+            NodeContextUpdateAdapter.<N>create(),
+            listener,
+            rebased);
+      }
+   }
+
+   private <N> TreeContext<N> rebase(TreeContext<N> tree, Scope.Visitor visitor) throws NavigationServiceException
+   {
+      POMSession session = manager.getSession();
+      NodeData data = dataCache.getNodeData(session, tree.root.getId());
+      if (data == null)
+      {
+         throw new NavigationServiceException(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE);
+      }
+
+      //
+      TreeContext<N> rebased = new NodeContext<N>(tree.model, data).tree;
+
+      //
+      TreeUpdate.perform(
+         rebased,
+         NodeContextUpdateAdapter.<N>create(),
+         data,
+         NodeDataUpdateAdapter.create(dataCache, session),
+         null,
+         visitor);
+
+      //
+      NodeChangeQueue<NodeContext<N>> changes = tree.getChanges();
+
+      //
+      NodeChangeListener<NodeContext<N>> merger = new TreeMerge<N>(rebased, rebased);
+
+      //
+      if (changes != null)
+      {
+         changes.broadcast(merger);
+      }
+
+      //
+      return rebased;
+   }
+
+   private static class NodeContextUpdateAdapter<N> implements TreeUpdateAdapter<NodeContext<N>>
+   {
+
+      /** . */
+      private static final NodeContextUpdateAdapter<?> _instance = new NodeContextUpdateAdapter();
+
+      static <N> NodeContextUpdateAdapter<N> create()
+      {
+         @SuppressWarnings("unchecked")
+         NodeContextUpdateAdapter<N> instance = (NodeContextUpdateAdapter<N>)_instance;
+         return instance;
+      }
+
+      public String getHandle(NodeContext<N> node)
+      {
+         return node.handle;
+      }
+
+      public String[] getChildren(NodeContext<N> node)
+      {
+         if (node.getFirst() != null)
+         {
+            ArrayList<String> tmp = new ArrayList<String>();
+            for (NodeContext<N> current = node.getFirst(); current != null; current = current.getNext())
+            {
+               tmp.add(current.handle);
+            }
+            return tmp.toArray(new String[tmp.size()]);
+         }
+         else
+         {
+            return Utils.EMPTY_STRING_ARRAY;
+         }
+      }
+
+      public NodeContext<N> getDescendant(NodeContext<N> node, String handle)
+      {
+         return node.getDescendant(handle);
+      }
+
+      public NodeData getData(NodeContext<N> node)
+      {
+         return node.data;
+      }
+
+      public NodeState getState(NodeContext<N> node)
+      {
+         return node.state;
+      }
+
+      public String getName(NodeContext<N> node)
+      {
+         return node.name;
+      }
+   }
+
+   private static class NodeDataUpdateAdapter implements TreeUpdateAdapter<NodeData>
+   {
+
+      static NodeDataUpdateAdapter create(DataCache dataCache, POMSession session)
+      {
+         return new NodeDataUpdateAdapter(dataCache, session);
+      }
+
+      /** . */
+      private final DataCache dataCache;
+
+      /** . */
+      private final POMSession session;
+
+      private NodeDataUpdateAdapter(DataCache dataCache, POMSession session)
+      {
+         this.dataCache = dataCache;
+         this.session = session;
+      }
+
+      public String getHandle(NodeData node)
+      {
+         return node.id;
+      }
+
+      public String[] getChildren(NodeData node)
+      {
+         return node.children;
+      }
+
+      public NodeData getDescendant(NodeData node, String handle)
+      {
+         NodeData data = dataCache.getNodeData(session, handle);
+         NodeData current = data;
+         while (current != null)
+         {
+            if (node.id.equals(current.id))
+            {
+               return data;
+            }
+            else
+            {
+               if (current.parentId != null)
+               {
+                  current = dataCache.getNodeData(session, current.parentId);
+               }
+               else
+               {
+                  current = null;
+               }
+            }
+         }
+         return null;
+      }
+
+      public NodeData getData(NodeData node)
+      {
+         return node;
+      }
+
+      public NodeState getState(NodeData node)
+      {
+         return null;
+      }
+
+      public String getName(NodeData node)
+      {
+         return null;
+      }
+   }
+
+   private static class NavigationPersister<N> extends NodeChangeListener.Base<NodeContext<N>>
+   {
+
+      /** The persisted handles to assign. */
+      private final Map<String, String> toPersist;
+
+      /** The handles to update. */
+      private final Set<String> toUpdate;
+
+      /** The handles to evict. */
+      private final Set<String> toEvict;
+
+      /** . */
+      private final POMSession session;
+
+      private NavigationPersister(POMSession session)
+      {
+         this.toPersist = new HashMap<String, String>();
+         this.toUpdate = new HashSet<String>();
+         this.session = session;
+         this.toEvict = new HashSet<String>();
+      }
+
+      @Override
+      public void onCreate(NodeContext<N> target, NodeContext<N> parent, NodeContext<N> previous, String name) throws NavigationServiceException
+      {
+         Navigation parentNav = session.findObjectById(ObjectType.NAVIGATION, parent.data.id);
+         toEvict.add(parentNav.getObjectId());
+         int index = 0;
+         if (previous != null)
+         {
+            Navigation previousNav = session.findObjectById(ObjectType.NAVIGATION, previous.data.id);
+            index = previousNav.getIndex() + 1;
+         }
+
+         //
+         Navigation sourceNav = parentNav.addChild(index, name);
+
+         //
+         parent.data = new NodeData(parentNav);
+
+         // Save the handle
+         toPersist.put(target.handle, sourceNav.getObjectId());
+
+         //
+         target.data = new NodeData(sourceNav);
+         target.handle = target.data.id;
+         target.name = null;
+         target.state = null;
+
+         //
+         toUpdate.add(parent.handle);
+         toUpdate.add(target.handle);
+      }
+      @Override
+      public void onDestroy(NodeContext<N> target, NodeContext<N> parent)
+      {
+         Navigation parentNav = session.findObjectById(ObjectType.NAVIGATION, parent.data.id);
+         Navigation sourceNav = session.findObjectById(ObjectType.NAVIGATION, target.data.id);
+
+         //
+         String objectId = sourceNav.getObjectId();
+
+         //
+         toEvict.add(objectId);
+         toEvict.add(parentNav.getObjectId());
+         sourceNav.destroy();
+
+         //
+         parent.data = new NodeData(parentNav);
+
+         //
+         toUpdate.add(parent.handle);
+
+         //
+         if (toPersist.values().contains(objectId))
+         {
+            toPersist.values().remove(objectId);
+         }
+         toUpdate.remove(objectId);
+      }
+      @Override
+      public void onUpdate(NodeContext<N> source, NodeState state) throws NavigationServiceException
+      {
+         Navigation sourceNav = session.findObjectById(ObjectType.NAVIGATION, source.data.id);
+
+         //
+         toEvict.add(sourceNav.getObjectId());
+         Workspace workspace = sourceNav.getSite().getWorkspace();
+         String reference = state.getPageRef();
+         if (reference != null)
+         {
+            String[] pageChunks = split("::", reference);
+            ObjectType<? extends Site> siteType = Mapper.parseSiteType(pageChunks[0]);
+            Site site = workspace.getSite(siteType, pageChunks[1]);
+            org.gatein.mop.api.workspace.Page target = site.getRootPage().getChild("pages").getChild(pageChunks[2]);
+            PageLink link = sourceNav.linkTo(ObjectType.PAGE_LINK);
+            link.setPage(target);
+         }
+         else
+         {
+            PageLink link = sourceNav.linkTo(ObjectType.PAGE_LINK);
+            link.setPage(null);
+         }
+
+         //
+         Described described = sourceNav.adapt(Described.class);
+         described.setName(state.getLabel());
+
+         //
+         Visible visible = sourceNav.adapt(Visible.class);
+         visible.setVisibility(state.getVisibility());
+
+         //
+         visible.setStartPublicationDate(state.getStartPublicationDate());
+         visible.setEndPublicationDate(state.getEndPublicationDate());
+
+         //
+         Attributes attrs = sourceNav.getAttributes();
+         attrs.setValue(MappedAttributes.ICON, state.getIcon());
+
+         //
+         source.data = new NodeData(sourceNav);
+         source.state = null;
+
+         //
+         toUpdate.add(source.handle);
+      }
+      @Override
+      public void onMove(NodeContext<N> target, NodeContext<N> from, NodeContext<N> to, NodeContext<N> previous) throws NavigationServiceException
+      {
+         Navigation sourceNav = session.findObjectById(ObjectType.NAVIGATION, target.data.id);
+         Navigation fromNav = session.findObjectById(ObjectType.NAVIGATION, from.data.id);
+         Navigation toNav = session.findObjectById(ObjectType.NAVIGATION, to.data.id);
+
+         //
+         toEvict.add(sourceNav.getObjectId());
+         toEvict.add(fromNav.getObjectId());
+         toEvict.add(toNav.getObjectId());
+         int index;
+         if (previous != null)
+         {
+            Navigation previousNav = session.findObjectById(ObjectType.NAVIGATION, previous.data.id);
+            index = previousNav.getIndex() + 1;
+         }
+         else
+         {
+            index = 0;
+         }
+         toNav.getChildren().add(index, sourceNav);
+
+         //
+         from.data = new NodeData(fromNav);
+
+         //
+         to.data = new NodeData(toNav);
+
+         //
+         target.data = new NodeData(sourceNav);
+
+         //
+         toUpdate.add(target.handle);
+         toUpdate.add(from.handle);
+         toUpdate.add(to.handle);
+      }
+      public void onRename(NodeContext<N> target, NodeContext<N> parent, String name) throws NavigationServiceException
+      {
+         Navigation sourceNav = session.findObjectById(ObjectType.NAVIGATION, target.data.id);
+         Navigation parentNav = session.findObjectById(ObjectType.NAVIGATION, parent.data.id);
+
+         //
+         toEvict.add(sourceNav.getObjectId());
+         toEvict.add(parentNav.getObjectId());
+         sourceNav.setName(name);
+
+         //
+         target.data = new NodeData(sourceNav);
+         target.name = null;
+
+         //
+         parent.data = new NodeData(parentNav);
+
+         //
+         toUpdate.add(parent.handle);
+         toUpdate.add(target.handle);
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceWrapper.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceWrapper.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceWrapper.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,197 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.chromattic.api.UndeclaredRepositoryException;
-import org.exoplatform.portal.mop.EventType;
-import org.exoplatform.portal.mop.SiteKey;
-import static org.exoplatform.portal.mop.navigation.Utils.*;
-import org.exoplatform.portal.pom.config.POMSessionManager;
-import org.exoplatform.services.cache.CacheService;
-import org.exoplatform.services.jcr.RepositoryService;
-import org.exoplatform.services.jcr.core.ManageableRepository;
-import org.exoplatform.services.listener.ListenerService;
-import org.gatein.common.logging.Logger;
-import org.gatein.common.logging.LoggerFactory;
-import org.gatein.mop.api.workspace.ObjectType;
-import org.gatein.mop.api.workspace.Site;
-import org.picocontainer.Startable;
-
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class NavigationServiceWrapper implements NavigationService, Startable
-{
-
-   /** . */
-   private static final Logger log = LoggerFactory.getLogger(NavigationServiceWrapper.class);
-
-   /** . */
-   private final NavigationServiceImpl service;
-
-   /** . */
-   private ListenerService listenerService;
-
-   /** . */
-   private final POMSessionManager manager;
-
-   /** . */
-   private Session session;
-
-   /** . */
-   private final RepositoryService repositoryService;
-
-   /** . */
-   private final InvalidationBridge bridge;
-
-   public NavigationServiceWrapper(
-      RepositoryService repositoryService,
-      POMSessionManager manager,
-      ListenerService listenerService)
-   {
-      SimpleDataCache cache = new SimpleDataCache();
-
-      //
-      this.repositoryService = repositoryService;
-      this.manager = manager;
-      this.service = new NavigationServiceImpl(manager, cache);
-      this.listenerService = listenerService;
-      this.bridge = new InvalidationBridge(cache);
-   }
-
-   public NavigationServiceWrapper(
-      RepositoryService repositoryService,
-      POMSessionManager manager,
-      ListenerService listenerService,
-      CacheService cacheService)
-   {
-      ExoDataCache cache = new ExoDataCache(cacheService);
-
-      //
-      this.repositoryService = repositoryService;
-      this.manager = manager;
-      this.service = new NavigationServiceImpl(manager, cache);
-      this.listenerService = listenerService;
-      this.bridge = new InvalidationBridge(cache);
-   }
-
-   public NavigationContext loadNavigation(SiteKey key)
-   {
-      return service.loadNavigation(key);
-   }
-
-   public void saveNavigation(NavigationContext navigation) throws NullPointerException, NavigationServiceException
-   {
-      boolean created = navigation.data == null;
-
-      //
-      service.saveNavigation(navigation);
-
-      //
-      if (created)
-      {
-         notify(EventType.NAVIGATION_CREATED, navigation.key);
-      }
-      else
-      {
-         notify(EventType.NAVIGATION_UPDATED, navigation.key);
-      }
-   }
-
-   public boolean destroyNavigation(NavigationContext navigation) throws NullPointerException, NavigationServiceException
-   {
-      boolean destroyed = service.destroyNavigation(navigation);
-
-      //
-      if (destroyed)
-      {
-         notify(EventType.NAVIGATION_DESTROYED, navigation.key);
-      }
-
-      //
-      return destroyed;
-   }
-
-   public <N> NodeContext<N> loadNode(NodeModel<N> model, NavigationContext navigation, Scope scope, NodeChangeListener<NodeContext<N>> listener)
-   {
-      return service.loadNode(model, navigation, scope, listener);
-   }
-
-   public <N> void saveNode(NodeContext<N> context, NodeChangeListener<NodeContext<N>> listener) throws NavigationServiceException
-   {
-      service.saveNode(context, listener);
-      org.gatein.mop.api.workspace.Navigation nav = service.manager.getSession().findObjectById(ObjectType.NAVIGATION, context.data.id);
-      Site site = nav.getSite();
-      SiteKey key = new SiteKey(siteType(site.getObjectType()), site.getName());
-      notify(EventType.NAVIGATION_UPDATED, key);
-   }
-
-   public <N> void updateNode(NodeContext<N> context, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException
-   {
-      service.updateNode(context, scope, listener);
-   }
-
-   public <N> void rebaseNode(NodeContext<N> context, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException
-   {
-      service.rebaseNode(context, scope, listener);
-   }
-
-   private void notify(String name, SiteKey key)
-   {
-      try
-      {
-         listenerService.broadcast(name, this, key);
-      }
-      catch (Exception e)
-      {
-         log.error("Error when delivering notification " + name + " for navigation " + key, e);
-      }
-   }
-
-   public void start()
-   {
-      try
-      {
-         String workspaceName = manager.getLifeCycle().getWorkspaceName();
-         ManageableRepository repo = repositoryService.getCurrentRepository();
-         session = repo.getSystemSession(workspaceName);
-         bridge.start(session);
-      }
-      catch (RepositoryException e)
-      {
-         throw new UndeclaredRepositoryException(e);
-      }
-   }
-
-   public void stop()
-   {
-      bridge.stop();
-
-      //
-      if (session != null)
-      {
-         session.logout();
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceWrapper.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceWrapper.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceWrapper.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationServiceWrapper.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.chromattic.api.UndeclaredRepositoryException;
+import org.exoplatform.portal.mop.EventType;
+import org.exoplatform.portal.mop.SiteKey;
+import static org.exoplatform.portal.mop.navigation.Utils.*;
+import org.exoplatform.portal.pom.config.POMSessionManager;
+import org.exoplatform.services.cache.CacheService;
+import org.exoplatform.services.jcr.RepositoryService;
+import org.exoplatform.services.jcr.core.ManageableRepository;
+import org.exoplatform.services.listener.ListenerService;
+import org.gatein.common.logging.Logger;
+import org.gatein.common.logging.LoggerFactory;
+import org.gatein.mop.api.workspace.ObjectType;
+import org.gatein.mop.api.workspace.Site;
+import org.picocontainer.Startable;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class NavigationServiceWrapper implements NavigationService, Startable
+{
+
+   /** . */
+   private static final Logger log = LoggerFactory.getLogger(NavigationServiceWrapper.class);
+
+   /** . */
+   private final NavigationServiceImpl service;
+
+   /** . */
+   private ListenerService listenerService;
+
+   /** . */
+   private final POMSessionManager manager;
+
+   /** . */
+   private Session session;
+
+   /** . */
+   private final RepositoryService repositoryService;
+
+   /** . */
+   private final InvalidationBridge bridge;
+
+   public NavigationServiceWrapper(
+      RepositoryService repositoryService,
+      POMSessionManager manager,
+      ListenerService listenerService)
+   {
+      SimpleDataCache cache = new SimpleDataCache();
+
+      //
+      this.repositoryService = repositoryService;
+      this.manager = manager;
+      this.service = new NavigationServiceImpl(manager, cache);
+      this.listenerService = listenerService;
+      this.bridge = new InvalidationBridge(cache);
+   }
+
+   public NavigationServiceWrapper(
+      RepositoryService repositoryService,
+      POMSessionManager manager,
+      ListenerService listenerService,
+      CacheService cacheService)
+   {
+      ExoDataCache cache = new ExoDataCache(cacheService);
+
+      //
+      this.repositoryService = repositoryService;
+      this.manager = manager;
+      this.service = new NavigationServiceImpl(manager, cache);
+      this.listenerService = listenerService;
+      this.bridge = new InvalidationBridge(cache);
+   }
+
+   public NavigationContext loadNavigation(SiteKey key)
+   {
+      return service.loadNavigation(key);
+   }
+
+   public void saveNavigation(NavigationContext navigation) throws NullPointerException, NavigationServiceException
+   {
+      boolean created = navigation.data == null;
+
+      //
+      service.saveNavigation(navigation);
+
+      //
+      if (created)
+      {
+         notify(EventType.NAVIGATION_CREATED, navigation.key);
+      }
+      else
+      {
+         notify(EventType.NAVIGATION_UPDATED, navigation.key);
+      }
+   }
+
+   public boolean destroyNavigation(NavigationContext navigation) throws NullPointerException, NavigationServiceException
+   {
+      boolean destroyed = service.destroyNavigation(navigation);
+
+      //
+      if (destroyed)
+      {
+         notify(EventType.NAVIGATION_DESTROYED, navigation.key);
+      }
+
+      //
+      return destroyed;
+   }
+
+   public <N> NodeContext<N> loadNode(NodeModel<N> model, NavigationContext navigation, Scope scope, NodeChangeListener<NodeContext<N>> listener)
+   {
+      return service.loadNode(model, navigation, scope, listener);
+   }
+
+   public <N> void saveNode(NodeContext<N> context, NodeChangeListener<NodeContext<N>> listener) throws NavigationServiceException
+   {
+      service.saveNode(context, listener);
+      org.gatein.mop.api.workspace.Navigation nav = service.manager.getSession().findObjectById(ObjectType.NAVIGATION, context.data.id);
+      Site site = nav.getSite();
+      SiteKey key = new SiteKey(siteType(site.getObjectType()), site.getName());
+      notify(EventType.NAVIGATION_UPDATED, key);
+   }
+
+   public <N> void updateNode(NodeContext<N> context, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException
+   {
+      service.updateNode(context, scope, listener);
+   }
+
+   public <N> void rebaseNode(NodeContext<N> context, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException
+   {
+      service.rebaseNode(context, scope, listener);
+   }
+
+   private void notify(String name, SiteKey key)
+   {
+      try
+      {
+         listenerService.broadcast(name, this, key);
+      }
+      catch (Exception e)
+      {
+         log.error("Error when delivering notification " + name + " for navigation " + key, e);
+      }
+   }
+
+   public void start()
+   {
+      try
+      {
+         String workspaceName = manager.getLifeCycle().getWorkspaceName();
+         ManageableRepository repo = repositoryService.getCurrentRepository();
+         session = repo.getSystemSession(workspaceName);
+         bridge.start(session);
+      }
+      catch (RepositoryException e)
+      {
+         throw new UndeclaredRepositoryException(e);
+      }
+   }
+
+   public void stop()
+   {
+      bridge.stop();
+
+      //
+      if (session != null)
+      {
+         session.logout();
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationState.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationState.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationState.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import java.io.Serializable;
-
-/**
- * An immutable navigation state class.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class NavigationState implements Serializable
-{
-
-   /** . */
-   private final Integer priority;
-
-   public NavigationState(Integer priority)
-   {
-      this.priority = priority;
-   }
-
-   /**
-    * Returns the navigation priority.
-    *
-    * @return the navigation priority
-    */
-   public Integer getPriority()
-   {
-      return priority;
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationState.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationState.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationState.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NavigationState.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import java.io.Serializable;
+
+/**
+ * An immutable navigation state class.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class NavigationState implements Serializable
+{
+
+   /** . */
+   private final Integer priority;
+
+   public NavigationState(Integer priority)
+   {
+      this.priority = priority;
+   }
+
+   /**
+    * Returns the navigation priority.
+    *
+    * @return the navigation priority
+    */
+   public Integer getPriority()
+   {
+      return priority;
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChange.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChange.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChange.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,391 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-/**
- * Describe a change applied to a node.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public abstract class NodeChange<N>
-{
-
-   /** The target. */
-   final N target;
-
-   private NodeChange(N target)
-   {
-      if (target == null)
-      {
-         throw new NullPointerException("No null target accepted");
-      }
-
-      //
-      this.target = target;
-   }
-
-   public final N getTarget()
-   {
-      return target;
-   }
-
-   /**
-    * Dispatch the change to the proper listener method:
-    * <ul>
-    *    <li>{@link Created} dispatches to {@link NodeChangeListener#onCreate(Object, Object, Object, String)}</li>
-    *    <li>{@link Added} dispatches to {@link NodeChangeListener#onAdd(Object, Object, Object)}</li>
-    *    <li>{@link Destroyed} dispatches to {@link NodeChangeListener#onDestroy(Object, Object)}</li>
-    *    <li>{@link Moved} dispatches to {@link NodeChangeListener#onMove(Object, Object, Object, Object)}</li>
-    *    <li>{@link Removed} dispatches to {@link NodeChangeListener#onRemove(Object, Object)}</li>
-    *    <li>{@link Renamed} dispatches to {@link NodeChangeListener#onRename(Object, Object, String)}</li>
-    *    <li>{@link Updated} dispatches to {@link NodeChangeListener#onUpdate(Object, NodeState)}</li>
-    * </ul>
-    *
-    * @param listener the listener
-    */
-   protected abstract void dispatch(NodeChangeListener<N> listener);
-
-   public final static class Destroyed<N> extends NodeChange<N>
-   {
-
-      /** . */
-      final N parent;
-
-      Destroyed(N parent, N node)
-      {
-         super(node);
-
-         //
-         if (parent == null)
-         {
-            throw new NullPointerException("No null parent accepted");
-         }
-
-         //
-         this.parent = parent;
-      }
-
-      public N getParent()
-      {
-         return parent;
-      }
-
-      @Override
-      protected void dispatch(NodeChangeListener<N> listener)
-      {
-         listener.onDestroy(target, parent);
-      }
-
-      @Override
-      public String toString()
-      {
-         return "NodeChange.Destroyed[target" + target + ",parent=" +  parent + "]";
-      }
-   }
-
-   public final static class Removed<N> extends NodeChange<N>
-   {
-
-      /** . */
-      final N parent;
-
-      Removed(N parent, N node)
-      {
-         super(node);
-
-         //
-         if (parent == null)
-         {
-            throw new NullPointerException("No null parent accepted");
-         }
-
-         //
-         this.parent = parent;
-      }
-
-      public N getParent()
-      {
-         return parent;
-      }
-
-      @Override
-      protected void dispatch(NodeChangeListener<N> listener)
-      {
-         listener.onRemove(target, parent);
-      }
-
-      @Override
-      public String toString()
-      {
-         return "NodeChange.Removed[target" + target + ",parent=" +  parent + "]";
-      }
-   }
-
-   public final static class Created<N> extends NodeChange<N>
-   {
-
-      /** . */
-      final N parent;
-
-      /** . */
-      final N previous;
-
-      /** . */
-      final String name;
-
-      Created(N parent, N previous, N node, String name) throws NullPointerException
-      {
-         super(node);
-
-         //
-         if (parent == null)
-         {
-            throw new NullPointerException("No null parent accepted");
-         }
-         if (name == null)
-         {
-            throw new NullPointerException("No null name accepted");
-         }
-
-         //
-         this.parent = parent;
-         this.previous = previous;
-         this.name = name;
-      }
-
-      public N getParent()
-      {
-         return parent;
-      }
-
-      public N getPrevious()
-      {
-         return previous;
-      }
-
-      public String getName()
-      {
-         return name;
-      }
-
-      @Override
-      protected void dispatch(NodeChangeListener<N> listener)
-      {
-         listener.onCreate(target, parent, previous, name);
-      }
-
-      @Override
-      public String toString()
-      {
-         return "NodeChange.Created[target" + target + ",previous" + previous + ",parent=" + parent + ",name=" + name + "]";
-      }
-   }
-
-   public final static class Added<N> extends NodeChange<N>
-   {
-
-      /** . */
-      final N parent;
-
-      /** . */
-      final N previous;
-
-      Added(N parent, N previous, N node)
-      {
-         super(node);
-
-         //
-         if (parent == null)
-         {
-            throw new NullPointerException("No null parent accepted");
-         }
-
-         //
-         this.parent = parent;
-         this.previous = previous;
-      }
-
-      public N getParent()
-      {
-         return parent;
-      }
-
-      public N getPrevious()
-      {
-         return previous != null ? previous : null;
-      }
-
-      @Override
-      protected void dispatch(NodeChangeListener<N> listener)
-      {
-         listener.onAdd(target, parent, previous);
-      }
-
-      @Override
-      public String toString()
-      {
-         return "NodeChange.Added[target" + target + ",previous" + previous + ",parent=" + parent + "]";
-      }
-   }
-
-   public final static class Moved<N> extends NodeChange<N>
-   {
-      
-      /** . */
-      final N from;
-
-      /** . */
-      final N to;
-
-      /** . */
-      final N previous;
-
-      Moved(N from, N to, N previous, N node)
-      {
-         super(node);
-
-         //
-         if (from == null)
-         {
-            throw new NullPointerException("No null from accepted");
-         }
-         //
-         if (to == null)
-         {
-            throw new NullPointerException("No null to accepted");
-         }
-
-         //
-         this.from = from;
-         this.to = to;
-         this.previous = previous;
-      }
-
-      public N getFrom()
-      {
-         return from;
-      }
-
-      public N getTo()
-      {
-         return to;
-      }
-
-      public N getPrevious()
-      {
-         return previous != null ? previous : null;
-      }
-
-      @Override
-      protected void dispatch(NodeChangeListener<N> listener)
-      {
-         listener.onMove(target, from, to, previous);
-      }
-
-      @Override
-      public String toString()
-      {
-         return "NodeChange.Moved[target" + target + ",from=" + from + ",to=" + to + ",previous=" + previous +  "]";
-      }
-   }
-
-   public final static class Renamed<N> extends NodeChange<N>
-   {
-
-      /** . */
-      final N parent;
-
-      /** . */
-      final String name;
-
-      Renamed(N parent, N node, String name)
-      {
-         super(node);
-
-         //
-         if (parent == null)
-         {
-            throw new NullPointerException("No null parent accepted");
-         }
-         if (name == null)
-         {
-            throw new NullPointerException("No null name accepted");
-         }
-
-         //
-         this.parent = parent;
-         this.name = name;
-      }
-
-      public N getParent()
-      {
-         return parent;
-      }
-
-      public String getName()
-      {
-         return name;
-      }
-
-      @Override
-      protected void dispatch(NodeChangeListener<N> listener)
-      {
-         listener.onRename(target, parent, name);
-      }
-
-      @Override
-      public String toString()
-      {
-         return "NodeChange.Renamed[target" + target + ",name=" + name + "]";
-      }
-   }
-
-   public final static class Updated<N> extends NodeChange<N>
-   {
-
-      /** . */
-      final NodeState state;
-
-      public Updated(N node, NodeState state)
-      {
-         super(node);
-
-         //
-         this.state = state;
-      }
-
-      public NodeState getState()
-      {
-         return state;
-      }
-
-      @Override
-      protected void dispatch(NodeChangeListener<N> listener)
-      {
-         listener.onUpdate(target, state);
-      }
-
-      @Override
-      public String toString()
-      {
-         return "NodeChange.Updated[target" + target + ",state=" + state + "]";
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChange.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChange.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChange.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChange.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,391 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+/**
+ * Describe a change applied to a node.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public abstract class NodeChange<N>
+{
+
+   /** The target. */
+   final N target;
+
+   private NodeChange(N target)
+   {
+      if (target == null)
+      {
+         throw new NullPointerException("No null target accepted");
+      }
+
+      //
+      this.target = target;
+   }
+
+   public final N getTarget()
+   {
+      return target;
+   }
+
+   /**
+    * Dispatch the change to the proper listener method:
+    * <ul>
+    *    <li>{@link Created} dispatches to {@link NodeChangeListener#onCreate(Object, Object, Object, String)}</li>
+    *    <li>{@link Added} dispatches to {@link NodeChangeListener#onAdd(Object, Object, Object)}</li>
+    *    <li>{@link Destroyed} dispatches to {@link NodeChangeListener#onDestroy(Object, Object)}</li>
+    *    <li>{@link Moved} dispatches to {@link NodeChangeListener#onMove(Object, Object, Object, Object)}</li>
+    *    <li>{@link Removed} dispatches to {@link NodeChangeListener#onRemove(Object, Object)}</li>
+    *    <li>{@link Renamed} dispatches to {@link NodeChangeListener#onRename(Object, Object, String)}</li>
+    *    <li>{@link Updated} dispatches to {@link NodeChangeListener#onUpdate(Object, NodeState)}</li>
+    * </ul>
+    *
+    * @param listener the listener
+    */
+   protected abstract void dispatch(NodeChangeListener<N> listener);
+
+   public final static class Destroyed<N> extends NodeChange<N>
+   {
+
+      /** . */
+      final N parent;
+
+      Destroyed(N parent, N node)
+      {
+         super(node);
+
+         //
+         if (parent == null)
+         {
+            throw new NullPointerException("No null parent accepted");
+         }
+
+         //
+         this.parent = parent;
+      }
+
+      public N getParent()
+      {
+         return parent;
+      }
+
+      @Override
+      protected void dispatch(NodeChangeListener<N> listener)
+      {
+         listener.onDestroy(target, parent);
+      }
+
+      @Override
+      public String toString()
+      {
+         return "NodeChange.Destroyed[target" + target + ",parent=" +  parent + "]";
+      }
+   }
+
+   public final static class Removed<N> extends NodeChange<N>
+   {
+
+      /** . */
+      final N parent;
+
+      Removed(N parent, N node)
+      {
+         super(node);
+
+         //
+         if (parent == null)
+         {
+            throw new NullPointerException("No null parent accepted");
+         }
+
+         //
+         this.parent = parent;
+      }
+
+      public N getParent()
+      {
+         return parent;
+      }
+
+      @Override
+      protected void dispatch(NodeChangeListener<N> listener)
+      {
+         listener.onRemove(target, parent);
+      }
+
+      @Override
+      public String toString()
+      {
+         return "NodeChange.Removed[target" + target + ",parent=" +  parent + "]";
+      }
+   }
+
+   public final static class Created<N> extends NodeChange<N>
+   {
+
+      /** . */
+      final N parent;
+
+      /** . */
+      final N previous;
+
+      /** . */
+      final String name;
+
+      Created(N parent, N previous, N node, String name) throws NullPointerException
+      {
+         super(node);
+
+         //
+         if (parent == null)
+         {
+            throw new NullPointerException("No null parent accepted");
+         }
+         if (name == null)
+         {
+            throw new NullPointerException("No null name accepted");
+         }
+
+         //
+         this.parent = parent;
+         this.previous = previous;
+         this.name = name;
+      }
+
+      public N getParent()
+      {
+         return parent;
+      }
+
+      public N getPrevious()
+      {
+         return previous;
+      }
+
+      public String getName()
+      {
+         return name;
+      }
+
+      @Override
+      protected void dispatch(NodeChangeListener<N> listener)
+      {
+         listener.onCreate(target, parent, previous, name);
+      }
+
+      @Override
+      public String toString()
+      {
+         return "NodeChange.Created[target" + target + ",previous" + previous + ",parent=" + parent + ",name=" + name + "]";
+      }
+   }
+
+   public final static class Added<N> extends NodeChange<N>
+   {
+
+      /** . */
+      final N parent;
+
+      /** . */
+      final N previous;
+
+      Added(N parent, N previous, N node)
+      {
+         super(node);
+
+         //
+         if (parent == null)
+         {
+            throw new NullPointerException("No null parent accepted");
+         }
+
+         //
+         this.parent = parent;
+         this.previous = previous;
+      }
+
+      public N getParent()
+      {
+         return parent;
+      }
+
+      public N getPrevious()
+      {
+         return previous != null ? previous : null;
+      }
+
+      @Override
+      protected void dispatch(NodeChangeListener<N> listener)
+      {
+         listener.onAdd(target, parent, previous);
+      }
+
+      @Override
+      public String toString()
+      {
+         return "NodeChange.Added[target" + target + ",previous" + previous + ",parent=" + parent + "]";
+      }
+   }
+
+   public final static class Moved<N> extends NodeChange<N>
+   {
+      
+      /** . */
+      final N from;
+
+      /** . */
+      final N to;
+
+      /** . */
+      final N previous;
+
+      Moved(N from, N to, N previous, N node)
+      {
+         super(node);
+
+         //
+         if (from == null)
+         {
+            throw new NullPointerException("No null from accepted");
+         }
+         //
+         if (to == null)
+         {
+            throw new NullPointerException("No null to accepted");
+         }
+
+         //
+         this.from = from;
+         this.to = to;
+         this.previous = previous;
+      }
+
+      public N getFrom()
+      {
+         return from;
+      }
+
+      public N getTo()
+      {
+         return to;
+      }
+
+      public N getPrevious()
+      {
+         return previous != null ? previous : null;
+      }
+
+      @Override
+      protected void dispatch(NodeChangeListener<N> listener)
+      {
+         listener.onMove(target, from, to, previous);
+      }
+
+      @Override
+      public String toString()
+      {
+         return "NodeChange.Moved[target" + target + ",from=" + from + ",to=" + to + ",previous=" + previous +  "]";
+      }
+   }
+
+   public final static class Renamed<N> extends NodeChange<N>
+   {
+
+      /** . */
+      final N parent;
+
+      /** . */
+      final String name;
+
+      Renamed(N parent, N node, String name)
+      {
+         super(node);
+
+         //
+         if (parent == null)
+         {
+            throw new NullPointerException("No null parent accepted");
+         }
+         if (name == null)
+         {
+            throw new NullPointerException("No null name accepted");
+         }
+
+         //
+         this.parent = parent;
+         this.name = name;
+      }
+
+      public N getParent()
+      {
+         return parent;
+      }
+
+      public String getName()
+      {
+         return name;
+      }
+
+      @Override
+      protected void dispatch(NodeChangeListener<N> listener)
+      {
+         listener.onRename(target, parent, name);
+      }
+
+      @Override
+      public String toString()
+      {
+         return "NodeChange.Renamed[target" + target + ",name=" + name + "]";
+      }
+   }
+
+   public final static class Updated<N> extends NodeChange<N>
+   {
+
+      /** . */
+      final NodeState state;
+
+      public Updated(N node, NodeState state)
+      {
+         super(node);
+
+         //
+         this.state = state;
+      }
+
+      public NodeState getState()
+      {
+         return state;
+      }
+
+      @Override
+      protected void dispatch(NodeChangeListener<N> listener)
+      {
+         listener.onUpdate(target, state);
+      }
+
+      @Override
+      public String toString()
+      {
+         return "NodeChange.Updated[target" + target + ",state=" + state + "]";
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeListener.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeListener.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeListener.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-/**
- * A listener for node changes.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @param <N> the node generic type
- */
-public interface NodeChangeListener<N>
-{
-
-   /**
-    * A node was added.
-    *
-    * @param target the added node
-    * @param parent the parent node
-    * @param previous the optional previous node
-    */
-   void onAdd(N target, N parent, N previous);
-
-   /**
-    * A node was created.
-    *
-    * @param target the created node
-    * @param parent the parent node
-    * @param previous the optional previous node
-    * @param name the name of the created node
-    */
-   void onCreate(N target, N parent, N previous, String name);
-
-   /**
-    * A node was removed.
-    *
-    * @param target the removed node
-    * @param parent the parent node
-    */
-   void onRemove(N target, N parent);
-
-   /**
-    * A node was destroyed.
-    *
-    * @param target the destroyed node
-    * @param parent the parent node
-    */
-   void onDestroy(N target, N parent);
-
-   /**
-    * A node was renamed.
-    *
-    * @param target the renamed node
-    * @param parent the parent node
-    * @param name the new node name
-    */
-   void onRename(N target, N parent, String name);
-
-   /**
-    * A node was updated.
-    *
-    * @param target the updated node
-    * @param state the new state
-    */
-   void onUpdate(N target, NodeState state);
-
-   /**
-    * A node was moved.
-    *
-    * @param target the moved node.
-    * @param from the previous parent
-    * @param to the new parent
-    * @param previous the optional previous node
-    */
-   void onMove(N target, N from, N to, N previous);
-
-   /**
-    * A base implementation that can be subclassed.
-    *
-    * @param <N> the node generic type
-    */
-   class Base<N> implements NodeChangeListener<N>
-   {
-
-      public void onAdd(N target, N parent, N previous)
-      {
-      }
-
-      public void onCreate(N target, N parent, N previous, String name) throws NavigationServiceException
-      {
-      }
-
-      public void onRemove(N target, N parent)
-      {
-      }
-
-      public void onDestroy(N target, N parent)
-      {
-      }
-
-      public void onRename(N target, N parent, String name) throws NavigationServiceException
-      {
-      }
-
-      public void onUpdate(N target, NodeState state) throws NavigationServiceException
-      {
-      }
-
-      public void onMove(N target, N from, N to, N previous) throws NavigationServiceException
-      {
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeListener.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeListener.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeListener.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeListener.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+/**
+ * A listener for node changes.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @param <N> the node generic type
+ */
+public interface NodeChangeListener<N>
+{
+
+   /**
+    * A node was added.
+    *
+    * @param target the added node
+    * @param parent the parent node
+    * @param previous the optional previous node
+    */
+   void onAdd(N target, N parent, N previous);
+
+   /**
+    * A node was created.
+    *
+    * @param target the created node
+    * @param parent the parent node
+    * @param previous the optional previous node
+    * @param name the name of the created node
+    */
+   void onCreate(N target, N parent, N previous, String name);
+
+   /**
+    * A node was removed.
+    *
+    * @param target the removed node
+    * @param parent the parent node
+    */
+   void onRemove(N target, N parent);
+
+   /**
+    * A node was destroyed.
+    *
+    * @param target the destroyed node
+    * @param parent the parent node
+    */
+   void onDestroy(N target, N parent);
+
+   /**
+    * A node was renamed.
+    *
+    * @param target the renamed node
+    * @param parent the parent node
+    * @param name the new node name
+    */
+   void onRename(N target, N parent, String name);
+
+   /**
+    * A node was updated.
+    *
+    * @param target the updated node
+    * @param state the new state
+    */
+   void onUpdate(N target, NodeState state);
+
+   /**
+    * A node was moved.
+    *
+    * @param target the moved node.
+    * @param from the previous parent
+    * @param to the new parent
+    * @param previous the optional previous node
+    */
+   void onMove(N target, N from, N to, N previous);
+
+   /**
+    * A base implementation that can be subclassed.
+    *
+    * @param <N> the node generic type
+    */
+   class Base<N> implements NodeChangeListener<N>
+   {
+
+      public void onAdd(N target, N parent, N previous)
+      {
+      }
+
+      public void onCreate(N target, N parent, N previous, String name) throws NavigationServiceException
+      {
+      }
+
+      public void onRemove(N target, N parent)
+      {
+      }
+
+      public void onDestroy(N target, N parent)
+      {
+      }
+
+      public void onRename(N target, N parent, String name) throws NavigationServiceException
+      {
+      }
+
+      public void onUpdate(N target, NodeState state) throws NavigationServiceException
+      {
+      }
+
+      public void onMove(N target, N from, N to, N previous) throws NavigationServiceException
+      {
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeQueue.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeQueue.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeQueue.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import java.util.Collection;
-import java.util.LinkedList;
-
-/**
- * A queuing implementation of the {@link NodeChangeListener} interface.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class NodeChangeQueue<N> extends LinkedList<NodeChange<N>> implements NodeChangeListener<N>
-{
-
-   public NodeChangeQueue()
-   {
-   }
-
-   public NodeChangeQueue(Collection<? extends NodeChange<N>> c)
-   {
-      super(c);
-   }
-
-   public void broadcast(NodeChangeListener<N> listener)
-   {
-      for (NodeChange<N> change : this)
-      {
-         change.dispatch(listener);
-      }
-   }
-
-   public void onAdd(N target, N parent, N previous)
-   {
-      add(new NodeChange.Added<N>(parent, previous, target));
-   }
-
-   public void onCreate(N target, N parent, N previous, String name)
-   {
-      add(new NodeChange.Created<N>(parent, previous, target, name));
-   }
-
-   public void onRemove(N target, N parent)
-   {
-      add(new NodeChange.Removed<N>(parent, target));
-   }
-
-   public void onDestroy(N target, N parent)
-   {
-      add(new NodeChange.Destroyed<N>(parent, target));
-   }
-
-   public void onRename(N target, N parent, String name)
-   {
-      add(new NodeChange.Renamed<N>(parent, target, name));
-   }
-
-   public void onUpdate(N target, NodeState state)
-   {
-      add(new NodeChange.Updated<N>(target, state));
-   }
-
-   public void onMove(N target, N from, N to, N previous)
-   {
-      add(new NodeChange.Moved<N>(from, to, previous, target));
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeQueue.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeQueue.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeQueue.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeChangeQueue.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import java.util.Collection;
+import java.util.LinkedList;
+
+/**
+ * A queuing implementation of the {@link NodeChangeListener} interface.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class NodeChangeQueue<N> extends LinkedList<NodeChange<N>> implements NodeChangeListener<N>
+{
+
+   public NodeChangeQueue()
+   {
+   }
+
+   public NodeChangeQueue(Collection<? extends NodeChange<N>> c)
+   {
+      super(c);
+   }
+
+   public void broadcast(NodeChangeListener<N> listener)
+   {
+      for (NodeChange<N> change : this)
+      {
+         change.dispatch(listener);
+      }
+   }
+
+   public void onAdd(N target, N parent, N previous)
+   {
+      add(new NodeChange.Added<N>(parent, previous, target));
+   }
+
+   public void onCreate(N target, N parent, N previous, String name)
+   {
+      add(new NodeChange.Created<N>(parent, previous, target, name));
+   }
+
+   public void onRemove(N target, N parent)
+   {
+      add(new NodeChange.Removed<N>(parent, target));
+   }
+
+   public void onDestroy(N target, N parent)
+   {
+      add(new NodeChange.Destroyed<N>(parent, target));
+   }
+
+   public void onRename(N target, N parent, String name)
+   {
+      add(new NodeChange.Renamed<N>(parent, target, name));
+   }
+
+   public void onUpdate(N target, NodeState state)
+   {
+      add(new NodeChange.Updated<N>(target, state));
+   }
+
+   public void onMove(N target, N from, N to, N previous)
+   {
+      add(new NodeChange.Moved<N>(from, to, previous, target));
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContext.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContext.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContext.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,817 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.tree.list.ListTree;
-
-import java.util.AbstractCollection;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * The context of a node.
- */
-public final class NodeContext<N> extends ListTree<NodeContext<N>>
-{
-
-   /** The owner tree. */
-   final TreeContext<N> tree;
-
-   /** The related model node. */
-   final N node;
-
-   /** The handle: either the persistent id or a sequence id. */
-   String handle;
-
-   /** A data snapshot. */
-   NodeData data;
-
-   /** The new name if any. */
-   String name;
-
-   /** The new state if any. */
-   NodeState state;
-
-   /** Whether or not this node is hidden. */
-   private boolean hidden;
-
-   /** The number of hidden children. */
-   private int hiddenCount;
-
-   /** The expension value. */
-   private boolean expanded;
-
-   NodeContext(NodeModel<N> model, NodeData data)
-   {
-      if (data == null)
-      {
-         throw new NullPointerException();
-      }
-
-      //
-      this.handle = data.id;
-      this.name = null;
-      this.tree = new TreeContext<N>(model, this);
-      this.node = tree.model.create(this);
-      this.data = data;
-      this.state = null;
-      this.hidden = false;
-      this.hiddenCount = 0;
-      this.expanded = false;
-   }
-
-   private NodeContext(TreeContext<N> tree, NodeData data)
-   {
-      if (data == null)
-      {
-         throw new NullPointerException();
-      }
-
-      //
-      this.handle = data.id;
-      this.name = null;
-      this.tree = tree;
-      this.node = tree.model.create(this);
-      this.data = data;
-      this.state = null;
-      this.hidden = false;
-      this.hiddenCount = 0;
-      this.expanded = false;
-   }
-
-   NodeContext(TreeContext<N> tree, String handle, String name, NodeState state, boolean expanded)
-   {
-      if (handle == null)
-      {
-         throw new NullPointerException();
-      }
-      if (name == null)
-      {
-         throw new NullPointerException();
-      }
-      if (state == null)
-      {
-         throw new NullPointerException();
-      }
-
-      //
-      this.handle = handle;
-      this.name = name;
-      this.tree = tree;
-      this.node = tree.model.create(this);
-      this.data = null;
-      this.state = state;
-      this.hidden = false;
-      this.hiddenCount = 0;
-      this.expanded = expanded;
-   }
-
-   /**
-    * Returns true if the tree containing this node has pending transient changes.
-    *
-    * @return true if there are uncommited changes
-    */
-   public boolean hasChanges()
-   {
-      return tree.hasChanges();
-   }
-
-   /**
-    * Returns the relative depth of this node with respect to the ancestor argument.
-    *
-    * @param ancestor the ancestor
-    * @return the depth
-    * @throws IllegalArgumentException if the ancestor argument is not an ancestor
-    * @throws NullPointerException if the ancestor argument is null
-    */
-   public int getDepth(NodeContext<N> ancestor) throws IllegalArgumentException, NullPointerException
-   {
-      if (ancestor == null)
-      {
-         throw new NullPointerException();
-      }
-      int depth = 0;
-      for (NodeContext<N> current = this;current != null;current = current.getParent())
-      {
-         if (current == ancestor)
-         {
-            return depth;
-         }
-         else
-         {
-            depth++;
-         }
-      }
-      throw new IllegalArgumentException("Context " + ancestor + " is not an ancestor of " + this);
-   }
-
-   public NodeContext<N> getDescendant(String handle) throws NullPointerException
-   {
-      if (handle == null)
-      {
-         throw new NullPointerException();
-      }
-
-      //
-      NodeContext<N> found = null;
-      if (this.handle.equals(handle))
-      {
-         found = this;
-      }
-      else
-      {
-         if (expanded)
-         {
-            for (NodeContext<N> current = getFirst();current != null;current = current.getNext())
-            {
-               found = current.getDescendant(handle);
-               if (found != null)
-               {
-                  break;
-               }
-            }
-         }
-      }
-      return found;
-   }
-
-   /**
-    * Returns true if the context is currently hidden.
-    *
-    * @return the hidden value
-    */
-   public boolean isHidden()
-   {
-      return hidden;
-   }
-
-   /**
-    * Updates the hiddent value.
-    *
-    * @param hidden the hidden value
-    */
-   public void setHidden(boolean hidden)
-   {
-      if (this.hidden != hidden)
-      {
-         NodeContext<N> parent = getParent();
-         if (parent != null)
-         {
-            if (hidden)
-            {
-               parent.hiddenCount++;
-            }
-            else
-            {
-               parent.hiddenCount--;
-            }
-         }
-         this.hidden = hidden;
-      }
-   }
-
-   /**
-    * Applies a filter recursively, the filter will update the hiddent status of the
-    * fragment.
-    *
-    * @param filter the filter to apply
-    */
-   public void filter(NodeFilter filter)
-   {
-      doFilter(0, filter);
-   }
-
-   private void doFilter(int depth, NodeFilter filter)
-   {
-      boolean accept = filter.accept(depth, getId(), name, getState());
-      setHidden(!accept);
-      if (expanded)
-      {
-         for (NodeContext<N> node = getFirst();node != null;node = node.getNext())
-         {
-            node.doFilter(depth + 1, filter);
-         }
-      }
-   }
-
-   /**
-    * Returns the associated node with this context
-    *
-    * @return the node
-    */
-   public N getNode()
-   {
-      return node;
-   }
-
-   /**
-    * Reutrns the context id or null if the context is not associated with a persistent navigation node.
-    *
-    * @return the id
-    */
-   public String getId()
-   {
-      return data != null ? data.getId() : null;
-   }
-
-   /**
-    * Returns the context index among its parent.
-    *
-    * @return the index value
-    */
-   public int getIndex()
-   {
-      int count = 0;
-      for (NodeContext<N> node = getPrevious();node != null;node = node.getPrevious())
-      {
-         count++;
-      }
-      return count;
-   }
-
-   public String getName()
-   {
-      return name != null ? name : data.name;
-   }
-
-   /**
-    * Rename this context.
-    *
-    * @param name the new name
-    * @throws NullPointerException if the name is null
-    * @throws IllegalStateException if the parent is null
-    * @throws IllegalArgumentException if the parent already have a child with the specified name
-    */
-   public void setName(String name) throws NullPointerException, IllegalStateException, IllegalArgumentException
-   {
-      NodeContext<N> parent = getParent();
-      if (parent == null)
-      {
-         throw new IllegalStateException("Cannot rename a node when its parent is not visible");
-      }
-      else
-      {
-         NodeContext<N> blah = parent.get(name);
-         if (blah != null)
-         {
-            if (blah == this)
-            {
-               // We do nothing
-            }
-            else
-            {
-               throw new IllegalArgumentException("the node " + name + " already exist");
-            }
-         }
-         else
-         {
-            tree.addChange(new NodeChange.Renamed<NodeContext<N>>(getParent(), this, name));
-         }
-      }
-   }
-
-   public NodeContext<N> get(String name) throws NullPointerException, IllegalStateException
-   {
-      if (name == null)
-      {
-         throw new NullPointerException();
-      }
-      if (!expanded)
-      {
-         throw new IllegalStateException("No children relationship");
-      }
-
-      //
-      for (NodeContext<N> node = getFirst();node != null;node = node.getNext())
-      {
-         if (node.getName().equals(name))
-         {
-            return node;
-         }
-      }
-
-      //
-      return null;
-   }
-
-   /**
-    * Returns the total number of nodes.
-    *
-    * @return the total number of nodes
-    */
-   public int getNodeSize()
-   {
-      if (expanded)
-      {
-         return getSize();
-      }
-      else
-      {
-         return data.children.length;
-      }
-   }
-
-   /**
-    * Returns the node count defined by:
-    * <ul>
-    *    <li>when the node has a children relationship, the number of non hidden nodes</li>
-    *    <li>when the node has not a children relationship, the total number of nodes</li>
-    * </ul>
-    *
-    * @return the node count
-    */
-   public int getNodeCount()
-   {
-      if (expanded)
-      {
-         return getSize() - hiddenCount;
-      }
-      else
-      {
-         return data.children.length;
-      }
-   }
-
-   public NodeState getState()
-   {
-      if (state != null)
-      {
-         return state;
-      }
-      else
-      {
-         return data.getState();
-      }
-   }
-
-   /**
-    * Update the context state
-    *
-    * @param state the new state
-    * @throws NullPointerException if the state is null
-    */
-   public void setState(NodeState state) throws NullPointerException
-   {
-      if (state == null)
-      {
-         throw new NullPointerException("No null state accepted");
-      }
-
-      //
-      tree.addChange(new NodeChange.Updated<NodeContext<N>>(this, state));
-   }
-
-   public N getParentNode()
-   {
-      NodeContext<N> parent = getParent();
-      return parent != null ? parent.node : null;
-   }
-
-   public N getNode(String name) throws NullPointerException
-   {
-      NodeContext<N> child = get(name);
-      return child != null && !child.hidden ? child.node: null;
-   }
-
-   public N getNode(int index)
-   {
-      if (index < 0)
-      {
-         throw new IndexOutOfBoundsException("Index " + index + " cannot be negative");
-      }
-      if (!expanded)
-      {
-         throw new IllegalStateException("No children relationship");
-      }
-      NodeContext<N> context = getFirst();
-      while (context != null && (context.hidden || index-- > 0))
-      {
-         context = context.getNext();
-      }
-      if (context == null)
-      {
-         throw new IndexOutOfBoundsException("Index " + index + " is out of bounds");
-      }
-      else
-      {
-         return context.node;
-      }
-   }
-
-   public final Iterator<N> iterator()
-   {
-      return new Iterator<N>()
-      {
-         NodeContext<N> next = getFirst();
-         {
-            while (next != null && next.isHidden())
-            {
-               next = next.getNext();
-            }
-         }
-         public boolean hasNext()
-         {
-            return next != null;
-         }
-         public N next()
-         {
-            if (next != null)
-            {
-               NodeContext<N> tmp = next;
-               do
-               {
-                  next = next.getNext();
-               }
-               while (next != null && next.isHidden());
-               return tmp.getNode();
-            }
-            else
-            {
-               throw new NoSuchElementException();
-            }
-         }
-         public void remove()
-         {
-            throw new UnsupportedOperationException();
-         }
-      };
-   }
-
-   /** . */
-   private Collection<N> nodes;
-
-   public Collection<N> getNodes()
-   {
-      if (expanded)
-      {
-         if (nodes == null)
-         {
-            nodes = new AbstractCollection<N>()
-            {
-               public Iterator<N> iterator()
-               {
-                  return NodeContext.this.iterator();
-               }
-               public int size()
-               {
-                  return getNodeCount();
-               }
-            };
-         }
-         return nodes;
-      }
-      else
-      {
-         return null;
-      }
-   }
-
-   /**
-    * Add a child node at the specified index with the specified name. If the index argument
-    * is null then the node is added at the last position among the children otherwise
-    * the node is added at the specified index.
-    *
-    * @param index the index
-    * @param name the node name
-    * @return the created node
-    * @throws NullPointerException if the model or the name is null
-    * @throws IndexOutOfBoundsException if the index is negative or greater than the children size
-    * @throws IllegalStateException if the children relationship does not exist
-    */
-   public NodeContext<N> add(Integer index, String name) throws NullPointerException, IndexOutOfBoundsException, IllegalStateException
-   {
-      if (name == null)
-      {
-         throw new NullPointerException("No null name accepted");
-      }
-
-      //
-      NodeContext<N> nodeContext = new NodeContext<N>(tree, "" + tree.sequence++, name, NodeState.INITIAL, true);
-      _add(index, nodeContext);
-      return nodeContext;
-   }
-
-   /**
-    * Move a context as a child context of this context at the specified index. If the index argument
-    * is null then the context is added at the last position among the children otherwise
-    * the context is added at the specified index.
-    *
-    * @param index the index
-    * @param context the context to move
-    * @throws NullPointerException if the model or the context is null
-    * @throws IndexOutOfBoundsException if the index is negative or greater than the children size
-    * @throws IllegalStateException if the children relationship does not exist
-    */
-   public void add(Integer index, NodeContext<N> context) throws NullPointerException, IndexOutOfBoundsException, IllegalStateException
-   {
-      if (context == null)
-      {
-         throw new NullPointerException("No null context argument accepted");
-      }
-
-      //
-      _add(index, context);
-   }
-
-   public NodeContext<N> insertLast(NodeData data)
-   {
-      if (data == null)
-      {
-         throw new NullPointerException("No null data argument accepted");
-      }
-
-      //
-      NodeContext<N> context = new NodeContext<N>(tree, data);
-      insertLast(context);
-      return context;
-   }
-
-   public NodeContext<N> insertAt(Integer index, NodeData data)
-   {
-      if (data == null)
-      {
-         throw new NullPointerException("No null data argument accepted");
-      }
-
-      //
-      NodeContext<N> context = new NodeContext<N>(tree, data);
-      insertAt(index, context);
-      return context;
-   }
-
-   public NodeContext<N> insertAfter(NodeData data)
-   {
-      if (data == null)
-      {
-         throw new NullPointerException("No null data argument accepted");
-      }
-
-      //
-      NodeContext<N> context = new NodeContext<N>(tree, data);
-      insertAfter(context);
-      return context;
-   }
-
-   private void _add(final Integer index, NodeContext<N> child)
-   {
-      NodeContext<N> previousParent = child.getParent();
-
-      //
-      NodeContext<N> previous;
-      if (index == null)
-      {
-         NodeContext<N> before = getLast();
-         while (before != null && before.isHidden())
-         {
-            before = before.getPrevious();
-         }
-         if (before == null)
-         {
-            previous = null;
-         }
-         else
-         {
-            previous = before;
-         }
-      }
-      else if (index < 0)
-      {
-         throw new IndexOutOfBoundsException("No negative index accepted");
-      }
-      else if (index == 0)
-      {
-         previous = null;
-      }
-      else
-      {
-         NodeContext<N> before = getFirst();
-         if (before == null)
-         {
-            throw new IndexOutOfBoundsException("Index " + index + " is greater than 0");
-         }
-         for (int count = index;count > 1;count -= before.isHidden() ? 0 : 1)
-         {
-            before = before.getNext();
-            if (before == null)
-            {
-               throw new IndexOutOfBoundsException("Index " + index + " is greater than the number of children " + (index - count));
-            }
-         }
-         previous = before;
-      }
-
-      //
-      if (previousParent != null)
-      {
-         tree.addChange(new NodeChange.Moved<NodeContext<N>>(previousParent, this, previous, child));
-      }
-      else
-      {
-         // The name should never be null as it's a newly created node
-         tree.addChange(new NodeChange.Created<NodeContext<N>>(this, previous, child, child.name));
-      }
-   }
-
-   /**
-    * Remove a specified context.
-    *
-    * @param name the name of the context to remove
-    * @return true if the context was removed
-    * @throws NullPointerException if the name argument is null
-    * @throws IllegalArgumentException if the named context does not exist
-    * @throws IllegalStateException if the children relationship does not exist
-    */
-   public boolean removeNode(String name) throws NullPointerException, IllegalArgumentException, IllegalStateException
-   {
-      NodeContext<N> node = get(name);
-      if (node == null)
-      {
-         throw new IllegalArgumentException("Cannot remove non existent " + name + " child");
-      }
-
-      //
-      if (node.hidden)
-      {
-         return false;
-      }
-      else
-      {
-         tree.addChange(new NodeChange.Destroyed<NodeContext<N>>(this, node));
-
-         //
-         return true;
-      }
-   }
-
-   public boolean isExpanded()
-   {
-      return expanded;
-   }
-
-   void expand()
-   {
-      if (!expanded)
-      {
-         this.expanded = true;
-      }
-      else
-      {
-         throw new IllegalStateException("Context is already expanded");
-      }
-   }
-
-   Iterable<NodeContext<N>> getContexts()
-   {
-      if (expanded)
-      {
-         return new Iterable<NodeContext<N>>()
-         {
-            public Iterator<NodeContext<N>> iterator()
-            {
-               return listIterator();
-            }
-         };
-      }
-      else
-      {
-         return null;
-      }
-   }
-
-   protected void beforeRemove(NodeContext<N> context)
-   {
-      if (!expanded)
-      {
-         throw new IllegalStateException();
-      }
-   }
-
-   protected void beforeInsert(NodeContext<N> context)
-   {
-      if (!expanded)
-      {
-         throw new IllegalStateException("No children relationship");
-      }
-
-      //
-      if (!tree.editMode)
-      {
-         NodeContext<N> existing = get(context.getName());
-         if (existing != null && existing != context)
-         {
-            throw new IllegalArgumentException("Tree " + context.getName() + " already in the map");
-         }
-      }
-   }
-
-   protected void afterInsert(NodeContext<N> context)
-   {
-      super.afterInsert(context);
-
-      //
-      if (context.hidden)
-      {
-         hiddenCount++;
-      }
-   }
-
-   protected void afterRemove(NodeContext<N> context)
-   {
-      if (context.hidden)
-      {
-         hiddenCount--;
-      }
-
-      //
-      super.afterRemove(context);
-   }
-
-   @Override
-   public String toString()
-   {
-      return toString(1, new StringBuilder()).toString();
-   }
-
-   public StringBuilder toString(int depth, StringBuilder sb)
-   {
-      if (sb == null)
-      {
-         throw new NullPointerException();
-      }
-      if (depth < 0) {
-         throw new IllegalArgumentException("Depth cannot be negative " + depth);
-      }
-      sb.append("NodeContext[id=").append(getId()).append(",name=").append(getName());
-      if (expanded && depth > 0) {
-         sb.append(",children={");
-         for (NodeContext<N> current = getFirst();current != null;current = current.getNext()) {
-            if (current.getPrevious() != null) {
-               sb.append(',');
-            }
-            current.toString(depth - 1, sb);
-         }
-         sb.append("}");
-      } else {
-         sb.append("]");
-      }
-      return sb;
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContext.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContext.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContext.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContext.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,817 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.tree.list.ListTree;
+
+import java.util.AbstractCollection;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * The context of a node.
+ */
+public final class NodeContext<N> extends ListTree<NodeContext<N>>
+{
+
+   /** The owner tree. */
+   final TreeContext<N> tree;
+
+   /** The related model node. */
+   final N node;
+
+   /** The handle: either the persistent id or a sequence id. */
+   String handle;
+
+   /** A data snapshot. */
+   NodeData data;
+
+   /** The new name if any. */
+   String name;
+
+   /** The new state if any. */
+   NodeState state;
+
+   /** Whether or not this node is hidden. */
+   private boolean hidden;
+
+   /** The number of hidden children. */
+   private int hiddenCount;
+
+   /** The expension value. */
+   private boolean expanded;
+
+   NodeContext(NodeModel<N> model, NodeData data)
+   {
+      if (data == null)
+      {
+         throw new NullPointerException();
+      }
+
+      //
+      this.handle = data.id;
+      this.name = null;
+      this.tree = new TreeContext<N>(model, this);
+      this.node = tree.model.create(this);
+      this.data = data;
+      this.state = null;
+      this.hidden = false;
+      this.hiddenCount = 0;
+      this.expanded = false;
+   }
+
+   private NodeContext(TreeContext<N> tree, NodeData data)
+   {
+      if (data == null)
+      {
+         throw new NullPointerException();
+      }
+
+      //
+      this.handle = data.id;
+      this.name = null;
+      this.tree = tree;
+      this.node = tree.model.create(this);
+      this.data = data;
+      this.state = null;
+      this.hidden = false;
+      this.hiddenCount = 0;
+      this.expanded = false;
+   }
+
+   NodeContext(TreeContext<N> tree, String handle, String name, NodeState state, boolean expanded)
+   {
+      if (handle == null)
+      {
+         throw new NullPointerException();
+      }
+      if (name == null)
+      {
+         throw new NullPointerException();
+      }
+      if (state == null)
+      {
+         throw new NullPointerException();
+      }
+
+      //
+      this.handle = handle;
+      this.name = name;
+      this.tree = tree;
+      this.node = tree.model.create(this);
+      this.data = null;
+      this.state = state;
+      this.hidden = false;
+      this.hiddenCount = 0;
+      this.expanded = expanded;
+   }
+
+   /**
+    * Returns true if the tree containing this node has pending transient changes.
+    *
+    * @return true if there are uncommited changes
+    */
+   public boolean hasChanges()
+   {
+      return tree.hasChanges();
+   }
+
+   /**
+    * Returns the relative depth of this node with respect to the ancestor argument.
+    *
+    * @param ancestor the ancestor
+    * @return the depth
+    * @throws IllegalArgumentException if the ancestor argument is not an ancestor
+    * @throws NullPointerException if the ancestor argument is null
+    */
+   public int getDepth(NodeContext<N> ancestor) throws IllegalArgumentException, NullPointerException
+   {
+      if (ancestor == null)
+      {
+         throw new NullPointerException();
+      }
+      int depth = 0;
+      for (NodeContext<N> current = this;current != null;current = current.getParent())
+      {
+         if (current == ancestor)
+         {
+            return depth;
+         }
+         else
+         {
+            depth++;
+         }
+      }
+      throw new IllegalArgumentException("Context " + ancestor + " is not an ancestor of " + this);
+   }
+
+   public NodeContext<N> getDescendant(String handle) throws NullPointerException
+   {
+      if (handle == null)
+      {
+         throw new NullPointerException();
+      }
+
+      //
+      NodeContext<N> found = null;
+      if (this.handle.equals(handle))
+      {
+         found = this;
+      }
+      else
+      {
+         if (expanded)
+         {
+            for (NodeContext<N> current = getFirst();current != null;current = current.getNext())
+            {
+               found = current.getDescendant(handle);
+               if (found != null)
+               {
+                  break;
+               }
+            }
+         }
+      }
+      return found;
+   }
+
+   /**
+    * Returns true if the context is currently hidden.
+    *
+    * @return the hidden value
+    */
+   public boolean isHidden()
+   {
+      return hidden;
+   }
+
+   /**
+    * Updates the hiddent value.
+    *
+    * @param hidden the hidden value
+    */
+   public void setHidden(boolean hidden)
+   {
+      if (this.hidden != hidden)
+      {
+         NodeContext<N> parent = getParent();
+         if (parent != null)
+         {
+            if (hidden)
+            {
+               parent.hiddenCount++;
+            }
+            else
+            {
+               parent.hiddenCount--;
+            }
+         }
+         this.hidden = hidden;
+      }
+   }
+
+   /**
+    * Applies a filter recursively, the filter will update the hiddent status of the
+    * fragment.
+    *
+    * @param filter the filter to apply
+    */
+   public void filter(NodeFilter filter)
+   {
+      doFilter(0, filter);
+   }
+
+   private void doFilter(int depth, NodeFilter filter)
+   {
+      boolean accept = filter.accept(depth, getId(), name, getState());
+      setHidden(!accept);
+      if (expanded)
+      {
+         for (NodeContext<N> node = getFirst();node != null;node = node.getNext())
+         {
+            node.doFilter(depth + 1, filter);
+         }
+      }
+   }
+
+   /**
+    * Returns the associated node with this context
+    *
+    * @return the node
+    */
+   public N getNode()
+   {
+      return node;
+   }
+
+   /**
+    * Reutrns the context id or null if the context is not associated with a persistent navigation node.
+    *
+    * @return the id
+    */
+   public String getId()
+   {
+      return data != null ? data.getId() : null;
+   }
+
+   /**
+    * Returns the context index among its parent.
+    *
+    * @return the index value
+    */
+   public int getIndex()
+   {
+      int count = 0;
+      for (NodeContext<N> node = getPrevious();node != null;node = node.getPrevious())
+      {
+         count++;
+      }
+      return count;
+   }
+
+   public String getName()
+   {
+      return name != null ? name : data.name;
+   }
+
+   /**
+    * Rename this context.
+    *
+    * @param name the new name
+    * @throws NullPointerException if the name is null
+    * @throws IllegalStateException if the parent is null
+    * @throws IllegalArgumentException if the parent already have a child with the specified name
+    */
+   public void setName(String name) throws NullPointerException, IllegalStateException, IllegalArgumentException
+   {
+      NodeContext<N> parent = getParent();
+      if (parent == null)
+      {
+         throw new IllegalStateException("Cannot rename a node when its parent is not visible");
+      }
+      else
+      {
+         NodeContext<N> blah = parent.get(name);
+         if (blah != null)
+         {
+            if (blah == this)
+            {
+               // We do nothing
+            }
+            else
+            {
+               throw new IllegalArgumentException("the node " + name + " already exist");
+            }
+         }
+         else
+         {
+            tree.addChange(new NodeChange.Renamed<NodeContext<N>>(getParent(), this, name));
+         }
+      }
+   }
+
+   public NodeContext<N> get(String name) throws NullPointerException, IllegalStateException
+   {
+      if (name == null)
+      {
+         throw new NullPointerException();
+      }
+      if (!expanded)
+      {
+         throw new IllegalStateException("No children relationship");
+      }
+
+      //
+      for (NodeContext<N> node = getFirst();node != null;node = node.getNext())
+      {
+         if (node.getName().equals(name))
+         {
+            return node;
+         }
+      }
+
+      //
+      return null;
+   }
+
+   /**
+    * Returns the total number of nodes.
+    *
+    * @return the total number of nodes
+    */
+   public int getNodeSize()
+   {
+      if (expanded)
+      {
+         return getSize();
+      }
+      else
+      {
+         return data.children.length;
+      }
+   }
+
+   /**
+    * Returns the node count defined by:
+    * <ul>
+    *    <li>when the node has a children relationship, the number of non hidden nodes</li>
+    *    <li>when the node has not a children relationship, the total number of nodes</li>
+    * </ul>
+    *
+    * @return the node count
+    */
+   public int getNodeCount()
+   {
+      if (expanded)
+      {
+         return getSize() - hiddenCount;
+      }
+      else
+      {
+         return data.children.length;
+      }
+   }
+
+   public NodeState getState()
+   {
+      if (state != null)
+      {
+         return state;
+      }
+      else
+      {
+         return data.getState();
+      }
+   }
+
+   /**
+    * Update the context state
+    *
+    * @param state the new state
+    * @throws NullPointerException if the state is null
+    */
+   public void setState(NodeState state) throws NullPointerException
+   {
+      if (state == null)
+      {
+         throw new NullPointerException("No null state accepted");
+      }
+
+      //
+      tree.addChange(new NodeChange.Updated<NodeContext<N>>(this, state));
+   }
+
+   public N getParentNode()
+   {
+      NodeContext<N> parent = getParent();
+      return parent != null ? parent.node : null;
+   }
+
+   public N getNode(String name) throws NullPointerException
+   {
+      NodeContext<N> child = get(name);
+      return child != null && !child.hidden ? child.node: null;
+   }
+
+   public N getNode(int index)
+   {
+      if (index < 0)
+      {
+         throw new IndexOutOfBoundsException("Index " + index + " cannot be negative");
+      }
+      if (!expanded)
+      {
+         throw new IllegalStateException("No children relationship");
+      }
+      NodeContext<N> context = getFirst();
+      while (context != null && (context.hidden || index-- > 0))
+      {
+         context = context.getNext();
+      }
+      if (context == null)
+      {
+         throw new IndexOutOfBoundsException("Index " + index + " is out of bounds");
+      }
+      else
+      {
+         return context.node;
+      }
+   }
+
+   public final Iterator<N> iterator()
+   {
+      return new Iterator<N>()
+      {
+         NodeContext<N> next = getFirst();
+         {
+            while (next != null && next.isHidden())
+            {
+               next = next.getNext();
+            }
+         }
+         public boolean hasNext()
+         {
+            return next != null;
+         }
+         public N next()
+         {
+            if (next != null)
+            {
+               NodeContext<N> tmp = next;
+               do
+               {
+                  next = next.getNext();
+               }
+               while (next != null && next.isHidden());
+               return tmp.getNode();
+            }
+            else
+            {
+               throw new NoSuchElementException();
+            }
+         }
+         public void remove()
+         {
+            throw new UnsupportedOperationException();
+         }
+      };
+   }
+
+   /** . */
+   private Collection<N> nodes;
+
+   public Collection<N> getNodes()
+   {
+      if (expanded)
+      {
+         if (nodes == null)
+         {
+            nodes = new AbstractCollection<N>()
+            {
+               public Iterator<N> iterator()
+               {
+                  return NodeContext.this.iterator();
+               }
+               public int size()
+               {
+                  return getNodeCount();
+               }
+            };
+         }
+         return nodes;
+      }
+      else
+      {
+         return null;
+      }
+   }
+
+   /**
+    * Add a child node at the specified index with the specified name. If the index argument
+    * is null then the node is added at the last position among the children otherwise
+    * the node is added at the specified index.
+    *
+    * @param index the index
+    * @param name the node name
+    * @return the created node
+    * @throws NullPointerException if the model or the name is null
+    * @throws IndexOutOfBoundsException if the index is negative or greater than the children size
+    * @throws IllegalStateException if the children relationship does not exist
+    */
+   public NodeContext<N> add(Integer index, String name) throws NullPointerException, IndexOutOfBoundsException, IllegalStateException
+   {
+      if (name == null)
+      {
+         throw new NullPointerException("No null name accepted");
+      }
+
+      //
+      NodeContext<N> nodeContext = new NodeContext<N>(tree, "" + tree.sequence++, name, NodeState.INITIAL, true);
+      _add(index, nodeContext);
+      return nodeContext;
+   }
+
+   /**
+    * Move a context as a child context of this context at the specified index. If the index argument
+    * is null then the context is added at the last position among the children otherwise
+    * the context is added at the specified index.
+    *
+    * @param index the index
+    * @param context the context to move
+    * @throws NullPointerException if the model or the context is null
+    * @throws IndexOutOfBoundsException if the index is negative or greater than the children size
+    * @throws IllegalStateException if the children relationship does not exist
+    */
+   public void add(Integer index, NodeContext<N> context) throws NullPointerException, IndexOutOfBoundsException, IllegalStateException
+   {
+      if (context == null)
+      {
+         throw new NullPointerException("No null context argument accepted");
+      }
+
+      //
+      _add(index, context);
+   }
+
+   public NodeContext<N> insertLast(NodeData data)
+   {
+      if (data == null)
+      {
+         throw new NullPointerException("No null data argument accepted");
+      }
+
+      //
+      NodeContext<N> context = new NodeContext<N>(tree, data);
+      insertLast(context);
+      return context;
+   }
+
+   public NodeContext<N> insertAt(Integer index, NodeData data)
+   {
+      if (data == null)
+      {
+         throw new NullPointerException("No null data argument accepted");
+      }
+
+      //
+      NodeContext<N> context = new NodeContext<N>(tree, data);
+      insertAt(index, context);
+      return context;
+   }
+
+   public NodeContext<N> insertAfter(NodeData data)
+   {
+      if (data == null)
+      {
+         throw new NullPointerException("No null data argument accepted");
+      }
+
+      //
+      NodeContext<N> context = new NodeContext<N>(tree, data);
+      insertAfter(context);
+      return context;
+   }
+
+   private void _add(final Integer index, NodeContext<N> child)
+   {
+      NodeContext<N> previousParent = child.getParent();
+
+      //
+      NodeContext<N> previous;
+      if (index == null)
+      {
+         NodeContext<N> before = getLast();
+         while (before != null && before.isHidden())
+         {
+            before = before.getPrevious();
+         }
+         if (before == null)
+         {
+            previous = null;
+         }
+         else
+         {
+            previous = before;
+         }
+      }
+      else if (index < 0)
+      {
+         throw new IndexOutOfBoundsException("No negative index accepted");
+      }
+      else if (index == 0)
+      {
+         previous = null;
+      }
+      else
+      {
+         NodeContext<N> before = getFirst();
+         if (before == null)
+         {
+            throw new IndexOutOfBoundsException("Index " + index + " is greater than 0");
+         }
+         for (int count = index;count > 1;count -= before.isHidden() ? 0 : 1)
+         {
+            before = before.getNext();
+            if (before == null)
+            {
+               throw new IndexOutOfBoundsException("Index " + index + " is greater than the number of children " + (index - count));
+            }
+         }
+         previous = before;
+      }
+
+      //
+      if (previousParent != null)
+      {
+         tree.addChange(new NodeChange.Moved<NodeContext<N>>(previousParent, this, previous, child));
+      }
+      else
+      {
+         // The name should never be null as it's a newly created node
+         tree.addChange(new NodeChange.Created<NodeContext<N>>(this, previous, child, child.name));
+      }
+   }
+
+   /**
+    * Remove a specified context.
+    *
+    * @param name the name of the context to remove
+    * @return true if the context was removed
+    * @throws NullPointerException if the name argument is null
+    * @throws IllegalArgumentException if the named context does not exist
+    * @throws IllegalStateException if the children relationship does not exist
+    */
+   public boolean removeNode(String name) throws NullPointerException, IllegalArgumentException, IllegalStateException
+   {
+      NodeContext<N> node = get(name);
+      if (node == null)
+      {
+         throw new IllegalArgumentException("Cannot remove non existent " + name + " child");
+      }
+
+      //
+      if (node.hidden)
+      {
+         return false;
+      }
+      else
+      {
+         tree.addChange(new NodeChange.Destroyed<NodeContext<N>>(this, node));
+
+         //
+         return true;
+      }
+   }
+
+   public boolean isExpanded()
+   {
+      return expanded;
+   }
+
+   void expand()
+   {
+      if (!expanded)
+      {
+         this.expanded = true;
+      }
+      else
+      {
+         throw new IllegalStateException("Context is already expanded");
+      }
+   }
+
+   Iterable<NodeContext<N>> getContexts()
+   {
+      if (expanded)
+      {
+         return new Iterable<NodeContext<N>>()
+         {
+            public Iterator<NodeContext<N>> iterator()
+            {
+               return listIterator();
+            }
+         };
+      }
+      else
+      {
+         return null;
+      }
+   }
+
+   protected void beforeRemove(NodeContext<N> context)
+   {
+      if (!expanded)
+      {
+         throw new IllegalStateException();
+      }
+   }
+
+   protected void beforeInsert(NodeContext<N> context)
+   {
+      if (!expanded)
+      {
+         throw new IllegalStateException("No children relationship");
+      }
+
+      //
+      if (!tree.editMode)
+      {
+         NodeContext<N> existing = get(context.getName());
+         if (existing != null && existing != context)
+         {
+            throw new IllegalArgumentException("Tree " + context.getName() + " already in the map");
+         }
+      }
+   }
+
+   protected void afterInsert(NodeContext<N> context)
+   {
+      super.afterInsert(context);
+
+      //
+      if (context.hidden)
+      {
+         hiddenCount++;
+      }
+   }
+
+   protected void afterRemove(NodeContext<N> context)
+   {
+      if (context.hidden)
+      {
+         hiddenCount--;
+      }
+
+      //
+      super.afterRemove(context);
+   }
+
+   @Override
+   public String toString()
+   {
+      return toString(1, new StringBuilder()).toString();
+   }
+
+   public StringBuilder toString(int depth, StringBuilder sb)
+   {
+      if (sb == null)
+      {
+         throw new NullPointerException();
+      }
+      if (depth < 0) {
+         throw new IllegalArgumentException("Depth cannot be negative " + depth);
+      }
+      sb.append("NodeContext[id=").append(getId()).append(",name=").append(getName());
+      if (expanded && depth > 0) {
+         sb.append(",children={");
+         for (NodeContext<N> current = getFirst();current != null;current = current.getNext()) {
+            if (current.getPrevious() != null) {
+               sb.append(',');
+            }
+            current.toString(depth - 1, sb);
+         }
+         sb.append("}");
+      } else {
+         sb.append("]");
+      }
+      return sb;
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContextChangeAdapter.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContextChangeAdapter.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContextChangeAdapter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-/**
-* @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
-*/
-public class NodeContextChangeAdapter<N> implements NodeChangeListener<NodeContext<N>>
-{
-
-   public static <N> NodeChangeListener<NodeContext<N>> safeWrap(NodeChangeListener<N> wrapped)
-   {
-      if (wrapped == null)
-      {
-         return null;
-      }
-      else
-      {
-         return new NodeContextChangeAdapter<N>(wrapped);
-      }
-   }
-
-   /** . */
-   private final NodeChangeListener<N> wrapped;
-
-   public NodeContextChangeAdapter(NodeChangeListener<N> wrapped)
-   {
-      if (wrapped == null)
-      {
-         throw new NullPointerException();
-      }
-      this.wrapped = wrapped;
-   }
-
-   public void onAdd(NodeContext<N> target, NodeContext<N> parent, NodeContext<N> previous)
-   {
-      wrapped.onAdd(unwrap(target), unwrap(parent), unwrap(previous));
-   }
-
-   public void onCreate(NodeContext<N> target, NodeContext<N> parent, NodeContext<N> previous, String name)
-   {
-      wrapped.onCreate(unwrap(target), unwrap(parent), unwrap(previous), name);
-   }
-
-   public void onRemove(NodeContext<N> target, NodeContext<N> parent)
-   {
-      wrapped.onRemove(unwrap(target), unwrap(parent));
-   }
-
-   public void onDestroy(NodeContext<N> target, NodeContext<N> parent)
-   {
-      wrapped.onDestroy(unwrap(target), unwrap(parent));
-   }
-
-   public void onRename(NodeContext<N> target, NodeContext<N> parent, String name)
-   {
-      wrapped.onRename(unwrap(target), unwrap(parent), name);
-   }
-
-   public void onUpdate(NodeContext<N> target, NodeState state)
-   {
-      wrapped.onUpdate(unwrap(target), state);
-   }
-
-   public void onMove(NodeContext<N> target, NodeContext<N> from, NodeContext<N> to, NodeContext<N> previous)
-   {
-      wrapped.onMove(unwrap(target), unwrap(from), unwrap(to), unwrap(previous));
-   }
-
-   private N unwrap(NodeContext<N> context)
-   {
-      return context != null ? context.getNode() : null;
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContextChangeAdapter.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContextChangeAdapter.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContextChangeAdapter.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeContextChangeAdapter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+/**
+* @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+*/
+public class NodeContextChangeAdapter<N> implements NodeChangeListener<NodeContext<N>>
+{
+
+   public static <N> NodeChangeListener<NodeContext<N>> safeWrap(NodeChangeListener<N> wrapped)
+   {
+      if (wrapped == null)
+      {
+         return null;
+      }
+      else
+      {
+         return new NodeContextChangeAdapter<N>(wrapped);
+      }
+   }
+
+   /** . */
+   private final NodeChangeListener<N> wrapped;
+
+   public NodeContextChangeAdapter(NodeChangeListener<N> wrapped)
+   {
+      if (wrapped == null)
+      {
+         throw new NullPointerException();
+      }
+      this.wrapped = wrapped;
+   }
+
+   public void onAdd(NodeContext<N> target, NodeContext<N> parent, NodeContext<N> previous)
+   {
+      wrapped.onAdd(unwrap(target), unwrap(parent), unwrap(previous));
+   }
+
+   public void onCreate(NodeContext<N> target, NodeContext<N> parent, NodeContext<N> previous, String name)
+   {
+      wrapped.onCreate(unwrap(target), unwrap(parent), unwrap(previous), name);
+   }
+
+   public void onRemove(NodeContext<N> target, NodeContext<N> parent)
+   {
+      wrapped.onRemove(unwrap(target), unwrap(parent));
+   }
+
+   public void onDestroy(NodeContext<N> target, NodeContext<N> parent)
+   {
+      wrapped.onDestroy(unwrap(target), unwrap(parent));
+   }
+
+   public void onRename(NodeContext<N> target, NodeContext<N> parent, String name)
+   {
+      wrapped.onRename(unwrap(target), unwrap(parent), name);
+   }
+
+   public void onUpdate(NodeContext<N> target, NodeState state)
+   {
+      wrapped.onUpdate(unwrap(target), state);
+   }
+
+   public void onMove(NodeContext<N> target, NodeContext<N> from, NodeContext<N> to, NodeContext<N> previous)
+   {
+      wrapped.onMove(unwrap(target), unwrap(from), unwrap(to), unwrap(previous));
+   }
+
+   private N unwrap(NodeContext<N> context)
+   {
+      return context != null ? context.getNode() : null;
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeData.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeData.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeData.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,257 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.mop.Described;
-import org.exoplatform.portal.mop.Visibility;
-import org.exoplatform.portal.mop.Visible;
-import org.exoplatform.portal.pom.data.MappedAttributes;
-import org.exoplatform.portal.pom.data.Mapper;
-import org.gatein.mop.api.Attributes;
-import org.gatein.mop.api.workspace.Navigation;
-import org.gatein.mop.api.workspace.ObjectType;
-import org.gatein.mop.api.workspace.Site;
-import org.gatein.mop.api.workspace.link.Link;
-import org.gatein.mop.api.workspace.link.PageLink;
-
-import java.io.Serializable;
-import java.util.*;
-
-/**
- * An immutable node data class.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-class NodeData implements Serializable
-{
-
-   /** . */
-   final String parentId;
-
-   /** . */
-   final String id;
-
-   /** . */
-   final String name;
-
-   /** . */
-   final NodeState state;
-
-   /** . */
-   final String[] children;
-
-   NodeData(Navigation navigation)
-   {
-      String[] children;
-      List<Navigation> _children = navigation.getChildren();
-      if (_children == null)
-      {
-         children = Utils.EMPTY_STRING_ARRAY;
-      }
-      else
-      {
-         children = new String[_children.size()];
-         int index = 0;
-         for (Navigation child : _children)
-         {
-            children[index++] = child.getObjectId();
-         }
-      }
-
-      //
-      String label = null;
-      if (navigation.isAdapted(Described.class))
-      {
-         Described described = navigation.adapt(Described.class);
-         label = described.getName();
-      }
-
-      //
-      Visibility visibility = Visibility.DISPLAYED;
-      Date startPublicationDate = null;
-      Date endPublicationDate = null;
-      if (navigation.isAdapted(Visible.class))
-      {
-         Visible visible = navigation.adapt(Visible.class);
-         visibility = visible.getVisibility();
-         startPublicationDate = visible.getStartPublicationDate();
-         endPublicationDate = visible.getEndPublicationDate();
-      }
-
-      //
-      String pageRef = null;
-      Link link = navigation.getLink();
-      if (link instanceof PageLink)
-      {
-         PageLink pageLink = (PageLink)link;
-         org.gatein.mop.api.workspace.Page target = pageLink.getPage();
-         if (target != null)
-         {
-            Site site = target.getSite();
-            ObjectType<? extends Site> siteType = site.getObjectType();
-            pageRef = Mapper.getOwnerType(siteType) + "::" + site.getName() + "::" + target.getName();
-         }
-      }
-
-      //
-      Attributes attrs = navigation.getAttributes();
-
-      //
-      NodeState state = new NodeState(
-         label,
-         attrs.getValue(MappedAttributes.ICON),
-         startPublicationDate != null ? startPublicationDate.getTime() : -1,
-         endPublicationDate != null ? endPublicationDate.getTime() : -1,
-         visibility,
-         pageRef
-      );
-
-      //
-      String parentId;
-      Navigation parent = navigation.getParent();
-      if (parent != null)
-      {
-         parentId = parent.getObjectId();
-      }
-      else
-      {
-         parentId = null;
-      }
-
-      //
-      this.parentId = parentId;
-      this.id = navigation.getObjectId();
-      this.name = navigation.getName();
-      this.state = state;
-      this.children = children;
-   }
-
-   NodeData(NodeContext<?> context)
-   {
-      int size = 0;
-      for (NodeContext<?> current = context.getFirst();current != null;current = current.getNext())
-      {
-         size++;
-      }
-      String[] children = new String[size];
-      for (NodeContext<?> current = context.getFirst();current != null;current = current.getNext())
-      {
-         children[children.length - size--] = current.handle;
-      }
-      String parentId = context.getParent() != null ? context.getParent().handle : null;
-      String id = context.handle;
-      String name = context.getName();
-      NodeState state = context.getState();
-
-      //
-      this.parentId = parentId;
-      this.id = id;
-      this.name = name;
-      this.state = state;
-      this.children = children;
-   }
-
-   NodeData(String parentId, String id, String name, NodeState state, String[] children)
-   {
-      this.parentId = parentId;
-      this.id = id;
-      this.name = name;
-      this.state = state;
-      this.children = children;
-   }
-
-   public Iterator<String> iterator(boolean reverse)
-   {
-      if (reverse)
-      {
-         return new Iterator<String>()
-         {
-            int index = children.length;
-            public boolean hasNext()
-            {
-               return index > 0;
-            }
-            public String next()
-            {
-               if (index > 0)
-               {
-                  return children[--index];
-               }
-               else
-               {
-                  throw new NoSuchElementException();
-               }
-            }
-            public void remove()
-            {
-               throw new UnsupportedOperationException();
-            }
-         };
-      }
-      else
-      {
-         return new Iterator<String>()
-         {
-            int index = 0;
-            public boolean hasNext()
-            {
-               return index < children.length;
-            }
-            public String next()
-            {
-               if (index < children.length)
-               {
-                  return children[index++];
-               }
-               else
-               {
-                  throw new NoSuchElementException();
-               }
-            }
-            public void remove()
-            {
-               throw new UnsupportedOperationException();
-            }
-         };
-      }
-   }
-
-   public String getId()
-   {
-      return id;
-   }
-
-   public String getName()
-   {
-      return name;
-   }
-
-   public NodeState getState()
-   {
-      return state;
-   }
-
-   @Override
-   public String toString()
-   {
-      return "NodeData[id=" + id + ",name=" + name + ",state=" + state + ",children=" + Arrays.asList(children) + "]";
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeData.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeData.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeData.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeData.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.mop.Described;
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.mop.Visible;
+import org.exoplatform.portal.pom.data.MappedAttributes;
+import org.exoplatform.portal.pom.data.Mapper;
+import org.gatein.mop.api.Attributes;
+import org.gatein.mop.api.workspace.Navigation;
+import org.gatein.mop.api.workspace.ObjectType;
+import org.gatein.mop.api.workspace.Site;
+import org.gatein.mop.api.workspace.link.Link;
+import org.gatein.mop.api.workspace.link.PageLink;
+
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * An immutable node data class.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+class NodeData implements Serializable
+{
+
+   /** . */
+   final String parentId;
+
+   /** . */
+   final String id;
+
+   /** . */
+   final String name;
+
+   /** . */
+   final NodeState state;
+
+   /** . */
+   final String[] children;
+
+   NodeData(Navigation navigation)
+   {
+      String[] children;
+      List<Navigation> _children = navigation.getChildren();
+      if (_children == null)
+      {
+         children = Utils.EMPTY_STRING_ARRAY;
+      }
+      else
+      {
+         children = new String[_children.size()];
+         int index = 0;
+         for (Navigation child : _children)
+         {
+            children[index++] = child.getObjectId();
+         }
+      }
+
+      //
+      String label = null;
+      if (navigation.isAdapted(Described.class))
+      {
+         Described described = navigation.adapt(Described.class);
+         label = described.getName();
+      }
+
+      //
+      Visibility visibility = Visibility.DISPLAYED;
+      Date startPublicationDate = null;
+      Date endPublicationDate = null;
+      if (navigation.isAdapted(Visible.class))
+      {
+         Visible visible = navigation.adapt(Visible.class);
+         visibility = visible.getVisibility();
+         startPublicationDate = visible.getStartPublicationDate();
+         endPublicationDate = visible.getEndPublicationDate();
+      }
+
+      //
+      String pageRef = null;
+      Link link = navigation.getLink();
+      if (link instanceof PageLink)
+      {
+         PageLink pageLink = (PageLink)link;
+         org.gatein.mop.api.workspace.Page target = pageLink.getPage();
+         if (target != null)
+         {
+            Site site = target.getSite();
+            ObjectType<? extends Site> siteType = site.getObjectType();
+            pageRef = Mapper.getOwnerType(siteType) + "::" + site.getName() + "::" + target.getName();
+         }
+      }
+
+      //
+      Attributes attrs = navigation.getAttributes();
+
+      //
+      NodeState state = new NodeState(
+         label,
+         attrs.getValue(MappedAttributes.ICON),
+         startPublicationDate != null ? startPublicationDate.getTime() : -1,
+         endPublicationDate != null ? endPublicationDate.getTime() : -1,
+         visibility,
+         pageRef
+      );
+
+      //
+      String parentId;
+      Navigation parent = navigation.getParent();
+      if (parent != null)
+      {
+         parentId = parent.getObjectId();
+      }
+      else
+      {
+         parentId = null;
+      }
+
+      //
+      this.parentId = parentId;
+      this.id = navigation.getObjectId();
+      this.name = navigation.getName();
+      this.state = state;
+      this.children = children;
+   }
+
+   NodeData(NodeContext<?> context)
+   {
+      int size = 0;
+      for (NodeContext<?> current = context.getFirst();current != null;current = current.getNext())
+      {
+         size++;
+      }
+      String[] children = new String[size];
+      for (NodeContext<?> current = context.getFirst();current != null;current = current.getNext())
+      {
+         children[children.length - size--] = current.handle;
+      }
+      String parentId = context.getParent() != null ? context.getParent().handle : null;
+      String id = context.handle;
+      String name = context.getName();
+      NodeState state = context.getState();
+
+      //
+      this.parentId = parentId;
+      this.id = id;
+      this.name = name;
+      this.state = state;
+      this.children = children;
+   }
+
+   NodeData(String parentId, String id, String name, NodeState state, String[] children)
+   {
+      this.parentId = parentId;
+      this.id = id;
+      this.name = name;
+      this.state = state;
+      this.children = children;
+   }
+
+   public Iterator<String> iterator(boolean reverse)
+   {
+      if (reverse)
+      {
+         return new Iterator<String>()
+         {
+            int index = children.length;
+            public boolean hasNext()
+            {
+               return index > 0;
+            }
+            public String next()
+            {
+               if (index > 0)
+               {
+                  return children[--index];
+               }
+               else
+               {
+                  throw new NoSuchElementException();
+               }
+            }
+            public void remove()
+            {
+               throw new UnsupportedOperationException();
+            }
+         };
+      }
+      else
+      {
+         return new Iterator<String>()
+         {
+            int index = 0;
+            public boolean hasNext()
+            {
+               return index < children.length;
+            }
+            public String next()
+            {
+               if (index < children.length)
+               {
+                  return children[index++];
+               }
+               else
+               {
+                  throw new NoSuchElementException();
+               }
+            }
+            public void remove()
+            {
+               throw new UnsupportedOperationException();
+            }
+         };
+      }
+   }
+
+   public String getId()
+   {
+      return id;
+   }
+
+   public String getName()
+   {
+      return name;
+   }
+
+   public NodeState getState()
+   {
+      return state;
+   }
+
+   @Override
+   public String toString()
+   {
+      return "NodeData[id=" + id + ",name=" + name + ",state=" + state + ",children=" + Arrays.asList(children) + "]";
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeFilter.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeFilter.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeFilter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-/**
- * A filter for nodes, filtering occurs after node retrieval and is applied once nodes
- * are loaded.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public interface NodeFilter
-{
-
-   /**
-    * Returns a value indicating whether or not the node should be visible or not in the user interface.
-    *
-    * @param depth the node depth
-    * @param id the node id
-    * @param name the node name
-    * @param state the node state
-    * @return the accept value
-    */
-   boolean accept(int depth, String id, String name, NodeState state);
-
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeFilter.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeFilter.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeFilter.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeFilter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+/**
+ * A filter for nodes, filtering occurs after node retrieval and is applied once nodes
+ * are loaded.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public interface NodeFilter
+{
+
+   /**
+    * Returns a value indicating whether or not the node should be visible or not in the user interface.
+    *
+    * @param depth the node depth
+    * @param id the node id
+    * @param name the node name
+    * @param state the node state
+    * @return the accept value
+    */
+   boolean accept(int depth, String id, String name, NodeState state);
+
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeModel.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeModel.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeModel.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public interface NodeModel<N>
-{
-
-   /**
-    * A model based on itself.
-    */
-   NodeModel<NodeContext<?>> SELF_MODEL = new NodeModel<NodeContext<?>>()
-   {
-      public NodeContext<NodeContext<?>> getContext(NodeContext<?> node)
-      {
-         throw new UnsupportedOperationException();
-      }
-      public NodeContext<?> create(NodeContext<NodeContext<?>> context)
-      {
-         return context;
-      }
-   };
-
-   /**
-    * Returns the context of a node.
-    *
-    * @param node the node
-    * @return the node context
-    */
-   NodeContext<N> getContext(N node);
-
-   /**
-    * Create a node wrapping a context.
-    *
-    * @param context the node context
-    * @return the node instance
-    */
-   N create(NodeContext<N> context);
-
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeModel.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeModel.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeModel.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeModel.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public interface NodeModel<N>
+{
+
+   /**
+    * A model based on itself.
+    */
+   NodeModel<NodeContext<?>> SELF_MODEL = new NodeModel<NodeContext<?>>()
+   {
+      public NodeContext<NodeContext<?>> getContext(NodeContext<?> node)
+      {
+         throw new UnsupportedOperationException();
+      }
+      public NodeContext<?> create(NodeContext<NodeContext<?>> context)
+      {
+         return context;
+      }
+   };
+
+   /**
+    * Returns the context of a node.
+    *
+    * @param node the node
+    * @return the node context
+    */
+   NodeContext<N> getContext(N node);
+
+   /**
+    * Create a node wrapping a context.
+    *
+    * @param context the node context
+    * @return the node instance
+    */
+   N create(NodeContext<N> context);
+
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeState.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeState.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeState.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,248 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.commons.utils.Safe;
-import org.exoplatform.portal.mop.Visibility;
-
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * An immutable node state class.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public final class NodeState implements Serializable
-{
-
-   /** . */
-   public static final NodeState INITIAL = new NodeState.Builder().build();
-
-   /**
-    * Builder class.
-    */
-   public static class Builder
-   {
-
-      /** . */
-      private String label;
-
-      /** . */
-      private String icon;
-
-      /** . */
-      private long startPublicationTime;
-
-      /** . */
-      private long endPublicationTime;
-
-      /** . */
-      private Visibility visibility;
-
-      /** . */
-      private String pageRef;
-
-      public Builder()
-      {
-         this.icon = null;
-         this.label = null;
-         this.startPublicationTime = -1;
-         this.endPublicationTime = -1;
-         this.visibility = Visibility.DISPLAYED;
-         this.pageRef = null;
-      }
-
-      /**
-       * Creates a builder from a specified state.
-       *
-       * @param state the state to copy
-       * @throws NullPointerException if the stateis null
-       */
-      public Builder(NodeState state) throws NullPointerException
-      {
-         if (state == null)
-         {
-            throw new NullPointerException();
-         }
-         this.label = state.label;
-         this.icon = state.icon;
-         this.startPublicationTime = state.startPublicationTime;
-         this.endPublicationTime = state.endPublicationTime;
-         this.visibility = state.visibility;
-         this.pageRef = state.pageRef;
-      }
-
-      public Builder label(String label)
-      {
-         this.label = label;
-         return this;
-      }
-
-      public Builder icon(String icon)
-      {
-         this.icon = icon;
-         return this;
-      }
-
-      public Builder startPublicationTime(long startPublicationTime)
-      {
-         this.startPublicationTime = startPublicationTime;
-         return this;
-      }
-
-      public Builder endPublicationTime(long endPublicationTime)
-      {
-         this.endPublicationTime = endPublicationTime;
-         return this;
-      }
-
-      public Builder visibility(Visibility visibility)
-      {
-         this.visibility = visibility;
-         return this;
-      }
-
-      public Builder pageRef(String pageRef)
-      {
-         this.pageRef = pageRef;
-         return this;
-      }
-
-      public NodeState build()
-      {
-         return new NodeState(
-            label,
-            icon,
-            startPublicationTime,
-            endPublicationTime,
-            visibility,
-            pageRef
-         );
-      }
-   }
-
-   /** . */
-   private final String label;
-
-   /** . */
-   private final String icon;
-
-   /** . */
-   private final long startPublicationTime;
-
-   /** . */
-   private final long endPublicationTime;
-
-   /** . */
-   private final Visibility visibility;
-
-   /** . */
-   private final String pageRef;
-
-   public NodeState(
-      String label,
-      String icon,
-      long startPublicationTime,
-      long endPublicationTime,
-      Visibility visibility,
-      String pageRef)
-   {
-      this.label = label;
-      this.icon = icon;
-      this.startPublicationTime = startPublicationTime;
-      this.endPublicationTime = endPublicationTime;
-      this.visibility = visibility;
-      this.pageRef = pageRef;
-   }
-
-   public String getLabel()
-   {
-      return label;
-   }
-
-   public String getIcon()
-   {
-      return icon;
-   }
-
-   public long getStartPublicationTime()
-   {
-      return startPublicationTime;
-   }
-
-   Date getStartPublicationDate()
-   {
-      return startPublicationTime != -1 ? new Date(startPublicationTime) : null;
-   }
-
-   public long getEndPublicationTime()
-   {
-      return endPublicationTime;
-   }
-
-   Date getEndPublicationDate()
-   {
-      return endPublicationTime != -1 ? new Date(endPublicationTime) : null;
-   }
-
-   public Visibility getVisibility()
-   {
-      return visibility;
-   }
-
-   public String getPageRef()
-   {
-      return pageRef;
-   }
-
-   @Override
-   public boolean equals(Object o)
-   {
-      if (o == this)
-      {
-         return true;
-      }
-      if (o instanceof NodeState)
-      {
-         NodeState that = (NodeState)o;
-         return Safe.equals(label, that.label)
-            && Safe.equals(icon, that.icon)
-            && Safe.equals(startPublicationTime, that.startPublicationTime)
-            && Safe.equals(endPublicationTime, that.endPublicationTime)
-            && Safe.equals(visibility, that.visibility)
-            && Safe.equals(pageRef, that.pageRef);
-      }
-      return false;
-   }
-
-   @Override
-   public String toString()
-   {
-      return "NodeState[label=" + label + ",icon=" + icon + ",startPublicationTime=" + startPublicationTime +
-         ",endPublicationTime=" + endPublicationTime + ",visibility=" + visibility + ",pageRef=" + pageRef + "]";
-   }
-
-   public Builder builder()
-   {
-      return new Builder(this);
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeState.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeState.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeState.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/NodeState.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.commons.utils.Safe;
+import org.exoplatform.portal.mop.Visibility;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * An immutable node state class.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public final class NodeState implements Serializable
+{
+
+   /** . */
+   public static final NodeState INITIAL = new NodeState.Builder().build();
+
+   /**
+    * Builder class.
+    */
+   public static class Builder
+   {
+
+      /** . */
+      private String label;
+
+      /** . */
+      private String icon;
+
+      /** . */
+      private long startPublicationTime;
+
+      /** . */
+      private long endPublicationTime;
+
+      /** . */
+      private Visibility visibility;
+
+      /** . */
+      private String pageRef;
+
+      public Builder()
+      {
+         this.icon = null;
+         this.label = null;
+         this.startPublicationTime = -1;
+         this.endPublicationTime = -1;
+         this.visibility = Visibility.DISPLAYED;
+         this.pageRef = null;
+      }
+
+      /**
+       * Creates a builder from a specified state.
+       *
+       * @param state the state to copy
+       * @throws NullPointerException if the stateis null
+       */
+      public Builder(NodeState state) throws NullPointerException
+      {
+         if (state == null)
+         {
+            throw new NullPointerException();
+         }
+         this.label = state.label;
+         this.icon = state.icon;
+         this.startPublicationTime = state.startPublicationTime;
+         this.endPublicationTime = state.endPublicationTime;
+         this.visibility = state.visibility;
+         this.pageRef = state.pageRef;
+      }
+
+      public Builder label(String label)
+      {
+         this.label = label;
+         return this;
+      }
+
+      public Builder icon(String icon)
+      {
+         this.icon = icon;
+         return this;
+      }
+
+      public Builder startPublicationTime(long startPublicationTime)
+      {
+         this.startPublicationTime = startPublicationTime;
+         return this;
+      }
+
+      public Builder endPublicationTime(long endPublicationTime)
+      {
+         this.endPublicationTime = endPublicationTime;
+         return this;
+      }
+
+      public Builder visibility(Visibility visibility)
+      {
+         this.visibility = visibility;
+         return this;
+      }
+
+      public Builder pageRef(String pageRef)
+      {
+         this.pageRef = pageRef;
+         return this;
+      }
+
+      public NodeState build()
+      {
+         return new NodeState(
+            label,
+            icon,
+            startPublicationTime,
+            endPublicationTime,
+            visibility,
+            pageRef
+         );
+      }
+   }
+
+   /** . */
+   private final String label;
+
+   /** . */
+   private final String icon;
+
+   /** . */
+   private final long startPublicationTime;
+
+   /** . */
+   private final long endPublicationTime;
+
+   /** . */
+   private final Visibility visibility;
+
+   /** . */
+   private final String pageRef;
+
+   public NodeState(
+      String label,
+      String icon,
+      long startPublicationTime,
+      long endPublicationTime,
+      Visibility visibility,
+      String pageRef)
+   {
+      this.label = label;
+      this.icon = icon;
+      this.startPublicationTime = startPublicationTime;
+      this.endPublicationTime = endPublicationTime;
+      this.visibility = visibility;
+      this.pageRef = pageRef;
+   }
+
+   public String getLabel()
+   {
+      return label;
+   }
+
+   public String getIcon()
+   {
+      return icon;
+   }
+
+   public long getStartPublicationTime()
+   {
+      return startPublicationTime;
+   }
+
+   Date getStartPublicationDate()
+   {
+      return startPublicationTime != -1 ? new Date(startPublicationTime) : null;
+   }
+
+   public long getEndPublicationTime()
+   {
+      return endPublicationTime;
+   }
+
+   Date getEndPublicationDate()
+   {
+      return endPublicationTime != -1 ? new Date(endPublicationTime) : null;
+   }
+
+   public Visibility getVisibility()
+   {
+      return visibility;
+   }
+
+   public String getPageRef()
+   {
+      return pageRef;
+   }
+
+   @Override
+   public boolean equals(Object o)
+   {
+      if (o == this)
+      {
+         return true;
+      }
+      if (o instanceof NodeState)
+      {
+         NodeState that = (NodeState)o;
+         return Safe.equals(label, that.label)
+            && Safe.equals(icon, that.icon)
+            && Safe.equals(startPublicationTime, that.startPublicationTime)
+            && Safe.equals(endPublicationTime, that.endPublicationTime)
+            && Safe.equals(visibility, that.visibility)
+            && Safe.equals(pageRef, that.pageRef);
+      }
+      return false;
+   }
+
+   @Override
+   public String toString()
+   {
+      return "NodeState[label=" + label + ",icon=" + icon + ",startPublicationTime=" + startPublicationTime +
+         ",endPublicationTime=" + endPublicationTime + ",visibility=" + visibility + ",pageRef=" + pageRef + "]";
+   }
+
+   public Builder builder()
+   {
+      return new Builder(this);
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Scope.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Scope.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Scope.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-/**
- * <p>The scope describes a set of nodes, the scope implementation should be stateless and should be shared
- * between many threads.</p>
- *
- * <p>A scope is responsible for providing a {@link Visitor} object that is used to determine which nodes are
- * loaded when a loading operation occurs. Visitors are not thread safe, as a consequence the {@link #get()} operation
- * should create a new visitor instance on each call, unless the visitor itself is stateless by nature.</p>
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public interface Scope
-{
-
-   /**
-    * The node without its children.
-    */
-   Scope SINGLE = new GenericScope(0);
-
-   /**
-    * A node and its chidren.
-    */
-   Scope CHILDREN = new GenericScope(1);
-
-   /**
-    * A node, its chidren and grandchildren.
-    */
-   Scope GRANDCHILDREN = new GenericScope(2);
-
-   /**
-    * The entire hierarchy, to use with care.
-    */
-   Scope ALL = new GenericScope(-1);
-
-   Visitor get();
-
-   /**
-    * A scope visitor responsible for determining the loading of a node.
-    */
-   public interface Visitor
-   {
-      /**
-       * Returns the visit mode for the specified node.
-       *
-       * @param depth the relative depth to the root of the loading
-       * @param id the node persistent id
-       * @param name the node name
-       * @param state the node state
-       * @return the visit mode
-       */
-      VisitMode enter(int depth, String id, String name, NodeState state);
-
-      void leave(int depth, String id, String name, NodeState state);
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Scope.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Scope.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Scope.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Scope.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+/**
+ * <p>The scope describes a set of nodes, the scope implementation should be stateless and should be shared
+ * between many threads.</p>
+ *
+ * <p>A scope is responsible for providing a {@link Visitor} object that is used to determine which nodes are
+ * loaded when a loading operation occurs. Visitors are not thread safe, as a consequence the {@link #get()} operation
+ * should create a new visitor instance on each call, unless the visitor itself is stateless by nature.</p>
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public interface Scope
+{
+
+   /**
+    * The node without its children.
+    */
+   Scope SINGLE = new GenericScope(0);
+
+   /**
+    * A node and its chidren.
+    */
+   Scope CHILDREN = new GenericScope(1);
+
+   /**
+    * A node, its chidren and grandchildren.
+    */
+   Scope GRANDCHILDREN = new GenericScope(2);
+
+   /**
+    * The entire hierarchy, to use with care.
+    */
+   Scope ALL = new GenericScope(-1);
+
+   Visitor get();
+
+   /**
+    * A scope visitor responsible for determining the loading of a node.
+    */
+   public interface Visitor
+   {
+      /**
+       * Returns the visit mode for the specified node.
+       *
+       * @param depth the relative depth to the root of the loading
+       * @param id the node persistent id
+       * @param name the node name
+       * @param state the node state
+       * @return the visit mode
+       */
+      VisitMode enter(int depth, String id, String name, NodeState state);
+
+      void leave(int depth, String id, String name, NodeState state);
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/SimpleDataCache.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/SimpleDataCache.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/SimpleDataCache.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.mop.SiteKey;
-import org.exoplatform.portal.pom.config.POMSession;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * A simple implementation for unit testing purpose.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class SimpleDataCache extends DataCache
-{
-
-   /** . */
-   protected Map<SiteKey, NavigationData> navigations;
-
-   /** . */
-   protected Map<String, NodeData> nodes;
-
-   public SimpleDataCache()
-   {
-      this.navigations = new ConcurrentHashMap<SiteKey, NavigationData>();
-      this.nodes = new ConcurrentHashMap<String, NodeData>();
-   }
-
-   @Override
-   protected void removeNodes(Collection<String> keys)
-   {
-      nodes.keySet().removeAll(keys);
-   }
-
-   @Override
-   protected NodeData getNode(POMSession session, String key)
-   {
-      NodeData node = nodes.get(key);
-      if (node == null)
-      {
-         node = loadNode(session, key);
-         if (node != null)
-         {
-            nodes.put(key, node);
-         }
-      }
-      return node;
-   }
-
-   @Override
-   protected void removeNavigation(SiteKey key)
-   {
-      navigations.remove(key);
-   }
-
-   @Override
-   protected NavigationData getNavigation(POMSession session, SiteKey key)
-   {
-      NavigationData navigation = navigations.get(key);
-      if (navigation == null)
-      {
-         navigation = loadNavigation(session, key);
-         if (navigation != null)
-         {
-            navigations.put(key, navigation);
-         }
-      }
-      return navigations.get(key);
-   }
-
-   @Override
-   protected void clear()
-   {
-      navigations.clear();
-      nodes.clear();
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/SimpleDataCache.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/SimpleDataCache.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/SimpleDataCache.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/SimpleDataCache.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.pom.config.POMSession;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * A simple implementation for unit testing purpose.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class SimpleDataCache extends DataCache
+{
+
+   /** . */
+   protected Map<SiteKey, NavigationData> navigations;
+
+   /** . */
+   protected Map<String, NodeData> nodes;
+
+   public SimpleDataCache()
+   {
+      this.navigations = new ConcurrentHashMap<SiteKey, NavigationData>();
+      this.nodes = new ConcurrentHashMap<String, NodeData>();
+   }
+
+   @Override
+   protected void removeNodes(Collection<String> keys)
+   {
+      nodes.keySet().removeAll(keys);
+   }
+
+   @Override
+   protected NodeData getNode(POMSession session, String key)
+   {
+      NodeData node = nodes.get(key);
+      if (node == null)
+      {
+         node = loadNode(session, key);
+         if (node != null)
+         {
+            nodes.put(key, node);
+         }
+      }
+      return node;
+   }
+
+   @Override
+   protected void removeNavigation(SiteKey key)
+   {
+      navigations.remove(key);
+   }
+
+   @Override
+   protected NavigationData getNavigation(POMSession session, SiteKey key)
+   {
+      NavigationData navigation = navigations.get(key);
+      if (navigation == null)
+      {
+         navigation = loadNavigation(session, key);
+         if (navigation != null)
+         {
+            navigations.put(key, navigation);
+         }
+      }
+      return navigations.get(key);
+   }
+
+   @Override
+   protected void clear()
+   {
+      navigations.clear();
+      nodes.clear();
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeContext.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeContext.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeContext.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,287 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-
-/**
- * <p>The context of a tree, that performs:
- * <ul>
- *    <li>holding the list of pending changes</li>
- *    <li>keep a reference to the {@link NodeModel}</li>
- *    <li>hold a sequence for providing id for transient contexts</li>
- *    <li>hold the root context</li>
- * </ul>
- * </p>
- *
- * <p>The class implements the {@link Scope.Visitor} and defines a scope describing the actual content
- * of the context tree.</p>
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-class TreeContext<N> implements Scope.Visitor, NodeChangeListener<NodeContext<N>>
-{
-
-   /** . */
-   private NodeChangeQueue<NodeContext<N>> changes;
-
-   /** . */
-   final NodeModel<N> model;
-
-   /** . */
-   boolean editMode;
-
-   /** . */
-   int sequence;
-
-   /** . */
-   final NodeContext<N> root;
-
-   TreeContext(NodeModel<N> model, NodeContext<N> root)
-   {
-      this.model = model;
-      this.editMode = false;
-      this.sequence =  0;
-      this.root = root;
-   }
-
-   public NodeChangeQueue<NodeContext<N>> getChanges()
-   {
-      return changes;
-   }
-
-   // Improve that method if we can
-   Scope.Visitor origin()
-   {
-
-      final Map<String, Boolean> map = new HashMap<String, Boolean>();
-
-      //
-      populate(map, root);
-
-      //
-      if (changes != null)
-      {
-         ListIterator<NodeChange<NodeContext<N>>> it = changes.listIterator(changes.size());
-         while (it.hasPrevious())
-         {
-            NodeChange<NodeContext<N>> change = it.previous();
-            if (change instanceof NodeChange.Created<?>)
-            {
-               NodeChange.Created<NodeContext<N>> created = (NodeChange.Created<NodeContext<N>>)change;
-               map.remove(created.target.handle);
-            }
-            else if (change instanceof NodeChange.Destroyed<?>)
-            {
-               NodeChange.Destroyed<NodeContext<N>> destroyed = (NodeChange.Destroyed<NodeContext<N>>)change;
-               map.put(destroyed.target.handle, Boolean.TRUE);
-            }
-         }
-      }
-
-      //
-      return new Scope.Visitor()
-      {
-         public VisitMode enter(int depth, String id, String name, NodeState state)
-         {
-            return map.containsKey(id) ? VisitMode.ALL_CHILDREN : VisitMode.NO_CHILDREN;
-         }
-         public void leave(int depth, String id, String name, NodeState state)
-         {
-         }
-      };
-   }
-
-   private void populate(Map<String, Boolean> map, NodeContext<N> ctx)
-   {
-      if (ctx.isExpanded())
-      {
-         map.put(ctx.handle, Boolean.TRUE);
-         for (NodeContext<N> current = ctx.getFirst();current != null;current = current.getNext())
-         {
-            populate(map, current);
-         }
-      }
-   }
-
-   void addChange(NodeChange<NodeContext<N>> change)
-   {
-      if (editMode)
-      {
-         throw new AssertionError();
-      }
-      if (changes == null)
-      {
-         changes = new NodeChangeQueue<NodeContext<N>>();
-      }
-
-      //
-      if (change.target.tree != this)
-      {
-         // Normally should be done for all arguments depending on the change type
-         throw new AssertionError("Ensure we are not mixing badly things");
-      }
-
-      // Perform state modification here
-      if (change instanceof NodeChange.Renamed<?>)
-      {
-         NodeChange.Renamed<NodeContext<N>> renamed = (NodeChange.Renamed<NodeContext<N>>)change;
-         renamed.target.name = renamed.name;
-      }
-      else if (change instanceof NodeChange.Created<?>)
-      {
-         NodeChange.Created<NodeContext<N>> added = (NodeChange.Created<NodeContext<N>>)change;
-         if (added.previous != null)
-         {
-            added.previous.insertAfter(added.target);
-         }
-         else
-         {
-            added.parent.insertAt(0, added.target);
-         }
-      }
-      else if (change instanceof NodeChange.Moved<?>)
-      {
-         NodeChange.Moved<NodeContext<N>> moved = (NodeChange.Moved<NodeContext<N>>)change;
-         if (moved.previous != null)
-         {
-            moved.previous.insertAfter(moved.target);
-         }
-         else
-         {
-            moved.to.insertAt(0, moved.target);
-         }
-      }
-      else if (change instanceof NodeChange.Destroyed<?>)
-      {
-         NodeChange.Destroyed<NodeContext<N>> removed = (NodeChange.Destroyed<NodeContext<N>>)change;
-         removed.target.remove();
-      }
-      else if (change instanceof NodeChange.Updated<?>)
-      {
-         NodeChange.Updated<NodeContext<N>> updated = (NodeChange.Updated<NodeContext<N>>)change;
-         updated.target.state = updated.state;
-      }
-
-      //
-      changes.addLast(change);
-   }
-
-   boolean hasChanges() {
-      return changes != null && changes.size() > 0;
-   }
-
-   List<NodeChange<NodeContext<N>>> peekChanges()
-   {
-      if (hasChanges())
-      {
-         return changes;
-      }
-      else
-      {
-         return Collections.emptyList();
-      }
-   }
-
-   List<NodeChange<NodeContext<N>>> popChanges()
-   {
-      if (hasChanges())
-      {
-         LinkedList<NodeChange<NodeContext<N>>> tmp = changes;
-         changes = null;
-         return tmp;
-      }
-      else
-      {
-         return Collections.emptyList();
-      }
-   }
-
-   NodeContext<N> getNode(String handle)
-   {
-      return root.getDescendant(handle);
-   }
-
-   NodeContext<N> create(String handle, String name, NodeState state)
-   {
-      return new NodeContext<N>(this, handle, name, state, true);
-   }
-   // Scope.Visitor implementation -------------------------------------------------------------------------------------
-
-   public VisitMode enter(int depth, String id, String name, NodeState state)
-   {
-      NodeContext<N> descendant = root.getDescendant(id);
-      if (descendant != null)
-      {
-         return descendant.isExpanded() ? VisitMode.ALL_CHILDREN : VisitMode.NO_CHILDREN;
-      }
-      else
-      {
-         return VisitMode.NO_CHILDREN;
-      }
-   }
-
-   public void leave(int depth, String id, String name, NodeState state)
-   {
-   }
-   
-   //
-
-
-   public void onCreate(NodeContext<N> target, NodeContext<N> parent, NodeContext<N> previous, String name) throws NavigationServiceException
-   {
-      addChange(new NodeChange.Created<NodeContext<N>>(parent, previous, target, name));
-   }
-
-   public void onDestroy(NodeContext<N> target, NodeContext<N> parent)
-   {
-      addChange(new NodeChange.Destroyed<NodeContext<N>>(parent, target));
-   }
-
-   public void onRename(NodeContext<N> target, NodeContext<N> parent, String name) throws NavigationServiceException
-   {
-      addChange(new NodeChange.Renamed<NodeContext<N>>(parent, target, name));
-   }
-
-   public void onUpdate(NodeContext<N> target, NodeState state) throws NavigationServiceException
-   {
-      addChange(new NodeChange.Updated<NodeContext<N>>(target, state));
-   }
-
-   public void onMove(NodeContext<N> target, NodeContext<N> from, NodeContext<N> to, NodeContext<N> previous) throws NavigationServiceException
-   {
-      addChange(new NodeChange.Moved<NodeContext<N>>(from, to, previous, target));
-   }
-
-   public void onAdd(NodeContext<N> target, NodeContext<N> parent, NodeContext<N> previous)
-   {
-      throw new UnsupportedOperationException();
-   }
-
-   public void onRemove(NodeContext<N> target, NodeContext<N> parent)
-   {
-      throw new UnsupportedOperationException();
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeContext.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeContext.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeContext.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeContext.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,287 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+
+/**
+ * <p>The context of a tree, that performs:
+ * <ul>
+ *    <li>holding the list of pending changes</li>
+ *    <li>keep a reference to the {@link NodeModel}</li>
+ *    <li>hold a sequence for providing id for transient contexts</li>
+ *    <li>hold the root context</li>
+ * </ul>
+ * </p>
+ *
+ * <p>The class implements the {@link Scope.Visitor} and defines a scope describing the actual content
+ * of the context tree.</p>
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+class TreeContext<N> implements Scope.Visitor, NodeChangeListener<NodeContext<N>>
+{
+
+   /** . */
+   private NodeChangeQueue<NodeContext<N>> changes;
+
+   /** . */
+   final NodeModel<N> model;
+
+   /** . */
+   boolean editMode;
+
+   /** . */
+   int sequence;
+
+   /** . */
+   final NodeContext<N> root;
+
+   TreeContext(NodeModel<N> model, NodeContext<N> root)
+   {
+      this.model = model;
+      this.editMode = false;
+      this.sequence =  0;
+      this.root = root;
+   }
+
+   public NodeChangeQueue<NodeContext<N>> getChanges()
+   {
+      return changes;
+   }
+
+   // Improve that method if we can
+   Scope.Visitor origin()
+   {
+
+      final Map<String, Boolean> map = new HashMap<String, Boolean>();
+
+      //
+      populate(map, root);
+
+      //
+      if (changes != null)
+      {
+         ListIterator<NodeChange<NodeContext<N>>> it = changes.listIterator(changes.size());
+         while (it.hasPrevious())
+         {
+            NodeChange<NodeContext<N>> change = it.previous();
+            if (change instanceof NodeChange.Created<?>)
+            {
+               NodeChange.Created<NodeContext<N>> created = (NodeChange.Created<NodeContext<N>>)change;
+               map.remove(created.target.handle);
+            }
+            else if (change instanceof NodeChange.Destroyed<?>)
+            {
+               NodeChange.Destroyed<NodeContext<N>> destroyed = (NodeChange.Destroyed<NodeContext<N>>)change;
+               map.put(destroyed.target.handle, Boolean.TRUE);
+            }
+         }
+      }
+
+      //
+      return new Scope.Visitor()
+      {
+         public VisitMode enter(int depth, String id, String name, NodeState state)
+         {
+            return map.containsKey(id) ? VisitMode.ALL_CHILDREN : VisitMode.NO_CHILDREN;
+         }
+         public void leave(int depth, String id, String name, NodeState state)
+         {
+         }
+      };
+   }
+
+   private void populate(Map<String, Boolean> map, NodeContext<N> ctx)
+   {
+      if (ctx.isExpanded())
+      {
+         map.put(ctx.handle, Boolean.TRUE);
+         for (NodeContext<N> current = ctx.getFirst();current != null;current = current.getNext())
+         {
+            populate(map, current);
+         }
+      }
+   }
+
+   void addChange(NodeChange<NodeContext<N>> change)
+   {
+      if (editMode)
+      {
+         throw new AssertionError();
+      }
+      if (changes == null)
+      {
+         changes = new NodeChangeQueue<NodeContext<N>>();
+      }
+
+      //
+      if (change.target.tree != this)
+      {
+         // Normally should be done for all arguments depending on the change type
+         throw new AssertionError("Ensure we are not mixing badly things");
+      }
+
+      // Perform state modification here
+      if (change instanceof NodeChange.Renamed<?>)
+      {
+         NodeChange.Renamed<NodeContext<N>> renamed = (NodeChange.Renamed<NodeContext<N>>)change;
+         renamed.target.name = renamed.name;
+      }
+      else if (change instanceof NodeChange.Created<?>)
+      {
+         NodeChange.Created<NodeContext<N>> added = (NodeChange.Created<NodeContext<N>>)change;
+         if (added.previous != null)
+         {
+            added.previous.insertAfter(added.target);
+         }
+         else
+         {
+            added.parent.insertAt(0, added.target);
+         }
+      }
+      else if (change instanceof NodeChange.Moved<?>)
+      {
+         NodeChange.Moved<NodeContext<N>> moved = (NodeChange.Moved<NodeContext<N>>)change;
+         if (moved.previous != null)
+         {
+            moved.previous.insertAfter(moved.target);
+         }
+         else
+         {
+            moved.to.insertAt(0, moved.target);
+         }
+      }
+      else if (change instanceof NodeChange.Destroyed<?>)
+      {
+         NodeChange.Destroyed<NodeContext<N>> removed = (NodeChange.Destroyed<NodeContext<N>>)change;
+         removed.target.remove();
+      }
+      else if (change instanceof NodeChange.Updated<?>)
+      {
+         NodeChange.Updated<NodeContext<N>> updated = (NodeChange.Updated<NodeContext<N>>)change;
+         updated.target.state = updated.state;
+      }
+
+      //
+      changes.addLast(change);
+   }
+
+   boolean hasChanges() {
+      return changes != null && changes.size() > 0;
+   }
+
+   List<NodeChange<NodeContext<N>>> peekChanges()
+   {
+      if (hasChanges())
+      {
+         return changes;
+      }
+      else
+      {
+         return Collections.emptyList();
+      }
+   }
+
+   List<NodeChange<NodeContext<N>>> popChanges()
+   {
+      if (hasChanges())
+      {
+         LinkedList<NodeChange<NodeContext<N>>> tmp = changes;
+         changes = null;
+         return tmp;
+      }
+      else
+      {
+         return Collections.emptyList();
+      }
+   }
+
+   NodeContext<N> getNode(String handle)
+   {
+      return root.getDescendant(handle);
+   }
+
+   NodeContext<N> create(String handle, String name, NodeState state)
+   {
+      return new NodeContext<N>(this, handle, name, state, true);
+   }
+   // Scope.Visitor implementation -------------------------------------------------------------------------------------
+
+   public VisitMode enter(int depth, String id, String name, NodeState state)
+   {
+      NodeContext<N> descendant = root.getDescendant(id);
+      if (descendant != null)
+      {
+         return descendant.isExpanded() ? VisitMode.ALL_CHILDREN : VisitMode.NO_CHILDREN;
+      }
+      else
+      {
+         return VisitMode.NO_CHILDREN;
+      }
+   }
+
+   public void leave(int depth, String id, String name, NodeState state)
+   {
+   }
+   
+   //
+
+
+   public void onCreate(NodeContext<N> target, NodeContext<N> parent, NodeContext<N> previous, String name) throws NavigationServiceException
+   {
+      addChange(new NodeChange.Created<NodeContext<N>>(parent, previous, target, name));
+   }
+
+   public void onDestroy(NodeContext<N> target, NodeContext<N> parent)
+   {
+      addChange(new NodeChange.Destroyed<NodeContext<N>>(parent, target));
+   }
+
+   public void onRename(NodeContext<N> target, NodeContext<N> parent, String name) throws NavigationServiceException
+   {
+      addChange(new NodeChange.Renamed<NodeContext<N>>(parent, target, name));
+   }
+
+   public void onUpdate(NodeContext<N> target, NodeState state) throws NavigationServiceException
+   {
+      addChange(new NodeChange.Updated<NodeContext<N>>(target, state));
+   }
+
+   public void onMove(NodeContext<N> target, NodeContext<N> from, NodeContext<N> to, NodeContext<N> previous) throws NavigationServiceException
+   {
+      addChange(new NodeChange.Moved<NodeContext<N>>(from, to, previous, target));
+   }
+
+   public void onAdd(NodeContext<N> target, NodeContext<N> parent, NodeContext<N> previous)
+   {
+      throw new UnsupportedOperationException();
+   }
+
+   public void onRemove(NodeContext<N> target, NodeContext<N> parent)
+   {
+      throw new UnsupportedOperationException();
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeMerge.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeMerge.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeMerge.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-class TreeMerge<N> extends NodeChangeListener.Base<NodeContext<N>>
-{
-
-   /** . */
-   private final TreeContext<N> merged;
-
-   /** . */
-   private final NodeChangeListener<NodeContext<N>> next;
-
-   TreeMerge(TreeContext<N> merged, NodeChangeListener<NodeContext<N>> next)
-   {
-      this.merged = merged;
-      this.next = next;
-   }
-
-   public void onCreate(NodeContext<N> target, NodeContext<N> _parent, NodeContext<N> _previous, String name) throws NavigationServiceException
-   {
-      String parentHandle = _parent.handle;
-      NodeContext<N> parent = merged.getNode(parentHandle);
-      if (parent == null)
-      {
-         throw new NavigationServiceException(NavigationError.ADD_CONCURRENTLY_REMOVED_PARENT_NODE);
-      }
-
-      //
-      NodeContext<N> previous;
-      if (_previous != null)
-      {
-         previous = merged.getNode(_previous.handle);
-         if (previous == null)
-         {
-            throw new NavigationServiceException(NavigationError.ADD_CONCURRENTLY_REMOVED_PREVIOUS_NODE);
-         }
-      }
-      else
-      {
-         previous = null;
-      }
-
-      //
-      NodeContext<N> added = parent.get(name);
-      if (added != null)
-      {
-         throw new NavigationServiceException(NavigationError.ADD_CONCURRENTLY_ADDED_NODE);
-      }
-
-      //
-      NodeContext<N> source = merged.create(target.handle, name, target.getState());
-
-      //
-      next.onCreate(source, parent, previous, name);
-   }
-
-   public void onDestroy(NodeContext<N> target, NodeContext<N> _parent)
-   {
-      NodeContext<N> removed = merged.getNode(target.handle);
-
-      //
-      if (removed != null)
-      {
-         NodeContext<N> parent = merged.getNode(_parent.handle);
-         next.onDestroy(removed, parent);
-      }
-   }
-
-   public void onRename(NodeContext<N> target, NodeContext<N> _parent, String _name) throws NavigationServiceException
-   {
-      //
-      String renamedHandle = target.handle;
-      NodeContext<N> renamed = merged.getNode(renamedHandle);
-      if (renamed == null)
-      {
-         throw new NavigationServiceException(NavigationError.RENAME_CONCURRENTLY_REMOVED_NODE);
-      }
-
-      //
-      NodeContext<N> parent = renamed.getParent();
-      if (parent.get(_name) != null)
-      {
-         throw new NavigationServiceException(NavigationError.RENAME_CONCURRENTLY_DUPLICATE_NAME);
-      }
-
-      //
-      next.onRename(renamed, parent, _name);
-   }
-
-   public void onUpdate(NodeContext<N> target, NodeState state) throws NavigationServiceException
-   {
-      String updatedHandle = target.handle;
-      NodeContext<N> navigation = merged.getNode(updatedHandle);
-      if (navigation == null)
-      {
-         throw new NavigationServiceException(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE);
-      }
-
-      //
-      next.onUpdate(navigation, state);
-   }
-
-   public void onMove(NodeContext<N> target, NodeContext<N> _from, NodeContext<N> _to, NodeContext<N> _previous) throws NavigationServiceException
-   {
-      String srcHandle = _from.handle;
-      NodeContext<N> src = merged.getNode(srcHandle);
-      if (src == null)
-      {
-         throw new NavigationServiceException(NavigationError.MOVE_CONCURRENTLY_REMOVED_SRC_NODE);
-      }
-
-      //
-      String dstHandle = _to.handle;
-      NodeContext<N> dst = merged.getNode(dstHandle);
-      if (dst == null)
-      {
-         throw new NavigationServiceException(NavigationError.MOVE_CONCURRENTLY_REMOVED_DST_NODE);
-      }
-
-      //
-      String movedHandle = target.handle;
-      NodeContext<N> moved = merged.getNode(movedHandle);
-      if (moved == null)
-      {
-         throw new NavigationServiceException(NavigationError.MOVE_CONCURRENTLY_REMOVED_MOVED_NODE);
-      }
-
-      //
-      NodeContext<N> previous;
-      if (_previous != null)
-      {
-         previous = merged.getNode(_previous.handle);
-         if (previous == null)
-         {
-            throw new NavigationServiceException(NavigationError.MOVE_CONCURRENTLY_REMOVED_PREVIOUS_NODE);
-         }
-      }
-      else
-      {
-         previous = null;
-      }
-
-      //
-      if (src != moved.getParent())
-      {
-         throw new NavigationServiceException(NavigationError.MOVE_CONCURRENTLY_CHANGED_SRC_NODE);
-      }
-
-      //
-      if (src != dst)
-      {
-         String name = moved.getName();
-         NodeContext<N> existing = dst.get(name);
-         if (existing != null)
-         {
-            throw new NavigationServiceException(NavigationError.MOVE_CONCURRENTLY_DUPLICATE_NAME);
-         }
-      }
-
-      //
-      next.onMove(moved, src, dst, previous);
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeMerge.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeMerge.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeMerge.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeMerge.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+class TreeMerge<N> extends NodeChangeListener.Base<NodeContext<N>>
+{
+
+   /** . */
+   private final TreeContext<N> merged;
+
+   /** . */
+   private final NodeChangeListener<NodeContext<N>> next;
+
+   TreeMerge(TreeContext<N> merged, NodeChangeListener<NodeContext<N>> next)
+   {
+      this.merged = merged;
+      this.next = next;
+   }
+
+   public void onCreate(NodeContext<N> target, NodeContext<N> _parent, NodeContext<N> _previous, String name) throws NavigationServiceException
+   {
+      String parentHandle = _parent.handle;
+      NodeContext<N> parent = merged.getNode(parentHandle);
+      if (parent == null)
+      {
+         throw new NavigationServiceException(NavigationError.ADD_CONCURRENTLY_REMOVED_PARENT_NODE);
+      }
+
+      //
+      NodeContext<N> previous;
+      if (_previous != null)
+      {
+         previous = merged.getNode(_previous.handle);
+         if (previous == null)
+         {
+            throw new NavigationServiceException(NavigationError.ADD_CONCURRENTLY_REMOVED_PREVIOUS_NODE);
+         }
+      }
+      else
+      {
+         previous = null;
+      }
+
+      //
+      NodeContext<N> added = parent.get(name);
+      if (added != null)
+      {
+         throw new NavigationServiceException(NavigationError.ADD_CONCURRENTLY_ADDED_NODE);
+      }
+
+      //
+      NodeContext<N> source = merged.create(target.handle, name, target.getState());
+
+      //
+      next.onCreate(source, parent, previous, name);
+   }
+
+   public void onDestroy(NodeContext<N> target, NodeContext<N> _parent)
+   {
+      NodeContext<N> removed = merged.getNode(target.handle);
+
+      //
+      if (removed != null)
+      {
+         NodeContext<N> parent = merged.getNode(_parent.handle);
+         next.onDestroy(removed, parent);
+      }
+   }
+
+   public void onRename(NodeContext<N> target, NodeContext<N> _parent, String _name) throws NavigationServiceException
+   {
+      //
+      String renamedHandle = target.handle;
+      NodeContext<N> renamed = merged.getNode(renamedHandle);
+      if (renamed == null)
+      {
+         throw new NavigationServiceException(NavigationError.RENAME_CONCURRENTLY_REMOVED_NODE);
+      }
+
+      //
+      NodeContext<N> parent = renamed.getParent();
+      if (parent.get(_name) != null)
+      {
+         throw new NavigationServiceException(NavigationError.RENAME_CONCURRENTLY_DUPLICATE_NAME);
+      }
+
+      //
+      next.onRename(renamed, parent, _name);
+   }
+
+   public void onUpdate(NodeContext<N> target, NodeState state) throws NavigationServiceException
+   {
+      String updatedHandle = target.handle;
+      NodeContext<N> navigation = merged.getNode(updatedHandle);
+      if (navigation == null)
+      {
+         throw new NavigationServiceException(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE);
+      }
+
+      //
+      next.onUpdate(navigation, state);
+   }
+
+   public void onMove(NodeContext<N> target, NodeContext<N> _from, NodeContext<N> _to, NodeContext<N> _previous) throws NavigationServiceException
+   {
+      String srcHandle = _from.handle;
+      NodeContext<N> src = merged.getNode(srcHandle);
+      if (src == null)
+      {
+         throw new NavigationServiceException(NavigationError.MOVE_CONCURRENTLY_REMOVED_SRC_NODE);
+      }
+
+      //
+      String dstHandle = _to.handle;
+      NodeContext<N> dst = merged.getNode(dstHandle);
+      if (dst == null)
+      {
+         throw new NavigationServiceException(NavigationError.MOVE_CONCURRENTLY_REMOVED_DST_NODE);
+      }
+
+      //
+      String movedHandle = target.handle;
+      NodeContext<N> moved = merged.getNode(movedHandle);
+      if (moved == null)
+      {
+         throw new NavigationServiceException(NavigationError.MOVE_CONCURRENTLY_REMOVED_MOVED_NODE);
+      }
+
+      //
+      NodeContext<N> previous;
+      if (_previous != null)
+      {
+         previous = merged.getNode(_previous.handle);
+         if (previous == null)
+         {
+            throw new NavigationServiceException(NavigationError.MOVE_CONCURRENTLY_REMOVED_PREVIOUS_NODE);
+         }
+      }
+      else
+      {
+         previous = null;
+      }
+
+      //
+      if (src != moved.getParent())
+      {
+         throw new NavigationServiceException(NavigationError.MOVE_CONCURRENTLY_CHANGED_SRC_NODE);
+      }
+
+      //
+      if (src != dst)
+      {
+         String name = moved.getName();
+         NodeContext<N> existing = dst.get(name);
+         if (existing != null)
+         {
+            throw new NavigationServiceException(NavigationError.MOVE_CONCURRENTLY_DUPLICATE_NAME);
+         }
+      }
+
+      //
+      next.onMove(moved, src, dst, previous);
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdate.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdate.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdate.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,294 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.tree.diff.Adapters;
-import org.exoplatform.portal.tree.diff.HierarchyAdapter;
-import org.exoplatform.portal.tree.diff.HierarchyChangeIterator;
-import org.exoplatform.portal.tree.diff.HierarchyChangeType;
-import org.exoplatform.portal.tree.diff.HierarchyDiff;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-class TreeUpdate<N1, N2>
-{
-
-   static <N1, N2> void perform(
-      TreeContext<N1> src,
-      HierarchyAdapter<String[], NodeContext<N1>, String> srcAdatper,
-      N2 dst,
-      TreeUpdateAdapter<N2> updateAdapter,
-      NodeChangeListener<NodeContext<N1>> listener,
-      Scope.Visitor visitor)
-   {
-
-      TreeUpdate<N1, N2> update = new TreeUpdate<N1, N2>(
-         src,
-         srcAdatper,
-         dst,
-         updateAdapter,
-         listener,
-         visitor
-      );
-
-      //
-      update.perform();
-   }
-
-   private TreeUpdate(
-      TreeContext<N1> src,
-      HierarchyAdapter<String[], NodeContext<N1>, String> srcAdatper,
-      N2 dst,
-      TreeUpdateAdapter<N2> updateAdapter,
-      NodeChangeListener<NodeContext<N1>> listener,
-      Scope.Visitor visitor)
-   {
-
-      // We create the diff object
-      HierarchyDiff<String[], NodeContext<N1>, String[], N2, String> diff = HierarchyDiff.create(
-         Adapters.<String>list(),
-         srcAdatper,
-         Adapters.<String>list(),
-         updateAdapter,
-         Utils.<String>comparator());
-
-      // We obtain the iterator
-      HierarchyChangeIterator<String[], NodeContext<N1>, String[], N2, String> it = diff.iterator(src.root, dst);
-
-      //
-      this.it = it;
-      this.updateAdapter = updateAdapter;
-      this.visitor = visitor;
-      this.depth = 0;
-      this.last = null;
-      this.listener = listener;
-   }
-
-   /** . */
-   private final HierarchyChangeIterator<String[], NodeContext<N1>, String[], N2, String> it;
-
-   /** . */
-   private final TreeUpdateAdapter<N2> updateAdapter;
-
-   /** . */
-   private final Scope.Visitor visitor;
-
-   /** . */
-   private int depth;
-
-   /** . */
-   private NodeContext<N1> last;
-
-   /** . */
-   private NodeChangeListener<NodeContext<N1>> listener;
-
-   private void perform()
-   {
-
-      // Consume the first ENTER that we won't skip
-      HierarchyChangeType change = it.next();
-
-      // Start recursion
-      perform(it.getSource());
-   }
-
-   private void perform(NodeContext<N1> parent)
-   {
-      // Compute visit
-      VisitMode visit = null;
-      N2 d = it.getDestination();
-      NodeData data = updateAdapter.getData(d);
-
-      //
-      if (data != null)
-      {
-         visit = visitor.enter(depth, data.id, data.name, data.state);
-      }
-
-      // Cut the recursion if necessary
-      if (visit != VisitMode.ALL_CHILDREN)
-      {
-         it.skip();
-
-         // Consume leave
-         it.next();
-      }
-      else
-      {
-         depth++;
-
-         // Expand if needed
-         if (!parent.isExpanded())
-         {
-            parent.expand();
-         }
-
-         //
-         while (true)
-         {
-            HierarchyChangeType change = it.next();
-            if (change == HierarchyChangeType.LEAVE)
-            {
-               // End recursion here
-               break;
-            }
-            else
-            {
-               if (change == HierarchyChangeType.KEEP)
-               {
-                  // Consume ENTER
-                  it.next();
-
-                  // Recurse
-                  perform(it.getSource());
-               }
-               else if (change == HierarchyChangeType.ADDED)
-               {
-                  // Consume ENTER
-                  it.next();
-
-                  //
-                  NodeContext<N1> previous;
-                  NodeContext<N1> added;
-                  NodeData addedData = updateAdapter.getData(it.getDestination());
-                  if (last == null || last.getParent() != parent)
-                  {
-                     previous = null;
-                     added = parent.insertAt(0, addedData);
-                  }
-                  else
-                  {
-                     previous = last;
-                     added = last.insertAfter(addedData);
-                  }
-
-                  //
-                  if (listener != null)
-                  {
-                     listener.onAdd(
-                        added,
-                        parent,
-                        previous);
-                  }
-
-                  // Recurse
-                  perform(added);
-               }
-               else if (change == HierarchyChangeType.MOVED_IN)
-               {
-                  // Consume ENTER
-                  it.next();
-
-
-                  //
-                  NodeContext<N1> to = parent;
-                  NodeContext<N1> moved = it.getSource();
-                  NodeContext<N1> from = moved.getParent();
-                  NodeContext<N1> previous;
-                  if (last == null || last.getParent() != parent)
-                  {
-                     previous = null;
-                     to.insertAt(0, moved);
-                  }
-                  else
-                  {
-                     previous = last;
-                     last.insertAfter(moved);
-                  }
-
-                  //
-                  if (listener != null)
-                  {
-                     listener.onMove(
-                        moved,
-                        from,
-                        to,
-                        previous != null ? previous : null);
-                  }
-
-                  // Recurse
-                  perform(it.getSource());
-               }
-               else if (change == HierarchyChangeType.MOVED_OUT)
-               {
-                  // Do nothing
-               }
-               else if (change == HierarchyChangeType.REMOVED)
-               {
-                  NodeContext<N1> removed = it.getSource();
-                  NodeContext<N1> removedParent = removed.getParent();
-
-                  //
-                  removed.remove();
-
-                  //
-                  if (listener != null)
-                  {
-                     listener.onRemove(
-                        removed,
-                        removedParent);
-                  }
-               }
-               else
-               {
-                  throw new UnsupportedOperationException("Not supported " + change);
-               }
-            }
-         }
-
-         //
-         depth--;
-      }
-
-      //
-      if (data != null)
-      {
-         if (!parent.data.state.equals(data.state))
-         {
-            if (listener != null)
-            {
-               listener.onUpdate(parent,  data.state);
-            }
-         }
-
-         //
-         if (!parent.data.name.equals(data.name))
-         {
-            parent.name = data.name;
-            if (listener != null)
-            {
-               listener.onRename(parent, parent.getParent(), data.name);
-            }
-         }
-
-         //
-         parent.state = updateAdapter.getState(d);
-         parent.name = updateAdapter.getName(d);
-         parent.data = data;
-
-         //
-         visitor.leave(depth, data.id, data.name, data.state);
-      }
-
-      //
-      last = parent;
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdate.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdate.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdate.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdate.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,294 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.tree.diff.Adapters;
+import org.exoplatform.portal.tree.diff.HierarchyAdapter;
+import org.exoplatform.portal.tree.diff.HierarchyChangeIterator;
+import org.exoplatform.portal.tree.diff.HierarchyChangeType;
+import org.exoplatform.portal.tree.diff.HierarchyDiff;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+class TreeUpdate<N1, N2>
+{
+
+   static <N1, N2> void perform(
+      TreeContext<N1> src,
+      HierarchyAdapter<String[], NodeContext<N1>, String> srcAdatper,
+      N2 dst,
+      TreeUpdateAdapter<N2> updateAdapter,
+      NodeChangeListener<NodeContext<N1>> listener,
+      Scope.Visitor visitor)
+   {
+
+      TreeUpdate<N1, N2> update = new TreeUpdate<N1, N2>(
+         src,
+         srcAdatper,
+         dst,
+         updateAdapter,
+         listener,
+         visitor
+      );
+
+      //
+      update.perform();
+   }
+
+   private TreeUpdate(
+      TreeContext<N1> src,
+      HierarchyAdapter<String[], NodeContext<N1>, String> srcAdatper,
+      N2 dst,
+      TreeUpdateAdapter<N2> updateAdapter,
+      NodeChangeListener<NodeContext<N1>> listener,
+      Scope.Visitor visitor)
+   {
+
+      // We create the diff object
+      HierarchyDiff<String[], NodeContext<N1>, String[], N2, String> diff = HierarchyDiff.create(
+         Adapters.<String>list(),
+         srcAdatper,
+         Adapters.<String>list(),
+         updateAdapter,
+         Utils.<String>comparator());
+
+      // We obtain the iterator
+      HierarchyChangeIterator<String[], NodeContext<N1>, String[], N2, String> it = diff.iterator(src.root, dst);
+
+      //
+      this.it = it;
+      this.updateAdapter = updateAdapter;
+      this.visitor = visitor;
+      this.depth = 0;
+      this.last = null;
+      this.listener = listener;
+   }
+
+   /** . */
+   private final HierarchyChangeIterator<String[], NodeContext<N1>, String[], N2, String> it;
+
+   /** . */
+   private final TreeUpdateAdapter<N2> updateAdapter;
+
+   /** . */
+   private final Scope.Visitor visitor;
+
+   /** . */
+   private int depth;
+
+   /** . */
+   private NodeContext<N1> last;
+
+   /** . */
+   private NodeChangeListener<NodeContext<N1>> listener;
+
+   private void perform()
+   {
+
+      // Consume the first ENTER that we won't skip
+      HierarchyChangeType change = it.next();
+
+      // Start recursion
+      perform(it.getSource());
+   }
+
+   private void perform(NodeContext<N1> parent)
+   {
+      // Compute visit
+      VisitMode visit = null;
+      N2 d = it.getDestination();
+      NodeData data = updateAdapter.getData(d);
+
+      //
+      if (data != null)
+      {
+         visit = visitor.enter(depth, data.id, data.name, data.state);
+      }
+
+      // Cut the recursion if necessary
+      if (visit != VisitMode.ALL_CHILDREN)
+      {
+         it.skip();
+
+         // Consume leave
+         it.next();
+      }
+      else
+      {
+         depth++;
+
+         // Expand if needed
+         if (!parent.isExpanded())
+         {
+            parent.expand();
+         }
+
+         //
+         while (true)
+         {
+            HierarchyChangeType change = it.next();
+            if (change == HierarchyChangeType.LEAVE)
+            {
+               // End recursion here
+               break;
+            }
+            else
+            {
+               if (change == HierarchyChangeType.KEEP)
+               {
+                  // Consume ENTER
+                  it.next();
+
+                  // Recurse
+                  perform(it.getSource());
+               }
+               else if (change == HierarchyChangeType.ADDED)
+               {
+                  // Consume ENTER
+                  it.next();
+
+                  //
+                  NodeContext<N1> previous;
+                  NodeContext<N1> added;
+                  NodeData addedData = updateAdapter.getData(it.getDestination());
+                  if (last == null || last.getParent() != parent)
+                  {
+                     previous = null;
+                     added = parent.insertAt(0, addedData);
+                  }
+                  else
+                  {
+                     previous = last;
+                     added = last.insertAfter(addedData);
+                  }
+
+                  //
+                  if (listener != null)
+                  {
+                     listener.onAdd(
+                        added,
+                        parent,
+                        previous);
+                  }
+
+                  // Recurse
+                  perform(added);
+               }
+               else if (change == HierarchyChangeType.MOVED_IN)
+               {
+                  // Consume ENTER
+                  it.next();
+
+
+                  //
+                  NodeContext<N1> to = parent;
+                  NodeContext<N1> moved = it.getSource();
+                  NodeContext<N1> from = moved.getParent();
+                  NodeContext<N1> previous;
+                  if (last == null || last.getParent() != parent)
+                  {
+                     previous = null;
+                     to.insertAt(0, moved);
+                  }
+                  else
+                  {
+                     previous = last;
+                     last.insertAfter(moved);
+                  }
+
+                  //
+                  if (listener != null)
+                  {
+                     listener.onMove(
+                        moved,
+                        from,
+                        to,
+                        previous != null ? previous : null);
+                  }
+
+                  // Recurse
+                  perform(it.getSource());
+               }
+               else if (change == HierarchyChangeType.MOVED_OUT)
+               {
+                  // Do nothing
+               }
+               else if (change == HierarchyChangeType.REMOVED)
+               {
+                  NodeContext<N1> removed = it.getSource();
+                  NodeContext<N1> removedParent = removed.getParent();
+
+                  //
+                  removed.remove();
+
+                  //
+                  if (listener != null)
+                  {
+                     listener.onRemove(
+                        removed,
+                        removedParent);
+                  }
+               }
+               else
+               {
+                  throw new UnsupportedOperationException("Not supported " + change);
+               }
+            }
+         }
+
+         //
+         depth--;
+      }
+
+      //
+      if (data != null)
+      {
+         if (!parent.data.state.equals(data.state))
+         {
+            if (listener != null)
+            {
+               listener.onUpdate(parent,  data.state);
+            }
+         }
+
+         //
+         if (!parent.data.name.equals(data.name))
+         {
+            parent.name = data.name;
+            if (listener != null)
+            {
+               listener.onRename(parent, parent.getParent(), data.name);
+            }
+         }
+
+         //
+         parent.state = updateAdapter.getState(d);
+         parent.name = updateAdapter.getName(d);
+         parent.data = data;
+
+         //
+         visitor.leave(depth, data.id, data.name, data.state);
+      }
+
+      //
+      last = parent;
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdateAdapter.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdateAdapter.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdateAdapter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.tree.diff.HierarchyAdapter;
-
-/**
- * Adapter for the update operation.
- *
- * @param <N> the node generic type
- */
-interface TreeUpdateAdapter<N> extends HierarchyAdapter<String[], N, String>
-{
-
-   /**
-    * Returns the persistent data associated with the node or null if such data does not exist.
-    *
-    * @param node the node
-    * @return the node data
-    */
-   NodeData getData(N node);
-
-   /**
-    * Returns the transient state associated with the node.
-    *
-    * @param node the node
-    * @return the transient state
-    */
-   NodeState getState(N node);
-
-   /**
-    * Returns the transient name associated with the node.
-    *
-    * @param node the node
-    * @return the transient name
-    */
-   String getName(N node);
-
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdateAdapter.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdateAdapter.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdateAdapter.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/TreeUpdateAdapter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.tree.diff.HierarchyAdapter;
+
+/**
+ * Adapter for the update operation.
+ *
+ * @param <N> the node generic type
+ */
+interface TreeUpdateAdapter<N> extends HierarchyAdapter<String[], N, String>
+{
+
+   /**
+    * Returns the persistent data associated with the node or null if such data does not exist.
+    *
+    * @param node the node
+    * @return the node data
+    */
+   NodeData getData(N node);
+
+   /**
+    * Returns the transient state associated with the node.
+    *
+    * @param node the node
+    * @return the transient state
+    */
+   NodeState getState(N node);
+
+   /**
+    * Returns the transient name associated with the node.
+    *
+    * @param node the node
+    * @return the transient name
+    */
+   String getName(N node);
+
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Utils.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Utils.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Utils.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.mop.SiteType;
-import org.gatein.mop.api.workspace.ObjectType;
-import org.gatein.mop.api.workspace.Site;
-
-import java.util.Comparator;
-import java.util.EnumMap;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-class Utils
-{
-
-   /** . */
-   static final String[] EMPTY_STRING_ARRAY = new String[0];
-
-   /** . */
-   private static final ComparableComparator INSTANCE = new ComparableComparator();
-
-   /** . */
-   private static final EnumMap<SiteType, ObjectType<Site>> a = new EnumMap<SiteType, ObjectType<Site>>(SiteType.class);
-
-   /** . */
-   private static final Map<ObjectType<Site>, SiteType> b = new HashMap<ObjectType<Site>, SiteType>(3);
-
-   static
-   {
-      a.put(SiteType.PORTAL, ObjectType.PORTAL_SITE);
-      a.put(SiteType.GROUP, ObjectType.GROUP_SITE);
-      a.put(SiteType.USER, ObjectType.USER_SITE);
-      b.put(ObjectType.PORTAL_SITE, SiteType.PORTAL);
-      b.put(ObjectType.GROUP_SITE, SiteType.GROUP);
-      b.put(ObjectType.USER_SITE, SiteType.USER);
-   }
-
-   static ObjectType<Site> objectType(SiteType siteType)
-   {
-      return a.get(siteType);
-   }
-
-   static SiteType siteType(ObjectType objectType)
-   {
-      return b.get(objectType);
-   }
-
-   static <T extends Comparable<T>> Comparator<T> comparator()
-   {
-      // Not totally good but well... should we pass the class to the caller ?
-      @SuppressWarnings("unchecked")
-      ComparableComparator instance = INSTANCE;
-      return instance;
-   }
-
-   private static class ComparableComparator<T extends Comparable<T>> implements Comparator<T>
-   {
-      public int compare(T o1, T o2)
-      {
-         return o1.compareTo(o2);
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Utils.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Utils.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Utils.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/Utils.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.mop.SiteType;
+import org.gatein.mop.api.workspace.ObjectType;
+import org.gatein.mop.api.workspace.Site;
+
+import java.util.Comparator;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+class Utils
+{
+
+   /** . */
+   static final String[] EMPTY_STRING_ARRAY = new String[0];
+
+   /** . */
+   private static final ComparableComparator INSTANCE = new ComparableComparator();
+
+   /** . */
+   private static final EnumMap<SiteType, ObjectType<Site>> a = new EnumMap<SiteType, ObjectType<Site>>(SiteType.class);
+
+   /** . */
+   private static final Map<ObjectType<Site>, SiteType> b = new HashMap<ObjectType<Site>, SiteType>(3);
+
+   static
+   {
+      a.put(SiteType.PORTAL, ObjectType.PORTAL_SITE);
+      a.put(SiteType.GROUP, ObjectType.GROUP_SITE);
+      a.put(SiteType.USER, ObjectType.USER_SITE);
+      b.put(ObjectType.PORTAL_SITE, SiteType.PORTAL);
+      b.put(ObjectType.GROUP_SITE, SiteType.GROUP);
+      b.put(ObjectType.USER_SITE, SiteType.USER);
+   }
+
+   static ObjectType<Site> objectType(SiteType siteType)
+   {
+      return a.get(siteType);
+   }
+
+   static SiteType siteType(ObjectType objectType)
+   {
+      return b.get(objectType);
+   }
+
+   static <T extends Comparable<T>> Comparator<T> comparator()
+   {
+      // Not totally good but well... should we pass the class to the caller ?
+      @SuppressWarnings("unchecked")
+      ComparableComparator instance = INSTANCE;
+      return instance;
+   }
+
+   private static class ComparableComparator<T extends Comparable<T>> implements Comparator<T>
+   {
+      public int compare(T o1, T o2)
+      {
+         return o1.compareTo(o2);
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/VisitMode.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/VisitMode.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/VisitMode.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-/**
- * Describes how a node should be loaded by a loading operation.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class VisitMode
-{
-
-   /**
-    * Include node but its children should be left appart.
-    */
-   public static final VisitMode NO_CHILDREN = new VisitMode("NO_CHILDREN");
-
-   /**
-    * Include node and its children.
-    */
-   public static final VisitMode ALL_CHILDREN = new VisitMode("ALL_CHILDREN");
-
-   /** . */
-   private final String name;
-
-   private VisitMode(String name)
-   {
-      this.name = name;
-   }
-
-   @Override
-   public String toString()
-   {
-      return "VisitMode[" + name + "]";
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/VisitMode.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/VisitMode.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/VisitMode.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/navigation/VisitMode.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+/**
+ * Describes how a node should be loaded by a loading operation.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class VisitMode
+{
+
+   /**
+    * Include node but its children should be left appart.
+    */
+   public static final VisitMode NO_CHILDREN = new VisitMode("NO_CHILDREN");
+
+   /**
+    * Include node and its children.
+    */
+   public static final VisitMode ALL_CHILDREN = new VisitMode("ALL_CHILDREN");
+
+   /** . */
+   private final String name;
+
+   private VisitMode(String name)
+   {
+      this.name = name;
+   }
+
+   @Override
+   public String toString()
+   {
+      return "VisitMode[" + name + "]";
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNavigation.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNavigation.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNavigation.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.user;
-
-import org.exoplatform.portal.mop.SiteKey;
-import org.exoplatform.portal.mop.navigation.NavigationContext;
-import org.gatein.common.util.EmptyResourceBundle;
-
-import java.util.ResourceBundle;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class UserNavigation
-{
-
-   /** . */
-   final UserPortalImpl portal;
-
-   /** . */
-   final NavigationContext navigation;
-
-   /** . */
-   private final boolean modifiable;
-
-   /** . */
-   private ResourceBundle bundle;
-
-   UserNavigation(UserPortalImpl portal, NavigationContext navigation, boolean modifiable)
-   {
-      if (navigation == null)
-      {
-         throw new NullPointerException();
-      }
-      if (navigation.getState() == null)
-      {
-         throw new IllegalArgumentException("No state for navigation " + navigation.getKey());
-      }
-
-      //
-      this.portal = portal;
-      this.navigation = navigation;
-      this.modifiable = modifiable;
-   }
-
-   public ResourceBundle getBundle()
-   {
-      if (bundle == null)
-      {
-         bundle = portal.context.getBundle(this);
-         if (bundle == null)
-         {
-            bundle = EmptyResourceBundle.INSTANCE;
-         }
-      }
-      return bundle;
-   }
-
-   public SiteKey getKey()
-   {
-      return navigation.getKey();
-   }
-
-   public int getPriority()
-   {
-      Integer priority = navigation.getState().getPriority();
-      return priority != null ? priority : 1;
-   }
-   
-   public boolean isModifiable()
-   {
-      return modifiable;
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNavigation.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNavigation.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNavigation.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNavigation.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.user;
+
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.navigation.NavigationContext;
+import org.gatein.common.util.EmptyResourceBundle;
+
+import java.util.ResourceBundle;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class UserNavigation
+{
+
+   /** . */
+   final UserPortalImpl portal;
+
+   /** . */
+   final NavigationContext navigation;
+
+   /** . */
+   private final boolean modifiable;
+
+   /** . */
+   private ResourceBundle bundle;
+
+   UserNavigation(UserPortalImpl portal, NavigationContext navigation, boolean modifiable)
+   {
+      if (navigation == null)
+      {
+         throw new NullPointerException();
+      }
+      if (navigation.getState() == null)
+      {
+         throw new IllegalArgumentException("No state for navigation " + navigation.getKey());
+      }
+
+      //
+      this.portal = portal;
+      this.navigation = navigation;
+      this.modifiable = modifiable;
+   }
+
+   public ResourceBundle getBundle()
+   {
+      if (bundle == null)
+      {
+         bundle = portal.context.getBundle(this);
+         if (bundle == null)
+         {
+            bundle = EmptyResourceBundle.INSTANCE;
+         }
+      }
+      return bundle;
+   }
+
+   public SiteKey getKey()
+   {
+      return navigation.getKey();
+   }
+
+   public int getPriority()
+   {
+      Integer priority = navigation.getState().getPriority();
+      return priority != null ? priority : 1;
+   }
+   
+   public boolean isModifiable()
+   {
+      return modifiable;
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNode.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNode.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNode.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,329 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.user;
-
-import org.exoplatform.commons.utils.ExpressionUtil;
-import org.exoplatform.portal.mop.Visibility;
-import org.exoplatform.portal.mop.navigation.NavigationServiceException;
-import org.exoplatform.portal.mop.navigation.NodeContext;
-import org.exoplatform.portal.mop.navigation.NodeFilter;
-import org.exoplatform.portal.mop.navigation.NodeState;
-import org.gatein.common.text.EntityEncoder;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.ResourceBundle;
-
-/**
- * A navigation node as seen by a user.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class UserNode
-{
-
-   /** . */
-   final UserNodeContext owner;
-
-   /** . */
-   final NodeContext<UserNode> context;
-
-   /** . */
-   private String resolvedLabel;
-
-   /** . */
-   private String encodedResolvedLabel;
-
-   /** . */
-   private String uri;
-
-   UserNode(UserNodeContext owner, NodeContext<UserNode> context)
-   {
-      this.owner = owner;
-      this.context = context;
-      this.resolvedLabel = null;
-      this.encodedResolvedLabel = null;
-      this.uri = null;
-   }
-
-   public UserNavigation getNavigation()
-   {
-      return owner.navigation;
-   }
-
-   public String getId()
-   {
-      return context.getId();
-   }
-
-   UserNode filter()
-   {
-      owner.filter(this);
-      return this;
-   }
-
-   public String getName()
-   {
-      return context.getName();
-   }
-
-   public void setName(String name)
-   {
-      context.setName(name);
-   }
-
-   public String getURI()
-   {
-      if (uri == null)
-      {
-         uri = buildURI().toString();
-      }
-      return uri;
-   }
-
-   private StringBuilder buildURI()
-   {
-      UserNode parent = context.getParentNode();
-      if (parent != null)
-      {
-         StringBuilder builder = parent.buildURI();
-         if (builder.length() > 0)
-         {
-            builder.append('/');
-         }
-         return builder.append(context.getName());
-      }
-      else
-      {
-         return new StringBuilder();
-      }
-   }
-
-   public String getLabel()
-   {
-      return context.getState().getLabel();
-   }
-
-   public void setLabel(String label)
-   {
-      this.resolvedLabel = null;
-      this.encodedResolvedLabel = null;
-
-      //
-      context.setState(new NodeState.Builder(context.getState()).label(label).build());
-   }
-
-   public String getIcon()
-   {
-      return context.getState().getIcon();
-   }
-
-   public void setIcon(String icon)
-   {
-      context.setState(new NodeState.Builder(context.getState()).icon(icon).build());
-   }
-
-   public long getStartPublicationTime()
-   {
-      return context.getState().getStartPublicationTime();
-   }
-
-   public void setStartPublicationTime(long startPublicationTime)
-   {
-      context.setState(new NodeState.Builder(context.getState()).startPublicationTime(startPublicationTime).build());
-   }
-
-   public long getEndPublicationTime()
-   {
-      return context.getState().getEndPublicationTime();
-   }
-
-   public void setEndPublicationTime(long endPublicationTime)
-   {
-      context.setState(new NodeState.Builder(context.getState()).endPublicationTime(endPublicationTime).build());
-   }
-
-   public Visibility getVisibility()
-   {
-      return context.getState().getVisibility();
-   }
-
-   public void setVisibility(Visibility visibility)
-   {
-      context.setState(new NodeState.Builder(context.getState()).visibility(visibility).build());
-   }
-
-   public String getPageRef()
-   {
-      return context.getState().getPageRef();
-   }
-
-   public void setPageRef(String pageRef)
-   {
-      context.setState(new NodeState.Builder(context.getState()).pageRef(pageRef).build());
-   }
-
-   public String getResolvedLabel()
-   {
-      if (resolvedLabel == null)
-      {
-         String resolvedLabel;
-         if (context.getState().getLabel() != null)
-         {
-            ResourceBundle bundle = owner.navigation.getBundle();
-            resolvedLabel = ExpressionUtil.getExpressionValue(bundle, context.getState().getLabel());
-         }
-         else
-         {
-            resolvedLabel = null;
-         }
-
-         //
-         if (resolvedLabel == null)
-         {
-            resolvedLabel = getName();
-         }
-
-         //
-         this.resolvedLabel = resolvedLabel;
-      }
-      return resolvedLabel;
-   }
-
-   public String getEncodedResolvedLabel()
-   {
-      if (encodedResolvedLabel == null)
-      {
-         encodedResolvedLabel = EntityEncoder.FULL.encode(getResolvedLabel());
-      }
-      return encodedResolvedLabel;
-   }
-
-   public UserNode getParent()
-   {
-      return context.getParentNode();
-   }
-
-   /**
-    * Returns true if the children relationship determined.
-    *
-    * @return ture if node has children
-    */
-   public boolean hasChildrenRelationship()
-   {
-      return context.isExpanded();
-   }
-
-   /**
-    * Returns the number of children.
-    *
-    * @return the number of children
-    */
-   public int getChildrenCount()
-   {
-      return context.getNodeCount();
-   }
-
-   public int getChildrenSize()
-   {
-      return context.getNodeSize();
-   }
-
-   public Collection<UserNode> getChildren()
-   {
-      return context.isExpanded() ? context.getNodes() : Collections.<UserNode>emptyList();
-   }
-
-   /**
-    * Returns a child by its name or null if the child does not exist or the children relationship has not been loaded.
-    *
-    * @param childName the child name
-    * @return the corresponding user node
-    * @throws NullPointerException if the child name is null
-    */
-   public UserNode getChild(String childName) throws NullPointerException
-   {
-      if (context.isExpanded())
-      {
-         return context.getNode(childName);
-      }
-      else
-      {
-         return null;
-      }
-   }
-
-   /**
-    * Returns a child by its index or null if the children relationship has not been loaded.
-    *
-    * @param childIndex the child index
-    * @return the corresponding user node
-    * @throws IndexOutOfBoundsException if the children relationship is loaded and the index is outside of its bounds
-    */
-   public UserNode getChild(int childIndex) throws IndexOutOfBoundsException
-   {
-      if (context.isExpanded())
-      {
-         return context.getNode(childIndex);
-      }
-      else
-      {
-         return null;
-      }
-   }
-
-   public void addChild(UserNode child)
-   {
-      context.add(null, child.context);
-   }
-
-   public void addChild(int index, UserNode child)
-   {
-      context.add(index, child.context);
-   }
-
-   public UserNode addChild(String childName)
-   {
-      return context.add(null, childName).getNode();
-   }
-
-   public boolean removeChild(String childName)
-   {
-      return context.removeNode(childName);
-   }
-
-   // Keep this internal for now
-   UserNode find(String nodeId)
-   {
-      NodeContext<UserNode> found = context.getDescendant(nodeId);
-      return found != null ? found.getNode() : null;
-   }
-
-   public String toString()
-   {
-      return toString(1);
-   }
-
-   public String toString(int depth)
-   {
-      return context.toString(depth, new StringBuilder("UserNode[")).append("]").toString();
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNode.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNode.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNode.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNode.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,329 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.user;
+
+import org.exoplatform.commons.utils.ExpressionUtil;
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.mop.navigation.NavigationServiceException;
+import org.exoplatform.portal.mop.navigation.NodeContext;
+import org.exoplatform.portal.mop.navigation.NodeFilter;
+import org.exoplatform.portal.mop.navigation.NodeState;
+import org.gatein.common.text.EntityEncoder;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.ResourceBundle;
+
+/**
+ * A navigation node as seen by a user.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class UserNode
+{
+
+   /** . */
+   final UserNodeContext owner;
+
+   /** . */
+   final NodeContext<UserNode> context;
+
+   /** . */
+   private String resolvedLabel;
+
+   /** . */
+   private String encodedResolvedLabel;
+
+   /** . */
+   private String uri;
+
+   UserNode(UserNodeContext owner, NodeContext<UserNode> context)
+   {
+      this.owner = owner;
+      this.context = context;
+      this.resolvedLabel = null;
+      this.encodedResolvedLabel = null;
+      this.uri = null;
+   }
+
+   public UserNavigation getNavigation()
+   {
+      return owner.navigation;
+   }
+
+   public String getId()
+   {
+      return context.getId();
+   }
+
+   UserNode filter()
+   {
+      owner.filter(this);
+      return this;
+   }
+
+   public String getName()
+   {
+      return context.getName();
+   }
+
+   public void setName(String name)
+   {
+      context.setName(name);
+   }
+
+   public String getURI()
+   {
+      if (uri == null)
+      {
+         uri = buildURI().toString();
+      }
+      return uri;
+   }
+
+   private StringBuilder buildURI()
+   {
+      UserNode parent = context.getParentNode();
+      if (parent != null)
+      {
+         StringBuilder builder = parent.buildURI();
+         if (builder.length() > 0)
+         {
+            builder.append('/');
+         }
+         return builder.append(context.getName());
+      }
+      else
+      {
+         return new StringBuilder();
+      }
+   }
+
+   public String getLabel()
+   {
+      return context.getState().getLabel();
+   }
+
+   public void setLabel(String label)
+   {
+      this.resolvedLabel = null;
+      this.encodedResolvedLabel = null;
+
+      //
+      context.setState(new NodeState.Builder(context.getState()).label(label).build());
+   }
+
+   public String getIcon()
+   {
+      return context.getState().getIcon();
+   }
+
+   public void setIcon(String icon)
+   {
+      context.setState(new NodeState.Builder(context.getState()).icon(icon).build());
+   }
+
+   public long getStartPublicationTime()
+   {
+      return context.getState().getStartPublicationTime();
+   }
+
+   public void setStartPublicationTime(long startPublicationTime)
+   {
+      context.setState(new NodeState.Builder(context.getState()).startPublicationTime(startPublicationTime).build());
+   }
+
+   public long getEndPublicationTime()
+   {
+      return context.getState().getEndPublicationTime();
+   }
+
+   public void setEndPublicationTime(long endPublicationTime)
+   {
+      context.setState(new NodeState.Builder(context.getState()).endPublicationTime(endPublicationTime).build());
+   }
+
+   public Visibility getVisibility()
+   {
+      return context.getState().getVisibility();
+   }
+
+   public void setVisibility(Visibility visibility)
+   {
+      context.setState(new NodeState.Builder(context.getState()).visibility(visibility).build());
+   }
+
+   public String getPageRef()
+   {
+      return context.getState().getPageRef();
+   }
+
+   public void setPageRef(String pageRef)
+   {
+      context.setState(new NodeState.Builder(context.getState()).pageRef(pageRef).build());
+   }
+
+   public String getResolvedLabel()
+   {
+      if (resolvedLabel == null)
+      {
+         String resolvedLabel;
+         if (context.getState().getLabel() != null)
+         {
+            ResourceBundle bundle = owner.navigation.getBundle();
+            resolvedLabel = ExpressionUtil.getExpressionValue(bundle, context.getState().getLabel());
+         }
+         else
+         {
+            resolvedLabel = null;
+         }
+
+         //
+         if (resolvedLabel == null)
+         {
+            resolvedLabel = getName();
+         }
+
+         //
+         this.resolvedLabel = resolvedLabel;
+      }
+      return resolvedLabel;
+   }
+
+   public String getEncodedResolvedLabel()
+   {
+      if (encodedResolvedLabel == null)
+      {
+         encodedResolvedLabel = EntityEncoder.FULL.encode(getResolvedLabel());
+      }
+      return encodedResolvedLabel;
+   }
+
+   public UserNode getParent()
+   {
+      return context.getParentNode();
+   }
+
+   /**
+    * Returns true if the children relationship determined.
+    *
+    * @return ture if node has children
+    */
+   public boolean hasChildrenRelationship()
+   {
+      return context.isExpanded();
+   }
+
+   /**
+    * Returns the number of children.
+    *
+    * @return the number of children
+    */
+   public int getChildrenCount()
+   {
+      return context.getNodeCount();
+   }
+
+   public int getChildrenSize()
+   {
+      return context.getNodeSize();
+   }
+
+   public Collection<UserNode> getChildren()
+   {
+      return context.isExpanded() ? context.getNodes() : Collections.<UserNode>emptyList();
+   }
+
+   /**
+    * Returns a child by its name or null if the child does not exist or the children relationship has not been loaded.
+    *
+    * @param childName the child name
+    * @return the corresponding user node
+    * @throws NullPointerException if the child name is null
+    */
+   public UserNode getChild(String childName) throws NullPointerException
+   {
+      if (context.isExpanded())
+      {
+         return context.getNode(childName);
+      }
+      else
+      {
+         return null;
+      }
+   }
+
+   /**
+    * Returns a child by its index or null if the children relationship has not been loaded.
+    *
+    * @param childIndex the child index
+    * @return the corresponding user node
+    * @throws IndexOutOfBoundsException if the children relationship is loaded and the index is outside of its bounds
+    */
+   public UserNode getChild(int childIndex) throws IndexOutOfBoundsException
+   {
+      if (context.isExpanded())
+      {
+         return context.getNode(childIndex);
+      }
+      else
+      {
+         return null;
+      }
+   }
+
+   public void addChild(UserNode child)
+   {
+      context.add(null, child.context);
+   }
+
+   public void addChild(int index, UserNode child)
+   {
+      context.add(index, child.context);
+   }
+
+   public UserNode addChild(String childName)
+   {
+      return context.add(null, childName).getNode();
+   }
+
+   public boolean removeChild(String childName)
+   {
+      return context.removeNode(childName);
+   }
+
+   // Keep this internal for now
+   UserNode find(String nodeId)
+   {
+      NodeContext<UserNode> found = context.getDescendant(nodeId);
+      return found != null ? found.getNode() : null;
+   }
+
+   public String toString()
+   {
+      return toString(1);
+   }
+
+   public String toString(int depth)
+   {
+      return context.toString(depth, new StringBuilder("UserNode[")).append("]").toString();
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeContext.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeContext.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeContext.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.user;
-
-import org.exoplatform.portal.mop.navigation.NodeContext;
-import org.exoplatform.portal.mop.navigation.NodeModel;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-class UserNodeContext implements NodeModel<UserNode>
-{
-
-   /** The related navigation. */
-   final UserNavigation navigation;
-
-   /** . */
-   final UserNodeFilterConfig filterConfig;
-
-   /** . */
-   private UserNodeFilter filter;
-
-   UserNodeContext(UserNavigation navigation, UserNodeFilterConfig filterConfig)
-   {
-      this.filterConfig = filterConfig;
-      this.navigation = navigation;
-   }
-
-   public NodeContext<UserNode> getContext(UserNode node)
-   {
-      return node.context;
-   }
-
-   public UserNode create(NodeContext<UserNode> context)
-   {
-      return new UserNode(this, context);
-   }
-
-   void filter(UserNode userNode)
-   {
-      if (filterConfig != null)
-      {
-         if (filter == null)
-         {
-            filter = new UserNodeFilter(navigation.portal, filterConfig);
-         }
-         userNode.context.filter(filter);
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeContext.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeContext.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeContext.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeContext.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.user;
+
+import org.exoplatform.portal.mop.navigation.NodeContext;
+import org.exoplatform.portal.mop.navigation.NodeModel;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+class UserNodeContext implements NodeModel<UserNode>
+{
+
+   /** The related navigation. */
+   final UserNavigation navigation;
+
+   /** . */
+   final UserNodeFilterConfig filterConfig;
+
+   /** . */
+   private UserNodeFilter filter;
+
+   UserNodeContext(UserNavigation navigation, UserNodeFilterConfig filterConfig)
+   {
+      this.filterConfig = filterConfig;
+      this.navigation = navigation;
+   }
+
+   public NodeContext<UserNode> getContext(UserNode node)
+   {
+      return node.context;
+   }
+
+   public UserNode create(NodeContext<UserNode> context)
+   {
+      return new UserNode(this, context);
+   }
+
+   void filter(UserNode userNode)
+   {
+      if (filterConfig != null)
+      {
+         if (filter == null)
+         {
+            filter = new UserNodeFilter(navigation.portal, filterConfig);
+         }
+         userNode.context.filter(filter);
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilter.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilter.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.user;
-
-import org.exoplatform.portal.config.UserACL;
-import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.mop.Visibility;
-import org.exoplatform.portal.mop.navigation.NodeFilter;
-import org.exoplatform.portal.mop.navigation.NodeState;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-class UserNodeFilter implements NodeFilter
-{
-
-   /** . */
-   private final UserPortalImpl userPortal;
-
-   /** . */
-   private final UserNodeFilterConfig config;
-
-   public UserNodeFilter(UserPortalImpl userPortal, UserNodeFilterConfig config)
-   {
-      if (userPortal == null)
-      {
-         throw new NullPointerException();
-      }
-      if (config == null)
-      {
-         throw new NullPointerException();
-      }
-
-      //
-      this.userPortal = userPortal;
-      this.config = config;
-   }
-
-   public boolean accept(int depth, String id, String name, NodeState state)
-   {
-      Visibility visibility = state.getVisibility();
-
-      // Correct null -> displayed
-      if (visibility == null)
-      {
-         visibility = Visibility.DISPLAYED;
-      }
-
-      // If a visibility is specified then we use it
-      if (config.visibility != null && !config.visibility.contains(visibility))
-      {
-         return false;
-      }
-
-      //
-      if (config.authorizationCheck)
-      {
-         if (visibility == Visibility.SYSTEM)
-         {
-            UserACL acl = userPortal.acl;
-            String userName = userPortal.userName;
-            if (!acl.getSuperUser().equals(userName))
-            {
-               return false;
-            }
-         }
-         else
-         {
-            String pageRef = state.getPageRef();
-            if (pageRef != null)
-            {
-               UserPortalConfigService upcs = userPortal.service;
-               try
-               {
-                  if (upcs.getPage(pageRef, userPortal.userName) == null)
-                  {
-                     return false;
-                  }
-               }
-               catch (Exception e)
-               {
-                  // Log me
-                  return false;
-               }
-            }
-         }
-      }
-
-      // Now make the custom checks
-      switch (visibility)
-      {
-         case SYSTEM:
-            break;
-         case TEMPORAL:
-            if (config.temporalCheck)
-            {
-               long now = System.currentTimeMillis();
-               if (state.getStartPublicationTime() != -1 && now < state.getStartPublicationTime())
-               {
-                  return false;
-               }
-               if (state.getEndPublicationTime() != -1 && now > state.getEndPublicationTime())
-               {
-                  return false;
-               }
-            }
-            break;
-      }
-
-      //
-      return true;
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilter.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilter.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilter.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.user;
+
+import org.exoplatform.portal.config.UserACL;
+import org.exoplatform.portal.config.UserPortalConfigService;
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.mop.navigation.NodeFilter;
+import org.exoplatform.portal.mop.navigation.NodeState;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+class UserNodeFilter implements NodeFilter
+{
+
+   /** . */
+   private final UserPortalImpl userPortal;
+
+   /** . */
+   private final UserNodeFilterConfig config;
+
+   public UserNodeFilter(UserPortalImpl userPortal, UserNodeFilterConfig config)
+   {
+      if (userPortal == null)
+      {
+         throw new NullPointerException();
+      }
+      if (config == null)
+      {
+         throw new NullPointerException();
+      }
+
+      //
+      this.userPortal = userPortal;
+      this.config = config;
+   }
+
+   public boolean accept(int depth, String id, String name, NodeState state)
+   {
+      Visibility visibility = state.getVisibility();
+
+      // Correct null -> displayed
+      if (visibility == null)
+      {
+         visibility = Visibility.DISPLAYED;
+      }
+
+      // If a visibility is specified then we use it
+      if (config.visibility != null && !config.visibility.contains(visibility))
+      {
+         return false;
+      }
+
+      //
+      if (config.authorizationCheck)
+      {
+         if (visibility == Visibility.SYSTEM)
+         {
+            UserACL acl = userPortal.acl;
+            String userName = userPortal.userName;
+            if (!acl.getSuperUser().equals(userName))
+            {
+               return false;
+            }
+         }
+         else
+         {
+            String pageRef = state.getPageRef();
+            if (pageRef != null)
+            {
+               UserPortalConfigService upcs = userPortal.service;
+               try
+               {
+                  if (upcs.getPage(pageRef, userPortal.userName) == null)
+                  {
+                     return false;
+                  }
+               }
+               catch (Exception e)
+               {
+                  // Log me
+                  return false;
+               }
+            }
+         }
+      }
+
+      // Now make the custom checks
+      switch (visibility)
+      {
+         case SYSTEM:
+            break;
+         case TEMPORAL:
+            if (config.temporalCheck)
+            {
+               long now = System.currentTimeMillis();
+               if (state.getStartPublicationTime() != -1 && now < state.getStartPublicationTime())
+               {
+                  return false;
+               }
+               if (state.getEndPublicationTime() != -1 && now > state.getEndPublicationTime())
+               {
+                  return false;
+               }
+            }
+            break;
+      }
+
+      //
+      return true;
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilterConfig.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilterConfig.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilterConfig.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.user;
-
-import org.exoplatform.commons.utils.Safe;
-import org.exoplatform.portal.mop.Visibility;
-
-import java.util.EnumSet;
-import java.util.Set;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class UserNodeFilterConfig
-{
-
-   /** . */
-   final Set<Visibility> visibility;
-
-   /** . */
-   final boolean authorizationCheck;
-
-   /** . */
-   final boolean temporalCheck;
-
-   public UserNodeFilterConfig(Builder builder)
-   {
-      if (builder == null)
-      {
-         throw new NullPointerException();
-      }
-
-      //
-      this.visibility = Safe.unmodifiableSet(builder.withVisibility);
-      this.authorizationCheck = builder.withAuthorizationCheck;
-      this.temporalCheck = builder.withTemporalCheck;
-   }
-
-   public Set<Visibility> getVisibility()
-   {
-      return visibility;
-   }
-
-   public boolean getAuthorizationCheck()
-   {
-      return authorizationCheck;
-   }
-
-   public boolean getTemporalCheck()
-   {
-      return temporalCheck;
-   }
-
-   public static Builder builder()
-   {
-      return new Builder();
-   }
-
-   public static Builder builder(UserNodeFilterConfig predicate)
-   {
-      return new Builder(predicate);
-   }
-
-   public static class Builder
-   {
-
-      /** . */
-      private Set<Visibility> withVisibility = null;
-
-      /** . */
-      private boolean withAuthorizationCheck = false;
-
-      /** . */
-      private boolean withTemporalCheck = false;
-
-      private Builder()
-      {
-         this.withVisibility = null;
-         this.withAuthorizationCheck = false;
-         this.withTemporalCheck = false;
-      }
-
-      private Builder(UserNodeFilterConfig predicate)
-      {
-         this.withVisibility = predicate.visibility;
-         this.withAuthorizationCheck = predicate.authorizationCheck;
-         this.withTemporalCheck = predicate.temporalCheck;
-      }
-
-      public Builder withVisibility(Visibility first, Visibility... rest)
-      {
-         withVisibility = EnumSet.of(first, rest);
-         return this;
-      }
-
-      public Builder withVisibility(Visibility first)
-      {
-         withVisibility = EnumSet.of(first);
-         return this;
-      }
-
-      public Builder withoutVisibility()
-      {
-         withVisibility = null;
-         return this;
-      }
-
-      public Builder withTemporalCheck()
-      {
-         this.withTemporalCheck = true;
-         return this;
-      }
-
-      public Builder withoutTemporalCheck()
-      {
-         this.withTemporalCheck = false;
-         return this;
-      }
-
-      public Builder withAuthorizationCheck()
-      {
-         this.withAuthorizationCheck = true;
-         return this;
-      }
-
-      public Builder withoutAuthorizationChek()
-      {
-         this.withAuthorizationCheck = false;
-         return this;
-      }
-
-      public UserNodeFilterConfig build()
-      {
-         return new UserNodeFilterConfig(this);
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilterConfig.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilterConfig.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilterConfig.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserNodeFilterConfig.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.user;
+
+import org.exoplatform.commons.utils.Safe;
+import org.exoplatform.portal.mop.Visibility;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class UserNodeFilterConfig
+{
+
+   /** . */
+   final Set<Visibility> visibility;
+
+   /** . */
+   final boolean authorizationCheck;
+
+   /** . */
+   final boolean temporalCheck;
+
+   public UserNodeFilterConfig(Builder builder)
+   {
+      if (builder == null)
+      {
+         throw new NullPointerException();
+      }
+
+      //
+      this.visibility = Safe.unmodifiableSet(builder.withVisibility);
+      this.authorizationCheck = builder.withAuthorizationCheck;
+      this.temporalCheck = builder.withTemporalCheck;
+   }
+
+   public Set<Visibility> getVisibility()
+   {
+      return visibility;
+   }
+
+   public boolean getAuthorizationCheck()
+   {
+      return authorizationCheck;
+   }
+
+   public boolean getTemporalCheck()
+   {
+      return temporalCheck;
+   }
+
+   public static Builder builder()
+   {
+      return new Builder();
+   }
+
+   public static Builder builder(UserNodeFilterConfig predicate)
+   {
+      return new Builder(predicate);
+   }
+
+   public static class Builder
+   {
+
+      /** . */
+      private Set<Visibility> withVisibility = null;
+
+      /** . */
+      private boolean withAuthorizationCheck = false;
+
+      /** . */
+      private boolean withTemporalCheck = false;
+
+      private Builder()
+      {
+         this.withVisibility = null;
+         this.withAuthorizationCheck = false;
+         this.withTemporalCheck = false;
+      }
+
+      private Builder(UserNodeFilterConfig predicate)
+      {
+         this.withVisibility = predicate.visibility;
+         this.withAuthorizationCheck = predicate.authorizationCheck;
+         this.withTemporalCheck = predicate.temporalCheck;
+      }
+
+      public Builder withVisibility(Visibility first, Visibility... rest)
+      {
+         withVisibility = EnumSet.of(first, rest);
+         return this;
+      }
+
+      public Builder withVisibility(Visibility first)
+      {
+         withVisibility = EnumSet.of(first);
+         return this;
+      }
+
+      public Builder withoutVisibility()
+      {
+         withVisibility = null;
+         return this;
+      }
+
+      public Builder withTemporalCheck()
+      {
+         this.withTemporalCheck = true;
+         return this;
+      }
+
+      public Builder withoutTemporalCheck()
+      {
+         this.withTemporalCheck = false;
+         return this;
+      }
+
+      public Builder withAuthorizationCheck()
+      {
+         this.withAuthorizationCheck = true;
+         return this;
+      }
+
+      public Builder withoutAuthorizationChek()
+      {
+         this.withAuthorizationCheck = false;
+         return this;
+      }
+
+      public UserNodeFilterConfig build()
+      {
+         return new UserNodeFilterConfig(this);
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortal.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortal.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortal.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.user;
-
-import java.util.List;
-
-import org.exoplatform.portal.mop.SiteKey;
-import org.exoplatform.portal.mop.navigation.NavigationServiceException;
-import org.exoplatform.portal.mop.navigation.NodeChangeListener;
-import org.exoplatform.portal.mop.navigation.Scope;
-
-/**
- * The user portal establish the relationship between a user and the portal.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public interface UserPortal
-{
-
-   /**
-    * Returns the sorted list of current user navigations.
-    *
-    * @return the current user navigations
-    * @throws UserPortalException any user portal exception
-    * @throws NavigationServiceException any navigation service exception
-    */
-   List<UserNavigation> getNavigations()
-      throws UserPortalException, NavigationServiceException;
-
-   /**
-    * Returns a user navigation for a specified site key, null is returned when such navigation does not exist.
-    *
-    * @param key the site key
-    * @return the corresponding user navigation
-    * @throws NullPointerException when the provided key is null
-    * @throws UserPortalException any user portal exception
-    * @throws NavigationServiceException any navigation service exception
-    */
-   UserNavigation getNavigation(SiteKey key)
-      throws NullPointerException, UserPortalException, NavigationServiceException;
-
-   /**
-    * Load a user node from a specified user navigation with a custom scope.
-    * The returned node is the root node of the navigation.
-    *
-    * @param navigation the user navigation
-    * @param scope an optional scope
-    * @param filterConfig an optional filter
-    * @param listener an optional listener  @return the user node
-    * @return the user node
-    * @throws NullPointerException if the navigation argument is null
-    * @throws UserPortalException any user portal exception
-    * @throws NavigationServiceException any navigation service exception
-    */
-   UserNode getNode(UserNavigation navigation, Scope scope, UserNodeFilterConfig filterConfig, NodeChangeListener<UserNode> listener)
-      throws NullPointerException, UserPortalException, NavigationServiceException;
-
-   /**
-    * Update the specified content with the most recent state.
-    *
-    * @param node the node to update
-    * @param scope the optional scope
-    * @param listener an optional listener
-    * @throws NullPointerException if the context argument is null
-    * @throws IllegalArgumentException if the node has pending changes
-    * @throws UserPortalException any user portal exception
-    * @throws NavigationServiceException anything that would prevent the operation to succeed
-    */
-   void updateNode(UserNode node, Scope scope, NodeChangeListener<UserNode> listener)
-      throws NullPointerException, IllegalArgumentException, UserPortalException, NavigationServiceException;
-   
-   /**
-    * Rebase the specified context with the most recent state.
-    *
-    * @param node the user node that will be rebased
-    * @param scope the optional scope
-    * @param listener the optional node change listener
-    * @throws NullPointerException if the context argument is null
-    * @throws UserPortalException any user portal exception
-    * @throws NavigationServiceException anything that would prevent the operation to succeed
-    */
-    void rebaseNode(UserNode node, Scope scope, NodeChangeListener<UserNode> listener)
-       throws NullPointerException, UserPortalException, NavigationServiceException;
-
-   /**
-    * Save the specified context to the persistent storage.
-    *
-    * @param node the user node that will be rebased
-    * @param listener the optional node change listener
-    * @throws NullPointerException if the node argument is null
-    * @throws UserPortalException any user portal exception
-    * @throws NavigationServiceException anything that would prevent the operation to succeed
-    */
-    void saveNode(UserNode node, NodeChangeListener<UserNode> listener)
-       throws NullPointerException, UserPortalException, NavigationServiceException;
-
-   /**
-    * Returns the user node for the default path.
-    *
-    * @param filterConfig an optional filter
-    * @return the default navigation path
-    * @throws UserPortalException any user portal exception
-    * @throws NavigationServiceException any navigation service exception
-    */
-   UserNode getDefaultPath(UserNodeFilterConfig filterConfig)
-      throws UserPortalException, NavigationServiceException;
-
-   /**
-    * Resolves and returns a node among all user navigations for a specified path.
-    *
-    * @param filterConfig an optional filter
-    * @param path the path
-    * @return the navigation path
-    * @throws NullPointerException if the navigation or path argument is null
-    * @throws UserPortalException any user portal exception
-    * @throws NavigationServiceException any navigation service exception
-    */
-   UserNode resolvePath(UserNodeFilterConfig filterConfig, String path)
-      throws NullPointerException, UserPortalException, NavigationServiceException;
-
-   /**
-    * Resolves and returns a node for the specified navigation and for a specified path.
-    *
-    * @param navigation the navigation
-    * @param filterConfig an optional filter
-    * @param path the path  @return the navigation path
-    * @return the navigation path
-    * @throws NullPointerException if the navigation or path argument is null
-    * @throws UserPortalException any user portal exception
-    * @throws NavigationServiceException any navigation service exception
-    */
-   UserNode resolvePath(UserNavigation navigation, UserNodeFilterConfig filterConfig, String path)
-      throws NullPointerException, UserPortalException, NavigationServiceException;
-
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortal.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortal.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortal.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortal.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.user;
+
+import java.util.List;
+
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.navigation.NavigationServiceException;
+import org.exoplatform.portal.mop.navigation.NodeChangeListener;
+import org.exoplatform.portal.mop.navigation.Scope;
+
+/**
+ * The user portal establish the relationship between a user and the portal.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public interface UserPortal
+{
+
+   /**
+    * Returns the sorted list of current user navigations.
+    *
+    * @return the current user navigations
+    * @throws UserPortalException any user portal exception
+    * @throws NavigationServiceException any navigation service exception
+    */
+   List<UserNavigation> getNavigations()
+      throws UserPortalException, NavigationServiceException;
+
+   /**
+    * Returns a user navigation for a specified site key, null is returned when such navigation does not exist.
+    *
+    * @param key the site key
+    * @return the corresponding user navigation
+    * @throws NullPointerException when the provided key is null
+    * @throws UserPortalException any user portal exception
+    * @throws NavigationServiceException any navigation service exception
+    */
+   UserNavigation getNavigation(SiteKey key)
+      throws NullPointerException, UserPortalException, NavigationServiceException;
+
+   /**
+    * Load a user node from a specified user navigation with a custom scope.
+    * The returned node is the root node of the navigation.
+    *
+    * @param navigation the user navigation
+    * @param scope an optional scope
+    * @param filterConfig an optional filter
+    * @param listener an optional listener  @return the user node
+    * @return the user node
+    * @throws NullPointerException if the navigation argument is null
+    * @throws UserPortalException any user portal exception
+    * @throws NavigationServiceException any navigation service exception
+    */
+   UserNode getNode(UserNavigation navigation, Scope scope, UserNodeFilterConfig filterConfig, NodeChangeListener<UserNode> listener)
+      throws NullPointerException, UserPortalException, NavigationServiceException;
+
+   /**
+    * Update the specified content with the most recent state.
+    *
+    * @param node the node to update
+    * @param scope the optional scope
+    * @param listener an optional listener
+    * @throws NullPointerException if the context argument is null
+    * @throws IllegalArgumentException if the node has pending changes
+    * @throws UserPortalException any user portal exception
+    * @throws NavigationServiceException anything that would prevent the operation to succeed
+    */
+   void updateNode(UserNode node, Scope scope, NodeChangeListener<UserNode> listener)
+      throws NullPointerException, IllegalArgumentException, UserPortalException, NavigationServiceException;
+   
+   /**
+    * Rebase the specified context with the most recent state.
+    *
+    * @param node the user node that will be rebased
+    * @param scope the optional scope
+    * @param listener the optional node change listener
+    * @throws NullPointerException if the context argument is null
+    * @throws UserPortalException any user portal exception
+    * @throws NavigationServiceException anything that would prevent the operation to succeed
+    */
+    void rebaseNode(UserNode node, Scope scope, NodeChangeListener<UserNode> listener)
+       throws NullPointerException, UserPortalException, NavigationServiceException;
+
+   /**
+    * Save the specified context to the persistent storage.
+    *
+    * @param node the user node that will be rebased
+    * @param listener the optional node change listener
+    * @throws NullPointerException if the node argument is null
+    * @throws UserPortalException any user portal exception
+    * @throws NavigationServiceException anything that would prevent the operation to succeed
+    */
+    void saveNode(UserNode node, NodeChangeListener<UserNode> listener)
+       throws NullPointerException, UserPortalException, NavigationServiceException;
+
+   /**
+    * Returns the user node for the default path.
+    *
+    * @param filterConfig an optional filter
+    * @return the default navigation path
+    * @throws UserPortalException any user portal exception
+    * @throws NavigationServiceException any navigation service exception
+    */
+   UserNode getDefaultPath(UserNodeFilterConfig filterConfig)
+      throws UserPortalException, NavigationServiceException;
+
+   /**
+    * Resolves and returns a node among all user navigations for a specified path.
+    *
+    * @param filterConfig an optional filter
+    * @param path the path
+    * @return the navigation path
+    * @throws NullPointerException if the navigation or path argument is null
+    * @throws UserPortalException any user portal exception
+    * @throws NavigationServiceException any navigation service exception
+    */
+   UserNode resolvePath(UserNodeFilterConfig filterConfig, String path)
+      throws NullPointerException, UserPortalException, NavigationServiceException;
+
+   /**
+    * Resolves and returns a node for the specified navigation and for a specified path.
+    *
+    * @param navigation the navigation
+    * @param filterConfig an optional filter
+    * @param path the path  @return the navigation path
+    * @return the navigation path
+    * @throws NullPointerException if the navigation or path argument is null
+    * @throws UserPortalException any user portal exception
+    * @throws NavigationServiceException any navigation service exception
+    */
+   UserNode resolvePath(UserNavigation navigation, UserNodeFilterConfig filterConfig, String path)
+      throws NullPointerException, UserPortalException, NavigationServiceException;
+
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalContext.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalContext.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalContext.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.user;
-
-import java.util.ResourceBundle;
-
-/**
- * The context of a user within its portal.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public interface UserPortalContext
-{
-
-   /**
-    * Provide an opportunity to use a resource bundle for a specified navigation. It no such bundle can be found then null
-    * can be returned.
-    *
-    * @param navigation the navigation that will be localized
-    * @return the resource bundle to use
-    */
-   ResourceBundle getBundle(UserNavigation navigation);
-
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalContext.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalContext.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalContext.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalContext.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.user;
+
+import java.util.ResourceBundle;
+
+/**
+ * The context of a user within its portal.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public interface UserPortalContext
+{
+
+   /**
+    * Provide an opportunity to use a resource bundle for a specified navigation. It no such bundle can be found then null
+    * can be returned.
+    *
+    * @param navigation the navigation that will be localized
+    * @return the resource bundle to use
+    */
+   ResourceBundle getBundle(UserNavigation navigation);
+
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalException.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalException.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalException.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.user;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class UserPortalException extends RuntimeException
-{
-
-   public UserPortalException()
-   {
-   }
-
-   public UserPortalException(String message)
-   {
-      super(message);
-   }
-
-   public UserPortalException(String message, Throwable cause)
-   {
-      super(message, cause);
-   }
-
-   public UserPortalException(Throwable cause)
-   {
-      super(cause);
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalException.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalException.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalException.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalException.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.user;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class UserPortalException extends RuntimeException
+{
+
+   public UserPortalException()
+   {
+   }
+
+   public UserPortalException(String message)
+   {
+      super(message);
+   }
+
+   public UserPortalException(String message, Throwable cause)
+   {
+      super(message, cause);
+   }
+
+   public UserPortalException(Throwable cause)
+   {
+      super(cause);
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalImpl.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalImpl.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalImpl.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,441 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.user;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.ResourceBundle;
-
-import org.exoplatform.portal.config.UserACL;
-import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.PortalConfig;
-import org.exoplatform.portal.mop.SiteKey;
-import org.exoplatform.portal.mop.SiteType;
-import org.exoplatform.portal.mop.navigation.NavigationContext;
-import org.exoplatform.portal.mop.navigation.NavigationService;
-import org.exoplatform.portal.mop.navigation.NavigationServiceException;
-import org.exoplatform.portal.mop.navigation.NodeChangeListener;
-import org.exoplatform.portal.mop.navigation.NodeContext;
-import org.exoplatform.portal.mop.navigation.NodeContextChangeAdapter;
-import org.exoplatform.portal.mop.navigation.NodeState;
-import org.exoplatform.portal.mop.navigation.Scope;
-import org.exoplatform.portal.mop.navigation.VisitMode;
-import org.exoplatform.services.organization.Group;
-import org.exoplatform.services.organization.OrganizationService;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class UserPortalImpl implements UserPortal
-{
-
-   /**
-    * A context that always return null.
-    */
-   private static final UserPortalContext NULL_CONTEXT = new UserPortalContext()
-   {
-      public ResourceBundle getBundle(UserNavigation navigation)
-      {
-         return null;
-      }
-   };
-
-   /** . */
-   final UserPortalConfigService service;
-
-   /** . */
-   final NavigationService navigationService;
-   
-   /** . */
-   private final OrganizationService organizationService;
-
-   /** . */
-   final UserACL acl;
-   
-   /** . */
-   private final PortalConfig portal;
-
-   /** . */
-   final UserPortalContext context;
-
-   /** . */
-   final String userName;
-
-   /** . */
-   private List<UserNavigation> navigations;
-
-   /** . */
-   private final String portalName;
-
-   public UserPortalImpl(
-      UserPortalConfigService service,
-      NavigationService navigationService,
-      OrganizationService organizationService,
-      UserACL acl,
-      String portalName,
-      PortalConfig portal,
-      String userName,
-      UserPortalContext context)
-   {
-      // So we don't care about testing nullity
-      if (context == null)
-      {
-         context = NULL_CONTEXT;
-      }
-
-      //
-      this.service = service;
-      this.navigationService = navigationService;
-      this.organizationService = organizationService;
-      this.acl = acl;
-      this.portalName = portalName;
-      this.portal = portal;
-      this.userName = userName;
-      this.context = context;
-      this.navigations = null;
-   }
-   /**
-    * Returns an immutable sorted list of the valid navigations related to the user.
-    *
-    * @return the navigations
-    * @throws UserPortalException any user portal exception
-    */
-   public List<UserNavigation> getNavigations() throws UserPortalException, NavigationServiceException
-   {
-      if (navigations == null)
-      {
-         List<UserNavigation> navigations = new ArrayList<UserNavigation>(userName == null ? 1 : 10);
-         NavigationContext portalNav = navigationService.loadNavigation(new SiteKey(SiteType.PORTAL, portalName));
-         if (portalNav != null && portalNav.getState() != null)
-         {
-            navigations.add(new UserNavigation(this, portalNav, acl.hasEditPermission(portal)));
-         }
-         //
-         if (userName != null)
-         {
-            // Add user nav if any
-            NavigationContext userNavigation = navigationService.loadNavigation(SiteKey.user(userName));
-            if (userNavigation != null && userNavigation.getState() != null)
-            {
-               navigations.add(new UserNavigation(this, userNavigation, true));
-            }
-
-            //
-            Collection<?> groups;
-            try
-            {
-               if (acl.getSuperUser().equals(userName))
-               {
-                  groups = organizationService.getGroupHandler().getAllGroups();
-               }
-               else
-               {
-                  groups = organizationService.getGroupHandler().findGroupsOfUser(userName);
-               }
-            }
-            catch (Exception e)
-            {
-               throw new UserPortalException("Could not retrieve groups", e);
-            }
-
-            //
-            for (Object group : groups)
-            {
-               Group m = (Group)group;
-               String groupId = m.getId().trim();
-               if (!groupId.equals(acl.getGuestsGroup()))
-               {
-                  NavigationContext groupNavigation = navigationService.loadNavigation(SiteKey.group(groupId));
-                  if (groupNavigation != null && groupNavigation.getState() != null)
-                  {
-                     navigations.add(new UserNavigation(
-                        this,
-                        groupNavigation,
-                        acl.hasEditPermissionOnNavigation(groupNavigation.getKey())));
-                  }
-               }
-            }
-
-            // Sort the list finally
-            Collections.sort(navigations, new Comparator<UserNavigation>()
-            {
-               public int compare(UserNavigation nav1, UserNavigation nav2)
-               {
-                  return nav1.getPriority() - nav2.getPriority();
-               }
-            });
-         }
-
-         //
-         this.navigations = Collections.unmodifiableList(navigations);
-      }
-      return navigations;
-   }
-
-   public UserNavigation getNavigation(SiteKey key) throws NullPointerException, UserPortalException, NavigationServiceException
-   {
-      if (key == null)
-      {
-         throw new NullPointerException("No null key accepted");
-      }
-      for (UserNavigation navigation : getNavigations())
-      {
-         if (navigation.getKey().equals(key))
-         {
-            return navigation;
-         }
-      }
-
-      //
-      return null;
-   }
-
-   public UserNode getNode(
-      UserNavigation userNavigation,
-      Scope scope,
-      UserNodeFilterConfig filterConfig,
-      NodeChangeListener<UserNode> listener) throws NullPointerException, UserPortalException, NavigationServiceException
-   {
-      UserNodeContext context = new UserNodeContext(userNavigation, filterConfig);
-      NodeContext<UserNode> nodeContext = navigationService.loadNode(context, userNavigation.navigation, scope, NodeContextChangeAdapter.safeWrap(listener));
-      if (nodeContext != null)
-      {
-         return nodeContext.getNode().filter();
-      }
-      else
-      {
-         return null;
-      }
-   }
-
-   public void updateNode(UserNode node, Scope scope, NodeChangeListener<UserNode> listener) 
-      throws NullPointerException, IllegalArgumentException, UserPortalException, NavigationServiceException
-   {
-      if (node == null)
-      {
-         throw new NullPointerException("No null node accepted");
-      }
-      navigationService.updateNode(node.context, scope, NodeContextChangeAdapter.safeWrap(listener));
-      node.filter();
-   }
-   
-   public void rebaseNode(UserNode node, Scope scope, NodeChangeListener<UserNode> listener)
-      throws NullPointerException, IllegalArgumentException, UserPortalException, NavigationServiceException
-   {
-      if (node == null)
-      {
-         throw new NullPointerException("No null node accepted");
-      }
-      navigationService.rebaseNode(node.context, scope, NodeContextChangeAdapter.safeWrap(listener));
-      node.filter();
-   }
-
-   public void saveNode(UserNode node, NodeChangeListener<UserNode> listener) throws NullPointerException, UserPortalException, NavigationServiceException
-   {
-      if (node == null)
-      {
-         throw new NullPointerException("No null node accepted");
-      }
-      navigationService.saveNode(node.context, NodeContextChangeAdapter.safeWrap(listener));
-      node.filter();
-   }
-
-   private class MatchingScope implements Scope
-   {
-      final UserNavigation userNavigation;
-      final UserNodeFilterConfig filterConfig;
-      final String[] match;
-      int score;
-      String id;
-      UserNode userNode;
-
-      MatchingScope(UserNavigation userNavigation, UserNodeFilterConfig filterConfig, String[] match)
-      {
-         this.userNavigation = userNavigation;
-         this.filterConfig = filterConfig;
-         this.match = match;
-      }
-
-      void resolve() throws NavigationServiceException
-      {
-         UserNodeContext context = new UserNodeContext(userNavigation, filterConfig);
-         NodeContext<UserNode> nodeContext = navigationService.loadNode(context, userNavigation.navigation, this, null);
-         if (context != null)
-         {
-            if (score > 0)
-            {
-               userNode = nodeContext.getNode().filter().find(id);
-            }
-         }
-      }
-
-      public Visitor get()
-      {
-         return new Visitor()
-         {
-            public VisitMode enter(int depth, String id, String name, NodeState state)
-            {
-               if (depth == 0 && "default".equals(name))
-               {
-                  score = 0;
-                  MatchingScope.this.id = null;
-                  return VisitMode.ALL_CHILDREN;
-               }
-               else if (depth <= match.length && name.equals(match[depth - 1]))
-               {
-                  score++;
-                  MatchingScope.this.id = id;
-                  return VisitMode.ALL_CHILDREN;
-               }
-               else
-               {
-                  return VisitMode.NO_CHILDREN;
-               }
-            }
-
-            public void leave(int depth, String id, String name, NodeState state)
-            {
-            }
-         };
-      }
-   }
-
-   public UserNode getDefaultPath(UserNodeFilterConfig filterConfig) throws UserPortalException, NavigationServiceException
-   {
-      for (UserNavigation userNavigation : getNavigations())
-      {
-         NavigationContext navigation = userNavigation.navigation;
-         if (navigation.getState() != null)
-         {
-            UserNodeContext context = new UserNodeContext(userNavigation, filterConfig);
-            NodeContext<UserNode> nodeContext = navigationService.loadNode(context, navigation, Scope.CHILDREN, null);
-            if (nodeContext != null)
-            {
-               UserNode root = nodeContext.getNode().filter();
-               for (UserNode node : root.getChildren())
-               {
-                  return node;
-               }
-            }
-         }
-      }
-
-      //
-      return null;
-   }
-
-   public UserNode resolvePath(UserNodeFilterConfig filterConfig, String path)
-      throws NullPointerException, UserPortalException, NavigationServiceException
-   {
-      if (path == null)
-      {
-         throw new NullPointerException("No null path accepted");
-      }
-
-      //  Parse path
-      String[] segments = Utils.parsePath(path);
-
-      // Find the first navigation available or return null
-      if (segments == null)
-      {
-         return getDefaultPath(null);
-      }
-
-      // Get navigations
-      List<UserNavigation> navigations = getNavigations();
-
-      //
-      MatchingScope best = null;
-      for (UserNavigation navigation : navigations)
-      {
-         MatchingScope scope = new MatchingScope(navigation, filterConfig, segments);
-         scope.resolve();
-         if (scope.score == segments.length)
-         {
-            best = scope;
-            break;
-         }
-         else
-         {
-            if (best == null)
-            {
-               best = scope;
-            }
-            else
-            {
-               if (scope.score > best.score)
-               {
-                  best = scope;
-               }
-            }
-         }
-      }
-
-      //
-      if (best != null && best.score > 0)
-      {
-         return best.userNode;
-      }
-      else
-      {
-         return getDefaultPath(null);
-      }
-   }
-
-   public UserNode resolvePath(UserNavigation navigation, UserNodeFilterConfig filterConfig, String path)
-      throws NullPointerException, UserPortalException, NavigationServiceException
-   {
-      if (navigation == null)
-      {
-         throw new NullPointerException("No null navigation accepted");
-      }
-      if (path == null)
-      {
-         throw new NullPointerException("No null path accepted");
-      }
-
-      //
-      String[] segments = Utils.parsePath(path);
-
-      //
-      if (segments == null)
-      {
-         return null;
-      }
-
-      //
-      MatchingScope scope = new MatchingScope(navigation, filterConfig, segments);
-      scope.resolve();
-
-      //
-      if (scope.score > 0)
-      {
-         return scope.userNode;
-      }
-      else
-      {
-         return null;
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalImpl.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalImpl.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalImpl.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/UserPortalImpl.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,441 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.user;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.ResourceBundle;
+
+import org.exoplatform.portal.config.UserACL;
+import org.exoplatform.portal.config.UserPortalConfigService;
+import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.SiteType;
+import org.exoplatform.portal.mop.navigation.NavigationContext;
+import org.exoplatform.portal.mop.navigation.NavigationService;
+import org.exoplatform.portal.mop.navigation.NavigationServiceException;
+import org.exoplatform.portal.mop.navigation.NodeChangeListener;
+import org.exoplatform.portal.mop.navigation.NodeContext;
+import org.exoplatform.portal.mop.navigation.NodeContextChangeAdapter;
+import org.exoplatform.portal.mop.navigation.NodeState;
+import org.exoplatform.portal.mop.navigation.Scope;
+import org.exoplatform.portal.mop.navigation.VisitMode;
+import org.exoplatform.services.organization.Group;
+import org.exoplatform.services.organization.OrganizationService;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class UserPortalImpl implements UserPortal
+{
+
+   /**
+    * A context that always return null.
+    */
+   private static final UserPortalContext NULL_CONTEXT = new UserPortalContext()
+   {
+      public ResourceBundle getBundle(UserNavigation navigation)
+      {
+         return null;
+      }
+   };
+
+   /** . */
+   final UserPortalConfigService service;
+
+   /** . */
+   final NavigationService navigationService;
+   
+   /** . */
+   private final OrganizationService organizationService;
+
+   /** . */
+   final UserACL acl;
+   
+   /** . */
+   private final PortalConfig portal;
+
+   /** . */
+   final UserPortalContext context;
+
+   /** . */
+   final String userName;
+
+   /** . */
+   private List<UserNavigation> navigations;
+
+   /** . */
+   private final String portalName;
+
+   public UserPortalImpl(
+      UserPortalConfigService service,
+      NavigationService navigationService,
+      OrganizationService organizationService,
+      UserACL acl,
+      String portalName,
+      PortalConfig portal,
+      String userName,
+      UserPortalContext context)
+   {
+      // So we don't care about testing nullity
+      if (context == null)
+      {
+         context = NULL_CONTEXT;
+      }
+
+      //
+      this.service = service;
+      this.navigationService = navigationService;
+      this.organizationService = organizationService;
+      this.acl = acl;
+      this.portalName = portalName;
+      this.portal = portal;
+      this.userName = userName;
+      this.context = context;
+      this.navigations = null;
+   }
+   /**
+    * Returns an immutable sorted list of the valid navigations related to the user.
+    *
+    * @return the navigations
+    * @throws UserPortalException any user portal exception
+    */
+   public List<UserNavigation> getNavigations() throws UserPortalException, NavigationServiceException
+   {
+      if (navigations == null)
+      {
+         List<UserNavigation> navigations = new ArrayList<UserNavigation>(userName == null ? 1 : 10);
+         NavigationContext portalNav = navigationService.loadNavigation(new SiteKey(SiteType.PORTAL, portalName));
+         if (portalNav != null && portalNav.getState() != null)
+         {
+            navigations.add(new UserNavigation(this, portalNav, acl.hasEditPermission(portal)));
+         }
+         //
+         if (userName != null)
+         {
+            // Add user nav if any
+            NavigationContext userNavigation = navigationService.loadNavigation(SiteKey.user(userName));
+            if (userNavigation != null && userNavigation.getState() != null)
+            {
+               navigations.add(new UserNavigation(this, userNavigation, true));
+            }
+
+            //
+            Collection<?> groups;
+            try
+            {
+               if (acl.getSuperUser().equals(userName))
+               {
+                  groups = organizationService.getGroupHandler().getAllGroups();
+               }
+               else
+               {
+                  groups = organizationService.getGroupHandler().findGroupsOfUser(userName);
+               }
+            }
+            catch (Exception e)
+            {
+               throw new UserPortalException("Could not retrieve groups", e);
+            }
+
+            //
+            for (Object group : groups)
+            {
+               Group m = (Group)group;
+               String groupId = m.getId().trim();
+               if (!groupId.equals(acl.getGuestsGroup()))
+               {
+                  NavigationContext groupNavigation = navigationService.loadNavigation(SiteKey.group(groupId));
+                  if (groupNavigation != null && groupNavigation.getState() != null)
+                  {
+                     navigations.add(new UserNavigation(
+                        this,
+                        groupNavigation,
+                        acl.hasEditPermissionOnNavigation(groupNavigation.getKey())));
+                  }
+               }
+            }
+
+            // Sort the list finally
+            Collections.sort(navigations, new Comparator<UserNavigation>()
+            {
+               public int compare(UserNavigation nav1, UserNavigation nav2)
+               {
+                  return nav1.getPriority() - nav2.getPriority();
+               }
+            });
+         }
+
+         //
+         this.navigations = Collections.unmodifiableList(navigations);
+      }
+      return navigations;
+   }
+
+   public UserNavigation getNavigation(SiteKey key) throws NullPointerException, UserPortalException, NavigationServiceException
+   {
+      if (key == null)
+      {
+         throw new NullPointerException("No null key accepted");
+      }
+      for (UserNavigation navigation : getNavigations())
+      {
+         if (navigation.getKey().equals(key))
+         {
+            return navigation;
+         }
+      }
+
+      //
+      return null;
+   }
+
+   public UserNode getNode(
+      UserNavigation userNavigation,
+      Scope scope,
+      UserNodeFilterConfig filterConfig,
+      NodeChangeListener<UserNode> listener) throws NullPointerException, UserPortalException, NavigationServiceException
+   {
+      UserNodeContext context = new UserNodeContext(userNavigation, filterConfig);
+      NodeContext<UserNode> nodeContext = navigationService.loadNode(context, userNavigation.navigation, scope, NodeContextChangeAdapter.safeWrap(listener));
+      if (nodeContext != null)
+      {
+         return nodeContext.getNode().filter();
+      }
+      else
+      {
+         return null;
+      }
+   }
+
+   public void updateNode(UserNode node, Scope scope, NodeChangeListener<UserNode> listener) 
+      throws NullPointerException, IllegalArgumentException, UserPortalException, NavigationServiceException
+   {
+      if (node == null)
+      {
+         throw new NullPointerException("No null node accepted");
+      }
+      navigationService.updateNode(node.context, scope, NodeContextChangeAdapter.safeWrap(listener));
+      node.filter();
+   }
+   
+   public void rebaseNode(UserNode node, Scope scope, NodeChangeListener<UserNode> listener)
+      throws NullPointerException, IllegalArgumentException, UserPortalException, NavigationServiceException
+   {
+      if (node == null)
+      {
+         throw new NullPointerException("No null node accepted");
+      }
+      navigationService.rebaseNode(node.context, scope, NodeContextChangeAdapter.safeWrap(listener));
+      node.filter();
+   }
+
+   public void saveNode(UserNode node, NodeChangeListener<UserNode> listener) throws NullPointerException, UserPortalException, NavigationServiceException
+   {
+      if (node == null)
+      {
+         throw new NullPointerException("No null node accepted");
+      }
+      navigationService.saveNode(node.context, NodeContextChangeAdapter.safeWrap(listener));
+      node.filter();
+   }
+
+   private class MatchingScope implements Scope
+   {
+      final UserNavigation userNavigation;
+      final UserNodeFilterConfig filterConfig;
+      final String[] match;
+      int score;
+      String id;
+      UserNode userNode;
+
+      MatchingScope(UserNavigation userNavigation, UserNodeFilterConfig filterConfig, String[] match)
+      {
+         this.userNavigation = userNavigation;
+         this.filterConfig = filterConfig;
+         this.match = match;
+      }
+
+      void resolve() throws NavigationServiceException
+      {
+         UserNodeContext context = new UserNodeContext(userNavigation, filterConfig);
+         NodeContext<UserNode> nodeContext = navigationService.loadNode(context, userNavigation.navigation, this, null);
+         if (context != null)
+         {
+            if (score > 0)
+            {
+               userNode = nodeContext.getNode().filter().find(id);
+            }
+         }
+      }
+
+      public Visitor get()
+      {
+         return new Visitor()
+         {
+            public VisitMode enter(int depth, String id, String name, NodeState state)
+            {
+               if (depth == 0 && "default".equals(name))
+               {
+                  score = 0;
+                  MatchingScope.this.id = null;
+                  return VisitMode.ALL_CHILDREN;
+               }
+               else if (depth <= match.length && name.equals(match[depth - 1]))
+               {
+                  score++;
+                  MatchingScope.this.id = id;
+                  return VisitMode.ALL_CHILDREN;
+               }
+               else
+               {
+                  return VisitMode.NO_CHILDREN;
+               }
+            }
+
+            public void leave(int depth, String id, String name, NodeState state)
+            {
+            }
+         };
+      }
+   }
+
+   public UserNode getDefaultPath(UserNodeFilterConfig filterConfig) throws UserPortalException, NavigationServiceException
+   {
+      for (UserNavigation userNavigation : getNavigations())
+      {
+         NavigationContext navigation = userNavigation.navigation;
+         if (navigation.getState() != null)
+         {
+            UserNodeContext context = new UserNodeContext(userNavigation, filterConfig);
+            NodeContext<UserNode> nodeContext = navigationService.loadNode(context, navigation, Scope.CHILDREN, null);
+            if (nodeContext != null)
+            {
+               UserNode root = nodeContext.getNode().filter();
+               for (UserNode node : root.getChildren())
+               {
+                  return node;
+               }
+            }
+         }
+      }
+
+      //
+      return null;
+   }
+
+   public UserNode resolvePath(UserNodeFilterConfig filterConfig, String path)
+      throws NullPointerException, UserPortalException, NavigationServiceException
+   {
+      if (path == null)
+      {
+         throw new NullPointerException("No null path accepted");
+      }
+
+      //  Parse path
+      String[] segments = Utils.parsePath(path);
+
+      // Find the first navigation available or return null
+      if (segments == null)
+      {
+         return getDefaultPath(null);
+      }
+
+      // Get navigations
+      List<UserNavigation> navigations = getNavigations();
+
+      //
+      MatchingScope best = null;
+      for (UserNavigation navigation : navigations)
+      {
+         MatchingScope scope = new MatchingScope(navigation, filterConfig, segments);
+         scope.resolve();
+         if (scope.score == segments.length)
+         {
+            best = scope;
+            break;
+         }
+         else
+         {
+            if (best == null)
+            {
+               best = scope;
+            }
+            else
+            {
+               if (scope.score > best.score)
+               {
+                  best = scope;
+               }
+            }
+         }
+      }
+
+      //
+      if (best != null && best.score > 0)
+      {
+         return best.userNode;
+      }
+      else
+      {
+         return getDefaultPath(null);
+      }
+   }
+
+   public UserNode resolvePath(UserNavigation navigation, UserNodeFilterConfig filterConfig, String path)
+      throws NullPointerException, UserPortalException, NavigationServiceException
+   {
+      if (navigation == null)
+      {
+         throw new NullPointerException("No null navigation accepted");
+      }
+      if (path == null)
+      {
+         throw new NullPointerException("No null path accepted");
+      }
+
+      //
+      String[] segments = Utils.parsePath(path);
+
+      //
+      if (segments == null)
+      {
+         return null;
+      }
+
+      //
+      MatchingScope scope = new MatchingScope(navigation, filterConfig, segments);
+      scope.resolve();
+
+      //
+      if (scope.score > 0)
+      {
+         return scope.userNode;
+      }
+      else
+      {
+         return null;
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/Utils.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/Utils.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/Utils.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.user;
-
-/**
- * A set of utils for this package.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-class Utils
-{
-
-   /**
-    * Parse the path with the following algorithm:
-    *
-    * <ul>
-    *    <li>The one char <code>/</code> string returns the null array</li>
-    *    <li>Any leading <code>/<code> char is ommited</li>
-    *    <li>Any trailing </code>/</code> chars are ommited</li>
-    *    <li>All the substrings obtained by slicing the remaining string by the <code>/</code> char are returned
-    *    as an array, even the empty strings</li>
-    * </ul>
-    *
-    * <p>Note that this is a reimplementation of a previous method that was using regex splitting, this reimplementation
-    * was done in order to minimize the created object count in mind and attempt to create the minimum required.</p>
-    *
-    * @param path the path
-    * @return the parse result
-    * @throws NullPointerException if the path argument is null
-    */
-   static String[] parsePath(String path) throws NullPointerException
-   {
-      // Where we start
-      final int start = 0 < path.length() && path.charAt(0) == '/' ? 1 : 0;
-
-      //
-      if (start == path.length())
-      {
-         return null;
-      }
-
-      // Where we end
-      int end = path.length();
-      while (end > start && path.charAt(end - 1) == '/')
-      {
-         end--;
-      }
-
-
-      // Count the number of slash
-      int count = 0;
-      int i = start;
-      while (true)
-      {
-         int pos = path.indexOf('/', i);
-         if (pos == -1)
-         {
-            pos = end;
-         }
-         if (pos == end)
-         {
-            if (pos > i)
-            {
-               count++;
-            }
-            break;
-         }
-         else
-         {
-            count++;
-            i = pos + 1;
-         }
-      }
-
-      // Now fill the array
-      String[] names = new String[count];
-      i = start;
-      int index = 0;
-      while (true)
-      {
-         int pos = path.indexOf('/', i);
-         if (pos == -1)
-         {
-            pos = end;
-         }
-         if (pos == end)
-         {
-            if (pos > i)
-            {
-               names[index] = path.substring(i, end);
-            }
-            break;
-         }
-         else
-         {
-            if (i < pos)
-            {
-               names[index++] = path.substring(i, pos);
-            }
-            else
-            {
-               names[index++] = "";
-            }
-            i = pos + 1;
-         }
-      }
-
-      //
-      return names;
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/Utils.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/mop/user/Utils.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/Utils.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/mop/user/Utils.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.user;
+
+/**
+ * A set of utils for this package.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+class Utils
+{
+
+   /**
+    * Parse the path with the following algorithm:
+    *
+    * <ul>
+    *    <li>The one char <code>/</code> string returns the null array</li>
+    *    <li>Any leading <code>/<code> char is ommited</li>
+    *    <li>Any trailing </code>/</code> chars are ommited</li>
+    *    <li>All the substrings obtained by slicing the remaining string by the <code>/</code> char are returned
+    *    as an array, even the empty strings</li>
+    * </ul>
+    *
+    * <p>Note that this is a reimplementation of a previous method that was using regex splitting, this reimplementation
+    * was done in order to minimize the created object count in mind and attempt to create the minimum required.</p>
+    *
+    * @param path the path
+    * @return the parse result
+    * @throws NullPointerException if the path argument is null
+    */
+   static String[] parsePath(String path) throws NullPointerException
+   {
+      // Where we start
+      final int start = 0 < path.length() && path.charAt(0) == '/' ? 1 : 0;
+
+      //
+      if (start == path.length())
+      {
+         return null;
+      }
+
+      // Where we end
+      int end = path.length();
+      while (end > start && path.charAt(end - 1) == '/')
+      {
+         end--;
+      }
+
+
+      // Count the number of slash
+      int count = 0;
+      int i = start;
+      while (true)
+      {
+         int pos = path.indexOf('/', i);
+         if (pos == -1)
+         {
+            pos = end;
+         }
+         if (pos == end)
+         {
+            if (pos > i)
+            {
+               count++;
+            }
+            break;
+         }
+         else
+         {
+            count++;
+            i = pos + 1;
+         }
+      }
+
+      // Now fill the array
+      String[] names = new String[count];
+      i = start;
+      int index = 0;
+      while (true)
+      {
+         int pos = path.indexOf('/', i);
+         if (pos == -1)
+         {
+            pos = end;
+         }
+         if (pos == end)
+         {
+            if (pos > i)
+            {
+               names[index] = path.substring(i, end);
+            }
+            break;
+         }
+         else
+         {
+            if (i < pos)
+            {
+               names[index++] = path.substring(i, pos);
+            }
+            else
+            {
+               names[index++] = "";
+            }
+            i = pos + 1;
+         }
+      }
+
+      //
+      return names;
+   }
+}

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/ExecutorDispatcher.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/ExecutorDispatcher.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/ExecutorDispatcher.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -36,20 +36,28 @@
 
    public <V> V execute(POMSession session, POMTask<V> task) throws Exception
    {
-      String s = task.toString();
-      long t0 = System.currentTimeMillis();
-      V v = session.execute(task);
-      long t1 = System.currentTimeMillis();
-      String t = "" + (t1 - t0);
-      if (t.length() < 4)
+      if (log.isDebugEnabled())
       {
-         t = padding[t.length()] + t;
-         log.debug("Executed [" + t + "] " + s + "");
+         String s = task.toString();
+         log.debug("Executing " + s + "");
+         long t0 = System.currentTimeMillis();
+         V v = session.execute(task);
+         long t1 = System.currentTimeMillis();
+         String t = "" + (t1 - t0);
+         if (t.length() < 4)
+         {
+            t = padding[t.length()] + t;
+            log.debug("Executed [" + t + "] " + s + "");
+         }
+         else
+         {
+            log.debug("Executed in " + t + " " + s + "");
+         }
+         return v;
       }
       else
       {
-         log.debug("Executed in " + t + " " + s + "");
+         return session.execute(task);
       }
-      return v;
    }
 }

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/POMDataStorage.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/POMDataStorage.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/POMDataStorage.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -27,6 +27,7 @@
 import org.chromattic.api.ChromatticSession;
 import org.exoplatform.commons.utils.IOUtil;
 import org.exoplatform.commons.utils.LazyPageList;
+import org.exoplatform.commons.utils.ListAccess;
 import org.exoplatform.container.configuration.ConfigurationManager;
 import org.exoplatform.portal.application.PortletPreferences;
 import org.exoplatform.portal.config.Query;
@@ -39,7 +40,7 @@
 import org.exoplatform.portal.config.model.PersistentApplicationState;
 import org.exoplatform.portal.config.model.TransientApplicationState;
 import org.exoplatform.portal.pom.config.tasks.DashboardTask;
-import org.exoplatform.portal.pom.config.tasks.PageNavigationTask;
+import org.exoplatform.portal.pom.config.tasks.MOPAccess;
 import org.exoplatform.portal.pom.config.tasks.PageTask;
 import org.exoplatform.portal.pom.config.tasks.PortalConfigTask;
 import org.exoplatform.portal.pom.config.tasks.PortletPreferencesTask;
@@ -49,8 +50,6 @@
 import org.exoplatform.portal.pom.data.ModelChange;
 import org.exoplatform.portal.pom.data.ModelData;
 import org.exoplatform.portal.pom.data.ModelDataStorage;
-import org.exoplatform.portal.pom.data.NavigationData;
-import org.exoplatform.portal.pom.data.NavigationKey;
 import org.exoplatform.portal.pom.data.PageData;
 import org.exoplatform.portal.pom.data.PageKey;
 import org.exoplatform.portal.pom.data.PortalData;
@@ -125,26 +124,6 @@
       return task.getChanges();
    }
 
-   public NavigationData getPageNavigation(NavigationKey key) throws Exception
-   {
-      return pomMgr.execute(new PageNavigationTask.Load(key));
-   }
-
-   public void save(NavigationData navigation) throws Exception
-   {
-      pomMgr.execute(new PageNavigationTask.Save(navigation, true));
-   }
-
-   public void create(NavigationData navigation) throws Exception
-   {
-      pomMgr.execute(new PageNavigationTask.Save(navigation, false));
-   }
-
-   public void remove(NavigationData navigation) throws Exception
-   {
-      pomMgr.execute(new PageNavigationTask.Remove(navigation));
-   }
-
    public void save(PortletPreferences portletPreferences) throws Exception
    {
       pomMgr.execute(new PortletPreferencesTask.Save(portletPreferences));
@@ -237,12 +216,31 @@
       Class<T> type = q.getClassType();
       if (PageData.class.equals(type))
       {
-         return (LazyPageList<T>)pomMgr.execute(new SearchTask.FindPage((Query<PageData>)q));
+         ListAccess<PageData> pageAccess;
+         try
+         {
+            pageAccess = new MOPAccess.PageAccess(pomMgr, (Query<PageData>)q);
+         }
+         catch (IllegalArgumentException e)
+         {
+            pageAccess = new ListAccess<PageData>()
+            {
+               @Override
+               public PageData[] load(int index, int length) throws Exception, IllegalArgumentException
+               {
+                  return new PageData[0];
+               }
+
+               @Override
+               public int getSize() throws Exception
+               {
+                  return 0;
+               }
+               
+            };
+         }
+         return (LazyPageList<T>)new LazyPageList<PageData>(pageAccess, 10);
       }
-      else if (NavigationData.class.equals(type))
-      {
-         return (LazyPageList<T>)pomMgr.execute(new SearchTask.FindNavigation((Query<NavigationData>)q));
-      }
       else if (PortletPreferences.class.equals(type))
       {
          return (LazyPageList<T>)pomMgr.execute(new SearchTask.FindPortletPreferences((Query<PortletPreferences>)q));

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/POMSession.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/POMSession.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/POMSession.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -22,6 +22,7 @@
 import org.chromattic.api.ChromatticSession;
 import org.chromattic.api.UndeclaredRepositoryException;
 import org.chromattic.ext.format.BaseEncodingObjectFormatter;
+import org.chromattic.api.query.QueryResult;
 import org.exoplatform.commons.chromattic.SessionContext;
 import org.exoplatform.commons.chromattic.SynchronizationListener;
 import org.exoplatform.commons.chromattic.SynchronizationStatus;
@@ -43,7 +44,6 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import java.io.Serializable;
-import java.lang.reflect.Field;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -249,8 +249,13 @@
 
    private static final BaseEncodingObjectFormatter formatter = new BaseEncodingObjectFormatter();
 
-   public <O extends WorkspaceObject> Iterator<O> findObjects(ObjectType<O> type, ObjectType<? extends Site> siteType,
-      String ownerId, String title)
+   public <O extends WorkspaceObject> QueryResult<O> findObjects(
+      ObjectType<O> type,
+      ObjectType<Site> siteType,
+      String ownerId,
+      String title,
+      int offset,
+      int limit)
    {
       this.save();
       //
@@ -292,37 +297,8 @@
 
       //
       String statement;
-      if (siteType != null)
+      try
       {
-         try
-         {
-            if (type == ObjectType.PAGE)
-            {
-               statement =
-                  "jcr:path LIKE '" + workspaceChunk + "/" + ownerTypeChunk + "/" + ownerIdChunk
-                     + "/mop:rootpage/mop:children/mop:pages/mop:children/%'";
-            }
-            else
-            {
-               statement =
-                  "jcr:path LIKE '" + workspaceChunk + "/" + ownerTypeChunk + "/" + ownerIdChunk
-                     + "/mop:rootnavigation/mop:children/mop:default'";
-            }
-         }
-         catch (IllegalArgumentException e)
-         {
-            if (type == ObjectType.PAGE)
-            {
-               statement = "jcr:path LIKE ''";
-            }
-            else
-            {
-               statement = "jcr:path LIKE ''";
-            }
-         }
-      }
-      else
-      {
          if (title != null)
          {
             title = Utils.queryEscape(title);
@@ -355,21 +331,22 @@
             }
          }
       }
-
-      // Temporary work around, to fix in MOP and then remove
-      ChromatticSession session;
-      try
+      catch (IllegalArgumentException e)
       {
-         Field f = ModelImpl.class.getDeclaredField("session");
-         f.setAccessible(true);
-         session = (ChromatticSession)f.get(model);
+         if (type == ObjectType.PAGE)
+         {
+            statement = "jcr:path LIKE ''";
+         }
+         else
+         {
+            statement = "jcr:path LIKE ''";
+         }
       }
-      catch (Exception e)
-      {
-         throw new Error(e);
-      }
+
+      // Temporary work around, to fix in MOP and then remove
+      ChromatticSession session = context.getSession();
       Class<O> mappedClass = (Class<O>)mapping.get(type);
-      return session.createQueryBuilder(mappedClass).where(statement).get().objects();
+      return session.createQueryBuilder(mappedClass).where(statement).get().objects((long)offset, (long)limit);
    }
 
    private final SynchronizationListener listener = new SynchronizationListener()

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/POMSessionManager.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/POMSessionManager.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/POMSessionManager.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -77,6 +77,11 @@
       this.executor = new PortalNamesCache(new DataCache(new ExecutorDispatcher()));
    }
 
+   public ChromatticLifeCycle getLifeCycle()
+   {
+      return configurator;
+   }
+
    public void cachePut(Serializable key, Object value)
    {
       GlobalKey globalKey = GlobalKey.wrap(configurator.getRepositoryName(), key);

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/tasks/MOPAccess.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/pom/config/tasks/MOPAccess.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/tasks/MOPAccess.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/tasks/MOPAccess.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.pom.config.tasks;
+
+import org.chromattic.api.query.QueryResult;
+import org.exoplatform.commons.utils.ListAccess;
+import org.exoplatform.portal.config.Query;
+import org.exoplatform.portal.pom.config.POMSession;
+import org.exoplatform.portal.pom.config.POMSessionManager;
+import org.exoplatform.portal.pom.config.POMTask;
+import org.exoplatform.portal.pom.data.Mapper;
+import org.exoplatform.portal.pom.data.PageData;
+import org.gatein.mop.api.workspace.ObjectType;
+import org.gatein.mop.api.workspace.Page;
+import org.gatein.mop.api.workspace.Site;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public abstract class MOPAccess<E, I> implements ListAccess<E>
+{
+
+   /** . */
+   private final POMSessionManager mgr;
+
+   /** . */
+   private final ObjectType<Site> ownerType;
+
+   /** . */
+   private final String ownerId;
+
+   /** . */
+   private final String title;
+
+   /** . */
+   private Integer size;
+
+   MOPAccess(POMSessionManager mgr, Query<E> query)
+   {
+      String ownerType = query.getOwnerType();
+      ObjectType<Site> siteType = null;
+      if (ownerType != null)
+      {
+         siteType = Mapper.parseSiteType(ownerType);
+      }
+
+      //
+      this.mgr = mgr;
+      this.ownerType = siteType;
+      this.ownerId = query.getOwnerId();
+      this.title = query.getTitle();
+      this.size = null;
+   }
+
+   public E[] load(final int index, final int length) throws Exception, IllegalArgumentException
+   {
+      return mgr.execute(new POMTask<E[]>()
+      {
+         public E[] run(POMSession session) throws Exception
+         {
+            QueryResult<I> res = findW(session, ownerType, ownerId, title, index, length);
+            E[] elements = createT(length);
+            int index = 0;
+            while (res.hasNext() && index < length)
+            {
+               I internal = res.next();
+               E external = convert(session, internal);
+               elements[index++] = external;
+            }
+            return elements;
+         }
+         public String toString()
+         {
+            return MOPAccess.this.getClass().getSimpleName() + "[offset=" + index + ",limit=" + length +  "]";
+         }
+      });
+   }
+
+   public int getSize() throws Exception
+   {
+      if (size == null)
+      {
+         size = mgr.execute(new POMTask<Integer>()
+         {
+            public Integer run(POMSession session) throws Exception
+            {
+               QueryResult res = findW(session, ownerType, ownerId, title, 0, 1);
+               return res.hits();
+            }
+            public String toString()
+            {
+               return MOPAccess.this.getClass().getSimpleName() + "[size]";
+            }
+         });
+         if (size == null)
+         {
+            size = 0;
+         }
+      }
+      return size;
+   }
+
+   protected abstract QueryResult<I> findW(
+      POMSession session,
+      ObjectType<Site> siteType,
+      String ownerId,
+      String title, int offset, int limit);
+
+   protected abstract E[] createT(int length);
+
+   protected abstract E convert(POMSession session, I internal);
+
+   public static class PageAccess extends MOPAccess<PageData, Page>
+   {
+
+      public PageAccess(POMSessionManager mgr, Query<PageData> pageDataQuery)
+      {
+         super(mgr, pageDataQuery);
+      }
+
+      @Override
+      protected QueryResult<Page> findW(POMSession session, ObjectType<Site> siteType, String ownerId, String title, int offset, int limit)
+      {
+         return session.findObjects(ObjectType.PAGE, siteType, ownerId, title, offset, limit);
+      }
+
+      @Override
+      protected PageData convert(POMSession session, Page internal)
+      {
+         return new Mapper(session).load(internal);
+      }
+
+      @Override
+      protected PageData[] createT(int length)
+      {
+         return new PageData[length];
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/tasks/PageNavigationTask.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/tasks/PageNavigationTask.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/tasks/PageNavigationTask.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,231 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- * 
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.pom.config.tasks;
-
-import org.exoplatform.portal.pom.config.cache.DataAccessMode;
-import org.exoplatform.portal.pom.config.cache.CacheableDataTask;
-import org.exoplatform.portal.pom.data.Mapper;
-
-import org.exoplatform.portal.pom.config.POMSession;
-import org.exoplatform.portal.pom.data.NavigationData;
-import org.exoplatform.portal.pom.data.NavigationKey;
-import org.gatein.common.logging.Logger;
-import org.gatein.common.logging.LoggerFactory;
-import org.gatein.mop.api.workspace.Navigation;
-import org.gatein.mop.api.workspace.ObjectType;
-import org.gatein.mop.api.workspace.Site;
-import org.gatein.mop.api.workspace.Workspace;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public abstract class PageNavigationTask
-{
-
-   /** . */
-   private static final Logger log = LoggerFactory.getLogger(PageNavigationTask.class);
-
-   /** . */
-   protected final ObjectType<? extends Site> siteType;
-
-   /** . */
-   protected final NavigationKey key;
-
-   protected PageNavigationTask(NavigationKey key)
-   {
-      this.key = key;
-      this.siteType = Mapper.parseSiteType(key.getType());
-   }
-
-   public static class Load extends PageNavigationTask implements CacheableDataTask<NavigationKey, NavigationData>
-   {
-
-      public Load(NavigationKey key)
-      {
-         super(key);
-      }
-
-      public DataAccessMode getAccessMode()
-      {
-         return DataAccessMode.READ;
-      }
-
-      public NavigationKey getKey()
-      {
-         return key;
-      }
-
-      public Class<NavigationData> getValueType()
-      {
-         return NavigationData.class;
-      }
-
-      public NavigationData run(POMSession session) throws Exception
-      {
-         Workspace workspace = session.getWorkspace();
-         Site site = workspace.getSite(siteType, key.getId());
-         if (site != null)
-         {
-            Navigation nav = site.getRootNavigation();
-            Navigation defaultNav = nav.getChild("default");
-            if (defaultNav != null)
-            {
-               return new Mapper(session).load(defaultNav);
-            }
-         }
-         else
-         {
-            log.debug("Cannot load page navigation as the corresponding portal " + key.getId()
-               + " with type " + siteType + " does not exist");
-         }
-
-         //
-         return null;
-      }
-
-      @Override
-      public String toString()
-      {
-         return "PageNavigation.Load[ownerType=" + key.getType() + ",ownerId=" + key.getId() + "]";
-      }
-   }
-
-   public static class Save extends PageNavigationTask implements CacheableDataTask<NavigationKey, Void>
-   {
-
-      /** . */
-      private final NavigationData pageNav;
-
-      /** . */
-      private final boolean overwrite;
-
-      public Save(NavigationData pageNav, boolean overwrite)
-      {
-         super(pageNav.getKey());
-
-         //
-         this.pageNav = pageNav;
-         this.overwrite = overwrite;
-      }
-
-      public Class<Void> getValueType()
-      {
-         return Void.class;
-      }
-
-      public DataAccessMode getAccessMode()
-      {
-         return pageNav.getStorageId() != null ? DataAccessMode.WRITE : DataAccessMode.CREATE;
-      }
-
-      public NavigationKey getKey()
-      {
-         return key;
-      }
-
-      public Void run(POMSession session) throws Exception
-      {
-         Workspace workspace = session.getWorkspace();
-         Site site = workspace.getSite(siteType, key.getId());
-         if (site == null)
-         {
-            throw new IllegalArgumentException("Cannot insert page navigation "
-               + " as the corresponding portal " + key.getId() + " with type " + siteType + " does not exist");
-         }
-
-         // Delete node descendants first
-         Navigation nav = site.getRootNavigation();
-
-         //
-         Navigation defaultNav = nav.getChild("default");
-         if (defaultNav == null)
-         {
-            defaultNav = nav.addChild("default");
-         }
-
-         //
-         new Mapper(session).save(pageNav, defaultNav);
-
-         //
-         return null;
-      }
-
-      @Override
-      public String toString()
-      {
-         return "PageNavigation.Save[ownerType=" + key.getType() + ",ownerId=" + key.getId() + "]";
-      }
-   }
-
-   public static class Remove extends PageNavigationTask implements CacheableDataTask<NavigationKey, Void>
-   {
-
-      public Remove(NavigationData pageNav)
-      {
-         super(pageNav.getKey());
-      }
-
-      public DataAccessMode getAccessMode()
-      {
-         return DataAccessMode.DESTROY;
-      }
-
-      public Class<Void> getValueType()
-      {
-         return Void.class;
-      }
-
-      public NavigationKey getKey()
-      {
-         return key;
-      }
-
-      public Void run(POMSession session) throws Exception
-      {
-         Workspace workspace = session.getWorkspace();
-         Site site = workspace.getSite(siteType, key.getId());
-         if (site == null)
-         {
-            throw new IllegalArgumentException("Cannot insert page navigation "
-               + " as the corresponding portal " + key.getId() + " with type " + siteType + " does not exist");
-         }
-
-         // Delete descendants
-         Navigation nav = site.getRootNavigation();
-
-         //
-         Navigation defaultNav = nav.getChild("default");
-         if (defaultNav != null)
-         {
-            defaultNav.destroy();
-         }
-
-         //
-         return null;
-      }
-
-      @Override
-      public String toString()
-      {
-         return "PageNavigation.Remove[ownerType=" + key.getType() + ",ownerId=" + key.getId() + "]";
-      }
-   }
-}
\ No newline at end of file

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/tasks/SearchTask.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/tasks/SearchTask.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/config/tasks/SearchTask.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -26,16 +26,15 @@
 import org.exoplatform.portal.pom.config.POMSessionManager;
 import org.exoplatform.portal.pom.config.POMTask;
 import org.exoplatform.portal.pom.data.Mapper;
-import org.exoplatform.portal.pom.data.NavigationData;
-import org.exoplatform.portal.pom.data.PageData;
 import org.exoplatform.portal.pom.data.PortalData;
 import org.exoplatform.portal.pom.data.PortalKey;
 import org.exoplatform.portal.pom.config.POMSession;
-import org.gatein.mop.api.workspace.*;
+import org.gatein.mop.api.workspace.ObjectType;
+import org.gatein.mop.api.workspace.Site;
+import org.gatein.mop.api.workspace.Workspace;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Iterator;
 
 /**
@@ -53,128 +52,6 @@
       this.q = query;
    }
 
-   public abstract static class FindSiteObject<W extends WorkspaceObject, T> extends SearchTask<T>
-   {
-
-      public FindSiteObject(Query<T> query)
-      {
-         super(query);
-      }
-
-      public final LazyPageList<T> run(final POMSession session) throws Exception
-      {
-         Iterator<W> ite;
-         try
-         {
-            String ownerType = q.getOwnerType();
-            ObjectType<? extends Site> siteType = null;
-            if (ownerType != null)
-            {
-               siteType = Mapper.parseSiteType(ownerType);
-            }
-            ite = findW(session, siteType, q.getOwnerId(), q.getTitle());
-
-         }
-         catch (IllegalArgumentException e)
-         {
-            ite = Collections.<W>emptyList().iterator();
-         }
-
-         //
-         final ArrayList<String> array = new ArrayList<String>();
-         while (ite.hasNext())
-         {
-            array.add(ite.next().getObjectId());
-         }
-
-         //
-         final POMSessionManager manager = session.getManager();
-         final Iterator<String> it = array.iterator();
-         ListAccess<T> la = new ListAccess<T>()
-         {
-            public T[] load(int index, int length) throws Exception, IllegalArgumentException
-            {
-               POMSession session = manager.getSession();
-               T[] result = createT(length);
-               for (int i = 0; i < length; i++)
-               {
-                  T t = loadT(session, it.next());
-                  result[i] = t;
-               }
-               return result;
-            }
-
-            public int getSize() throws Exception
-            {
-               return array.size();
-            }
-         };
-
-         //
-         return new LazyPageList<T>(la, 10);
-      }
-
-      protected abstract Iterator<W> findW(POMSession session, ObjectType<? extends Site> siteType, String ownerId,
-         String title);
-
-      protected abstract T[] createT(int length);
-
-      protected abstract T loadT(POMSession session, String id);
-
-   }
-
-   public static class FindPage extends FindSiteObject<org.gatein.mop.api.workspace.Page, PageData>
-   {
-
-      public FindPage(Query<PageData> pageQuery)
-      {
-         super(pageQuery);
-      }
-
-      protected Iterator<org.gatein.mop.api.workspace.Page> findW(POMSession session,
-         ObjectType<? extends Site> siteType, String ownerId, String title)
-      {
-         return session.findObjects(ObjectType.PAGE, siteType, q.getOwnerId(), q.getTitle());
-      }
-
-      protected PageData[] createT(int length)
-      {
-         return new PageData[length];
-      }
-
-      protected PageData loadT(POMSession session, String id)
-      {
-         Page page = session.getManager().getPOMService().getModel().findObjectById(ObjectType.PAGE, id);
-         return new Mapper(session).load(page);
-      }
-   }
-
-   public static class FindNavigation extends FindSiteObject<Navigation, NavigationData>
-   {
-
-      public FindNavigation(Query<NavigationData> pageQuery)
-      {
-         super(pageQuery);
-      }
-
-      protected Iterator<Navigation> findW(POMSession session, ObjectType<? extends Site> siteType, String ownerId,
-         String title)
-      {
-         return session.findObjects(ObjectType.NAVIGATION, siteType, q.getOwnerId(), q.getTitle());
-      }
-
-      protected NavigationData[] createT(int length)
-      {
-         return new NavigationData[length];
-      }
-
-      protected NavigationData loadT(POMSession session, String id)
-      {
-         Navigation nav = session.getManager().getPOMService().getModel().findObjectById(ObjectType.NAVIGATION, id);
-         return new Mapper(session).load(nav);
-      }
-   }
-
    public static class FindPortletPreferences extends SearchTask<PortletPreferences>
    {
 
@@ -251,27 +128,36 @@
       public LazyPageList<PortalKey> run(final POMSession session) throws Exception
       {
          Workspace workspace = session.getWorkspace();
-         final Collection<? extends Site> portals = workspace.getSites(ObjectType.PORTAL_SITE);
+         Collection<Site> sites = workspace.getSites(ObjectType.PORTAL_SITE);
+         final ArrayList<PortalKey> keys = new ArrayList<PortalKey>(sites.size());
+         for (Site site : sites)
+         {
+            keys.add(new PortalKey("portal", site.getName()));
+         }
          ListAccess<PortalKey> la = new ListAccess<PortalKey>()
          {
             public PortalKey[] load(int index, int length) throws Exception, IllegalArgumentException
             {
-               Iterator<? extends Site> iterator = portals.iterator();
                PortalKey[] result = new PortalKey[length];
                for (int i = 0; i < length; i++)
                {
-                  Site site = iterator.next();
-                  result[i] = new PortalKey("portal", site.getName());
+                  result[i] = keys.get(index++);
                }
                return result;
             }
 
             public int getSize() throws Exception
             {
-               return portals.size();
+               return keys.size();
             }
          };
          return new LazyPageList<PortalKey>(la, 10);
       }
    }
+
+  @Override
+  public String toString()
+  {
+     return getClass().getSimpleName() + "[query=" + q + "]";
+  }
 }

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/MappedAttributes.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/MappedAttributes.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/MappedAttributes.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -30,7 +30,7 @@
  * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
  * @version $Revision$
  */
-class MappedAttributes
+public class MappedAttributes
 {
 
    private MappedAttributes()

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/Mapper.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/Mapper.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/Mapper.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -38,8 +38,6 @@
 import org.gatein.mop.api.content.ContentType;
 import org.gatein.mop.api.content.Customization;
 import org.gatein.mop.api.workspace.*;
-import org.gatein.mop.api.workspace.link.Link;
-import org.gatein.mop.api.workspace.link.PageLink;
 import org.gatein.mop.api.workspace.ui.UIBody;
 import org.gatein.mop.api.workspace.ui.UIComponent;
 import org.gatein.mop.api.workspace.ui.UIContainer;
@@ -51,7 +49,6 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -98,198 +95,6 @@
       this.session = session;
    }
 
-   public NavigationData load(Navigation src)
-   {
-      return load(src, NavigationData.class);
-   }
-
-   private <T extends NavigationNodeContainerData> T load(Navigation src, Class<T> type)
-   {
-
-      //
-      ArrayList<NavigationNodeData> children = new ArrayList<NavigationNodeData>(src.getChildren().size());
-      for (Navigation srcChild : src.getChildren())
-      {
-         NavigationNodeData dstChild = load(srcChild, NavigationNodeData.class);
-         children.add(dstChild);
-      }
-
-      //
-      T dst;
-      if (type == NavigationData.class)
-      {
-         Site site = src.getSite();
-         String ownerType = getOwnerType(site.getObjectType());
-         String ownerId = site.getName();
-         Attributes attrs = src.getAttributes();
-         NavigationData dstNav = new NavigationData(
-            src.getObjectId(),
-            ownerType,
-            ownerId,
-            attrs.getValue(MappedAttributes.PRIORITY, 1),
-            children);
-         dst = (T)dstNav;
-      }
-      else if (type == NavigationNodeData.class)
-      {
-         Attributes attrs = src.getAttributes();
-         String pageReference = null;
-         Link link = src.getLink();
-         if (link instanceof PageLink)
-         {
-            PageLink pageLink = (PageLink)link;
-            org.gatein.mop.api.workspace.Page target = pageLink.getPage();
-            if (target != null)
-            {
-               Site site = target.getSite();
-               ObjectType<? extends Site> siteType = site.getObjectType();
-               pageReference = getOwnerType(siteType) + "::" + site.getName() + "::" + target.getName();
-            }
-         }
-
-         //
-         Described described = src.adapt(Described.class);
-
-         //
-         Visible visible = src.adapt(Visible.class);
-
-         //
-         NavigationNodeData dstNode = new NavigationNodeData(
-            src.getObjectId(),
-            attrs.getValue(MappedAttributes.URI),
-            described.getName(),
-            attrs.getValue(MappedAttributes.ICON),
-            src.getName(),
-            visible.getStartPublicationDate(),
-            visible.getEndPublicationDate(),
-            visible.getVisibility() != null ? visible.getVisibility() : Visibility.DISPLAYED,
-            pageReference,
-            children
-         );
-
-         dst = (T)dstNode;
-      }
-      else
-      {
-         throw new AssertionError();
-      }
-
-      //
-      return dst;
-   }
-
-   public void save(NavigationData src, Navigation dst)
-   {
-      save((NavigationNodeContainerData)src, dst);
-   }
-
-   private void save(NavigationNodeContainerData src, Navigation dst)
-   {
-      if (src instanceof NavigationNodeData)
-      {
-         NavigationNodeData node = (NavigationNodeData)src;
-         Workspace workspace = dst.getSite().getWorkspace();
-         String reference = node.getPageReference();
-         if (reference != null)
-         {
-            String[] pageChunks = split("::", reference);
-            ObjectType<? extends Site> siteType = parseSiteType(pageChunks[0]);
-            Site site = workspace.getSite(siteType, pageChunks[1]);
-            org.gatein.mop.api.workspace.Page target = site.getRootPage().getChild("pages").getChild(pageChunks[2]);
-            PageLink link = dst.linkTo(ObjectType.PAGE_LINK);
-            link.setPage(target);
-         }
-         else
-         {
-            PageLink link = dst.linkTo(ObjectType.PAGE_LINK);
-            link.setPage(null);
-         }
-
-         //
-         Described described = dst.adapt(Described.class);
-         described.setName(node.getLabel());
-         if(!dst.getName().equals(((NavigationNodeData) src).getName()))
-         {
-            dst.setName(((NavigationNodeData) src).getName());
-         }
-         //
-         Visible visible = dst.adapt(Visible.class);
-         visible.setVisibility(node.getVisibility());
-         visible.setStartPublicationDate(node.getStartPublicationDate());
-         visible.setEndPublicationDate(node.getEndPublicationDate());
-
-         //
-         Attributes attrs = dst.getAttributes();
-         attrs.setValue(MappedAttributes.URI, node.getURI());
-         attrs.setValue(MappedAttributes.ICON, node.getIcon());
-      }
-      else if (src instanceof NavigationData)
-      {
-         NavigationData pageNav = (NavigationData)src;
-
-         //
-         Attributes attrs = dst.getAttributes();
-         attrs.setValue(MappedAttributes.PRIORITY, pageNav.getPriority());
-      }
-      else
-      {
-         throw new AssertionError();
-      }
-
-      //
-      final List<String> orders = new ArrayList<String>();
-      Set<String> savedSet = new HashSet<String>();
-      for (NavigationNodeData node : src.getNodes())
-      {
-         String srcId = node.getStorageId();
-         Navigation dstChild;
-         if (srcId != null)
-         {
-            dstChild = session.findObjectById(ObjectType.NAVIGATION, srcId);
-         }
-         else
-         {
-            dstChild = dst.getChild(node.getName());
-            if (dstChild == null)
-            {
-               dstChild = dst.addChild(node.getName());
-            }
-            srcId = dstChild.getObjectId();
-         }
-         save(node, dstChild);
-         savedSet.add(srcId);
-         orders.add(dstChild.getObjectId());
-      }
-      for (Iterator<? extends Navigation> i = dst.getChildren().iterator(); i.hasNext();)
-      {
-         Navigation dstChild = i.next();
-         if (!savedSet.contains(dstChild.getObjectId()))
-         {
-            Visible visible = dstChild.adapt(Visible.class);
-            if (visible.getVisibility() != Visibility.SYSTEM)
-            {
-               i.remove();
-            }
-         }
-      }
-      // Now sort children according to the order provided by the container
-      // need to replace that with Collections.sort once the set(int index, E element) is implemented in Chromattic lists
-      Navigation[] a = dst.getChildren().toArray(new Navigation[dst.getChildren().size()]);
-      Arrays.sort(a, new Comparator<Navigation>()
-      {
-         public int compare(Navigation o1, Navigation o2)
-         {
-            int i1 = orders.indexOf(o1.getObjectId());
-            int i2 = orders.indexOf(o2.getObjectId());
-            return i1 - i2;
-         }
-      });
-      for (int j = 0; j < a.length; j++)
-      {
-         dst.getChildren().add(j, a[j]);
-      }
-   }
-
    public PortalData load(Site src)
    {
       String type = Mapper.getOwnerType(src.getObjectType());

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/ModelDataStorage.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/ModelDataStorage.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/ModelDataStorage.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,6 +19,9 @@
 
 package org.exoplatform.portal.pom.data;
 
+import java.util.Comparator;
+import java.util.List;
+
 import org.exoplatform.commons.utils.LazyPageList;
 import org.exoplatform.portal.application.PortletPreferences;
 import org.exoplatform.portal.config.Query;
@@ -29,9 +32,6 @@
 import org.exoplatform.portal.pom.data.PageData;
 import org.exoplatform.portal.pom.data.PortalData;
 
-import java.util.Comparator;
-import java.util.List;
-
 /**
  * Created by The eXo Platform SAS
  * Apr 19, 2007
@@ -80,14 +80,7 @@
     */
    public List<ModelChange> save(PageData page) throws Exception;
 
-   public NavigationData getPageNavigation(NavigationKey key) throws Exception;
 
-   public void save(NavigationData navigation) throws Exception;
-
-   public void create(NavigationData navigation) throws Exception;
-
-   public void remove(NavigationData navigation) throws Exception;
-
    public void save(PortletPreferences portletPreferences) throws Exception;
 
    public <S> String getId(ApplicationState<S> state) throws Exception;

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NavigationData.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NavigationData.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NavigationData.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,88 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.exoplatform.portal.pom.data;
-
-import java.util.List;
-
-/**
-* @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
-* @version $Revision$
-*/
-public class NavigationData extends NavigationNodeContainerData
-{
-
-   /** . */
-   private final NavigationKey key;
-
-   /** . */
-   private final int priority;
-
-   public NavigationData(
-      String ownerType,
-      String ownerId,
-      Integer priority,
-      List<NavigationNodeData> children)
-   {
-      this(null, ownerType, ownerId, priority, children);
-   }
-
-   public NavigationData(
-      String storageId,
-      String ownerType,
-      String ownerId,
-      Integer priority,
-      List<NavigationNodeData> children)
-   {
-      super(storageId, children);
-
-      //
-      if (ownerType == null)
-      {
-         throw new NullPointerException("No null owner type");
-      }
-      if (ownerId == null)
-      {
-         throw new NullPointerException("No null owner id");
-      }
-
-      //
-      this.key = new NavigationKey(ownerType, ownerId);
-      this.priority = priority != null ? priority : 1;
-   }
-
-   public NavigationKey getKey()
-   {
-      return key;
-   }
-
-   public String getOwnerType()
-   {
-      return key.getType();
-   }
-
-   public String getOwnerId()
-   {
-      return key.getId();
-   }
-
-   public int getPriority()
-   {
-      return priority;
-   }
-}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NavigationNodeContainerData.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NavigationNodeContainerData.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NavigationNodeContainerData.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,45 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.exoplatform.portal.pom.data;
-
-import java.util.List;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public abstract class NavigationNodeContainerData extends ModelData
-{
-
-   /** . */
-   private final List<NavigationNodeData> nodes;
-
-   public NavigationNodeContainerData(String storageId, List<NavigationNodeData> nodes)
-   {
-      super(storageId, null);
-
-      //
-      this.nodes = nodes;
-   }
-
-   public List<NavigationNodeData> getNodes()
-   {
-      return nodes;
-   }
-}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NavigationNodeData.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NavigationNodeData.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NavigationNodeData.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,134 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.exoplatform.portal.pom.data;
-
-import org.exoplatform.portal.mop.Visibility;
-
-import java.util.Date;
-import java.util.List;
-
-/**
-* @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
-* @version $Revision$
-*/
-public class NavigationNodeData extends NavigationNodeContainerData
-{
-
-   /** . */
-   private final String uri;
-
-   /** . */
-   private final String label;
-
-   /** . */
-   private final String icon;
-
-   /** . */
-   private final String name;
-
-   /** . */
-   private final Date startPublicationDate;
-
-   /** . */
-   private final Date endPublicationDate;
-
-   /** . */
-   private final Visibility visibility;
-
-   /** . */
-   private final String pageReference;
-
-   public NavigationNodeData(
-      String uri,
-      String label,
-      String icon,
-      String name,
-      Date startPublicationDate,
-      Date endPublicationDate,
-      Visibility visibility,
-      String pageReference,
-      List<NavigationNodeData> children)
-   {
-      this(null, uri, label, icon, name, startPublicationDate, endPublicationDate, visibility, pageReference, children);
-   }
-
-   public NavigationNodeData(
-      String storageId,
-      String uri,
-      String label,
-      String icon,
-      String name,
-      Date startPublicationDate,
-      Date endPublicationDate,
-      Visibility visibility,
-      String pageReference,
-      List<NavigationNodeData> children)
-   {
-      super(storageId, children);
-
-      //
-      this.uri = uri;
-      this.label = label;
-      this.icon = icon;
-      this.name = name;
-      this.startPublicationDate = startPublicationDate;
-      this.endPublicationDate = endPublicationDate;
-      this.visibility = visibility;
-      this.pageReference = pageReference;
-   }
-   public String getURI()
-   {
-      return uri;
-   }
-
-   public String getLabel()
-   {
-      return label;
-   }
-
-   public String getIcon()
-   {
-      return icon;
-   }
-
-   public String getName()
-   {
-      return name;
-   }
-
-   public Date getStartPublicationDate()
-   {
-      return startPublicationDate;
-   }
-
-   public Date getEndPublicationDate()
-   {
-      return endPublicationDate;
-   }
-
-   public Visibility getVisibility()
-   {
-      return visibility;
-   }
-
-   public String getPageReference()
-   {
-      return pageReference;
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NodeData.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/pom/data/NodeData.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NodeData.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/pom/data/NodeData.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,147 @@
+/**
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.portal.pom.data;
+
+import org.exoplatform.portal.mop.Visibility;
+
+import java.util.Date;
+
+/**
+* @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+* @version $Revision$
+*/
+public class NodeData extends ModelData
+{
+
+   /** . */
+   private final String uri;
+
+   /** . */
+   private final String label;
+
+   /** . */
+   private final String icon;
+
+   /** . */
+   private final String name;
+
+   /** . */
+   private final Date startPublicationDate;
+
+   /** . */
+   private final Date endPublicationDate;
+
+   /** . */
+   private final Visibility visibility;
+
+   /** . */
+   private final String pageReference;
+
+   /** . */
+   private final String[] children;
+
+   public NodeData(
+      String uri,
+      String label,
+      String icon,
+      String name,
+      Date startPublicationDate,
+      Date endPublicationDate,
+      Visibility visibility,
+      String pageReference,
+      String[] children)
+   {
+      this(null, uri, label, icon, name, startPublicationDate, endPublicationDate, visibility, pageReference, children);
+   }
+
+   public NodeData(
+      String storageId,
+      String uri,
+      String label,
+      String icon,
+      String name,
+      Date startPublicationDate,
+      Date endPublicationDate,
+      Visibility visibility,
+      String pageReference,
+      String[] children)
+   {
+      super(storageId, null);
+
+      //
+      this.uri = uri;
+      this.label = label;
+      this.icon = icon;
+      this.name = name;
+      this.startPublicationDate = startPublicationDate;
+      this.endPublicationDate = endPublicationDate;
+      this.visibility = visibility;
+      this.pageReference = pageReference;
+      this.children =  children;
+   }
+   public String getURI()
+   {
+      return uri;
+   }
+
+   public String getLabel()
+   {
+      return label;
+   }
+
+   public String getIcon()
+   {
+      return icon;
+   }
+
+   public String getName()
+   {
+      return name;
+   }
+
+   public Date getStartPublicationDate()
+   {
+      return startPublicationDate;
+   }
+
+   public Date getEndPublicationDate()
+   {
+      return endPublicationDate;
+   }
+
+   public Visibility getVisibility()
+   {
+      return visibility;
+   }
+
+   public String getPageReference()
+   {
+      return pageReference;
+   }
+
+   public int getChildrenCount()
+   {
+      return children.length;
+   }
+
+   public String getChildRef(int index)
+   {
+      return children[index];
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/Adapters.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/Adapters.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/Adapters.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.tree.diff;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class Adapters
-{
-
-   /** . */
-   private static final ArrayAdapter ARRAY_INSTANCE = new ArrayAdapter();
-
-   public static <E> ListAdapter<E[], E> list()
-   {
-      @SuppressWarnings("unchecked")
-      ListAdapter<E[], E> adapter = (ListAdapter<E[], E>)ARRAY_INSTANCE;
-      return adapter;
-   }
-
-   private static class ArrayAdapter<E> implements ListAdapter<E[], E>
-   {
-      public int size(E[] list)
-      {
-         return list.length;
-      }
-
-      public Iterator<E> iterator(final E[] list, final boolean reverse)
-      {
-         return new Iterator<E>()
-         {
-            /** . */
-            int count = 0;
-
-            public boolean hasNext()
-            {
-               return count < list.length;
-            }
-
-            public E next()
-            {
-               if (!hasNext())
-               {
-                  throw new NoSuchElementException();
-               }
-               int index = count++;
-               if (reverse)
-               {
-                  index = list.length - index - 1;
-               }
-               return list[index];
-            }
-
-            public void remove()
-            {
-               throw new UnsupportedOperationException();
-            }
-         };
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/Adapters.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/Adapters.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/Adapters.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/Adapters.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.tree.diff;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class Adapters
+{
+
+   /** . */
+   private static final ArrayAdapter ARRAY_INSTANCE = new ArrayAdapter();
+
+   public static <E> ListAdapter<E[], E> list()
+   {
+      @SuppressWarnings("unchecked")
+      ListAdapter<E[], E> adapter = (ListAdapter<E[], E>)ARRAY_INSTANCE;
+      return adapter;
+   }
+
+   private static class ArrayAdapter<E> implements ListAdapter<E[], E>
+   {
+      public int size(E[] list)
+      {
+         return list.length;
+      }
+
+      public Iterator<E> iterator(final E[] list, final boolean reverse)
+      {
+         return new Iterator<E>()
+         {
+            /** . */
+            int count = 0;
+
+            public boolean hasNext()
+            {
+               return count < list.length;
+            }
+
+            public E next()
+            {
+               if (!hasNext())
+               {
+                  throw new NoSuchElementException();
+               }
+               int index = count++;
+               if (reverse)
+               {
+                  index = list.length - index - 1;
+               }
+               return list[index];
+            }
+
+            public void remove()
+            {
+               throw new UnsupportedOperationException();
+            }
+         };
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyAdapter.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyAdapter.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyAdapter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.tree.diff;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public interface HierarchyAdapter<L, N, H> {
-
-   H getHandle(N node);
-
-   L getChildren(N node);
-
-   N getDescendant(N node, H handle);
-
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyAdapter.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyAdapter.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyAdapter.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyAdapter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.tree.diff;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public interface HierarchyAdapter<L, N, H> {
+
+   H getHandle(N node);
+
+   L getChildren(N node);
+
+   N getDescendant(N node, H handle);
+
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeIterator.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeIterator.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeIterator.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,296 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.tree.diff;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class HierarchyChangeIterator<L1, N1, L2, N2, H> implements Iterator<HierarchyChangeType> {
-
-   /** . */
-   private final HierarchyDiff<L1, N1, L2, N2, H> diff;
-
-   /** . */
-   private Frame frame;
-
-   /** . */
-   private final HierarchyContext<L1, N1, H> context1;
-
-   /** . */
-   private final HierarchyContext<L2, N2, H> context2;
-
-   /** . */
-   private final ListDiff<L1, L2, H> listDiff;
-
-   HierarchyChangeIterator(HierarchyDiff<L1, N1, L2, N2, H> diff, HierarchyContext<L1, N1, H> context1, HierarchyContext<L2, N2, H> context2) {
-      this.diff = diff;
-      this.context1 = context1;
-      this.context2 = context2;
-      this.frame = new Frame(null, context1.getRoot(), context2.getRoot());
-      this.listDiff = new ListDiff<L1, L2, H>(
-            diff.listAdapter1,
-            diff.listAdapter2,
-            diff.comparator);
-   }
-
-   /**
-    * The internal status.
-    */
-   private enum Status {
-
-      INIT(null),
-
-      ENTER(HierarchyChangeType.ENTER),
-
-      KEEP(HierarchyChangeType.KEEP),
-
-      ADDED(HierarchyChangeType.ADDED),
-
-      REMOVED(HierarchyChangeType.REMOVED),
-
-      MOVED_IN(HierarchyChangeType.MOVED_IN),
-
-      MOVED_OUT(HierarchyChangeType.MOVED_OUT),
-
-      LEAVE(HierarchyChangeType.LEAVE),
-
-      ERROR(HierarchyChangeType.ERROR),
-
-      RESUME(null);
-
-      /** The associated change type. */
-      final HierarchyChangeType changeType;
-
-      private Status(HierarchyChangeType changeType) {
-         this.changeType = changeType;
-      }
-   }
-
-   private class Frame {
-
-      /** . */
-      private final Frame parent;
-
-      /** . */
-      private final N1 srcRoot;
-
-      /** . */
-      private final N2 dstRoot;
-
-      /** . */
-      private ListChangeIterator<L1, L2, H> it;
-
-      /** . */
-      private Status previous;
-
-      /** . */
-      private Status next;
-
-      /** . */
-      private Iterator<H> srcIt;
-
-      /** . */
-      private Iterator<H> dstIt;
-
-      /** . */
-      private N1 src;
-
-      /** . */
-      private N2 dst;
-
-      private Frame(Frame parent, N1 srcRoot, N2 dstRoot) {
-         this.parent = parent;
-         this.srcRoot = srcRoot;
-         this.dstRoot = dstRoot;
-         this.previous = Status.INIT;
-      }
-   }
-
-   public boolean hasNext() {
-      if (frame != null && frame.next == null) {
-         while (true) {
-
-            if (frame.previous == Status.INIT) {
-               H id2 = context2.getHierarchyAdapter().getHandle(frame.dstRoot);
-               if (frame.srcRoot == null)
-               {
-                  frame.next = Status.ENTER;
-                  frame.src = null;
-                  frame.dst = frame.dstRoot;
-               }
-               else
-               {
-                  H id1 = context1.getHierarchyAdapter().getHandle(frame.srcRoot);
-                  if (diff.comparator.compare(id1, id2) != 0) {
-                     frame.next = Status.ERROR;
-                     frame.src = frame.srcRoot;
-                     frame.dst = frame.dstRoot;
-                  } else {
-                     frame.next = Status.ENTER;
-                     frame.src = frame.srcRoot;
-                     frame.dst = frame.dstRoot;
-                  }
-               }
-               break;
-            } else if (frame.previous == Status.ERROR) {
-               break;
-            } else if (frame.previous == Status.LEAVE) {
-               frame = frame.parent;
-               if (frame != null) {
-                  frame.previous = Status.RESUME;
-                  continue;
-               } else {
-                  break;
-               }
-            } else if (frame.previous == Status.KEEP) {
-               frame = new Frame(frame, frame.src, frame.dst);
-               continue;
-            } else if (frame.previous == Status.MOVED_IN) {
-               frame = new Frame(frame, frame.src, frame.dst);
-               continue;
-            } else if (frame.previous == Status.ADDED) {
-               frame = new Frame(frame, frame.src, frame.dst);
-               continue;
-            } else if (frame.previous == Status.ENTER) {
-               L1 children1;
-               if (frame.src != null) {
-                  children1 = context1.getHierarchyAdapter().getChildren(frame.srcRoot);
-                  frame.srcIt = diff.listAdapter1.iterator(children1, false);
-               }
-               else {
-                  children1 = null;
-                  frame.srcIt = null;
-               }
-               L2 children2 = context2.getHierarchyAdapter().getChildren(frame.dstRoot);
-               frame.dstIt = diff.listAdapter2.iterator(children2, false);
-               frame.it = listDiff.iterator(children1, children2);
-            } else {
-               // Nothing
-            }
-
-            //
-            if (frame.it.hasNext()) {
-               switch (frame.it.next()) {
-                  case SAME:
-                     N1 next1 = context1.findByHandle(frame.srcIt.next());
-                     N2 next2 = context2.findByHandle(frame.dstIt.next());
-                     frame.next = Status.KEEP;
-                     frame.src = next1;
-                     frame.dst = next2;
-                     break;
-                  case ADD:
-                     frame.dstIt.next();
-                     H addedHandle = frame.it.getElement();
-                     N2 added = context2.findByHandle(addedHandle);
-                     H addedId = context2.getHierarchyAdapter().getHandle(added);
-                     N1 a = context1.findByHandle(addedId);
-                     if (a != null) {
-                        frame.next = Status.MOVED_IN;
-                        frame.src = a;
-                        frame.dst = added;
-                     } else {
-                        frame.next = Status.ADDED;
-                        frame.src = null;
-                        frame.dst = added;
-                     }
-                     break;
-                  case REMOVE:
-                     frame.srcIt.next();
-                     H removedHandle = frame.it.getElement();
-                     N1 removed = context1.findByHandle(removedHandle);
-                     H removedId = context1.getHierarchyAdapter().getHandle(removed);
-                     N2 b = context2.findByHandle(removedId);
-                     if (b != null) {
-                        frame.next = Status.MOVED_OUT;
-                        frame.src = removed;
-                        frame.dst = b;
-                     } else {
-                        frame.next = Status.REMOVED;
-                        frame.src = removed;
-                        frame.dst = null;
-                     }
-                     break;
-                  default:
-                     throw new AssertionError();
-               }
-            } else {
-               frame.next = Status.LEAVE;
-               frame.src = frame.srcRoot;
-               frame.dst = frame.dstRoot;
-            }
-
-            //
-            break;
-         }
-      }
-      return frame != null && frame.next != null;
-   }
-
-   public HierarchyChangeType next() {
-      if (!hasNext()) {
-         throw new NoSuchElementException();
-      } else {
-         frame.previous = frame.next;
-         frame.next = null;
-         return frame.previous.changeType;
-      }
-   }
-
-   public void skip() {
-      if (frame.previous == HierarchyChangeIterator.Status.ENTER) {
-
-         // A bit hackish as it bypass the main loop
-         // the proper way to do it would be to introduce a SKIP status
-         // and properly react to it to update the state machine
-         // but for now it will do
-
-         frame.next = Status.LEAVE;
-         frame.src = frame.srcRoot;
-         frame.dst = frame.dstRoot;
-      } else {
-         throw new IllegalStateException("Cannot skip when in state " + frame.previous);
-      }
-   }
-
-   public N1 getSource() {
-      return frame.src;
-   }
-
-   public N2 getDestination() {
-      return frame.dst;
-   }
-
-   public N1 peekSourceRoot()
-   {
-      return frame.srcRoot;
-   }
-
-   public N2 peekDestinationRoot()
-   {
-      return frame.dstRoot;
-   }
-
-   public void remove() {
-      throw new UnsupportedOperationException();
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeIterator.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeIterator.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeIterator.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeIterator.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,296 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.tree.diff;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class HierarchyChangeIterator<L1, N1, L2, N2, H> implements Iterator<HierarchyChangeType> {
+
+   /** . */
+   private final HierarchyDiff<L1, N1, L2, N2, H> diff;
+
+   /** . */
+   private Frame frame;
+
+   /** . */
+   private final HierarchyContext<L1, N1, H> context1;
+
+   /** . */
+   private final HierarchyContext<L2, N2, H> context2;
+
+   /** . */
+   private final ListDiff<L1, L2, H> listDiff;
+
+   HierarchyChangeIterator(HierarchyDiff<L1, N1, L2, N2, H> diff, HierarchyContext<L1, N1, H> context1, HierarchyContext<L2, N2, H> context2) {
+      this.diff = diff;
+      this.context1 = context1;
+      this.context2 = context2;
+      this.frame = new Frame(null, context1.getRoot(), context2.getRoot());
+      this.listDiff = new ListDiff<L1, L2, H>(
+            diff.listAdapter1,
+            diff.listAdapter2,
+            diff.comparator);
+   }
+
+   /**
+    * The internal status.
+    */
+   private enum Status {
+
+      INIT(null),
+
+      ENTER(HierarchyChangeType.ENTER),
+
+      KEEP(HierarchyChangeType.KEEP),
+
+      ADDED(HierarchyChangeType.ADDED),
+
+      REMOVED(HierarchyChangeType.REMOVED),
+
+      MOVED_IN(HierarchyChangeType.MOVED_IN),
+
+      MOVED_OUT(HierarchyChangeType.MOVED_OUT),
+
+      LEAVE(HierarchyChangeType.LEAVE),
+
+      ERROR(HierarchyChangeType.ERROR),
+
+      RESUME(null);
+
+      /** The associated change type. */
+      final HierarchyChangeType changeType;
+
+      private Status(HierarchyChangeType changeType) {
+         this.changeType = changeType;
+      }
+   }
+
+   private class Frame {
+
+      /** . */
+      private final Frame parent;
+
+      /** . */
+      private final N1 srcRoot;
+
+      /** . */
+      private final N2 dstRoot;
+
+      /** . */
+      private ListChangeIterator<L1, L2, H> it;
+
+      /** . */
+      private Status previous;
+
+      /** . */
+      private Status next;
+
+      /** . */
+      private Iterator<H> srcIt;
+
+      /** . */
+      private Iterator<H> dstIt;
+
+      /** . */
+      private N1 src;
+
+      /** . */
+      private N2 dst;
+
+      private Frame(Frame parent, N1 srcRoot, N2 dstRoot) {
+         this.parent = parent;
+         this.srcRoot = srcRoot;
+         this.dstRoot = dstRoot;
+         this.previous = Status.INIT;
+      }
+   }
+
+   public boolean hasNext() {
+      if (frame != null && frame.next == null) {
+         while (true) {
+
+            if (frame.previous == Status.INIT) {
+               H id2 = context2.getHierarchyAdapter().getHandle(frame.dstRoot);
+               if (frame.srcRoot == null)
+               {
+                  frame.next = Status.ENTER;
+                  frame.src = null;
+                  frame.dst = frame.dstRoot;
+               }
+               else
+               {
+                  H id1 = context1.getHierarchyAdapter().getHandle(frame.srcRoot);
+                  if (diff.comparator.compare(id1, id2) != 0) {
+                     frame.next = Status.ERROR;
+                     frame.src = frame.srcRoot;
+                     frame.dst = frame.dstRoot;
+                  } else {
+                     frame.next = Status.ENTER;
+                     frame.src = frame.srcRoot;
+                     frame.dst = frame.dstRoot;
+                  }
+               }
+               break;
+            } else if (frame.previous == Status.ERROR) {
+               break;
+            } else if (frame.previous == Status.LEAVE) {
+               frame = frame.parent;
+               if (frame != null) {
+                  frame.previous = Status.RESUME;
+                  continue;
+               } else {
+                  break;
+               }
+            } else if (frame.previous == Status.KEEP) {
+               frame = new Frame(frame, frame.src, frame.dst);
+               continue;
+            } else if (frame.previous == Status.MOVED_IN) {
+               frame = new Frame(frame, frame.src, frame.dst);
+               continue;
+            } else if (frame.previous == Status.ADDED) {
+               frame = new Frame(frame, frame.src, frame.dst);
+               continue;
+            } else if (frame.previous == Status.ENTER) {
+               L1 children1;
+               if (frame.src != null) {
+                  children1 = context1.getHierarchyAdapter().getChildren(frame.srcRoot);
+                  frame.srcIt = diff.listAdapter1.iterator(children1, false);
+               }
+               else {
+                  children1 = null;
+                  frame.srcIt = null;
+               }
+               L2 children2 = context2.getHierarchyAdapter().getChildren(frame.dstRoot);
+               frame.dstIt = diff.listAdapter2.iterator(children2, false);
+               frame.it = listDiff.iterator(children1, children2);
+            } else {
+               // Nothing
+            }
+
+            //
+            if (frame.it.hasNext()) {
+               switch (frame.it.next()) {
+                  case SAME:
+                     N1 next1 = context1.findByHandle(frame.srcIt.next());
+                     N2 next2 = context2.findByHandle(frame.dstIt.next());
+                     frame.next = Status.KEEP;
+                     frame.src = next1;
+                     frame.dst = next2;
+                     break;
+                  case ADD:
+                     frame.dstIt.next();
+                     H addedHandle = frame.it.getElement();
+                     N2 added = context2.findByHandle(addedHandle);
+                     H addedId = context2.getHierarchyAdapter().getHandle(added);
+                     N1 a = context1.findByHandle(addedId);
+                     if (a != null) {
+                        frame.next = Status.MOVED_IN;
+                        frame.src = a;
+                        frame.dst = added;
+                     } else {
+                        frame.next = Status.ADDED;
+                        frame.src = null;
+                        frame.dst = added;
+                     }
+                     break;
+                  case REMOVE:
+                     frame.srcIt.next();
+                     H removedHandle = frame.it.getElement();
+                     N1 removed = context1.findByHandle(removedHandle);
+                     H removedId = context1.getHierarchyAdapter().getHandle(removed);
+                     N2 b = context2.findByHandle(removedId);
+                     if (b != null) {
+                        frame.next = Status.MOVED_OUT;
+                        frame.src = removed;
+                        frame.dst = b;
+                     } else {
+                        frame.next = Status.REMOVED;
+                        frame.src = removed;
+                        frame.dst = null;
+                     }
+                     break;
+                  default:
+                     throw new AssertionError();
+               }
+            } else {
+               frame.next = Status.LEAVE;
+               frame.src = frame.srcRoot;
+               frame.dst = frame.dstRoot;
+            }
+
+            //
+            break;
+         }
+      }
+      return frame != null && frame.next != null;
+   }
+
+   public HierarchyChangeType next() {
+      if (!hasNext()) {
+         throw new NoSuchElementException();
+      } else {
+         frame.previous = frame.next;
+         frame.next = null;
+         return frame.previous.changeType;
+      }
+   }
+
+   public void skip() {
+      if (frame.previous == HierarchyChangeIterator.Status.ENTER) {
+
+         // A bit hackish as it bypass the main loop
+         // the proper way to do it would be to introduce a SKIP status
+         // and properly react to it to update the state machine
+         // but for now it will do
+
+         frame.next = Status.LEAVE;
+         frame.src = frame.srcRoot;
+         frame.dst = frame.dstRoot;
+      } else {
+         throw new IllegalStateException("Cannot skip when in state " + frame.previous);
+      }
+   }
+
+   public N1 getSource() {
+      return frame.src;
+   }
+
+   public N2 getDestination() {
+      return frame.dst;
+   }
+
+   public N1 peekSourceRoot()
+   {
+      return frame.srcRoot;
+   }
+
+   public N2 peekDestinationRoot()
+   {
+      return frame.dstRoot;
+   }
+
+   public void remove() {
+      throw new UnsupportedOperationException();
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeType.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeType.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeType.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.tree.diff;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public enum HierarchyChangeType {
-
-   ENTER,
-
-   KEEP,
-
-   ADDED,
-
-   REMOVED,
-
-   MOVED_IN,
-
-   MOVED_OUT,
-
-   LEAVE,
-
-   ERROR
-
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeType.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeType.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeType.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyChangeType.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.tree.diff;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public enum HierarchyChangeType {
+
+   ENTER,
+
+   KEEP,
+
+   ADDED,
+
+   REMOVED,
+
+   MOVED_IN,
+
+   MOVED_OUT,
+
+   LEAVE,
+
+   ERROR
+
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyContext.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyContext.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyContext.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.tree.diff;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class HierarchyContext<L, N, H> {
-
-   /** . */
-   final ListAdapter<L, H> listAdapter;
-
-   /** . */
-   final HierarchyAdapter<L, N, H> hierarchyAdapter;
-
-   /** . */
-   final N root;
-
-   public HierarchyContext(ListAdapter<L, H> listAdapter, HierarchyAdapter<L, N, H> hierarchyAdapter, N root) throws NullPointerException {
-      if (listAdapter == null) {
-         throw new NullPointerException();
-      }
-      if (hierarchyAdapter == null) {
-         throw new NullPointerException();
-      }
-      if (root == null) {
-         throw new NullPointerException();
-      }
-
-      //
-      this.listAdapter = listAdapter;
-      this.hierarchyAdapter = hierarchyAdapter;
-      this.root = root;
-   }
-
-   public HierarchyAdapter<L, N, H> getHierarchyAdapter() {
-      return hierarchyAdapter;
-   }
-
-   public N getRoot() {
-      return root;
-   }
-
-   public N findByHandle(H handle) {
-      return hierarchyAdapter.getDescendant(root, handle);
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyContext.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyContext.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyContext.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyContext.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.tree.diff;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class HierarchyContext<L, N, H> {
+
+   /** . */
+   final ListAdapter<L, H> listAdapter;
+
+   /** . */
+   final HierarchyAdapter<L, N, H> hierarchyAdapter;
+
+   /** . */
+   final N root;
+
+   public HierarchyContext(ListAdapter<L, H> listAdapter, HierarchyAdapter<L, N, H> hierarchyAdapter, N root) throws NullPointerException {
+      if (listAdapter == null) {
+         throw new NullPointerException();
+      }
+      if (hierarchyAdapter == null) {
+         throw new NullPointerException();
+      }
+      if (root == null) {
+         throw new NullPointerException();
+      }
+
+      //
+      this.listAdapter = listAdapter;
+      this.hierarchyAdapter = hierarchyAdapter;
+      this.root = root;
+   }
+
+   public HierarchyAdapter<L, N, H> getHierarchyAdapter() {
+      return hierarchyAdapter;
+   }
+
+   public N getRoot() {
+      return root;
+   }
+
+   public N findByHandle(H handle) {
+      return hierarchyAdapter.getDescendant(root, handle);
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyDiff.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyDiff.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyDiff.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.tree.diff;
-
-import java.util.Comparator;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class HierarchyDiff<L1, N1, L2, N2, H> {
-
-   public static <L1, N1, L2, N2, H> HierarchyDiff<L1, N1, L2, N2, H> create(
-      ListAdapter<L1, H> listAdapter1,
-      HierarchyAdapter<L1, N1, H> hierarchyAdapter1,
-      ListAdapter<L2, H> listAdapter2,
-      HierarchyAdapter<L2, N2, H> hierarchyAdapter2,
-      Comparator<H> comparator)
-   {
-      return new HierarchyDiff<L1, N1, L2, N2, H>(listAdapter1, hierarchyAdapter1, listAdapter2, hierarchyAdapter2, comparator);
-   }
-
-   /** . */
-   final ListAdapter<L1, H> listAdapter1;
-
-   /** . */
-   final HierarchyAdapter<L1, N1, H> hierarchyAdapter1;
-
-   /** . */
-   final ListAdapter<L2, H> listAdapter2;
-
-   /** . */
-   final HierarchyAdapter<L2, N2, H> hierarchyAdapter2;
-
-   /** . */
-   final Comparator<H> comparator;
-
-   public HierarchyDiff(ListAdapter<L1, H> listAdapter1, HierarchyAdapter<L1, N1, H> hierarchyAdapter1, ListAdapter<L2, H> listAdapter2, HierarchyAdapter<L2, N2, H> hierarchyAdapter2, Comparator<H> comparator) {
-      this.listAdapter1 = listAdapter1;
-      this.hierarchyAdapter1 = hierarchyAdapter1;
-      this.listAdapter2 = listAdapter2;
-      this.hierarchyAdapter2 = hierarchyAdapter2;
-      this.comparator = comparator;
-   }
-
-   public HierarchyChangeIterator<L1, N1, L2, N2, H> iterator(N1 node1, N2 node2) {
-      return new HierarchyChangeIterator<L1, N1, L2, N2, H>(this, new HierarchyContext<L1, N1, H>(listAdapter1, hierarchyAdapter1, node1), new HierarchyContext<L2, N2, H>(listAdapter2, hierarchyAdapter2, node2));
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyDiff.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyDiff.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyDiff.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/HierarchyDiff.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.tree.diff;
+
+import java.util.Comparator;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class HierarchyDiff<L1, N1, L2, N2, H> {
+
+   public static <L1, N1, L2, N2, H> HierarchyDiff<L1, N1, L2, N2, H> create(
+      ListAdapter<L1, H> listAdapter1,
+      HierarchyAdapter<L1, N1, H> hierarchyAdapter1,
+      ListAdapter<L2, H> listAdapter2,
+      HierarchyAdapter<L2, N2, H> hierarchyAdapter2,
+      Comparator<H> comparator)
+   {
+      return new HierarchyDiff<L1, N1, L2, N2, H>(listAdapter1, hierarchyAdapter1, listAdapter2, hierarchyAdapter2, comparator);
+   }
+
+   /** . */
+   final ListAdapter<L1, H> listAdapter1;
+
+   /** . */
+   final HierarchyAdapter<L1, N1, H> hierarchyAdapter1;
+
+   /** . */
+   final ListAdapter<L2, H> listAdapter2;
+
+   /** . */
+   final HierarchyAdapter<L2, N2, H> hierarchyAdapter2;
+
+   /** . */
+   final Comparator<H> comparator;
+
+   public HierarchyDiff(ListAdapter<L1, H> listAdapter1, HierarchyAdapter<L1, N1, H> hierarchyAdapter1, ListAdapter<L2, H> listAdapter2, HierarchyAdapter<L2, N2, H> hierarchyAdapter2, Comparator<H> comparator) {
+      this.listAdapter1 = listAdapter1;
+      this.hierarchyAdapter1 = hierarchyAdapter1;
+      this.listAdapter2 = listAdapter2;
+      this.hierarchyAdapter2 = hierarchyAdapter2;
+      this.comparator = comparator;
+   }
+
+   public HierarchyChangeIterator<L1, N1, L2, N2, H> iterator(N1 node1, N2 node2) {
+      return new HierarchyChangeIterator<L1, N1, L2, N2, H>(this, new HierarchyContext<L1, N1, H>(listAdapter1, hierarchyAdapter1, node1), new HierarchyContext<L2, N2, H>(listAdapter2, hierarchyAdapter2, node2));
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListAdapter.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListAdapter.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListAdapter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.tree.diff;
-
-import java.util.Iterator;
-
-/**
- * An adapter for a list of elements.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public interface ListAdapter<L, E> {
-
-   /**
-    * Returns the number of list elements.
-    *
-    * @param list the list
-    * @return the list size
-    */
-   int size(L list);
-
-   /**
-    * Returns an iterator over the list elements.
-    *
-    *
-    * @param list the list
-    * @param reverse the iteration direction
-    * @return the iterator
-    */
-   Iterator<E> iterator(L list, boolean reverse);
-
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListAdapter.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListAdapter.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListAdapter.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListAdapter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.tree.diff;
+
+import java.util.Iterator;
+
+/**
+ * An adapter for a list of elements.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public interface ListAdapter<L, E> {
+
+   /**
+    * Returns the number of list elements.
+    *
+    * @param list the list
+    * @return the list size
+    */
+   int size(L list);
+
+   /**
+    * Returns an iterator over the list elements.
+    *
+    *
+    * @param list the list
+    * @param reverse the iteration direction
+    * @return the iterator
+    */
+   Iterator<E> iterator(L list, boolean reverse);
+
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeIterator.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeIterator.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeIterator.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,296 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.tree.diff;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * Iterates over a list of {@link ListChangeType} computed from two list of  objects. The implementation
- * is optimized to use the LCS algorithm only when needed, for trivial list no LCS computation should be
- * required.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class ListChangeIterator<L1, L2, E> implements Iterator<ListChangeType>
-{
-
-   /** . */
-   private static final int[] EMPTY = new int[0];
-
-   /** . */
-   private static final int TRIVIAL_MODE = 0;
-
-   /** . */
-   private static final int LCS_MODE = 1;
-
-   /** . */
-   ListDiff<L1, L2, E> diff;
-
-   /** . */
-   private final L1 elements1;
-
-   /** . */
-   private final L2 elements2;
-
-   /** . */
-   private final Iterator<E> it1;
-
-   /** . */
-   private final Iterator<E> it2;
-
-   /** . */
-   private int index1;
-
-   /** . */
-   private int index2;
-
-   /** . */
-   private E next1;
-
-   /** . */
-   private E next2;
-
-   /** . */
-   private E element;
-
-   /** . */
-   private ListChangeType type;
-
-   /** . */
-   private int mode;
-
-   /** . */
-   private boolean buffered;
-
-   // LCS state
-
-   /** . */
-   private int[] matrix;
-
-   /** . */
-   private int m;
-
-   /** . */
-   private int n;
-
-   ListChangeIterator(ListDiff<L1, L2, E> diff, L1 elements1, L2 elements2) {
-      this.diff = diff;
-      this.elements1 = elements1;
-      this.elements2 = elements2;
-      this.it1 = elements1 != null ? diff.adapter1.iterator(elements1, false) : null;
-      this.it2 = elements2 != null ? diff.adapter2.iterator(elements2, false) : null;
-      this.mode = TRIVIAL_MODE;
-
-      //
-      this.index1 = 0;
-      this.index2 = 0;
-      this.buffered = false;
-      this.next1 = null;
-      this.next2 = null;
-      this.type = null;
-      this.element = null;
-
-      //
-      if (it1 != null && it1.hasNext()) {
-         next1 = it1.next();
-      }
-      if (it2 != null && it2.hasNext()) {
-         next2 = it2.next();
-      }
-
-      //
-      this.m = 0;
-      this.n = 0;
-      this.matrix = EMPTY;
-   }
-
-   private void next1() {
-      index1++;
-      if (it1 != null && it1.hasNext()) {
-         next1 = it1.next();
-      } else {
-         next1 = null;
-      }
-   }
-
-   private void next2() {
-      index2++;
-      if (it2 != null && it2.hasNext()) {
-         next2 = it2.next();
-      } else {
-         next2 = null;
-      }
-   }
-
-   public boolean hasNext() {
-
-      while (!buffered) {
-         if (mode == TRIVIAL_MODE) {
-            if (next1 != null) {
-               if (next2 != null) {
-                  if (diff.equals(next1, next2)) {
-                     type = ListChangeType.SAME;
-                     element = next1;
-                     buffered = true;
-                     next1();
-                     next2();
-                  } else {
-                     lcs(index1, elements1, elements2);
-                     mode = LCS_MODE;
-                  }
-               } else {
-                  type = ListChangeType.REMOVE;
-                  element = next1;
-                  buffered = true;
-                  next1();
-               }
-            } else {
-               if (next2 != null) {
-                  type = ListChangeType.ADD;
-                  element = next2;
-                  buffered = true;
-                  next2();
-               } else {
-                  // Force a break with buffered to false
-                  break;
-               }
-            }
-         } else if (mode == LCS_MODE) {
-            E elt1 = null;
-            E elt2 = null;
-            int i = diff.adapter1.size(elements1) - index1;
-            int j = diff.adapter2.size(elements2) - index2;
-            if (i > 0 && j > 0 && diff.equals(elt1 = next1, elt2 = next2)) {
-               type = ListChangeType.SAME;
-               element = elt1;
-               next1();
-               next2();
-               buffered = true;
-            } else {
-               int index1 = i + (j - 1) * m;
-               int index2 = i - 1 + j * m;
-               if (j > 0 && (i == 0 || matrix[index1] >= matrix[index2])) {
-                  type = ListChangeType.ADD;
-                  element = elt2 == null ? next2 : elt2;
-                  next2();
-                  buffered = true;
-               } else if (i > 0 && (j == 0 || matrix[index1] < matrix[index2])) {
-                  type = ListChangeType.REMOVE;
-                  element = elt1 == null ? next1 : elt1;
-                  next1();
-                  buffered = true;
-               } else {
-                  // Force a break with buffered to false
-                  break;
-               }
-            }
-         } else {
-            throw new AssertionError();
-         }
-      }
-
-      //
-      return buffered;
-   }
-
-   public ListChangeType next() {
-      if (!hasNext()) {
-         throw new NoSuchElementException();
-      } else {
-         buffered = false;
-         return type;
-      }
-   }
-
-   public void remove() {
-      throw new UnsupportedOperationException();
-   }
-
-   public E getElement() {
-      return element;
-   }
-
-   public int getIndex1() {
-      return index1;
-   }
-
-   public int getIndex2() {
-      return index2;
-   }
-
-   /**
-    * Compute the LCS matrix from the specified offset. It updates the state of this object
-    * with the relevant state. The LCS matrix is computed using the LCS algorithm
-    * (see http://en.wikipedia.org/wiki/Longest_common_subsequence_problem).
-    *
-    * @param offset the offset
-    * @param elements1 the elements 1
-    * @param elements2 the elements 2
-    */
-   private void lcs(int offset, L1 elements1, L2 elements2) {
-      m = 1 + diff.adapter1.size(elements1) - offset;
-      n = 1 + diff.adapter2.size(elements2) - offset;
-
-      //
-      int s = m * n;
-      matrix = new int[s];
-
-      // Compute the lcs matrix
-      Iterator<E> itI = diff.adapter1.iterator(elements1, true);
-      for (int i = 1; i < m; i++) {
-         E abc = itI.next();
-         Iterator<E> itJ = diff.adapter2.iterator(elements2, true);
-         for (int j = 1; j < n; j++) {
-            int index = i + j * m;
-            int v;
-            E def = itJ.next();
-            if (diff.equals(abc, def)) {
-               v = matrix[index - m - 1] + 1;
-            } else {
-               int v1 = matrix[index - 1];
-               int v2 = matrix[index - m];
-               v = v1 < v2 ? v2 : v1;
-            }
-            matrix[index] = v;
-         }
-      }
-   }
-
-   // For unit testing purpose
-   String getMatrix() {
-      StringBuilder sb = new StringBuilder();
-      for (int i = 0; i < m; i++) {
-         sb.append('[');
-         for (int j = 0; j < n; j++) {
-            if (j > 0) {
-               sb.append(',');
-            }
-            sb.append(matrix[i + j * m]);
-         }
-         sb.append("]\n");
-      }
-      return sb.toString();
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeIterator.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeIterator.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeIterator.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeIterator.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,296 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.tree.diff;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * Iterates over a list of {@link ListChangeType} computed from two list of  objects. The implementation
+ * is optimized to use the LCS algorithm only when needed, for trivial list no LCS computation should be
+ * required.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class ListChangeIterator<L1, L2, E> implements Iterator<ListChangeType>
+{
+
+   /** . */
+   private static final int[] EMPTY = new int[0];
+
+   /** . */
+   private static final int TRIVIAL_MODE = 0;
+
+   /** . */
+   private static final int LCS_MODE = 1;
+
+   /** . */
+   ListDiff<L1, L2, E> diff;
+
+   /** . */
+   private final L1 elements1;
+
+   /** . */
+   private final L2 elements2;
+
+   /** . */
+   private final Iterator<E> it1;
+
+   /** . */
+   private final Iterator<E> it2;
+
+   /** . */
+   private int index1;
+
+   /** . */
+   private int index2;
+
+   /** . */
+   private E next1;
+
+   /** . */
+   private E next2;
+
+   /** . */
+   private E element;
+
+   /** . */
+   private ListChangeType type;
+
+   /** . */
+   private int mode;
+
+   /** . */
+   private boolean buffered;
+
+   // LCS state
+
+   /** . */
+   private int[] matrix;
+
+   /** . */
+   private int m;
+
+   /** . */
+   private int n;
+
+   ListChangeIterator(ListDiff<L1, L2, E> diff, L1 elements1, L2 elements2) {
+      this.diff = diff;
+      this.elements1 = elements1;
+      this.elements2 = elements2;
+      this.it1 = elements1 != null ? diff.adapter1.iterator(elements1, false) : null;
+      this.it2 = elements2 != null ? diff.adapter2.iterator(elements2, false) : null;
+      this.mode = TRIVIAL_MODE;
+
+      //
+      this.index1 = 0;
+      this.index2 = 0;
+      this.buffered = false;
+      this.next1 = null;
+      this.next2 = null;
+      this.type = null;
+      this.element = null;
+
+      //
+      if (it1 != null && it1.hasNext()) {
+         next1 = it1.next();
+      }
+      if (it2 != null && it2.hasNext()) {
+         next2 = it2.next();
+      }
+
+      //
+      this.m = 0;
+      this.n = 0;
+      this.matrix = EMPTY;
+   }
+
+   private void next1() {
+      index1++;
+      if (it1 != null && it1.hasNext()) {
+         next1 = it1.next();
+      } else {
+         next1 = null;
+      }
+   }
+
+   private void next2() {
+      index2++;
+      if (it2 != null && it2.hasNext()) {
+         next2 = it2.next();
+      } else {
+         next2 = null;
+      }
+   }
+
+   public boolean hasNext() {
+
+      while (!buffered) {
+         if (mode == TRIVIAL_MODE) {
+            if (next1 != null) {
+               if (next2 != null) {
+                  if (diff.equals(next1, next2)) {
+                     type = ListChangeType.SAME;
+                     element = next1;
+                     buffered = true;
+                     next1();
+                     next2();
+                  } else {
+                     lcs(index1, elements1, elements2);
+                     mode = LCS_MODE;
+                  }
+               } else {
+                  type = ListChangeType.REMOVE;
+                  element = next1;
+                  buffered = true;
+                  next1();
+               }
+            } else {
+               if (next2 != null) {
+                  type = ListChangeType.ADD;
+                  element = next2;
+                  buffered = true;
+                  next2();
+               } else {
+                  // Force a break with buffered to false
+                  break;
+               }
+            }
+         } else if (mode == LCS_MODE) {
+            E elt1 = null;
+            E elt2 = null;
+            int i = diff.adapter1.size(elements1) - index1;
+            int j = diff.adapter2.size(elements2) - index2;
+            if (i > 0 && j > 0 && diff.equals(elt1 = next1, elt2 = next2)) {
+               type = ListChangeType.SAME;
+               element = elt1;
+               next1();
+               next2();
+               buffered = true;
+            } else {
+               int index1 = i + (j - 1) * m;
+               int index2 = i - 1 + j * m;
+               if (j > 0 && (i == 0 || matrix[index1] >= matrix[index2])) {
+                  type = ListChangeType.ADD;
+                  element = elt2 == null ? next2 : elt2;
+                  next2();
+                  buffered = true;
+               } else if (i > 0 && (j == 0 || matrix[index1] < matrix[index2])) {
+                  type = ListChangeType.REMOVE;
+                  element = elt1 == null ? next1 : elt1;
+                  next1();
+                  buffered = true;
+               } else {
+                  // Force a break with buffered to false
+                  break;
+               }
+            }
+         } else {
+            throw new AssertionError();
+         }
+      }
+
+      //
+      return buffered;
+   }
+
+   public ListChangeType next() {
+      if (!hasNext()) {
+         throw new NoSuchElementException();
+      } else {
+         buffered = false;
+         return type;
+      }
+   }
+
+   public void remove() {
+      throw new UnsupportedOperationException();
+   }
+
+   public E getElement() {
+      return element;
+   }
+
+   public int getIndex1() {
+      return index1;
+   }
+
+   public int getIndex2() {
+      return index2;
+   }
+
+   /**
+    * Compute the LCS matrix from the specified offset. It updates the state of this object
+    * with the relevant state. The LCS matrix is computed using the LCS algorithm
+    * (see http://en.wikipedia.org/wiki/Longest_common_subsequence_problem).
+    *
+    * @param offset the offset
+    * @param elements1 the elements 1
+    * @param elements2 the elements 2
+    */
+   private void lcs(int offset, L1 elements1, L2 elements2) {
+      m = 1 + diff.adapter1.size(elements1) - offset;
+      n = 1 + diff.adapter2.size(elements2) - offset;
+
+      //
+      int s = m * n;
+      matrix = new int[s];
+
+      // Compute the lcs matrix
+      Iterator<E> itI = diff.adapter1.iterator(elements1, true);
+      for (int i = 1; i < m; i++) {
+         E abc = itI.next();
+         Iterator<E> itJ = diff.adapter2.iterator(elements2, true);
+         for (int j = 1; j < n; j++) {
+            int index = i + j * m;
+            int v;
+            E def = itJ.next();
+            if (diff.equals(abc, def)) {
+               v = matrix[index - m - 1] + 1;
+            } else {
+               int v1 = matrix[index - 1];
+               int v2 = matrix[index - m];
+               v = v1 < v2 ? v2 : v1;
+            }
+            matrix[index] = v;
+         }
+      }
+   }
+
+   // For unit testing purpose
+   String getMatrix() {
+      StringBuilder sb = new StringBuilder();
+      for (int i = 0; i < m; i++) {
+         sb.append('[');
+         for (int j = 0; j < n; j++) {
+            if (j > 0) {
+               sb.append(',');
+            }
+            sb.append(matrix[i + j * m]);
+         }
+         sb.append("]\n");
+      }
+      return sb.toString();
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeType.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeType.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeType.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.tree.diff;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public enum ListChangeType {
-
-   REMOVE,
-
-   SAME,
-
-   ADD
-
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeType.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeType.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeType.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListChangeType.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.tree.diff;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public enum ListChangeType {
+
+   REMOVE,
+
+   SAME,
+
+   ADD
+
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListDiff.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListDiff.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListDiff.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.tree.diff;
-
-import java.util.Comparator;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class ListDiff<L1, L2, E> {
-
-   /** . */
-   final Comparator<E> comparator;
-
-   /** . */
-   final ListAdapter<L1, E> adapter1;
-
-   /** . */
-   final ListAdapter<L2, E> adapter2;
-
-   public ListDiff(ListAdapter<L1, E> adapter1, ListAdapter<L2, E> adapter2, Comparator<E> comparator) {
-      this.adapter1 = adapter1;
-      this.adapter2 = adapter2;
-      this.comparator = comparator;
-   }
-
-   public ListDiff(ListAdapter<L1, E> adapter1, ListAdapter<L2, E> adapter2) {
-      this(adapter1, adapter2, null);
-   }
-
-   boolean equals(E e1, E e2) {
-      if (comparator == null) {
-         return e1.equals(e2);
-      } else {
-         return comparator.compare(e1, e2) == 0;
-      }
-   }
-
-   public final ListChangeIterator<L1, L2, E> iterator(L1 elements1, L2 elements2) {
-      return new ListChangeIterator<L1, L2, E>(this, elements1, elements2);
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListDiff.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListDiff.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListDiff.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/diff/ListDiff.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.tree.diff;
+
+import java.util.Comparator;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class ListDiff<L1, L2, E> {
+
+   /** . */
+   final Comparator<E> comparator;
+
+   /** . */
+   final ListAdapter<L1, E> adapter1;
+
+   /** . */
+   final ListAdapter<L2, E> adapter2;
+
+   public ListDiff(ListAdapter<L1, E> adapter1, ListAdapter<L2, E> adapter2, Comparator<E> comparator) {
+      this.adapter1 = adapter1;
+      this.adapter2 = adapter2;
+      this.comparator = comparator;
+   }
+
+   public ListDiff(ListAdapter<L1, E> adapter1, ListAdapter<L2, E> adapter2) {
+      this(adapter1, adapter2, null);
+   }
+
+   boolean equals(E e1, E e2) {
+      if (comparator == null) {
+         return e1.equals(e2);
+      } else {
+         return comparator.compare(e1, e2) == 0;
+      }
+   }
+
+   public final ListChangeIterator<L1, L2, E> iterator(L1 elements1, L2 elements2) {
+      return new ListChangeIterator<L1, L2, E>(this, elements1, elements2);
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/list/ListTree.java
===================================================================
--- portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/list/ListTree.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/list/ListTree.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,535 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.tree.list;
-
-import java.util.ListIterator;
-import java.util.NoSuchElementException;
-
-/**
- * <p>A tree structure where the children in which the children are organized as a linked list. The children of a
- * tree is a linked list and can be iterated with an iterator or thanks to the {@link #getFirst()}, {@link #getLast()},
- * {@link #getNext()} and {@link #getPrevious()} methods.</p>
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- * @param <T> the self bounding tree type
- */
-public class ListTree<T extends ListTree<T>>
-{
-
-   /** . */
-   private T parent;
-
-   /** . */
-   private T next;
-
-   /** . */
-   private T previous;
-
-   /** . */
-   private T head;
-
-   /** . */
-   private T tail;
-
-   /** . */
-   private int size;
-
-   public ListTree()
-   {
-      this.next = null;
-      this.previous = null;
-      this.head = null;
-      this.tail = null;
-      this.size = 0;
-   }
-
-   /**
-    * Returns the tree.
-    *
-    * @return the tree
-    */
-   public final T getNext()
-   {
-      return next;
-   }
-
-   /**
-    * Returns the previous.
-    *
-    * @return the previous
-    */
-   public final T getPrevious()
-   {
-      return previous;
-   }
-
-   /**
-    * Returns the parent.
-    *
-    * @return the parent
-    */
-   public final T getParent()
-   {
-      return parent;
-   }
-
-   /**
-    * Returns the size.
-    *
-    * @return the size
-    */
-   public final int getSize()
-   {
-      return size;
-   }
-
-   /**
-    * Returns the first tree.
-    *
-    * @return the first tree
-    */
-   public final T getFirst()
-   {
-      return head;
-   }
-
-   /**
-    * Returns the last tree.
-    *
-    * @return the last tree
-    */
-   public final T getLast()
-   {
-      return tail;
-   }
-
-   /**
-    * Returns a tree specified by its index.
-    *
-    * @param index the index
-    * @return the corresponding tree
-    * @throws IndexOutOfBoundsException if the index is incorrect
-    */
-   public final T get(int index) throws IndexOutOfBoundsException
-   {
-      if (index < 0)
-      {
-         throw new IndexOutOfBoundsException("No negative index allowed");
-      }
-
-      //
-      T current = head;
-      while (true)
-      {
-         if (current == null)
-         {
-            throw new IndexOutOfBoundsException("index " + index + " is greater than the children size");
-         }
-         if (index == 0)
-         {
-            break;
-         }
-         else
-         {
-            current = current.next;
-            index--;
-         }
-      }
-      return current;
-   }
-
-   /**
-    * Insert the specified tree.
-    *
-    * @param index the index
-    * @param tree the tree
-    * @throws NullPointerException if the context is null
-    * @throws IllegalArgumentException if an existing child with the same name already exist
-    * @throws IndexOutOfBoundsException if the index is negative or is greater than the children size
-    */
-   public final void insertAt(Integer index, T tree) throws NullPointerException, IllegalArgumentException, IndexOutOfBoundsException
-   {
-      if (tree == null)
-      {
-         throw new NullPointerException("No null tree accepted");
-      }
-      if (index != null && index < 0)
-      {
-         throw new IndexOutOfBoundsException("No negative index permitted");
-      }
-
-      //
-      if (index != null)
-      {
-         T a = head;
-         if (index == 0)
-         {
-            insertFirst(tree);
-         }
-         else
-         {
-            while (index > 0)
-            {
-               if (a == null)
-               {
-                  throw new IndexOutOfBoundsException();
-               }
-               index--;
-               a = a.next;
-            }
-
-            //
-            if (a == null)
-            {
-               insertLast(tree);
-            }
-            else if (a != tree)
-            {
-               a.insertBefore(tree);
-            }
-         }
-      }
-      else
-      {
-         T a = tail;
-         if (a == null)
-         {
-            insertFirst(tree);
-         }
-         else if (a != tree)
-         {
-            a.insertAfter(tree);
-         }
-      }
-   }
-
-   /**
-    * Insert the specified context at the last position among the children of this context.
-    *
-    * @param tree the content to insert
-    * @throws NullPointerException if the tree argument is null
-    */
-   public final void insertLast(T tree)
-   {
-      if (tail == null)
-      {
-         insertFirst(tree);
-      }
-      else
-      {
-         tail.insertAfter(tree);
-      }
-   }
-
-   /**
-    * Insert the specified context at the first position among the children of this context.
-    *
-    * @param tree the content to insert
-    * @throws NullPointerException if the tree argument is null
-    */
-   public void insertFirst(T tree) throws NullPointerException
-   {
-      if (tree == null)
-      {
-         throw new NullPointerException();
-      }
-      if (head == null)
-      {
-         beforeInsert(tree);
-         if (tree.parent != null)
-         {
-            tree.remove();
-         }
-         head = tail = tree;
-         tree.parent = (T)this;
-         size++;
-         afterInsert(tree);
-      }
-      else
-      {
-         head.insertBefore(tree);
-      }
-   }
-
-   /**
-    * Insert the specified tree after this tree
-    *
-    * @param tree the tree to insert after
-    * @throws NullPointerException if the specified tree argument is null
-    * @throws IllegalStateException if this tree does not have a parent
-    */
-   public final void insertAfter(T tree)
-   {
-      if (tree == null)
-      {
-         throw new NullPointerException("No null tree argument accepted");
-      }
-      if (parent == null)
-      {
-         throw new IllegalStateException();
-      }
-      if (this != tree)
-      {
-         parent.beforeInsert(tree);
-         if (tree.parent != null)
-         {
-            tree.remove();
-         }
-         tree.previous = (T)this;
-         tree.next = next;
-         if (next == null)
-         {
-            parent.tail = tree;
-         }
-         else
-         {
-            next.previous = tree;
-         }
-         next = tree;
-         tree.parent = parent;
-         parent.size++;
-         parent.afterInsert(tree);
-      }
-   }
-
-   /**
-    * Insert the specified tree before this tree
-    *
-    * @param tree the tree to insert before
-    * @throws NullPointerException if the specified tree argument is null
-    * @throws IllegalStateException if this tree does not have a parent
-    */
-   public final void insertBefore(T tree) throws NullPointerException, IllegalStateException
-   {
-      if (tree == null)
-      {
-         throw new NullPointerException("No null tree argument accepted");
-      }
-      if (parent == null)
-      {
-         throw new IllegalStateException();
-      }
-      if (this != tree)
-      {
-         parent.beforeInsert(tree);
-         if (tree.parent != null)
-         {
-            tree.remove();
-         }
-         tree.previous = previous;
-         tree.next = (T)this;
-         if (previous == null)
-         {
-            parent.head = tree;
-         }
-         else
-         {
-            previous.next = tree;
-         }
-         previous = tree;
-         tree.parent = parent;
-         parent.size++;
-         parent.afterInsert(tree);
-      }
-   }
-
-   /**
-    * Removes this tree from its parent
-    *
-    * @throws IllegalStateException if this tree does not have a parent
-    */
-   public final void remove() throws IllegalStateException
-   {
-      if (parent == null)
-      {
-         throw new IllegalStateException();
-      }
-      parent.beforeRemove((T)this);
-      if (previous == null)
-      {
-         parent.head = next;
-      }
-      else
-      {
-         previous.next = next;
-      }
-      if (next == null)
-      {
-         parent.tail = previous;
-      }
-      else
-      {
-         next.previous = previous;
-      }
-      T _parent = parent;
-      parent = null;
-      previous = null;
-      next = null;
-      _parent.size--;
-      _parent.afterRemove((T)this);
-   }
-
-   public final ListIterator<T> listIterator()
-   {
-/*
-      if (map == null)
-      {
-         return null;
-      }
-*/
-      return new ListIterator<T>()
-      {
-         T next = head;
-         T current = null;
-         T previous = null;
-         int index = 0;
-
-         public boolean hasNext()
-         {
-            return next != null;
-         }
-
-         public T next()
-         {
-            if (next != null)
-            {
-               current = next;
-
-               //
-               previous = next;
-               next = next.next;
-               index++;
-               return current;
-            }
-            else
-            {
-               throw new NoSuchElementException();
-            }
-         }
-
-         public boolean hasPrevious()
-         {
-            return previous != null;
-         }
-
-         public T previous()
-         {
-            if (previous != null)
-            {
-               current = previous;
-
-               //
-               next = previous;
-               previous = previous.previous;
-               index--;
-               return current;
-            }
-            else
-            {
-               throw new NoSuchElementException();
-            }
-         }
-
-         public int nextIndex()
-         {
-            return index;
-         }
-
-         public int previousIndex()
-         {
-            return index - 1;
-         }
-
-         public void remove()
-         {
-            if (current == null)
-            {
-               throw new IllegalStateException("no element to remove");
-            }
-            if (current == previous)
-            {
-               index--;
-            }
-            next = current.next;
-            previous = current.previous;
-            current.remove();
-            current = null;
-         }
-
-         public void set(T tree)
-         {
-            throw new UnsupportedOperationException();
-         }
-
-         public void add(T tree)
-         {
-            if (previous == null)
-            {
-               insertFirst(tree);
-            }
-            else
-            {
-               previous.insertAfter(tree);
-            }
-            index++;
-            previous = tree;
-            next = tree.next;
-         }
-      };
-   }
-
-   /**
-    * Callback to signal insertion occured.
-    *
-    * @param tree the child inserted
-    */
-   protected void beforeInsert(T tree)
-   {
-   }
-
-   /**
-    * Callback to signal insertion occured.
-    *
-    * @param tree the child inserted
-    */
-   protected void afterInsert(T tree)
-   {
-   }
-
-   /**
-    * Callback to signal insertion occured.
-    *
-    * @param tree the child inserted
-    */
-   protected void beforeRemove(T tree)
-   {
-   }
-
-   /**
-    * Callback to signal insertion occured.
-    *
-    * @param tree the child inserted
-    */
-   protected void afterRemove(T tree)
-   {
-   }
-}
-

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/list/ListTree.java (from rev 6783, portal/trunk/component/portal/src/main/java/org/exoplatform/portal/tree/list/ListTree.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/list/ListTree.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/java/org/exoplatform/portal/tree/list/ListTree.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,535 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.tree.list;
+
+import java.util.ListIterator;
+import java.util.NoSuchElementException;
+
+/**
+ * <p>A tree structure where the children in which the children are organized as a linked list. The children of a
+ * tree is a linked list and can be iterated with an iterator or thanks to the {@link #getFirst()}, {@link #getLast()},
+ * {@link #getNext()} and {@link #getPrevious()} methods.</p>
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ * @param <T> the self bounding tree type
+ */
+public class ListTree<T extends ListTree<T>>
+{
+
+   /** . */
+   private T parent;
+
+   /** . */
+   private T next;
+
+   /** . */
+   private T previous;
+
+   /** . */
+   private T head;
+
+   /** . */
+   private T tail;
+
+   /** . */
+   private int size;
+
+   public ListTree()
+   {
+      this.next = null;
+      this.previous = null;
+      this.head = null;
+      this.tail = null;
+      this.size = 0;
+   }
+
+   /**
+    * Returns the tree.
+    *
+    * @return the tree
+    */
+   public final T getNext()
+   {
+      return next;
+   }
+
+   /**
+    * Returns the previous.
+    *
+    * @return the previous
+    */
+   public final T getPrevious()
+   {
+      return previous;
+   }
+
+   /**
+    * Returns the parent.
+    *
+    * @return the parent
+    */
+   public final T getParent()
+   {
+      return parent;
+   }
+
+   /**
+    * Returns the size.
+    *
+    * @return the size
+    */
+   public final int getSize()
+   {
+      return size;
+   }
+
+   /**
+    * Returns the first tree.
+    *
+    * @return the first tree
+    */
+   public final T getFirst()
+   {
+      return head;
+   }
+
+   /**
+    * Returns the last tree.
+    *
+    * @return the last tree
+    */
+   public final T getLast()
+   {
+      return tail;
+   }
+
+   /**
+    * Returns a tree specified by its index.
+    *
+    * @param index the index
+    * @return the corresponding tree
+    * @throws IndexOutOfBoundsException if the index is incorrect
+    */
+   public final T get(int index) throws IndexOutOfBoundsException
+   {
+      if (index < 0)
+      {
+         throw new IndexOutOfBoundsException("No negative index allowed");
+      }
+
+      //
+      T current = head;
+      while (true)
+      {
+         if (current == null)
+         {
+            throw new IndexOutOfBoundsException("index " + index + " is greater than the children size");
+         }
+         if (index == 0)
+         {
+            break;
+         }
+         else
+         {
+            current = current.next;
+            index--;
+         }
+      }
+      return current;
+   }
+
+   /**
+    * Insert the specified tree.
+    *
+    * @param index the index
+    * @param tree the tree
+    * @throws NullPointerException if the context is null
+    * @throws IllegalArgumentException if an existing child with the same name already exist
+    * @throws IndexOutOfBoundsException if the index is negative or is greater than the children size
+    */
+   public final void insertAt(Integer index, T tree) throws NullPointerException, IllegalArgumentException, IndexOutOfBoundsException
+   {
+      if (tree == null)
+      {
+         throw new NullPointerException("No null tree accepted");
+      }
+      if (index != null && index < 0)
+      {
+         throw new IndexOutOfBoundsException("No negative index permitted");
+      }
+
+      //
+      if (index != null)
+      {
+         T a = head;
+         if (index == 0)
+         {
+            insertFirst(tree);
+         }
+         else
+         {
+            while (index > 0)
+            {
+               if (a == null)
+               {
+                  throw new IndexOutOfBoundsException();
+               }
+               index--;
+               a = a.next;
+            }
+
+            //
+            if (a == null)
+            {
+               insertLast(tree);
+            }
+            else if (a != tree)
+            {
+               a.insertBefore(tree);
+            }
+         }
+      }
+      else
+      {
+         T a = tail;
+         if (a == null)
+         {
+            insertFirst(tree);
+         }
+         else if (a != tree)
+         {
+            a.insertAfter(tree);
+         }
+      }
+   }
+
+   /**
+    * Insert the specified context at the last position among the children of this context.
+    *
+    * @param tree the content to insert
+    * @throws NullPointerException if the tree argument is null
+    */
+   public final void insertLast(T tree)
+   {
+      if (tail == null)
+      {
+         insertFirst(tree);
+      }
+      else
+      {
+         tail.insertAfter(tree);
+      }
+   }
+
+   /**
+    * Insert the specified context at the first position among the children of this context.
+    *
+    * @param tree the content to insert
+    * @throws NullPointerException if the tree argument is null
+    */
+   public void insertFirst(T tree) throws NullPointerException
+   {
+      if (tree == null)
+      {
+         throw new NullPointerException();
+      }
+      if (head == null)
+      {
+         beforeInsert(tree);
+         if (tree.parent != null)
+         {
+            tree.remove();
+         }
+         head = tail = tree;
+         tree.parent = (T)this;
+         size++;
+         afterInsert(tree);
+      }
+      else
+      {
+         head.insertBefore(tree);
+      }
+   }
+
+   /**
+    * Insert the specified tree after this tree
+    *
+    * @param tree the tree to insert after
+    * @throws NullPointerException if the specified tree argument is null
+    * @throws IllegalStateException if this tree does not have a parent
+    */
+   public final void insertAfter(T tree)
+   {
+      if (tree == null)
+      {
+         throw new NullPointerException("No null tree argument accepted");
+      }
+      if (parent == null)
+      {
+         throw new IllegalStateException();
+      }
+      if (this != tree)
+      {
+         parent.beforeInsert(tree);
+         if (tree.parent != null)
+         {
+            tree.remove();
+         }
+         tree.previous = (T)this;
+         tree.next = next;
+         if (next == null)
+         {
+            parent.tail = tree;
+         }
+         else
+         {
+            next.previous = tree;
+         }
+         next = tree;
+         tree.parent = parent;
+         parent.size++;
+         parent.afterInsert(tree);
+      }
+   }
+
+   /**
+    * Insert the specified tree before this tree
+    *
+    * @param tree the tree to insert before
+    * @throws NullPointerException if the specified tree argument is null
+    * @throws IllegalStateException if this tree does not have a parent
+    */
+   public final void insertBefore(T tree) throws NullPointerException, IllegalStateException
+   {
+      if (tree == null)
+      {
+         throw new NullPointerException("No null tree argument accepted");
+      }
+      if (parent == null)
+      {
+         throw new IllegalStateException();
+      }
+      if (this != tree)
+      {
+         parent.beforeInsert(tree);
+         if (tree.parent != null)
+         {
+            tree.remove();
+         }
+         tree.previous = previous;
+         tree.next = (T)this;
+         if (previous == null)
+         {
+            parent.head = tree;
+         }
+         else
+         {
+            previous.next = tree;
+         }
+         previous = tree;
+         tree.parent = parent;
+         parent.size++;
+         parent.afterInsert(tree);
+      }
+   }
+
+   /**
+    * Removes this tree from its parent
+    *
+    * @throws IllegalStateException if this tree does not have a parent
+    */
+   public final void remove() throws IllegalStateException
+   {
+      if (parent == null)
+      {
+         throw new IllegalStateException();
+      }
+      parent.beforeRemove((T)this);
+      if (previous == null)
+      {
+         parent.head = next;
+      }
+      else
+      {
+         previous.next = next;
+      }
+      if (next == null)
+      {
+         parent.tail = previous;
+      }
+      else
+      {
+         next.previous = previous;
+      }
+      T _parent = parent;
+      parent = null;
+      previous = null;
+      next = null;
+      _parent.size--;
+      _parent.afterRemove((T)this);
+   }
+
+   public final ListIterator<T> listIterator()
+   {
+/*
+      if (map == null)
+      {
+         return null;
+      }
+*/
+      return new ListIterator<T>()
+      {
+         T next = head;
+         T current = null;
+         T previous = null;
+         int index = 0;
+
+         public boolean hasNext()
+         {
+            return next != null;
+         }
+
+         public T next()
+         {
+            if (next != null)
+            {
+               current = next;
+
+               //
+               previous = next;
+               next = next.next;
+               index++;
+               return current;
+            }
+            else
+            {
+               throw new NoSuchElementException();
+            }
+         }
+
+         public boolean hasPrevious()
+         {
+            return previous != null;
+         }
+
+         public T previous()
+         {
+            if (previous != null)
+            {
+               current = previous;
+
+               //
+               next = previous;
+               previous = previous.previous;
+               index--;
+               return current;
+            }
+            else
+            {
+               throw new NoSuchElementException();
+            }
+         }
+
+         public int nextIndex()
+         {
+            return index;
+         }
+
+         public int previousIndex()
+         {
+            return index - 1;
+         }
+
+         public void remove()
+         {
+            if (current == null)
+            {
+               throw new IllegalStateException("no element to remove");
+            }
+            if (current == previous)
+            {
+               index--;
+            }
+            next = current.next;
+            previous = current.previous;
+            current.remove();
+            current = null;
+         }
+
+         public void set(T tree)
+         {
+            throw new UnsupportedOperationException();
+         }
+
+         public void add(T tree)
+         {
+            if (previous == null)
+            {
+               insertFirst(tree);
+            }
+            else
+            {
+               previous.insertAfter(tree);
+            }
+            index++;
+            previous = tree;
+            next = tree.next;
+         }
+      };
+   }
+
+   /**
+    * Callback to signal insertion occured.
+    *
+    * @param tree the child inserted
+    */
+   protected void beforeInsert(T tree)
+   {
+   }
+
+   /**
+    * Callback to signal insertion occured.
+    *
+    * @param tree the child inserted
+    */
+   protected void afterInsert(T tree)
+   {
+   }
+
+   /**
+    * Callback to signal insertion occured.
+    *
+    * @param tree the child inserted
+    */
+   protected void beforeRemove(T tree)
+   {
+   }
+
+   /**
+    * Callback to signal insertion occured.
+    *
+    * @param tree the child inserted
+    */
+   protected void afterRemove(T tree)
+   {
+   }
+}
+

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/resources/binding.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/resources/binding.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/main/resources/binding.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -90,7 +90,7 @@
   </mapping>
   
    <mapping name="node" label="node" class="org.exoplatform.portal.config.model.PageNode">
-    <value name="uri" field="uri"/>
+    <value name="uri" field="uri" usage="optional"/>
     <value name="name" field="name"/>
     <value name="label" field="label" usage="optional" set-method="setLabel"/>
     <value name="icon" field="icon" usage="optional"/>

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/TestXSDCorruption.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/TestXSDCorruption.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/TestXSDCorruption.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -59,6 +59,6 @@
    {
       assertHash("d0591b0a022a0c2929e1aed8979857cd", "gatein_objects_1_0.xsd");
       assertHash("99ae24c9bbfe1b59e066756a29ab6c79", "gatein_objects_1_1.xsd");
-      assertHash("9a031c15ce0e2b4dd1e283458f590581", "gatein_objects_1_2.xsd");
+      assertHash("a2d34899c8b645e32bfa7fc03b7cbe4d", "gatein_objects_1_2.xsd");
    }
 }

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestDataStorage.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestDataStorage.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestDataStorage.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -21,12 +21,27 @@
 
 import static org.exoplatform.portal.pom.config.Utils.split;
 
-import org.exoplatform.commons.utils.LazyPageList;
+import junit.framework.AssertionFailedError;
 import org.exoplatform.container.PortalContainer;
 import org.exoplatform.portal.application.PortletPreferences;
 import org.exoplatform.portal.application.Preference;
-import org.exoplatform.portal.config.model.*;
-import org.exoplatform.portal.pom.config.POMSession;
+import org.exoplatform.portal.config.model.Application;
+import org.exoplatform.portal.config.model.ApplicationState;
+import org.exoplatform.portal.config.model.ApplicationType;
+import org.exoplatform.portal.config.model.Container;
+import org.exoplatform.portal.config.model.Dashboard;
+import org.exoplatform.portal.config.model.ModelObject;
+import org.exoplatform.portal.config.model.Page;
+import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.config.model.TransientApplicationState;
+import org.exoplatform.portal.mop.EventType;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.navigation.NavigationContext;
+import org.exoplatform.portal.mop.navigation.NavigationService;
+import org.exoplatform.portal.mop.navigation.NavigationState;
+import org.exoplatform.portal.mop.navigation.NodeContext;
+import org.exoplatform.portal.mop.navigation.NodeModel;
+import org.exoplatform.portal.mop.navigation.Scope;
 import org.exoplatform.portal.pom.config.POMSessionManager;
 import org.exoplatform.portal.pom.data.ModelChange;
 import org.exoplatform.portal.pom.spi.gadget.Gadget;
@@ -36,12 +51,15 @@
 import org.exoplatform.services.listener.Listener;
 import org.exoplatform.services.listener.ListenerService;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicReference;
 
-import junit.framework.AssertionFailedError;
-
 /**
  * Created by The eXo Platform SARL Author : Tung Pham thanhtungty at gmail.com Nov
  * 13, 2007
@@ -50,27 +68,22 @@
 {
 
    /** . */
-   private static final String CLASSIC_HOME = "portal::classic::homepage";
+   private final String testPage = "portal::classic::testPage";
 
    /** . */
-   private static final String CLASSIC_TEST = "portal::classic::testPage";
-
-   /** . */
    private final String testPortletPreferences = "portal#classic:/web/BannerPortlet/testPortletPreferences";
 
    /** . */
    private DataStorage storage_;
 
    /** . */
-   private POMSessionManager mgr;
+   private NavigationService navService;
 
    /** . */
-   private POMSession session;
+   private POMSessionManager mgr;
 
-   /** . */
-   private EventQueue events;
+   private LinkedList<Event> events;
 
-   /** . */
    private ListenerService listenerService;
 
    public TestDataStorage(String name)
@@ -80,37 +93,41 @@
 
    public void setUp() throws Exception
    {
+      Listener listener = new Listener()
+      {
+         @Override
+         public void onEvent(Event event) throws Exception
+         {
+            events.add(event);
+         }
+      };
+
+      //
       super.setUp();
-      begin();
       PortalContainer container = PortalContainer.getInstance();
       storage_ = (DataStorage)container.getComponentInstanceOfType(DataStorage.class);
       mgr = (POMSessionManager)container.getComponentInstanceOfType(POMSessionManager.class);
-      session = mgr.openSession();
+      navService = (NavigationService)container.getComponentInstanceOfType(NavigationService.class);
+      events = new LinkedList<Event>();
       listenerService = (ListenerService)container.getComponentInstanceOfType(ListenerService.class);
 
       //
-      if (events == null)
-      {
-         events = new EventQueue();
-         listenerService.addListener(DataStorage.PAGE_CREATED, events);
-         listenerService.addListener(DataStorage.PAGE_REMOVED, events);
-         listenerService.addListener(DataStorage.PAGE_UPDATED, events);
-         listenerService.addListener(DataStorage.NAVIGATION_CREATED, events);
-         listenerService.addListener(DataStorage.NAVIGATION_REMOVED, events);
-         listenerService.addListener(DataStorage.NAVIGATION_UPDATED, events);
-         listenerService.addListener(DataStorage.PORTAL_CONFIG_CREATED, events);
-         listenerService.addListener(DataStorage.PORTAL_CONFIG_UPDATED, events);
-         listenerService.addListener(DataStorage.PORTAL_CONFIG_REMOVED, events);
-      }
-      else
-      {
-         events.clear();
-      }
+      listenerService.addListener(DataStorage.PAGE_CREATED, listener);
+      listenerService.addListener(DataStorage.PAGE_REMOVED, listener);
+      listenerService.addListener(DataStorage.PAGE_UPDATED, listener);
+      listenerService.addListener(EventType.NAVIGATION_CREATED, listener);
+      listenerService.addListener(EventType.NAVIGATION_DESTROYED, listener);
+      listenerService.addListener(EventType.NAVIGATION_UPDATED, listener);
+      listenerService.addListener(DataStorage.PORTAL_CONFIG_CREATED, listener);
+      listenerService.addListener(DataStorage.PORTAL_CONFIG_UPDATED, listener);
+      listenerService.addListener(DataStorage.PORTAL_CONFIG_REMOVED, listener);
+
+      //
+      begin();
    }
 
    protected void tearDown() throws Exception
    {
-      session.close();
       end();
       super.tearDown();
    }
@@ -128,9 +145,8 @@
       portal.setAccessPermissions(new String[]{UserACL.EVERYONE});
 
       //
-      events.clear();
       storage_.create(portal);
-      events.assertSize(1);
+      assertEquals(1, events.size());
       portal = storage_.getPortalConfig(portal.getName());
       assertNotNull(portal);
       assertEquals("portal", portal.getType());
@@ -145,11 +161,9 @@
       assertNotNull(portal);
 
       //
-      events.clear();
       portal.setLocale("vietnam");
       storage_.save(portal);
-      events.assertSize(1);
-
+      assertEquals(1, events.size());
       //
       portal = storage_.getPortalConfig("portal", "test");
       assertNotNull(portal);
@@ -161,9 +175,8 @@
       PortalConfig portal = storage_.getPortalConfig("portal", "test");
       assertNotNull(portal);
 
-      events.clear();
       storage_.remove(portal);
-      events.assertSize(1);
+      assertEquals(1, events.size());
       assertNull(storage_.getPortalConfig("portal", "test"));
       
       try
@@ -187,9 +200,8 @@
       page.setName("foo");
 
       //
-      events.clear();
       storage_.create(page);
-      events.assertSize(1);
+      assertEquals(1, events.size());
 
       //
       Page page2 = storage_.getPage(page.getPageId());
@@ -214,17 +226,15 @@
       page.setShowMaxWindow(false);
 
       //
-      events.clear();
       storage_.create(page);
-      events.assertSize(1);
+      assertEquals(1, events.size());
 
       //
       Page page2 = storage_.getPage(page.getPageId());
       page2.setTitle("MyTitle2");
       page2.setShowMaxWindow(true);
-      events.clear();
       storage_.save(page2);
-      events.assertSize(1);
+      assertEquals(2, events.size());
 
       page2 = storage_.getPage(page.getPageId());
       assertNotNull(page2);
@@ -237,56 +247,6 @@
       assertEquals(true, page2.isShowMaxWindow());
    }
    
-   public void testRenameNode() throws Exception
-   {
-      //Create node
-      PageNode pageNode = new PageNode();
-      String name = "MyPageNode";
-      pageNode.setName(name);
-      pageNode.setUri(name);
-      pageNode.setLabel(name);
-      
-      //add node to page navigation
-      String ownerId = "root";
-      String ownerType = "user";
-      PageNavigation nav = storage_.getPageNavigation(ownerType, ownerId);
-      assertNotNull(nav);
-      assertEquals(ownerId, nav.getOwnerId());
-      assertEquals(ownerType, nav.getOwnerType());
-      nav.addNode(pageNode);
-      storage_.save(nav);
-      
-      //Rename node
-      PageNavigation nav2 = storage_.getPageNavigation(ownerType, ownerId);
-      assertNotNull(nav2);
-      assertEquals(ownerId, nav2.getOwnerId());
-      assertEquals(ownerType, nav2.getOwnerType());
-      
-      PageNode pageNode2 = nav2.getNode(name);
-      assertNotNull(pageNode2);
-      assertEquals(name, pageNode2.getName());
-      assertEquals(name, pageNode2.getLabel());
-      assertEquals(name, pageNode2.getUri());
-
-      String newName = "NewMyPageNode";
-      pageNode2.setName(newName);
-      pageNode2.setUri(newName);
-      pageNode2.setLabel(newName);
-      storage_.save(nav2);
-      
-      //Get and compare
-      PageNavigation nav3 = storage_.getPageNavigation(ownerType, ownerId);
-      assertNotNull(nav3);
-      assertEquals(ownerId, nav3.getOwnerId());
-      assertEquals(ownerType, nav3.getOwnerType());
-      
-      PageNode pageNode3 = nav3.getNode(newName);
-      assertNotNull(pageNode3);
-      assertEquals(newName, pageNode3.getName());
-      assertEquals(newName, pageNode3.getLabel());
-      assertEquals(newName, pageNode3.getUri());
-   }
-   
    public void testChangingPortletThemeInPage() throws Exception {
       Page page;
       Application<?> app;
@@ -314,12 +274,11 @@
       assertNotNull(page);
 
       //
-      events.clear();
       storage_.remove(page);
-      events.assertSize(1);
-
+      assertEquals(1, events.size());
+      
       //
-      page = storage_.getPage(CLASSIC_TEST);
+      page = storage_.getPage(testPage);
       assertNull(page);
    }
 
@@ -388,39 +347,6 @@
 
    // Need to make window move 3 unit test
 
-   public void testCreateNavigation() throws Exception
-   {
-      PortalConfig portal = new PortalConfig();
-      portal.setName("foo");
-      portal.setLocale("en");
-      portal.setAccessPermissions(new String[]{UserACL.EVERYONE});
-      events.clear();
-      storage_.create(portal);
-      events.assertSize(1);
-
-      //
-      PageNavigation navigation = new PageNavigation();
-      navigation.setOwnerId("foo");
-      navigation.setOwnerType("portal");
-      events.clear();
-      storage_.create(navigation);
-      events.assertSize(1);
-   }
-
-   public void testSaveNavigation() throws Exception
-   {
-      PageNavigation pageNavi = storage_.getPageNavigation("portal", "test");
-      assertNotNull(pageNavi);
-
-      //
-      events.clear();
-      storage_.save(pageNavi);
-      events.assertSize(1);
-
-      //
-      PageNavigation newPageNavi = storage_.getPageNavigation(pageNavi.getOwnerType(), pageNavi.getOwnerId());
-   }
-
    /**
     * Test that setting a page reference to null will actually remove the page reference from the PageNode
     * @throws Exception
@@ -440,92 +366,28 @@
       page.setOwnerId("test");
       page.setName("foo");
       storage_.create(page);
-      
-      //create a page node and add page
-      PageNode pageNode = new PageNode();
-      pageNode.setName("testPage");
-      pageNode.setPageReference(page.getPageId());
-      pageNode.build();
-      
+
       // create a new page navigation and add node
-      PageNavigation navigation = new PageNavigation();
-      navigation.setOwnerId("foo");
-      navigation.setOwnerType("portal");
-      navigation.addNode(pageNode);
-      storage_.create(navigation);
-      
+      NavigationContext nav = new NavigationContext(SiteKey.portal("foo"), new NavigationState(0));
+      navService.saveNavigation(nav);
+      NodeContext<?> node = navService.loadNode(NodeModel.SELF_MODEL, nav, Scope.CHILDREN, null);
+      NodeContext<?> test = node.add(null, "testPage");
+      test.setState(test.getState().builder().pageRef(page.getPageId()).build());
+      navService.saveNode(node, null);
+
       // get the page reference from the created page and check that it exists
-      PageNavigation pageNavigationWithPageReference = storage_.getPageNavigation("portal", navigation.getOwnerId());
-      assertNotNull("Expected page reference should not be null.", pageNavigationWithPageReference.getNodes().get(0).getPageReference());
+      NodeContext<?> pageNavigationWithPageReference = navService.loadNode(NodeModel.SELF_MODEL, nav, Scope.CHILDREN, null);
+      assertNotNull("Expected page reference should not be null.", pageNavigationWithPageReference.get(0).getState().getPageRef());
       
       // set the page reference to null and save.
-      ArrayList<PageNode> nodes = navigation.getNodes();
-      nodes.get(0).setPageReference(null);
-      navigation.setNodes(nodes);
-      storage_.save(navigation);
-      
+      test.setState(test.getState().builder().pageRef(null).build());
+      navService.saveNode(node, null);
+
       // check that setting the page reference to null actually removes the page reference
-      PageNavigation pageNavigationWithoutPageReference = storage_.getPageNavigation("portal", navigation.getOwnerId());
-      assertNull("Expected page reference should be null.", pageNavigationWithoutPageReference.getNodes().get(0).getPageReference());
+      NodeContext<?> pageNavigationWithoutPageReference = navService.loadNode(NodeModel.SELF_MODEL, nav, Scope.CHILDREN, null);
+      assertNull("Expected page reference should be null.", pageNavigationWithoutPageReference.get(0).getState().getPageRef());
    }
    
-   public void testRemoveNavigation() throws Exception
-   {
-      PageNavigation navigation = storage_.getPageNavigation("portal", "test");
-      assertNotNull(navigation);
-
-      //
-      events.clear();
-      storage_.remove(navigation);
-      events.assertSize(1);
-
-      //
-      navigation = storage_.getPageNavigation("portal", "test");
-      assertNull(navigation);
-   }
-
-   public void testNavigationOrder() throws Exception
-   {
-      PortalConfig portal = new PortalConfig("portal");
-      portal.setName("test_nav");
-      storage_.create(portal);
-
-      //
-      PageNavigation nav = new PageNavigation();
-      nav.setOwnerType("portal");
-      nav.setOwnerId("test_nav");
-      PageNode node1 = new PageNode();
-      node1.setName("n1");
-      PageNode node2 = new PageNode();
-      node2.setName("n2");
-      PageNode node3 = new PageNode();
-      node3.setName("n3");
-      nav.addNode(node1);
-      nav.addNode(node2);
-      nav.addNode(node3);
-
-      //
-      storage_.save(nav);
-
-      //
-      nav = storage_.getPageNavigation("portal", "test_nav");
-      assertEquals(3, nav.getNodes().size());
-      assertEquals("n1", nav.getNodes().get(0).getName());
-      assertEquals("n2", nav.getNodes().get(1).getName());
-      assertEquals("n3", nav.getNodes().get(2).getName());
-
-      //
-      nav.getNodes().add(0, nav.getNodes().remove(1));
-      storage_.save(nav);
-
-      //
-      nav = storage_.getPageNavigation("portal", "test_nav");
-      assertEquals(3, nav.getNodes().size());
-      assertEquals("n2", nav.getNodes().get(0).getName());
-      assertEquals("n1", nav.getNodes().get(1).getName());
-      assertEquals("n3", nav.getNodes().get(2).getName());
-   }
-
    public void testCreatePortletPreferences() throws Exception
    {
       ArrayList<Preference> prefs = new ArrayList<Preference>();
@@ -894,22 +756,7 @@
       gadgetApp = (Application<Gadget>)row0.getChildren().get(0);
       assertEquals("foo", storage_.getId(gadgetApp.getState()));
    }
-   
-   public void testRemoveAndFindPage() throws Exception
-   {
-      Page page = storage_.getPage(CLASSIC_HOME);
-      assertNotNull(page);
-      storage_.remove(page);
 
-      // This will trigger a save
-      Query<Page> query = new Query<Page>(null, null, null, null, Page.class);
-      LazyPageList<Page> list = storage_.find(query);
-      assertNotNull(list);
-
-      // We check is now seen as removed
-      assertNull(storage_.getPage(CLASSIC_HOME));
-   }
-
    public void testGetAllPortalNames() throws Exception
    {
       final List<String> names = storage_.getAllPortalNames();
@@ -959,12 +806,10 @@
       }
 
       // Now commit tx
-      session.close(true);
       end(true);
 
       // We test we observe the change
       begin();
-      session = mgr.openSession();
       List<String> afterNames = storage_.getAllPortalNames();
       assertTrue(afterNames.containsAll(names));
       afterNames.removeAll(names);
@@ -1015,12 +860,10 @@
       }
 
       //
-      session.close(true);
       end(true);
 
       // Now test it is still removed
       begin();
-      session = mgr.openSession();
       afterNames = storage_.getAllPortalNames();
       assertEquals(new HashSet<String>(names), new HashSet<String>(afterNames));
    }

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestLoadedPOM.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestLoadedPOM.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestLoadedPOM.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -28,6 +28,13 @@
 import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.model.PageNode;
 import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.mop.navigation.NavigationContext;
+import org.exoplatform.portal.mop.navigation.NavigationService;
+import org.exoplatform.portal.mop.navigation.NodeContext;
+import org.exoplatform.portal.mop.navigation.NodeModel;
+import org.exoplatform.portal.mop.navigation.Scope;
 import org.exoplatform.portal.pom.config.POMSession;
 import org.exoplatform.portal.pom.config.POMSessionManager;
 
@@ -57,6 +64,9 @@
    /** . */
    private POMSession session;
 
+   /** . */
+   private NavigationService navService;
+
    public TestLoadedPOM(String name)
    {
       super(name);
@@ -70,6 +80,7 @@
       portalConfigService = (UserPortalConfigService)container.getComponentInstanceOfType(UserPortalConfigService.class);
       storage = (DataStorage)container.getComponentInstanceOfType(DataStorage.class);
       mgr = (POMSessionManager)container.getComponentInstanceOfType(POMSessionManager.class);
+      navService = (NavigationService)container.getComponentInstanceOfType(NavigationService.class);
       session = mgr.openSession();
    }
 
@@ -82,11 +93,12 @@
 
    public void testLegacyGroupWithNormalizedName() throws Exception
    {
-      PageNavigation nav = storage.getPageNavigation("group::/platform/test/legacy");
+      SiteKey key = SiteKey.group("/platform/test/legacy");
+      NavigationContext nav = navService.loadNavigation(key);
       assertNotNull(nav);
-      assertEquals("/platform/test/legacy", nav.getOwnerId());
-      PageNode node = nav.getNodes().get(0);
-      assertEquals("group::/platform/test/legacy::register", node.getPageReference());
+      NodeContext<?> root = navService.loadNode(NodeModel.SELF_MODEL, nav, Scope.ALL, null);
+      NodeContext<?> node = root.get(0);
+      assertEquals("group::/platform/test/legacy::register", node.getState().getPageRef());
 
       Page page = storage.getPage("group::/platform/test/legacy::register");
       assertNotNull(page);
@@ -102,11 +114,12 @@
 
    public void testGroupWithNormalizedName() throws Exception
    {
-      PageNavigation nav = storage.getPageNavigation("group::/platform/test/normalized");
+      SiteKey key = SiteKey.group("/platform/test/normalized");
+      NavigationContext nav = navService.loadNavigation(key);
       assertNotNull(nav);
-      assertEquals("/platform/test/normalized", nav.getOwnerId());
-      PageNode node = nav.getNodes().get(0);
-      assertEquals("group::/platform/test/normalized::register", node.getPageReference());
+      NodeContext<?> root = navService.loadNode(NodeModel.SELF_MODEL, nav, Scope.ALL, null);
+      NodeContext<?> node = root.get(0);
+      assertEquals("group::/platform/test/normalized::register", node.getState().getPageRef());
 
       Page page = storage.getPage("group::/platform/test/normalized::register");
       assertNotNull(page);
@@ -123,30 +136,30 @@
 
    public void testNavigation() throws Exception
    {
-      PageNavigation nav = storage.getPageNavigation("portal::test");
+      SiteKey key = SiteKey.portal("test");
+      NavigationContext nav = navService.loadNavigation(key);
       assertNotNull(nav);
 
       //
-      assertEquals(1, nav.getPriority());
+      assertEquals(1, (int) nav.getState().getPriority());
 
       //
-      assertEquals(2, nav.getNodes().size());
+      NodeContext<?> root = navService.loadNode(NodeModel.SELF_MODEL, nav, Scope.ALL, null);
+      assertEquals(5, root.getNodeCount());
 
       //
-      PageNode nodeNavigation = nav.getNodes().get(0);
-      assertEquals(0, nodeNavigation.getChildren().size());
+      NodeContext<?> nodeNavigation = root.get(0);
+      assertEquals(0, nodeNavigation.getNodeCount());
       assertEquals("node_name", nodeNavigation.getName());
-      assertEquals("node_uri", nodeNavigation.getUri());
-      assertEquals("node_label", nodeNavigation.getLabel());
-      assertEquals("node_icon", nodeNavigation.getIcon());
+      assertEquals("node_label", nodeNavigation.getState().getLabel());
+      assertEquals("node_icon", nodeNavigation.getState().getIcon());
       GregorianCalendar start = new GregorianCalendar(2000, 2, 21, 1, 33, 0);
       start.setTimeZone(TimeZone.getTimeZone("UTC"));
-      assertEquals(start.getTime(), nodeNavigation.getStartPublicationDate());
+      assertEquals(start.getTime().getTime(), nodeNavigation.getState().getStartPublicationTime());
       GregorianCalendar end = new GregorianCalendar(2009, 2, 21, 1, 33, 0);
       end.setTimeZone(TimeZone.getTimeZone("UTC"));
-      assertEquals(end.getTime(), nodeNavigation.getEndPublicationDate());
-      assertEquals(true, nodeNavigation.isShowPublicationDate());
-      assertEquals(true, nodeNavigation.isVisible());
+      assertEquals(end.getTime().getTime(), nodeNavigation.getState().getEndPublicationTime());
+      assertEquals(Visibility.TEMPORAL, nodeNavigation.getState().getVisibility());
    }
 
    public void testPortal() throws Exception
@@ -230,24 +243,6 @@
    }
 */
 
-   public void testFindNavigation() throws Exception
-   {
-      Query<PageNavigation> query = new Query<PageNavigation>("group", null, null, null, PageNavigation.class);
-      List<PageNavigation> list = storage.find(query).getAll();
-      assertEquals("Expected 6 results instead of " + list, 6, list.size());
-      Set<String> names = new HashSet<String>();
-      for (PageNavigation navigation : list)
-      {
-         assertEquals("group", navigation.getOwnerType());
-         names.add(navigation.getOwnerId());
-      }
-      HashSet<String> expectedNames =
-         new HashSet<String>(Arrays.asList("/platform/test/legacy", "/platform/test/normalized",
-            "/platform/administrators", "/platform/guests", "/platform/users",
-            "/organization/management/executive-board"));
-      assertEquals(expectedNames, names);
-   }
-
 /*
    public void testFindPageByName() throws Exception
    {

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestPortalConfig.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestPortalConfig.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestPortalConfig.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -22,6 +22,10 @@
 import org.exoplatform.container.PortalContainer;
 import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.navigation.NavigationContext;
+import org.exoplatform.portal.mop.navigation.NavigationService;
+import org.exoplatform.portal.mop.navigation.NavigationState;
 import org.exoplatform.portal.pom.config.POMSession;
 import org.exoplatform.portal.pom.config.POMSessionManager;
 import org.exoplatform.services.organization.Group;
@@ -48,6 +52,9 @@
    /** . */
    private POMSession session;
 
+   /** . */
+   private NavigationService navService;
+
    public TestPortalConfig(String name)
    {
       super(name);
@@ -61,6 +68,7 @@
       org = (OrganizationService)container.getComponentInstanceOfType(OrganizationService.class);
       storage = (DataStorage)container.getComponentInstanceOfType(DataStorage.class);
       mgr = (POMSessionManager)container.getComponentInstanceOfType(POMSessionManager.class);
+      navService = (NavigationService)container.getComponentInstanceOfType(NavigationService.class);
       session = mgr.openSession();
    }
 
@@ -127,30 +135,29 @@
       group = groupHandler.findGroupById("/groupTest");
       assertNull(group);
    }
-   
+
+
+
    public void testGroupNavigation() throws Exception
    {
+
+
       GroupHandler groupHandler = org.getGroupHandler();
       Group group = groupHandler.createGroupInstance();
       group.setGroupName("testGroupNavigation");
       group.setLabel("testGroupNavigation");
       
       groupHandler.addChild(null, group, true);
-      
-      PageNavigation pageNavigation = new PageNavigation();
-      pageNavigation.setOwnerId(group.getId());
-      pageNavigation.setOwnerType(PortalConfig.GROUP_TYPE);
-      storage.create(pageNavigation);
-      
-      pageNavigation = storage.getPageNavigation(PortalConfig.GROUP_TYPE, group.getId());
-      assertNotNull(pageNavigation);
-      
+
+      SiteKey key = SiteKey.group(group.getId());
+      navService.saveNavigation(new NavigationContext(key, new NavigationState(0)));
+      assertNotNull(navService.loadNavigation(key));
+
       // Remove group
       groupHandler.removeGroup(group, true);
       
       // Group navigations is removed after remove group 
-      pageNavigation = storage.getPageNavigation(PortalConfig.GROUP_TYPE, group.getId());
-      assertNull(pageNavigation);
+      assertNull(navService.loadNavigation(key));
    }
 
    public void testUserLayout() throws Exception
@@ -173,27 +180,4 @@
       PortalConfig pConfig = storage.getPortalConfig(PortalConfig.USER_TYPE, "testing");
       assertNotNull("the User's PortalConfig is not null", pConfig);
    }
-
-   public void testGetAllOrder() throws Exception
-   {
-      // Query with comparator to make sure returned list is ordered
-      Query<PageNavigation> query = new Query<PageNavigation>(PortalConfig.GROUP_TYPE, null, PageNavigation.class);
-      Comparator<PageNavigation> sortComparator = new Comparator<PageNavigation>()
-      {
-         public int compare(PageNavigation pconfig1, PageNavigation pconfig2)
-         {
-            return pconfig1.getOwnerId().compareTo(pconfig2.getOwnerId());
-         }
-      };
-
-      // First query
-      List<PageNavigation> navis = storage.find(query, sortComparator).getAll();
-      storage.save(navis.get(0)); // Modify
-      // Second query
-      List<PageNavigation> navis2 = storage.find(query, sortComparator).getAll();
-      for (int i = 0; i < navis.size(); i++)
-      {
-         assertEquals(true, navis.get(i).getOwnerId().equals(navis2.get(i).getOwnerId()));
-      }
-   }
 }

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSavedPOM.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSavedPOM.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSavedPOM.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -97,7 +97,7 @@
       //
       Collection<? extends Navigation> childrenNavigations = defaultNav.getChildren();
       assertNotNull(childrenNavigations);
-      assertEquals(2, childrenNavigations.size());
+      assertEquals(5, childrenNavigations.size());
       Iterator<? extends Navigation> i = childrenNavigations.iterator();
 
       //
@@ -109,7 +109,6 @@
       Described nodeDescribed = nodeNavigation.adapt(Described.class);
       assertEquals("node_label", nodeDescribed.getName());
       Attributes nodeAttrs = nodeNavigation.getAttributes();
-      assertEquals("node_uri", nodeAttrs.getString("uri"));
       assertEquals("node_icon", nodeAttrs.getString("icon"));
 
       //

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSearch.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSearch.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSearch.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -59,22 +59,20 @@
       super.tearDown();
    }
 
-   private void assertFound(String searchTitle, String expectedPage) throws Exception
+   private void assertPageFound(Query<Page> q, String expectedPage) throws Exception
    {
-      Query<Page> q = new Query<Page>(null, null, null, searchTitle, Page.class);
       List<Page> res = storage.find(q).getAll();
       assertEquals(1, res.size());
       assertEquals(expectedPage, res.get(0).getPageId());
    }
 
-   private void assertNotFound(String searchTitle) throws Exception
+   private void assertPageNotFound(Query<Page> q) throws Exception
    {
-      Query<Page> q = new Query<Page>(null, null, null, searchTitle, Page.class);
       List<Page> res = storage.find(q).getAll();
       assertEquals(0, res.size());
    }
 
-   public void testFoo() throws Exception
+   public void testSearchPage() throws Exception
    {
       Page page = new Page();
       page.setPageId("portal::test::searchedpage");
@@ -83,19 +81,20 @@
       session.save();
 
       //
-      assertFound("Juuu Ziii", "portal::test::searchedpage");
-      assertFound("Juuu", "portal::test::searchedpage");
-      assertFound("Ziii", "portal::test::searchedpage");
-      assertFound("juuu ziii", "portal::test::searchedpage");
-      assertFound("juuu", "portal::test::searchedpage");
-      assertFound("ziii", "portal::test::searchedpage");
-      assertFound("juu", "portal::test::searchedpage");
-      assertFound("zii", "portal::test::searchedpage");
-      assertFound("ju", "portal::test::searchedpage");
-      assertFound("zi", "portal::test::searchedpage");
+      assertPageFound(new Query<Page>(null, null, null, "Juuu Ziii", Page.class), "portal::test::searchedpage");
+      assertPageFound(new Query<Page>(null, null, null, "Juuu", Page.class), "portal::test::searchedpage");
+      assertPageFound(new Query<Page>(null, null, null, "Ziii", Page.class), "portal::test::searchedpage");
+      assertPageFound(new Query<Page>(null, null, null, "juuu ziii", Page.class), "portal::test::searchedpage");
+      assertPageFound(new Query<Page>(null, null, null, "juuu", Page.class), "portal::test::searchedpage");
+      assertPageFound(new Query<Page>(null, null, null, "ziii", Page.class), "portal::test::searchedpage");
+      assertPageFound(new Query<Page>(null, null, null, "juu", Page.class), "portal::test::searchedpage");
+      assertPageFound(new Query<Page>(null, null, null, "zii", Page.class), "portal::test::searchedpage");
+      assertPageFound(new Query<Page>(null, null, null, "ju", Page.class), "portal::test::searchedpage");
+      assertPageFound(new Query<Page>(null, null, null, "zi", Page.class), "portal::test::searchedpage");
 
-      assertNotFound("foo");
-      assertNotFound("foo bar");
+      assertPageNotFound(new Query<Page>(null, null, null, "foo", Page.class));
+      assertPageNotFound(new Query<Page>(null, null, null, "foo bar", Page.class));
+      assertPageNotFound(new Query<Page>("test", null, null, null, Page.class));
    }
    
    public void testSearchPageByOwnerID() throws Exception

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSerialization.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSerialization.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSerialization.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -22,15 +22,12 @@
 import org.exoplatform.component.test.AbstractGateInTest;
 import org.exoplatform.portal.config.model.ApplicationType;
 import org.exoplatform.portal.config.model.PersistentApplicationState;
-import org.exoplatform.portal.config.model.TransientApplicationState;
-import org.exoplatform.portal.mop.Visibility;
 import org.exoplatform.portal.pom.data.*;
 import org.exoplatform.portal.pom.spi.gadget.Gadget;
 import org.gatein.common.io.IOTools;
 
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -179,52 +176,6 @@
       assertEquals(obj.getSkin(), clone.getSkin());
    }
 
-   public void testNavigationNode() throws Exception
-   {
-      Date a = new Date();
-      Date b = new Date();
-      NavigationNodeData obj = new NavigationNodeData(
-         "foo01",
-         "foo02",
-         "foo03",
-         "foo04",
-         "foo05",
-         a,
-         b,
-         Visibility.SYSTEM,
-         "foo06",
-         Collections.<NavigationNodeData>emptyList()
-      );
-      NavigationNodeData clone = IOTools.clone(obj);
-      assertEquals(obj.getStorageId(), clone.getStorageId());
-      assertEquals(obj.getStorageName(), clone.getStorageName());
-      assertEquals(obj.getURI(), clone.getURI());
-      assertEquals(obj.getLabel(), clone.getLabel());
-      assertEquals(obj.getIcon(), clone.getIcon());
-      assertEquals(obj.getName(), clone.getName());
-      assertEquals(obj.getStartPublicationDate(), clone.getStartPublicationDate());
-      assertEquals(obj.getEndPublicationDate(), clone.getEndPublicationDate());
-      assertEquals(obj.getVisibility(), clone.getVisibility());
-      assertEquals(obj.getPageReference(), clone.getPageReference());
-   }
-
-   public void testNavigationData() throws Exception
-   {
-      NavigationData obj = new NavigationData(
-         "foo01",
-         "foo02",
-         "foo03",
-         3,
-         Collections.<NavigationNodeData>emptyList()
-      );
-      NavigationData clone = IOTools.clone(obj);
-      assertEquals(obj.getStorageId(), clone.getStorageId());
-      assertEquals(obj.getStorageName(), clone.getStorageName());
-      assertEquals(obj.getOwnerType(), clone.getOwnerType());
-      assertEquals(obj.getOwnerId(), clone.getOwnerId());
-      assertEquals(obj.getPriority(), clone.getPriority());
-   }
-
    public void testApplicationData() throws Exception
    {
       ApplicationData<?> obj = new ApplicationData<Gadget>(

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSystemNavigation.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSystemNavigation.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestSystemNavigation.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2009 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.config;
-
-import org.exoplatform.container.PortalContainer;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
-import org.exoplatform.portal.mop.Visibility;
-import org.exoplatform.portal.pom.config.POMSession;
-import org.exoplatform.portal.pom.config.POMSessionManager;
-
-import java.util.Iterator;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class TestSystemNavigation extends AbstractPortalTest
-{
-
-   /** . */
-   private DataStorage storage_;
-
-   /** . */
-   private POMSessionManager mgr;
-
-   /** . */
-   private POMSession session;
-
-   public void setUp() throws Exception
-   {
-      super.setUp();
-      begin();
-      PortalContainer container = PortalContainer.getInstance();
-      storage_ = (DataStorage)container.getComponentInstanceOfType(DataStorage.class);
-      mgr = (POMSessionManager)container.getComponentInstanceOfType(POMSessionManager.class);
-      session = mgr.openSession();
-   }
-
-   protected void tearDown() throws Exception
-   {
-      session.close();
-      end();
-      super.tearDown();
-   }
-
-   public void testWeirdBug() throws Exception
-   {
-      PageNavigation nav = storage_.getPageNavigation("portal::system");
-
-      //
-      for (Iterator<PageNode> i = nav.getNodes().iterator();i.hasNext();)
-      {
-         PageNode node = i.next();
-         if (node.getVisibility() != Visibility.SYSTEM)
-         {
-            i.remove();
-         }
-      }
-
-      //
-      storage_.save(nav);
-
-      end(true);
-      begin();
-
-      //
-      nav = storage_.getPageNavigation("portal::system");
-
-      //
-      PageNode b = new PageNode();
-      b.setName("b");
-      b.setUri("b");
-      b.setVisibility(Visibility.DISPLAYED);
-      b.setLabel("b");
-
-      //
-      System.out.println("nav.getNodes() = " + nav.getNodes());
-
-      //
-      nav.getNodes().clear();
-      nav.addNode(b);
-
-      // Need to uncomment to make it fail for now
-//      storage_.save(nav);
-   }
-}

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestUserPortalConfigService.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestUserPortalConfigService.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/TestUserPortalConfigService.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -32,6 +32,10 @@
 import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.model.PageNode;
 import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.EventType;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.portal.pom.config.POMDataStorage;
 import org.exoplatform.portal.pom.config.POMSession;
 import org.exoplatform.portal.pom.config.POMSessionManager;
@@ -131,23 +135,23 @@
          listenerService.addListener(DataStorage.PAGE_CREATED, listener);
          listenerService.addListener(DataStorage.PAGE_REMOVED, listener);
          listenerService.addListener(DataStorage.PAGE_UPDATED, listener);
-         listenerService.addListener(DataStorage.NAVIGATION_CREATED, listener);
-         listenerService.addListener(DataStorage.NAVIGATION_REMOVED, listener);
-         listenerService.addListener(DataStorage.NAVIGATION_UPDATED, listener);
+         listenerService.addListener(EventType.NAVIGATION_CREATED, listener);
+         listenerService.addListener(EventType.NAVIGATION_DESTROYED, listener);
+         listenerService.addListener(EventType.NAVIGATION_UPDATED, listener);
       }
    }
 
-   private static Map<String, PageNavigation> toMap(UserPortalConfig cfg)
+   private static Map<String, UserNavigation> toMap(UserPortal cfg)
    {
       return toMap(cfg.getNavigations());
    }
 
-   private static Map<String, PageNavigation> toMap(List<PageNavigation> navigations)
+   private static Map<String, UserNavigation> toMap(List<UserNavigation> navigations)
    {
-      Map<String, PageNavigation> map = new HashMap<String, PageNavigation>();
-      for (PageNavigation nav : navigations)
+      Map<String, UserNavigation> map = new HashMap<String, UserNavigation>();
+      for (UserNavigation nav : navigations)
       {
-         map.put(nav.getOwnerType() + "::" + nav.getOwnerId(), nav);
+         map.put(nav.getKey().getType().getName() + "::" + nav.getKey().getName(), nav);
       }
       return map;
    }
@@ -188,8 +192,9 @@
             assertNotNull(portalCfg);
             assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
             assertEquals("classic", portalCfg.getName());
-            assertNotNull(userPortalCfg.getNavigations());
-            Map<String, PageNavigation> navigations = toMap(userPortalCfg);
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+            assertNotNull(userPortal.getNavigations());
+            Map<String, UserNavigation> navigations = toMap(userPortal);
             assertEquals("expected to have 5 navigations instead of " + navigations, 5, navigations.size());
             assertTrue(navigations.containsKey("portal::classic"));
             assertTrue(navigations.containsKey("group::/platform/administrators"));
@@ -212,8 +217,9 @@
             assertNotNull(portalCfg);
             assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
             assertEquals("classic", portalCfg.getName());
-            assertNotNull(userPortalCfg.getNavigations());
-            Map<String, PageNavigation> navigations = toMap(userPortalCfg);
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+            assertNotNull(userPortal.getNavigations());
+            Map<String, UserNavigation> navigations = toMap(userPortal);
             assertEquals("expected to have 5 navigations instead of " + navigations, 5, navigations.size());
             assertTrue(navigations.containsKey("portal::classic"));
             assertTrue(navigations.containsKey("group::/platform/administrators"));
@@ -236,8 +242,9 @@
             assertNotNull(portalCfg);
             assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
             assertEquals("classic", portalCfg.getName());
-            assertNotNull(userPortalCfg.getNavigations());
-            Map<String, PageNavigation> navigations = toMap(userPortalCfg);
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+            assertNotNull(userPortal.getNavigations());
+            Map<String, UserNavigation> navigations = toMap(userPortal);
             assertEquals(3, navigations.size());
             assertTrue(navigations.containsKey("portal::classic"));
             assertTrue(navigations.containsKey("group::/platform/users"));
@@ -258,8 +265,9 @@
             assertNotNull(portalCfg);
             assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
             assertEquals("classic", portalCfg.getName());
-            assertNotNull(userPortalCfg.getNavigations());
-            Map<String, PageNavigation> navigations = toMap(userPortalCfg);
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+            assertNotNull(userPortal.getNavigations());
+            Map<String, UserNavigation> navigations = toMap(userPortal);
             assertEquals("" + navigations, 1, navigations.size());
             assertTrue(navigations.containsKey("portal::classic"));
          }
@@ -273,13 +281,14 @@
          public void execute() throws Exception
          {
             UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "root");
-            List<PageNavigation> navigations = userPortalCfg.getNavigations();
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+            List<UserNavigation> navigations = userPortal.getNavigations();
             assertEquals("expected to have 5 navigations instead of " + navigations, 5, navigations.size());
-            assertEquals("classic", navigations.get(0).getOwnerId()); // 1
-            assertEquals("/platform/administrators", navigations.get(1).getOwnerId()); // 2
-            assertEquals("root", navigations.get(2).getOwnerId()); // 3
-            assertEquals("/organization/management/executive-board", navigations.get(3).getOwnerId()); // 5
-            assertEquals("/platform/users", navigations.get(4).getOwnerId()); // 8
+            assertEquals("classic", navigations.get(0).getKey().getName()); // 1
+            assertEquals("/platform/administrators", navigations.get(1).getKey().getName()); // 2
+            assertEquals("root", navigations.get(2).getKey().getName()); // 3
+            assertEquals("/organization/management/executive-board", navigations.get(3).getKey().getName()); // 5
+            assertEquals("/platform/users", navigations.get(4).getKey().getName()); // 8
          }
       }.execute("root");
    }
@@ -297,8 +306,9 @@
             assertNotNull(portalCfg);
             assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
             assertEquals("jazz", portalCfg.getName());
-            assertNotNull(userPortalCfg.getNavigations());
-            Map<String, PageNavigation> navigations = toMap(userPortalCfg);
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+            assertNotNull(userPortal.getNavigations());
+            Map<String, UserNavigation> navigations = toMap(userPortal);
             assertEquals("expected to have 5 navigations instead of " + navigations, 5, navigations.size());
             assertTrue(navigations.containsKey("portal::jazz"));
             assertTrue(navigations.containsKey("group::/platform/administrators"));
@@ -569,142 +579,6 @@
          }
       }.execute(null);
    }
-
-   public void testRemoveNavigation()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            PageNavigation navigation = new PageNavigation();
-            navigation.setOwnerType("group");
-            navigation.setOwnerId("/platform/administrators");
-            assertTrue(events.isEmpty());
-            storage_.remove(navigation);
-            assertEquals(1, events.size());
-            Event event = events.removeFirst();
-            assertEquals(DataStorage.NAVIGATION_REMOVED, event.getEventName());
-            PageNavigation n = ((PageNavigation)event.getData());
-            assertEquals("group", n.getOwnerType());
-            assertEquals("/platform/administrators", n.getOwnerId());
-            assertEquals(null, storage_.getPageNavigation("group", "/platform/administrators"));
-         }
-      }.execute(null);
-   }
-
-   public void testCreateNavigation()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            PageNavigation navigation = new PageNavigation();
-            navigation.setOwnerType("group");
-            navigation.setOwnerId("/platform/administrators");
-            storage_.remove(navigation);
-            assertNotNull(events.removeLast());
-            assertTrue(events.isEmpty());
-            storage_.create(navigation);
-            assertEquals(1, events.size());
-            Event event = events.removeFirst();
-            assertEquals(DataStorage.NAVIGATION_CREATED, event.getEventName());
-            PageNavigation n = ((PageNavigation)event.getData());
-            assertEquals("group", n.getOwnerType());
-            assertEquals("/platform/administrators", n.getOwnerId());
-            PageNavigation n2 = storage_.getPageNavigation("group", "/platform/administrators");
-            assertEquals("group", n2.getOwnerType());
-            assertEquals("/platform/administrators", n2.getOwnerId());
-         }
-      }.execute(null);
-   }
-
-   /*
-      public void testCreateMultipleNavigations(){
-         for(int i =0; i < 10; i++){
-            createNavigation(null, "group", "/platform/administrators" + i);
-         }
-      }
-      
-      private void createNavigation(final String user, final String ownerType, final String ownerId)
-      {
-         new UnitTest()
-         {
-
-            public void execute() throws Exception
-            {
-               createNavigationInSeperatedThread();
-            }
-
-            private void createNavigationInSeperatedThread()
-            {
-               Thread task = new Thread()
-               {
-                  public void run()
-                  {
-                     PageNavigation navigation = new PageNavigation();
-                     navigation.setOwnerType(ownerType);
-                     navigation.setOwnerId(ownerId);
-                     try
-                     {
-                        userPortalConfigSer_.create(navigation);
-                        Event event = events.removeFirst();
-                        assertEquals(DataStorage.CREATE_NAVIGATION_EVENT, event.getEventName());
-                        PageNavigation n1 = (PageNavigation)event.getSource();
-                        assertEquals(ownerType, n1.getOwnerType());
-                        assertEquals(ownerId, n1.getOwnerId());
-                        PageNavigation n2 = storage_.getPageNavigation(ownerType, ownerId);
-                        assertEquals(ownerType, n2.getOwnerType());
-                        assertEquals(ownerId, n2.getOwnerId());
-                     }
-                     catch (Exception ex)
-                     {
-                        assertTrue("Failed while create '" + ownerType + " ' navigation for owner: " + ownerId, false);
-                        ex.printStackTrace();
-                     }
-                  }
-               };
-
-               task.start();
-               try
-               {
-                  task.sleep(200);
-               }
-               catch (InterruptedException ex)
-               {
-                  ex.printStackTrace();
-               }
-            }
-         }.execute(user);
-      }
-   */
-
-   public void testUpdateNavigation()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            PageNavigation navigation = new PageNavigation();
-            navigation.setOwnerType("group");
-            navigation.setOwnerId("/platform/administrators");
-            navigation.setPriority(3);
-            assertTrue(events.isEmpty());
-            storage_.save(navigation);
-            assertEquals(1, events.size());
-            Event event = events.removeFirst();
-            assertEquals(DataStorage.NAVIGATION_UPDATED, event.getEventName());
-            PageNavigation n = ((PageNavigation)event.getData());
-            assertEquals("group", n.getOwnerType());
-            assertEquals("/platform/administrators", n.getOwnerId());
-            assertEquals(3, n.getPriority());
-            PageNavigation n2 = storage_.getPageNavigation("group", "/platform/administrators");
-            assertEquals("group", n2.getOwnerType());
-            assertEquals("/platform/administrators", n2.getOwnerId());
-            assertEquals(3, n2.getPriority());
-         }
-      }.execute(null);
-   }
-   
    public void testRenewPage()
    {
       new UnitTest()
@@ -887,25 +761,6 @@
       }.execute(null);
    }
 
-   public void testCachePageNavigation()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            mgr.clearCache();
-            DataCache cache = mgr.getDecorator(DataCache.class);
-            long readCount0 = cache.getReadCount();
-            storage_.getPageNavigation("portal", "test");
-            long readCount1 = cache.getReadCount();
-            assertTrue(readCount1 > readCount0);
-            storage_.getPageNavigation("portal", "test");
-            long readCount2 = cache.getReadCount();
-            assertEquals(readCount1, readCount2);
-         }
-      }.execute(null);
-   }
-
    private abstract class UnitTest
    {
 

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/Builder.java
===================================================================
--- portal/trunk/component/portal/src/test/java/org/exoplatform/portal/config/importer/Builder.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/Builder.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.config.importer;
-
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class Builder
-{
-
-   /** . */
-   private String value;
-
-   /** . */
-   private List<Builder> nodes;
-
-   private Builder(String value)
-   {
-      this.value = value;
-      this.nodes = new ArrayList<Builder>();
-   }
-
-   public static Builder navigation(String ownerId)
-   {
-      return new Builder(ownerId);
-   }
-
-   public static Builder node(String name)
-   {
-      return new Builder(name);
-   }
-
-   public Builder add(Builder... nodes)
-   {
-      for (Builder node : nodes)
-      {
-         this.nodes.add(node);
-      }
-      return this;
-   }
-
-   public Builder get(String value)
-   {
-      for (Builder node : nodes)
-      {
-         if (node.value.equals(value))
-         {
-            return node;
-         }
-      }
-      return null;
-   }
-
-   private ArrayList<PageNode> buildNodes()
-   {
-      ArrayList<PageNode> nodes = new ArrayList<PageNode>();
-      for (Builder node : this.nodes)
-      {
-         nodes.add(node.buildNode());
-      }
-      return nodes;
-   }
-
-   public PageNavigation build()
-   {
-      PageNavigation navigation = new PageNavigation();
-      navigation.setOwnerType("portal");
-      navigation.setOwnerId(value);
-      navigation.setNodes(buildNodes());
-      return navigation;
-   }
-
-   private PageNode buildNode()
-   {
-      PageNode node = new PageNode();
-      node.setName(value);
-      node.setLabel(value);
-      node.setChildren(buildNodes());
-      return node;
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/Builder.java (from rev 6783, portal/trunk/component/portal/src/test/java/org/exoplatform/portal/config/importer/Builder.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/Builder.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/Builder.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.config.importer;
+
+import org.exoplatform.portal.config.model.PageNavigation;
+import org.exoplatform.portal.config.model.PageNode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class Builder
+{
+
+   /** . */
+   private String value;
+
+   /** . */
+   private List<Builder> nodes;
+
+   private Builder(String value)
+   {
+      this.value = value;
+      this.nodes = new ArrayList<Builder>();
+   }
+
+   public static Builder navigation(String ownerId)
+   {
+      return new Builder(ownerId);
+   }
+
+   public static Builder node(String name)
+   {
+      return new Builder(name);
+   }
+
+   public Builder add(Builder... nodes)
+   {
+      for (Builder node : nodes)
+      {
+         this.nodes.add(node);
+      }
+      return this;
+   }
+
+   public Builder get(String value)
+   {
+      for (Builder node : nodes)
+      {
+         if (node.value.equals(value))
+         {
+            return node;
+         }
+      }
+      return null;
+   }
+
+   private ArrayList<PageNode> buildNodes()
+   {
+      ArrayList<PageNode> nodes = new ArrayList<PageNode>();
+      for (Builder node : this.nodes)
+      {
+         nodes.add(node.buildNode());
+      }
+      return nodes;
+   }
+
+   public PageNavigation build()
+   {
+      PageNavigation navigation = new PageNavigation();
+      navigation.setOwnerType("portal");
+      navigation.setOwnerId(value);
+      navigation.setNodes(buildNodes());
+      return navigation;
+   }
+
+   private PageNode buildNode()
+   {
+      PageNode node = new PageNode();
+      node.setName(value);
+      node.setLabel(value);
+      node.setChildren(buildNodes());
+      return node;
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/TestNavigationImporter.java
===================================================================
--- portal/trunk/component/portal/src/test/java/org/exoplatform/portal/config/importer/TestNavigationImporter.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/TestNavigationImporter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,264 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.config.importer;
-
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.mop.SiteKey;
-import org.exoplatform.portal.mop.navigation.*;
-import org.gatein.mop.api.workspace.ObjectType;
-import org.gatein.mop.core.api.MOPService;
-
-import static org.exoplatform.portal.config.importer.Builder.*;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class TestNavigationImporter extends AbstractTestNavigationService
-{
-
-   public void testMergeCreateNavigation()
-   {
-      testCreate(ImportMode.MERGE);
-   }
-
-   public void testConserveCreateNavigation()
-   {
-      testCreate(ImportMode.CONSERVE);
-   }
-
-   public void testReimportCreateNavigation()
-   {
-      testCreate(ImportMode.REIMPORT);
-   }
-
-   private void testCreate(ImportMode mode)
-   {
-      String name = mode.name() + "_create_navigation";
-
-      //
-      MOPService mop = mgr.getPOMService();
-      mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, name);
-      sync(true);
-
-      //
-      assertNull(service.loadNavigation(SiteKey.portal(name)));
-      PageNavigation src = navigation(name).build();
-      src.setPriority(2);
-      src.setOwnerId(name);
-      NavigationImporter merge = new NavigationImporter(mode, src, service);
-      merge.perform();
-
-      //
-      NavigationContext ctx = service.loadNavigation(SiteKey.portal(name));
-      assertEquals(2, (int)ctx.getState().getPriority());
-   }
-
-   public void testMergeCreate()
-   {
-      MOPService mop = mgr.getPOMService();
-      mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "merge_create");
-      sync(true);
-
-      //
-      assertNull(service.loadNavigation(SiteKey.portal("merge_create")));
-
-      //
-      Builder builder = navigation("merge_create").add(node("a"));
-
-      //
-      PageNavigation src = builder.build();
-      src.setOwnerId("merge_create");
-      NavigationImporter merge = new NavigationImporter(ImportMode.MERGE, src, service);
-      merge.perform();
-
-      //
-      NavigationContext ctx = service.loadNavigation(SiteKey.portal("merge_create"));
-      NodeContext<?> node = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null).getNode();
-      NodeContext<?> a = node.get("a");
-      assertNotNull(a);
-      assertEquals("a", a.getName());
-      assertEquals("a", a.getState().getLabel());
-      assertEquals(0, a.getNodeCount());
-   }
-
-   public void testMergeNested()
-   {
-      MOPService mop = mgr.getPOMService();
-      mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "merge_nested");
-      sync(true);
-
-      //
-      assertNull(service.loadNavigation(SiteKey.portal("merge_nested")));
-
-      //
-      Builder builder = navigation("merge_nested").add(node("a").add(node("b")));
-
-      //
-      PageNavigation src = builder.build();
-      src.setOwnerId("merge_nested");
-      NavigationImporter merge = new NavigationImporter(ImportMode.MERGE, src, service);
-      merge.perform();
-
-      //
-      NavigationContext ctx = service.loadNavigation(SiteKey.portal("merge_nested"));
-      NodeContext<?> node = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null).getNode();
-      NodeContext<?> a = node.get("a");
-      assertNotNull(a);
-      assertEquals("a", a.getName());
-      assertEquals("a", a.getState().getLabel());
-      assertEquals(1, a.getNodeCount());
-   }
-
-   public void testCreateMerge()
-   {
-      testMerge(ImportMode.CONSERVE);
-   }
-
-   public void testMergeMerge()
-   {
-      testMerge(ImportMode.MERGE);
-   }
-
-   public void testReimportMerge()
-   {
-      testMerge(ImportMode.REIMPORT);
-   }
-
-   private void testMerge(ImportMode importMode)
-   {
-      String name = importMode.name() + "_merge_merge";
-
-      //
-      MOPService mop = mgr.getPOMService();
-      mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, name);
-      sync(true);
-
-      //
-      assertNull(service.loadNavigation(SiteKey.portal(name)));
-
-      //
-      Builder builder = navigation(name).add(node("a").add(node("b")));
-
-      //
-      PageNavigation src = builder.build();
-      src.setOwnerId(name);
-      NavigationImporter merge = new NavigationImporter(ImportMode.CONSERVE, src, service);
-      merge.perform();
-
-      //
-      NavigationContext ctx = service.loadNavigation(SiteKey.portal(name));
-      Node node = service.loadNode(Node.MODEL, ctx, Scope.ALL, null).getNode();
-      Node a = node.getChild("a");
-      assertNotNull(a);
-      assertEquals("a", a.getName());
-      assertEquals(1, a.getNodeCount());
-      Node b = a.getChild("b");
-      assertNotNull(b);
-      assertEquals("b", b.getName());
-      assertEquals(0, b.getNodeCount());
-
-      //
-      builder = navigation(name).add(node("a").add(node("d"))).add(node("c"));
-      src = builder.build();
-      src.setOwnerId(name);
-      merge = new NavigationImporter(importMode, src, service);
-      merge.perform();
-
-      //
-      ctx = service.loadNavigation(SiteKey.portal(name));
-      node = service.loadNode(Node.MODEL, ctx, Scope.ALL, null).getNode();
-      switch (importMode)
-      {
-         case MERGE:
-         {
-            assertEquals(2, node.getNodeCount());
-            a = node.getChild("a");
-            assertNotNull(a);
-            assertEquals("a", a.getState().getLabel());
-            assertEquals(2, a.getNodeCount());
-            b = a.getChild("b");
-            assertNotNull(b);
-            assertEquals("b", b.getState().getLabel());
-            assertEquals(0, b.getNodeCount());
-            Node c = node.getChild("c");
-            assertNotNull(c);
-            assertEquals("c", c.getState().getLabel());
-            assertEquals(0, c.getNodeCount());
-            Node d = a.getChild("d");
-            assertNotNull(d);
-            assertEquals("d", d.getName());
-            assertEquals(0, d.getNodeCount());
-            break;
-         }
-         case CONSERVE:
-         {
-            assertEquals(1, node.getNodeCount());
-            a = node.getChild("a");
-            assertNotNull(a);
-            assertEquals(1, a.getNodeCount());
-            assertNotNull(b);
-            assertEquals("b", b.getState().getLabel());
-            assertEquals(0, b.getNodeCount());
-            break;
-         }
-         case REIMPORT:
-         {
-            assertEquals(2, node.getNodeCount());
-            a = node.getChild("a");
-            assertNotNull(a);
-            assertEquals("a", a.getState().getLabel());
-            assertEquals(1, a.getNodeCount());
-            Node c = node.getChild("c");
-            assertNotNull(c);
-            assertEquals("c", c.getState().getLabel());
-            assertEquals(0, c.getNodeCount());
-            Node d = a.getChild("d");
-            assertNotNull(d);
-            assertEquals("d", d.getName());
-            assertEquals(0, d.getNodeCount());
-            break;
-         }
-      }
-   }
-
-   public void testMergeOrder()
-   {
-      MOPService mop = mgr.getPOMService();
-      mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "merge_order");
-      sync(true);
-
-      //
-      assertNull(service.loadNavigation(SiteKey.portal("merge_order")));
-
-      //
-      PageNavigation src = navigation("merge_order").add(node("a"), node("b"), node("c")).build();
-      src.setOwnerId("merge_order");
-      NavigationImporter merge = new NavigationImporter(ImportMode.MERGE, src, service);
-      merge.perform();
-
-      //
-      NavigationContext ctx = service.loadNavigation(SiteKey.portal("merge_order"));
-      NodeContext<?> node = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null).getNode();
-      assertEquals(3, node.getNodeCount());
-      assertEquals("a", node.get(0).getName());
-      assertEquals("b", node.get(1).getName());
-      assertEquals("c", node.get(2).getName());
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/TestNavigationImporter.java (from rev 6783, portal/trunk/component/portal/src/test/java/org/exoplatform/portal/config/importer/TestNavigationImporter.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/TestNavigationImporter.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/importer/TestNavigationImporter.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,264 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.config.importer;
+
+import org.exoplatform.portal.config.model.PageNavigation;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.navigation.*;
+import org.gatein.mop.api.workspace.ObjectType;
+import org.gatein.mop.core.api.MOPService;
+
+import static org.exoplatform.portal.config.importer.Builder.*;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class TestNavigationImporter extends AbstractTestNavigationService
+{
+
+   public void testMergeCreateNavigation()
+   {
+      testCreate(ImportMode.MERGE);
+   }
+
+   public void testConserveCreateNavigation()
+   {
+      testCreate(ImportMode.CONSERVE);
+   }
+
+   public void testReimportCreateNavigation()
+   {
+      testCreate(ImportMode.REIMPORT);
+   }
+
+   private void testCreate(ImportMode mode)
+   {
+      String name = mode.name() + "_create_navigation";
+
+      //
+      MOPService mop = mgr.getPOMService();
+      mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, name);
+      sync(true);
+
+      //
+      assertNull(service.loadNavigation(SiteKey.portal(name)));
+      PageNavigation src = navigation(name).build();
+      src.setPriority(2);
+      src.setOwnerId(name);
+      NavigationImporter merge = new NavigationImporter(mode, src, service);
+      merge.perform();
+
+      //
+      NavigationContext ctx = service.loadNavigation(SiteKey.portal(name));
+      assertEquals(2, (int)ctx.getState().getPriority());
+   }
+
+   public void testMergeCreate()
+   {
+      MOPService mop = mgr.getPOMService();
+      mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "merge_create");
+      sync(true);
+
+      //
+      assertNull(service.loadNavigation(SiteKey.portal("merge_create")));
+
+      //
+      Builder builder = navigation("merge_create").add(node("a"));
+
+      //
+      PageNavigation src = builder.build();
+      src.setOwnerId("merge_create");
+      NavigationImporter merge = new NavigationImporter(ImportMode.MERGE, src, service);
+      merge.perform();
+
+      //
+      NavigationContext ctx = service.loadNavigation(SiteKey.portal("merge_create"));
+      NodeContext<?> node = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null).getNode();
+      NodeContext<?> a = node.get("a");
+      assertNotNull(a);
+      assertEquals("a", a.getName());
+      assertEquals("a", a.getState().getLabel());
+      assertEquals(0, a.getNodeCount());
+   }
+
+   public void testMergeNested()
+   {
+      MOPService mop = mgr.getPOMService();
+      mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "merge_nested");
+      sync(true);
+
+      //
+      assertNull(service.loadNavigation(SiteKey.portal("merge_nested")));
+
+      //
+      Builder builder = navigation("merge_nested").add(node("a").add(node("b")));
+
+      //
+      PageNavigation src = builder.build();
+      src.setOwnerId("merge_nested");
+      NavigationImporter merge = new NavigationImporter(ImportMode.MERGE, src, service);
+      merge.perform();
+
+      //
+      NavigationContext ctx = service.loadNavigation(SiteKey.portal("merge_nested"));
+      NodeContext<?> node = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null).getNode();
+      NodeContext<?> a = node.get("a");
+      assertNotNull(a);
+      assertEquals("a", a.getName());
+      assertEquals("a", a.getState().getLabel());
+      assertEquals(1, a.getNodeCount());
+   }
+
+   public void testCreateMerge()
+   {
+      testMerge(ImportMode.CONSERVE);
+   }
+
+   public void testMergeMerge()
+   {
+      testMerge(ImportMode.MERGE);
+   }
+
+   public void testReimportMerge()
+   {
+      testMerge(ImportMode.REIMPORT);
+   }
+
+   private void testMerge(ImportMode importMode)
+   {
+      String name = importMode.name() + "_merge_merge";
+
+      //
+      MOPService mop = mgr.getPOMService();
+      mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, name);
+      sync(true);
+
+      //
+      assertNull(service.loadNavigation(SiteKey.portal(name)));
+
+      //
+      Builder builder = navigation(name).add(node("a").add(node("b")));
+
+      //
+      PageNavigation src = builder.build();
+      src.setOwnerId(name);
+      NavigationImporter merge = new NavigationImporter(ImportMode.CONSERVE, src, service);
+      merge.perform();
+
+      //
+      NavigationContext ctx = service.loadNavigation(SiteKey.portal(name));
+      Node node = service.loadNode(Node.MODEL, ctx, Scope.ALL, null).getNode();
+      Node a = node.getChild("a");
+      assertNotNull(a);
+      assertEquals("a", a.getName());
+      assertEquals(1, a.getNodeCount());
+      Node b = a.getChild("b");
+      assertNotNull(b);
+      assertEquals("b", b.getName());
+      assertEquals(0, b.getNodeCount());
+
+      //
+      builder = navigation(name).add(node("a").add(node("d"))).add(node("c"));
+      src = builder.build();
+      src.setOwnerId(name);
+      merge = new NavigationImporter(importMode, src, service);
+      merge.perform();
+
+      //
+      ctx = service.loadNavigation(SiteKey.portal(name));
+      node = service.loadNode(Node.MODEL, ctx, Scope.ALL, null).getNode();
+      switch (importMode)
+      {
+         case MERGE:
+         {
+            assertEquals(2, node.getNodeCount());
+            a = node.getChild("a");
+            assertNotNull(a);
+            assertEquals("a", a.getState().getLabel());
+            assertEquals(2, a.getNodeCount());
+            b = a.getChild("b");
+            assertNotNull(b);
+            assertEquals("b", b.getState().getLabel());
+            assertEquals(0, b.getNodeCount());
+            Node c = node.getChild("c");
+            assertNotNull(c);
+            assertEquals("c", c.getState().getLabel());
+            assertEquals(0, c.getNodeCount());
+            Node d = a.getChild("d");
+            assertNotNull(d);
+            assertEquals("d", d.getName());
+            assertEquals(0, d.getNodeCount());
+            break;
+         }
+         case CONSERVE:
+         {
+            assertEquals(1, node.getNodeCount());
+            a = node.getChild("a");
+            assertNotNull(a);
+            assertEquals(1, a.getNodeCount());
+            assertNotNull(b);
+            assertEquals("b", b.getState().getLabel());
+            assertEquals(0, b.getNodeCount());
+            break;
+         }
+         case REIMPORT:
+         {
+            assertEquals(2, node.getNodeCount());
+            a = node.getChild("a");
+            assertNotNull(a);
+            assertEquals("a", a.getState().getLabel());
+            assertEquals(1, a.getNodeCount());
+            Node c = node.getChild("c");
+            assertNotNull(c);
+            assertEquals("c", c.getState().getLabel());
+            assertEquals(0, c.getNodeCount());
+            Node d = a.getChild("d");
+            assertNotNull(d);
+            assertEquals("d", d.getName());
+            assertEquals(0, d.getNodeCount());
+            break;
+         }
+      }
+   }
+
+   public void testMergeOrder()
+   {
+      MOPService mop = mgr.getPOMService();
+      mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "merge_order");
+      sync(true);
+
+      //
+      assertNull(service.loadNavigation(SiteKey.portal("merge_order")));
+
+      //
+      PageNavigation src = navigation("merge_order").add(node("a"), node("b"), node("c")).build();
+      src.setOwnerId("merge_order");
+      NavigationImporter merge = new NavigationImporter(ImportMode.MERGE, src, service);
+      merge.perform();
+
+      //
+      NavigationContext ctx = service.loadNavigation(SiteKey.portal("merge_order"));
+      NodeContext<?> node = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null).getNode();
+      assertEquals(3, node.getNodeCount());
+      assertEquals("a", node.get(0).getName());
+      assertEquals("b", node.get(1).getName());
+      assertEquals("c", node.get(2).getName());
+   }
+}

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/AbstractTestUserACL.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/AbstractTestUserACL.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/AbstractTestUserACL.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -25,6 +25,7 @@
 import org.exoplatform.portal.config.model.Page;
 import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.SiteKey;
 import org.exoplatform.services.security.ConversationState;
 import org.exoplatform.services.security.Identity;
 import org.exoplatform.services.security.MembershipEntry;
@@ -139,12 +140,12 @@
          }
       }
 
-      public boolean hasEditPermission(PageNavigation nav)
+      public boolean hasEditPermission(SiteKey nav)
       {
          ConversationState.setCurrent(new ConversationState(identity));
          try
          {
-            return ua.hasEditPermission(nav);
+            return ua.hasEditPermissionOnNavigation(nav);
          }
          finally
          {

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/nav/TestGroupNavACL.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/nav/TestGroupNavACL.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/nav/TestGroupNavACL.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,8 +19,8 @@
 
 package org.exoplatform.portal.config.security.nav;
 
-import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.security.AbstractTestUserACL;
+import org.exoplatform.portal.mop.SiteKey;
 
 /**
  * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
@@ -31,9 +31,7 @@
 
    public void testNavEditByManager()
    {
-      PageNavigation nav = new PageNavigation();
-      nav.setOwnerType("group");
-      nav.setOwnerId("manageable");
+      SiteKey nav = SiteKey.group("manageable");
 
       //
       assertTrue(root.hasEditPermission(nav));
@@ -43,7 +41,7 @@
       assertFalse(guest.hasEditPermission(nav));
 
       //
-      nav.setOwnerId("foo");
+      nav = SiteKey.group("foo");
 
       //
       assertTrue(root.hasEditPermission(nav));

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/nav/TestPortalNavACL.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/nav/TestPortalNavACL.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/nav/TestPortalNavACL.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,8 +19,8 @@
 
 package org.exoplatform.portal.config.security.nav;
 
-import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.security.AbstractTestUserACL;
+import org.exoplatform.portal.mop.SiteKey;
 
 /**
  * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
@@ -31,9 +31,7 @@
 
    public void testNavEditByRoot()
    {
-      PageNavigation nav = new PageNavigation();
-      nav.setOwnerType("portal");
-      nav.setOwnerId("foo");
+      SiteKey nav = SiteKey.portal("foo");
 
       //
       assertTrue(root.hasEditPermission(nav));

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/nav/TestUserNavACL.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/nav/TestUserNavACL.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/config/security/nav/TestUserNavACL.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,8 +19,8 @@
 
 package org.exoplatform.portal.config.security.nav;
 
-import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.security.AbstractTestUserACL;
+import org.exoplatform.portal.mop.SiteKey;
 
 /**
  * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
@@ -32,9 +32,7 @@
    public void testNav()
    {
 
-      PageNavigation nav = new PageNavigation();
-      nav.setOwnerType("user");
-      nav.setOwnerId("user");
+      SiteKey nav = SiteKey.user("user");
 
       assertTrue(root.hasEditPermission(nav));
       assertFalse(administrator.hasEditPermission(nav));

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/AbstractTestNavigationService.java
===================================================================
--- portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/AbstractTestNavigationService.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/AbstractTestNavigationService.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import junit.framework.AssertionFailedError;
-import org.exoplatform.container.PortalContainer;
-import org.exoplatform.portal.config.AbstractPortalTest;
-import org.exoplatform.portal.config.DataStorage;
-import org.exoplatform.portal.pom.config.POMSessionManager;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public abstract class AbstractTestNavigationService extends AbstractPortalTest
-{
-
-   /** . */
-   protected POMSessionManager mgr;
-
-   /** . */
-   protected NavigationServiceImpl service;
-
-   /** . */
-   protected DataStorage dataStorage;
-
-   @Override
-   protected void setUp() throws Exception
-   {
-      super.setUp();
-
-      //
-      PortalContainer container = PortalContainer.getInstance();
-      mgr = (POMSessionManager)container.getComponentInstanceOfType(POMSessionManager.class);
-      service = new NavigationServiceImpl(mgr);
-      dataStorage = (DataStorage)container.getComponentInstanceOfType(DataStorage.class);
-
-      // Clear the cache for each test
-      service.clearCache();
-
-      //
-      begin();
-   }
-
-   protected void sync()
-   {
-      end();
-      begin();
-   }
-
-   protected void sync(boolean save)
-   {
-      end(save);
-      begin();
-   }
-
-   @Override
-   protected void end(boolean save)
-   {
-      if (save)
-      {
-         try
-         {
-            startService();
-            super.end(save);
-         }
-         finally
-         {
-            stopService();
-         }
-      }
-      else
-      {
-         super.end(save);
-      }
-   }
-
-   @Override
-   protected void tearDown() throws Exception
-   {
-      end();
-      super.tearDown();
-   }
-
-   private void startService()
-   {
-      try
-      {
-         begin();
-         end();
-      }
-      catch (Exception e)
-      {
-         AssertionFailedError afe = new AssertionFailedError();
-         afe.initCause(e);
-         throw afe;
-      }
-   }
-
-   private void stopService()
-   {
-      begin();
-      end();
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/AbstractTestNavigationService.java (from rev 6783, portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/AbstractTestNavigationService.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/AbstractTestNavigationService.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/AbstractTestNavigationService.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import junit.framework.AssertionFailedError;
+import org.exoplatform.container.PortalContainer;
+import org.exoplatform.portal.config.AbstractPortalTest;
+import org.exoplatform.portal.config.DataStorage;
+import org.exoplatform.portal.pom.config.POMSessionManager;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public abstract class AbstractTestNavigationService extends AbstractPortalTest
+{
+
+   /** . */
+   protected POMSessionManager mgr;
+
+   /** . */
+   protected NavigationServiceImpl service;
+
+   /** . */
+   protected DataStorage dataStorage;
+
+   @Override
+   protected void setUp() throws Exception
+   {
+      super.setUp();
+
+      //
+      PortalContainer container = PortalContainer.getInstance();
+      mgr = (POMSessionManager)container.getComponentInstanceOfType(POMSessionManager.class);
+      service = new NavigationServiceImpl(mgr);
+      dataStorage = (DataStorage)container.getComponentInstanceOfType(DataStorage.class);
+
+      // Clear the cache for each test
+      service.clearCache();
+
+      //
+      begin();
+   }
+
+   protected void sync()
+   {
+      end();
+      begin();
+   }
+
+   protected void sync(boolean save)
+   {
+      end(save);
+      begin();
+   }
+
+   @Override
+   protected void end(boolean save)
+   {
+      if (save)
+      {
+         try
+         {
+            startService();
+            super.end(save);
+         }
+         finally
+         {
+            stopService();
+         }
+      }
+      else
+      {
+         super.end(save);
+      }
+   }
+
+   @Override
+   protected void tearDown() throws Exception
+   {
+      end();
+      super.tearDown();
+   }
+
+   private void startService()
+   {
+      try
+      {
+         begin();
+         end();
+      }
+      catch (Exception e)
+      {
+         AssertionFailedError afe = new AssertionFailedError();
+         afe.initCause(e);
+         throw afe;
+      }
+   }
+
+   private void stopService()
+   {
+      begin();
+      end();
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/Node.java
===================================================================
--- portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/Node.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/Node.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,245 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import junit.framework.Assert;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Represents a navigation node.
- *
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class Node
-{
-
-   /** . */
-   public static final NodeModel<Node> MODEL = new NodeModel<Node>()
-   {
-      public NodeContext<Node> getContext(Node node)
-      {
-         return node.context;
-      }
-
-      public Node create(NodeContext<Node> context)
-      {
-         return new Node(context);
-      }
-   };
-
-   /** . */
-   final NodeContext<Node> context;
-
-   Node(NodeContext<Node> context)
-   {
-      this.context = context;
-   }
-
-   public String getId()
-   {
-      return context.getId();
-   }
-
-   public String getName()
-   {
-      return context.getName();
-   }
-
-   public void setName(String name)
-   {
-      context.setName(name);
-   }
-
-   public NodeContext getContext()
-   {
-      return context;
-   }
-
-   public NodeState getState()
-   {
-      return context.getState();
-   }
-
-   public void setState(NodeState state)
-   {
-      context.setState(state);
-   }
-
-   public Node getParent()
-   {
-      return context.getParentNode();
-   }
-
-   public Collection<Node> getChildren()
-   {
-      return context.getNodes();
-   }
-
-   public Node getChild(String childName)
-   {
-      return context.getNode(childName);
-   }
-
-   public Node getChild(int childIndex)
-   {
-      return context.getNode(childIndex);
-   }
-
-   public void addChild(Node child)
-   {
-      context.add(null, child.context);
-   }
-
-   public void addChild(int index, Node child)
-   {
-      context.add(index, child.context);
-   }
-
-   public Node addChild(String childName)
-   {
-      return context.add(null, childName).node;
-   }
-
-   public Node addChild(int index, String childName)
-   {
-      return context.add(index, childName).node;
-   }
-
-   public boolean removeChild(String childName)
-   {
-      return context.removeNode(childName);
-   }
-
-   public int getNodeCount()
-   {
-      return context.getNodeCount();
-   }
-
-   public int getSize()
-   {
-      return context.getSize();
-   }
-
-   public void setHidden(boolean hidden)
-   {
-      context.setHidden(hidden);
-   }
-
-   public boolean isHidden()
-   {
-      return context.isHidden();
-   }
-
-   public void filter(NodeFilter filter)
-   {
-      context.filter(filter);
-   }
-
-   public void assertConsistent()
-   {
-      if (context.isExpanded())
-      {
-         List<String> a = new ArrayList<String>();
-         for (NodeContext<Node> b = context.getFirst();b != null;b = b.getNext()) {
-            Assert.assertNotNull(b.data);
-            a.add(b.data.getId());
-         }
-         List<String> b = Arrays.asList(context.data.children);
-         Assert.assertEquals(a, b);
-         for (NodeContext<Node> c = context.getFirst();c != null;c = c.getNext()) {
-            c.getNode().assertConsistent();
-         }
-      }
-   }
-
-   public void assertEquals(Node node) {
-
-      // First check state
-      if (context.data != null) {
-         Assert.assertNotNull(node.context.data);
-         Assert.assertEquals(context.data.id, node.context.data.id);
-         Assert.assertEquals(context.data.name, node.context.data.name);
-         Assert.assertEquals(context.data.state, node.context.data.state);
-         Assert.assertEquals(context.state, node.context.state);
-      } else {
-         Assert.assertNull(node.context.data);
-         Assert.assertEquals(context.getName(), node.context.getName());
-         Assert.assertEquals(context.state, node.context.state);
-      }
-
-      //
-      List<Node> nodes1 = new ArrayList<Node>();
-      for (NodeContext<Node> current = context.getFirst();current != null;current = current.getNext()) {
-         nodes1.add(current.getNode());
-      }
-
-      //
-      List<Node> nodes2 = new ArrayList<Node>();
-      for (NodeContext<Node> current = node.context.getFirst();current != null;current = current.getNext()) {
-         nodes2.add(current.getNode());
-      }
-
-      //
-      Assert.assertEquals("Was expecting to have the same children for node " + toString(1) + " " + node.toString(1), nodes1.size(), nodes2.size());
-
-      //
-      for (int i = 0;i < nodes1.size();i++) {
-         nodes1.get(i).assertEquals(nodes2.get(i));
-      }
-   }
-
-   public Iterator<NodeChange<Node>> update(NavigationService service, Scope scope) throws NavigationServiceException
-   {
-      NodeChangeQueue<Node> queue = new NodeChangeQueue<Node>();
-      service.updateNode(context, scope, new NodeContextChangeAdapter<Node>(queue));
-      return queue.iterator();
-   }
-
-   public Iterator<NodeChange<Node>> rebase(NavigationService service, Scope scope) throws NavigationServiceException
-   {
-      NodeChangeQueue<Node> queue = new NodeChangeQueue<Node>();
-      service.rebaseNode(context, scope, new NodeContextChangeAdapter<Node>(queue));
-      return queue.iterator();
-   }
-
-   public Iterator<NodeChange<Node>> save(NavigationService service) throws NavigationServiceException
-   {
-      NodeChangeQueue<Node> queue = new NodeChangeQueue<Node>();
-      service.saveNode(context, new NodeContextChangeAdapter<Node>(queue));
-      return queue.iterator();
-   }
-
-   @Override
-   public String toString()
-   {
-      return toString(1);
-   }
-
-   public String toString(int depth)
-   {
-      return context.toString(depth, new StringBuilder("Node[")).append("]").toString();
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/Node.java (from rev 6783, portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/Node.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/Node.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/Node.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import junit.framework.Assert;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Represents a navigation node.
+ *
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class Node
+{
+
+   /** . */
+   public static final NodeModel<Node> MODEL = new NodeModel<Node>()
+   {
+      public NodeContext<Node> getContext(Node node)
+      {
+         return node.context;
+      }
+
+      public Node create(NodeContext<Node> context)
+      {
+         return new Node(context);
+      }
+   };
+
+   /** . */
+   final NodeContext<Node> context;
+
+   Node(NodeContext<Node> context)
+   {
+      this.context = context;
+   }
+
+   public String getId()
+   {
+      return context.getId();
+   }
+
+   public String getName()
+   {
+      return context.getName();
+   }
+
+   public void setName(String name)
+   {
+      context.setName(name);
+   }
+
+   public NodeContext getContext()
+   {
+      return context;
+   }
+
+   public NodeState getState()
+   {
+      return context.getState();
+   }
+
+   public void setState(NodeState state)
+   {
+      context.setState(state);
+   }
+
+   public Node getParent()
+   {
+      return context.getParentNode();
+   }
+
+   public Collection<Node> getChildren()
+   {
+      return context.getNodes();
+   }
+
+   public Node getChild(String childName)
+   {
+      return context.getNode(childName);
+   }
+
+   public Node getChild(int childIndex)
+   {
+      return context.getNode(childIndex);
+   }
+
+   public void addChild(Node child)
+   {
+      context.add(null, child.context);
+   }
+
+   public void addChild(int index, Node child)
+   {
+      context.add(index, child.context);
+   }
+
+   public Node addChild(String childName)
+   {
+      return context.add(null, childName).node;
+   }
+
+   public Node addChild(int index, String childName)
+   {
+      return context.add(index, childName).node;
+   }
+
+   public boolean removeChild(String childName)
+   {
+      return context.removeNode(childName);
+   }
+
+   public int getNodeCount()
+   {
+      return context.getNodeCount();
+   }
+
+   public int getSize()
+   {
+      return context.getSize();
+   }
+
+   public void setHidden(boolean hidden)
+   {
+      context.setHidden(hidden);
+   }
+
+   public boolean isHidden()
+   {
+      return context.isHidden();
+   }
+
+   public void filter(NodeFilter filter)
+   {
+      context.filter(filter);
+   }
+
+   public void assertConsistent()
+   {
+      if (context.isExpanded())
+      {
+         List<String> a = new ArrayList<String>();
+         for (NodeContext<Node> b = context.getFirst();b != null;b = b.getNext()) {
+            Assert.assertNotNull(b.data);
+            a.add(b.data.getId());
+         }
+         List<String> b = Arrays.asList(context.data.children);
+         Assert.assertEquals(a, b);
+         for (NodeContext<Node> c = context.getFirst();c != null;c = c.getNext()) {
+            c.getNode().assertConsistent();
+         }
+      }
+   }
+
+   public void assertEquals(Node node) {
+
+      // First check state
+      if (context.data != null) {
+         Assert.assertNotNull(node.context.data);
+         Assert.assertEquals(context.data.id, node.context.data.id);
+         Assert.assertEquals(context.data.name, node.context.data.name);
+         Assert.assertEquals(context.data.state, node.context.data.state);
+         Assert.assertEquals(context.state, node.context.state);
+      } else {
+         Assert.assertNull(node.context.data);
+         Assert.assertEquals(context.getName(), node.context.getName());
+         Assert.assertEquals(context.state, node.context.state);
+      }
+
+      //
+      List<Node> nodes1 = new ArrayList<Node>();
+      for (NodeContext<Node> current = context.getFirst();current != null;current = current.getNext()) {
+         nodes1.add(current.getNode());
+      }
+
+      //
+      List<Node> nodes2 = new ArrayList<Node>();
+      for (NodeContext<Node> current = node.context.getFirst();current != null;current = current.getNext()) {
+         nodes2.add(current.getNode());
+      }
+
+      //
+      Assert.assertEquals("Was expecting to have the same children for node " + toString(1) + " " + node.toString(1), nodes1.size(), nodes2.size());
+
+      //
+      for (int i = 0;i < nodes1.size();i++) {
+         nodes1.get(i).assertEquals(nodes2.get(i));
+      }
+   }
+
+   public Iterator<NodeChange<Node>> update(NavigationService service, Scope scope) throws NavigationServiceException
+   {
+      NodeChangeQueue<Node> queue = new NodeChangeQueue<Node>();
+      service.updateNode(context, scope, new NodeContextChangeAdapter<Node>(queue));
+      return queue.iterator();
+   }
+
+   public Iterator<NodeChange<Node>> rebase(NavigationService service, Scope scope) throws NavigationServiceException
+   {
+      NodeChangeQueue<Node> queue = new NodeChangeQueue<Node>();
+      service.rebaseNode(context, scope, new NodeContextChangeAdapter<Node>(queue));
+      return queue.iterator();
+   }
+
+   public Iterator<NodeChange<Node>> save(NavigationService service) throws NavigationServiceException
+   {
+      NodeChangeQueue<Node> queue = new NodeChangeQueue<Node>();
+      service.saveNode(context, new NodeContextChangeAdapter<Node>(queue));
+      return queue.iterator();
+   }
+
+   @Override
+   public String toString()
+   {
+      return toString(1);
+   }
+
+   public String toString(int depth)
+   {
+      return context.toString(depth, new StringBuilder("Node[")).append("]").toString();
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationService.java
===================================================================
--- portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationService.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationService.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,803 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.mop.Described;
-import org.exoplatform.portal.mop.SiteKey;
-import org.exoplatform.portal.mop.Visibility;
-import org.exoplatform.portal.pom.data.MappedAttributes;
-import org.gatein.mop.api.workspace.Navigation;
-import org.gatein.mop.api.workspace.ObjectType;
-import org.gatein.mop.api.workspace.Site;
-import org.gatein.mop.core.api.MOPService;
-
-import javax.jcr.NodeIterator;
-import javax.jcr.Session;
-import java.util.Iterator;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class TestNavigationService extends AbstractTestNavigationService
-{
-
-   public void testNonExistingSite() throws Exception
-   {
-      assertNull(service.loadNavigation(SiteKey.portal("non_existing")));
-   }
-
-   public void testLoadSingleScope() throws Exception
-   {
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("classic"));
-      Node root = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
-      assertNull(root.getChildren());
-      assertEquals("default", root.getName());
-      try
-      {
-         root.getChild(0);
-         fail();
-      }
-      catch (IllegalStateException ignore)
-      {
-      }
-      try
-      {
-         root.addChild("a");
-         fail();
-      }
-      catch (IllegalStateException e)
-      {
-      }
-      try
-      {
-         root.addChild(0, "a");
-         fail();
-      }
-      catch (IllegalStateException e)
-      {
-      }
-      try
-      {
-         root.removeChild("a");
-         fail();
-      }
-      catch (IllegalStateException e)
-      {
-      }
-   }
-
-   public void testLoadChildrenScope() throws Exception
-   {
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("classic"));
-      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      assertEquals("default", root.getName());
-      Iterator<? extends Node> i = root.getChildren().iterator();
-      assertTrue(i.hasNext());
-      Node home = i.next();
-      assertSame(home, root.getChild(0));
-      assertNull(home.getChildren());
-      assertEquals("home", home.getName());
-      assertTrue(i.hasNext());
-      Node webexplorer = i.next();
-
-      assertNull(webexplorer.getChildren());
-
-      assertSame(webexplorer, root.getChild(1));
-      assertEquals("webexplorer", webexplorer.getName());
-      assertFalse(i.hasNext());
-   }
-
-   public void testLoadCustomScope() throws Exception
-   {
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("large"));
-      Node root = service.loadNode(Node.MODEL, nav, new Scope()
-      {
-         public Visitor get()
-         {
-            return new Visitor()
-            {
-               public VisitMode enter(int depth, String id, String name, NodeState state)
-               {
-                  boolean use = false;
-                  switch (depth)
-                  {
-                     case 0:
-                        use = "default".equals(name);
-                        break;
-                     case 1:
-                        use = "b".equals(name);
-                        break;
-                     case 2:
-                        use = "d".equals(name);
-                        break;
-                  }
-                  return use ? VisitMode.ALL_CHILDREN : VisitMode.NO_CHILDREN;
-               }
-               public void leave(int depth, String id, String name, NodeState state)
-               {
-               }
-            };
-         }
-      }, null).getNode();
-      assertNull(root.getChild("a").getChildren());
-      Node b = root.getChild("b");
-      Node d = b.getChild("d");
-      assertNull(d.getChild("e").getChildren());
-   }
-
-   public void testUpdateNode() throws Exception
-   {
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("large"));
-      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      Node a = root.getChild("a");
-      assertNotNull(a);
-      assertNull(a.getChildren());
-      a.update(service, Scope.CHILDREN);
-      assertNotNull(a.getChildren());
-      assertEquals(1, a.getChildren().size());
-      Node c = a.getChild("c");
-      assertEquals("c", c.getName());
-      assertSame(a, c.getParent());
-      service.updateNode(a.context, Scope.SINGLE, null);
-      assertNotNull(a.getChildren());
-      assertEquals(1, a.getChildren().size());
-      assertSame(c, a.getChild("c"));
-      assertNotNull(c.getParent());
-   }
-
-   public void testState() throws Exception
-   {
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("test"));
-      Node root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-      assertEquals(5, root.getNodeCount());
-      Node child1 = root.getChild("node_name");
-      Node child2 = root.getChild("node_name4");
-      assertEquals("node_name", child1.getName());
-      assertEquals("node_label", child1.getContext().getState().getLabel());
-      assertEquals("portal::test::test1", child1.getContext().getState().getPageRef());
-      assertEquals(Visibility.TEMPORAL, child1.getContext().getState().getVisibility());
-      assertEquals(953602380000L, child1.getContext().getState().getStartPublicationTime());
-      assertEquals(1237599180000L, child1.getContext().getState().getEndPublicationTime());
-      assertEquals("node_name4", child2.getName());
-      assertEquals("node_label4", child2.getContext().getState().getLabel());
-      assertEquals("portal::test::test1", child2.getContext().getState().getPageRef());
-      assertEquals(Visibility.DISPLAYED, child2.getContext().getState().getVisibility());
-   }
-
-   public void testDepth() throws Exception
-   {
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("test"));
-      Node root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-      Node child1 = root.getChild("node_name");
-      assertEquals(0, child1.context.getDepth(child1.context));
-      assertEquals(1, child1.context.getDepth(root.context));
-      try
-      {
-         root.context.getDepth(child1.context);
-         fail();
-      }
-      catch (IllegalArgumentException e)
-      {
-      }
-   }
-
-   public void testHiddenNode() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "hidden_node");
-      Navigation defaultNav = portal.getRootNavigation().addChild("default");
-      defaultNav.addChild("a");
-      defaultNav.addChild("b");
-      defaultNav.addChild("c");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("hidden_node"));
-
-      //
-      Node root;
-      Node a;
-      Node b;
-      Node c;
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.GRANDCHILDREN, null).getNode();
-      a = root.getChild("a");
-      b = root.getChild("b");
-      a.setHidden(true);
-      assertEquals(2, root.getChildren().size());
-      assertNull(root.getChild("a"));
-      assertEquals("b", root.getChild(0).getName());
-      try
-      {
-         root.getChild(2);
-         fail();
-      }
-      catch (IndexOutOfBoundsException ignore)
-      {
-      }
-      assertFalse(root.removeChild("a"));
-      try
-      {
-         b.setName("a");
-         fail();
-      }
-      catch (IllegalArgumentException ignore)
-      {
-      }
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      a = root.getChild("a");
-      b = root.getChild("b");
-      c = root.getChild("c");
-      b.setHidden(true);
-      assertSame(a, root.getChild(0));
-      assertSame(c, root.getChild(1));
-      try
-      {
-         root.getChild(2);
-         fail();
-      }
-      catch (IndexOutOfBoundsException e)
-      {
-      }
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      a = root.getChild("a");
-      b = root.getChild("b");
-      c = root.getChild("c");
-      a.setHidden(true);
-      c.setHidden(true);
-      assertSame(b, root.getChild(0));
-      try
-      {
-         root.getChild(1);
-         fail();
-      }
-      catch (IndexOutOfBoundsException e)
-      {
-      }
-   }
-
-   public void testHiddenInsert1() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "hidden_insert_1");
-      Navigation defaultNav = portal.getRootNavigation().addChild("default");
-      defaultNav.addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("hidden_insert_1"));
-
-      //
-      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      Node a = root.getChild("a");
-      a.setHidden(true);
-      Node b = root.addChild("b");
-      assertEquals(1, root.getChildren().size());
-      assertSame(b, root.getChildren().iterator().next());
-      a.setHidden(false);
-      assertEquals(2, root.getChildren().size());
-      Iterator<Node> it = root.getChildren().iterator();
-      assertSame(b, it.next());
-      assertSame(a, it.next());
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      a = root.getChild("a");
-      a.setHidden(true);
-      b = root.addChild(0, "b");
-      assertEquals(1, root.getChildren().size());
-      assertSame(b, root.getChildren().iterator().next());
-      a.setHidden(false);
-      assertEquals(2, root.getChildren().size());
-      it = root.getChildren().iterator();
-      assertSame(b, it.next());
-      assertSame(a, it.next());
-   }
-
-   public void testHiddenInsert2() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "hidden_insert_2");
-      Navigation defaultNav = portal.getRootNavigation().addChild("default");
-      defaultNav.addChild("a");
-      defaultNav.addChild("b");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("hidden_insert_2"));
-
-      //
-      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      Node a = root.getChild("a");
-      Node b = root.getChild("b");
-      b.setHidden(true);
-      Node c = root.addChild(0, "c");
-      assertEquals(2, root.getChildren().size());
-      Iterator<Node> it = root.getChildren().iterator();
-      assertSame(c, it.next());
-      assertSame(a, it.next());
-      b.setHidden(false);
-      assertEquals(3, root.getChildren().size());
-      it = root.getChildren().iterator();
-      assertSame(c, it.next());
-      assertSame(a, it.next());
-      assertSame(b, it.next());
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      a = root.getChild("a");
-      b = root.getChild("b");
-      b.setHidden(true);
-      c = root.addChild(1, "c");
-      assertEquals(2, root.getChildren().size());
-      it = root.getChildren().iterator();
-      assertSame(a, it.next());
-      assertSame(c, it.next());
-      b.setHidden(false);
-      assertEquals(3, root.getChildren().size());
-      it = root.getChildren().iterator();
-      assertSame(a, it.next());
-      assertSame(c, it.next());
-      assertSame(b, it.next());
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      a = root.getChild("a");
-      b = root.getChild("b");
-      b.setHidden(true);
-      c = root.addChild("c");
-      assertEquals(2, root.getChildren().size());
-      it = root.getChildren().iterator();
-      assertSame(a, it.next());
-      assertSame(c, it.next());
-      b.setHidden(false);
-      assertEquals(3, root.getChildren().size());
-      it = root.getChildren().iterator();
-      assertSame(a, it.next());
-      assertSame(c, it.next());
-      assertSame(b, it.next());
-   }
-
-   public void testHiddenInsert3() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "hidden_insert_3");
-      Navigation defaultNav = portal.getRootNavigation().addChild("default");
-      defaultNav.addChild("a");
-      defaultNav.addChild("b");
-      defaultNav.addChild("c");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("hidden_insert_3"));
-
-      //
-      Node root,a,b,c,d;
-      Iterator<Node> it;
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      a = root.getChild("a");
-      b = root.getChild("b");
-      c = root.getChild("c");
-      b.setHidden(true);
-      d = root.addChild(0, "d");
-      assertEquals(3, root.getChildren().size());
-      it = root.getChildren().iterator();
-      assertSame(d, it.next());
-      assertSame(a, it.next());
-      assertSame(c, it.next());
-      b.setHidden(false);
-      assertEquals(4, root.getChildren().size());
-      it = root.getChildren().iterator();
-      assertSame(d, it.next());
-      assertSame(a, it.next());
-      assertSame(b, it.next());
-      assertSame(c, it.next());
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      a = root.getChild("a");
-      b = root.getChild("b");
-      c = root.getChild("c");
-      b.setHidden(true);
-      d = root.addChild(1, "d");
-      assertEquals(3, root.getChildren().size());
-      it = root.getChildren().iterator();
-      assertSame(a, it.next());
-      assertSame(d, it.next());
-      assertSame(c, it.next());
-      b.setHidden(false);
-      assertEquals(4, root.getChildren().size());
-      it = root.getChildren().iterator();
-      assertSame(a, it.next());
-      assertSame(d, it.next());
-      assertSame(b, it.next());
-      assertSame(c, it.next());
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      a = root.getChild("a");
-      b = root.getChild("b");
-      c = root.getChild("c");
-      b.setHidden(true);
-      d = root.addChild(2, "d");
-      assertEquals(3, root.getChildren().size());
-      it = root.getChildren().iterator();
-      assertSame(a, it.next());
-      assertSame(c, it.next());
-      assertSame(d, it.next());
-      b.setHidden(false);
-      assertEquals(4, root.getChildren().size());
-      it = root.getChildren().iterator();
-      assertSame(a, it.next());
-      assertSame(b, it.next());
-      assertSame(c, it.next());
-      assertSame(d, it.next());
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      a = root.getChild("a");
-      b = root.getChild("b");
-      c = root.getChild("c");
-      b.setHidden(true);
-      d = root.addChild("d");
-      assertEquals(3, root.getChildren().size());
-      it = root.getChildren().iterator();
-      assertSame(a, it.next());
-      assertSame(c, it.next());
-      assertSame(d, it.next());
-      b.setHidden(false);
-      assertEquals(4, root.getChildren().size());
-      it = root.getChildren().iterator();
-      assertSame(a, it.next());
-      assertSame(b, it.next());
-      assertSame(c, it.next());
-      assertSame(d, it.next());
-   }
-
-   public void _testNodeInvalidationByRemoval() throws Exception
-   {
-      //
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "invalidation_by_removal");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("invalidation_by_removal"));
-      Node root = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
-      assertNotNull(root);
-
-      //
-      sync();
-
-      //
-      mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_removal").getRootNavigation().getChild("default").destroy();
-
-      //
-      sync(true);
-
-      //
-      NodeContext<Node> rootCtx = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null);
-      assertNull(rootCtx);
-   }
-
-   public void _testNodeInvalidationByChild() throws Exception
-   {
-      // Create a navigation
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "invalidation_by_child");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      // Put the navigation in the cache
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("invalidation_by_child"));
-      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      Iterator<? extends Node> iterator = root.getChildren().iterator();
-      assertFalse(iterator.hasNext());
-
-      //
-      sync();
-
-      //
-      mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_child").getRootNavigation().getChild("default").addChild("new");
-
-      //
-      sync(true);
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      iterator = root.getChildren().iterator();
-      iterator.next();
-      assertFalse(iterator.hasNext());
-
-      //
-      sync();
-
-      //
-      mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_child").getRootNavigation().getChild("default").getChild("new").destroy();
-
-      //
-      sync(true);
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      iterator = root.getChildren().iterator();
-      assertFalse(iterator.hasNext());
-   }
-
-   public void _testNodeInvalidationByProperty() throws Exception
-   {
-      // Create a navigation
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "invalidation_by_propertychange");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("invalidation_by_propertychange"));
-      Node defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
-      assertNull(defaultNode.getContext().getState().getLabel());
-
-      //
-      sync();
-
-      //
-      Described defaultDescribed = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_propertychange").getRootNavigation().getChild("default").adapt(Described.class);
-      defaultDescribed.setName("bilto");
-
-      //
-      sync(true);
-
-      //
-      defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
-      assertEquals("bilto", defaultNode.getContext().getState().getLabel());
-
-      //
-      sync();
-
-      //
-      defaultDescribed = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_propertychange").getRootNavigation().getChild("default").adapt(Described.class);
-      defaultDescribed.setName("bilta");
-
-      //
-      sync(true);
-
-      //
-      defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
-      assertEquals("bilta", defaultNode.getContext().getState().getLabel());
-
-      //
-      sync();
-
-      //
-      defaultDescribed = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_propertychange").getRootNavigation().getChild("default").adapt(Described.class);
-      defaultDescribed.setName(null);
-
-      //
-      sync(true);
-
-      //
-      defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
-      assertNull(defaultNode.getContext().getState().getLabel());
-   }
-
-   public void _testNodeInvalidationByAttribute() throws Exception
-   {
-      //
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "invalidation_by_attribute");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("invalidation_by_attribute"));
-      Node defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
-
-      //
-      sync();
-
-      //
-      mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_attribute").getRootNavigation().getChild("default").getAttributes().setValue(MappedAttributes.URI, "foo_uri");
-
-      //
-      sync(true);
-
-      //
-      defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
-
-      //
-      sync();
-
-      //
-      mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_attribute").getRootNavigation().getChild("default").getAttributes().setValue(MappedAttributes.URI, "bar_uri");
-
-      //
-      sync(true);
-
-      //
-      defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
-
-      //
-      sync();
-
-      //
-      mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_attribute").getRootNavigation().getChild("default").getAttributes().setValue(MappedAttributes.URI, null);
-
-      //
-      sync(true);
-
-      //
-      defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
-   }
-
-   public void _testWeirdBug() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "reorder_child_2");
-      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
-      rootNavigation.addChild("foo");
-      rootNavigation.addChild("bar");
-      rootNavigation.addChild("juu");
-
-      //
-      sync(true);
-
-      //
-      portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2");
-      rootNavigation = portal.getRootNavigation().getChild("default");
-      rootNavigation.getChild("bar").destroy();
-
-      //
-      sync(true);
-
-      //
-      portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2");
-      rootNavigation = portal.getRootNavigation().getChild("default");
-      rootNavigation.addChild("daa");
-
-      //
-      sync(true);
-
-      //
-      portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2");
-      rootNavigation = portal.getRootNavigation().getChild("default");
-      Navigation daa = rootNavigation.getChildren().get(2);
-      assertEquals("daa", daa.getName());
-   }
-
-   public void _testWeirdBug2() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Session session = mop.getModel().getSession().getJCRSession();
-      javax.jcr.Node container = session.getRootNode().
-         getNode("mop:workspace/mop:portalsites").
-         addNode("mop:reorder_child_2").
-         getNode("mop:rootnavigation/mop:children").
-         addNode("mop:default").
-         getNode("mop:children");
-      container.addNode("mop:foo");
-      container.addNode("mop:bar");
-      container.addNode("mop:juu");
-
-      //
-      sync(true);
-
-      //
-      session = mop.getModel().getSession().getJCRSession();
-      container = session.getRootNode().getNode("mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children");
-      container.getNode("mop:bar").remove();
-
-      //
-      sync(true);
-
-      //
-      session = mop.getModel().getSession().getJCRSession();
-      container = session.getRootNode().getNode("mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children");
-      container.addNode("mop:daa");
-      container.orderBefore("mop:daa", null);
-
-      //
-      sync(true);
-
-      //
-      container = session.getRootNode().getNode("mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children");
-      NodeIterator it = container.getNodes();
-      assertEquals("mop:foo", it.nextNode().getName());
-      assertEquals("mop:juu", it.nextNode().getName());
-      assertEquals("mop:daa", it.nextNode().getName());
-      assertFalse(it.hasNext());
-   }
-
-   public void testCount()
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "count");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("count"));
-      Node root;
-
-      //
-      root = service.loadNode(Node.MODEL, navigation, Scope.SINGLE, null).getNode();
-      assertEquals(0, root.getNodeCount());
-//      assertEquals(-1, root.getSize());
-
-      //
-      root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-      assertEquals(0, root.getNodeCount());
-      assertEquals(0, root.getSize());
-      Node a = root.addChild("a");
-      assertEquals(1, root.getNodeCount());
-      assertEquals(1, root.getSize());
-      a.setHidden(true);
-      assertEquals(0, root.getNodeCount());
-      assertEquals(1, root.getSize());
-   }
-
-   public void testInsertDuplicate()
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "insert_duplicate");
-      portal.getRootNavigation().addChild("default").addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("insert_duplicate"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-      try
-      {
-         root.addChild("a");
-         fail();
-      }
-      catch (IllegalArgumentException e)
-      {
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationService.java (from rev 6783, portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationService.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationService.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationService.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,803 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.mop.Described;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.pom.data.MappedAttributes;
+import org.gatein.mop.api.workspace.Navigation;
+import org.gatein.mop.api.workspace.ObjectType;
+import org.gatein.mop.api.workspace.Site;
+import org.gatein.mop.core.api.MOPService;
+
+import javax.jcr.NodeIterator;
+import javax.jcr.Session;
+import java.util.Iterator;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class TestNavigationService extends AbstractTestNavigationService
+{
+
+   public void testNonExistingSite() throws Exception
+   {
+      assertNull(service.loadNavigation(SiteKey.portal("non_existing")));
+   }
+
+   public void testLoadSingleScope() throws Exception
+   {
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("classic"));
+      Node root = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
+      assertNull(root.getChildren());
+      assertEquals("default", root.getName());
+      try
+      {
+         root.getChild(0);
+         fail();
+      }
+      catch (IllegalStateException ignore)
+      {
+      }
+      try
+      {
+         root.addChild("a");
+         fail();
+      }
+      catch (IllegalStateException e)
+      {
+      }
+      try
+      {
+         root.addChild(0, "a");
+         fail();
+      }
+      catch (IllegalStateException e)
+      {
+      }
+      try
+      {
+         root.removeChild("a");
+         fail();
+      }
+      catch (IllegalStateException e)
+      {
+      }
+   }
+
+   public void testLoadChildrenScope() throws Exception
+   {
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("classic"));
+      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      assertEquals("default", root.getName());
+      Iterator<? extends Node> i = root.getChildren().iterator();
+      assertTrue(i.hasNext());
+      Node home = i.next();
+      assertSame(home, root.getChild(0));
+      assertNull(home.getChildren());
+      assertEquals("home", home.getName());
+      assertTrue(i.hasNext());
+      Node webexplorer = i.next();
+
+      assertNull(webexplorer.getChildren());
+
+      assertSame(webexplorer, root.getChild(1));
+      assertEquals("webexplorer", webexplorer.getName());
+      assertFalse(i.hasNext());
+   }
+
+   public void testLoadCustomScope() throws Exception
+   {
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("large"));
+      Node root = service.loadNode(Node.MODEL, nav, new Scope()
+      {
+         public Visitor get()
+         {
+            return new Visitor()
+            {
+               public VisitMode enter(int depth, String id, String name, NodeState state)
+               {
+                  boolean use = false;
+                  switch (depth)
+                  {
+                     case 0:
+                        use = "default".equals(name);
+                        break;
+                     case 1:
+                        use = "b".equals(name);
+                        break;
+                     case 2:
+                        use = "d".equals(name);
+                        break;
+                  }
+                  return use ? VisitMode.ALL_CHILDREN : VisitMode.NO_CHILDREN;
+               }
+               public void leave(int depth, String id, String name, NodeState state)
+               {
+               }
+            };
+         }
+      }, null).getNode();
+      assertNull(root.getChild("a").getChildren());
+      Node b = root.getChild("b");
+      Node d = b.getChild("d");
+      assertNull(d.getChild("e").getChildren());
+   }
+
+   public void testUpdateNode() throws Exception
+   {
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("large"));
+      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      Node a = root.getChild("a");
+      assertNotNull(a);
+      assertNull(a.getChildren());
+      a.update(service, Scope.CHILDREN);
+      assertNotNull(a.getChildren());
+      assertEquals(1, a.getChildren().size());
+      Node c = a.getChild("c");
+      assertEquals("c", c.getName());
+      assertSame(a, c.getParent());
+      service.updateNode(a.context, Scope.SINGLE, null);
+      assertNotNull(a.getChildren());
+      assertEquals(1, a.getChildren().size());
+      assertSame(c, a.getChild("c"));
+      assertNotNull(c.getParent());
+   }
+
+   public void testState() throws Exception
+   {
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("test"));
+      Node root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+      assertEquals(5, root.getNodeCount());
+      Node child1 = root.getChild("node_name");
+      Node child2 = root.getChild("node_name4");
+      assertEquals("node_name", child1.getName());
+      assertEquals("node_label", child1.getContext().getState().getLabel());
+      assertEquals("portal::test::test1", child1.getContext().getState().getPageRef());
+      assertEquals(Visibility.TEMPORAL, child1.getContext().getState().getVisibility());
+      assertEquals(953602380000L, child1.getContext().getState().getStartPublicationTime());
+      assertEquals(1237599180000L, child1.getContext().getState().getEndPublicationTime());
+      assertEquals("node_name4", child2.getName());
+      assertEquals("node_label4", child2.getContext().getState().getLabel());
+      assertEquals("portal::test::test1", child2.getContext().getState().getPageRef());
+      assertEquals(Visibility.DISPLAYED, child2.getContext().getState().getVisibility());
+   }
+
+   public void testDepth() throws Exception
+   {
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("test"));
+      Node root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+      Node child1 = root.getChild("node_name");
+      assertEquals(0, child1.context.getDepth(child1.context));
+      assertEquals(1, child1.context.getDepth(root.context));
+      try
+      {
+         root.context.getDepth(child1.context);
+         fail();
+      }
+      catch (IllegalArgumentException e)
+      {
+      }
+   }
+
+   public void testHiddenNode() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "hidden_node");
+      Navigation defaultNav = portal.getRootNavigation().addChild("default");
+      defaultNav.addChild("a");
+      defaultNav.addChild("b");
+      defaultNav.addChild("c");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("hidden_node"));
+
+      //
+      Node root;
+      Node a;
+      Node b;
+      Node c;
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.GRANDCHILDREN, null).getNode();
+      a = root.getChild("a");
+      b = root.getChild("b");
+      a.setHidden(true);
+      assertEquals(2, root.getChildren().size());
+      assertNull(root.getChild("a"));
+      assertEquals("b", root.getChild(0).getName());
+      try
+      {
+         root.getChild(2);
+         fail();
+      }
+      catch (IndexOutOfBoundsException ignore)
+      {
+      }
+      assertFalse(root.removeChild("a"));
+      try
+      {
+         b.setName("a");
+         fail();
+      }
+      catch (IllegalArgumentException ignore)
+      {
+      }
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      a = root.getChild("a");
+      b = root.getChild("b");
+      c = root.getChild("c");
+      b.setHidden(true);
+      assertSame(a, root.getChild(0));
+      assertSame(c, root.getChild(1));
+      try
+      {
+         root.getChild(2);
+         fail();
+      }
+      catch (IndexOutOfBoundsException e)
+      {
+      }
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      a = root.getChild("a");
+      b = root.getChild("b");
+      c = root.getChild("c");
+      a.setHidden(true);
+      c.setHidden(true);
+      assertSame(b, root.getChild(0));
+      try
+      {
+         root.getChild(1);
+         fail();
+      }
+      catch (IndexOutOfBoundsException e)
+      {
+      }
+   }
+
+   public void testHiddenInsert1() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "hidden_insert_1");
+      Navigation defaultNav = portal.getRootNavigation().addChild("default");
+      defaultNav.addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("hidden_insert_1"));
+
+      //
+      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      Node a = root.getChild("a");
+      a.setHidden(true);
+      Node b = root.addChild("b");
+      assertEquals(1, root.getChildren().size());
+      assertSame(b, root.getChildren().iterator().next());
+      a.setHidden(false);
+      assertEquals(2, root.getChildren().size());
+      Iterator<Node> it = root.getChildren().iterator();
+      assertSame(b, it.next());
+      assertSame(a, it.next());
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      a = root.getChild("a");
+      a.setHidden(true);
+      b = root.addChild(0, "b");
+      assertEquals(1, root.getChildren().size());
+      assertSame(b, root.getChildren().iterator().next());
+      a.setHidden(false);
+      assertEquals(2, root.getChildren().size());
+      it = root.getChildren().iterator();
+      assertSame(b, it.next());
+      assertSame(a, it.next());
+   }
+
+   public void testHiddenInsert2() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "hidden_insert_2");
+      Navigation defaultNav = portal.getRootNavigation().addChild("default");
+      defaultNav.addChild("a");
+      defaultNav.addChild("b");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("hidden_insert_2"));
+
+      //
+      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      Node a = root.getChild("a");
+      Node b = root.getChild("b");
+      b.setHidden(true);
+      Node c = root.addChild(0, "c");
+      assertEquals(2, root.getChildren().size());
+      Iterator<Node> it = root.getChildren().iterator();
+      assertSame(c, it.next());
+      assertSame(a, it.next());
+      b.setHidden(false);
+      assertEquals(3, root.getChildren().size());
+      it = root.getChildren().iterator();
+      assertSame(c, it.next());
+      assertSame(a, it.next());
+      assertSame(b, it.next());
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      a = root.getChild("a");
+      b = root.getChild("b");
+      b.setHidden(true);
+      c = root.addChild(1, "c");
+      assertEquals(2, root.getChildren().size());
+      it = root.getChildren().iterator();
+      assertSame(a, it.next());
+      assertSame(c, it.next());
+      b.setHidden(false);
+      assertEquals(3, root.getChildren().size());
+      it = root.getChildren().iterator();
+      assertSame(a, it.next());
+      assertSame(c, it.next());
+      assertSame(b, it.next());
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      a = root.getChild("a");
+      b = root.getChild("b");
+      b.setHidden(true);
+      c = root.addChild("c");
+      assertEquals(2, root.getChildren().size());
+      it = root.getChildren().iterator();
+      assertSame(a, it.next());
+      assertSame(c, it.next());
+      b.setHidden(false);
+      assertEquals(3, root.getChildren().size());
+      it = root.getChildren().iterator();
+      assertSame(a, it.next());
+      assertSame(c, it.next());
+      assertSame(b, it.next());
+   }
+
+   public void testHiddenInsert3() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "hidden_insert_3");
+      Navigation defaultNav = portal.getRootNavigation().addChild("default");
+      defaultNav.addChild("a");
+      defaultNav.addChild("b");
+      defaultNav.addChild("c");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("hidden_insert_3"));
+
+      //
+      Node root,a,b,c,d;
+      Iterator<Node> it;
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      a = root.getChild("a");
+      b = root.getChild("b");
+      c = root.getChild("c");
+      b.setHidden(true);
+      d = root.addChild(0, "d");
+      assertEquals(3, root.getChildren().size());
+      it = root.getChildren().iterator();
+      assertSame(d, it.next());
+      assertSame(a, it.next());
+      assertSame(c, it.next());
+      b.setHidden(false);
+      assertEquals(4, root.getChildren().size());
+      it = root.getChildren().iterator();
+      assertSame(d, it.next());
+      assertSame(a, it.next());
+      assertSame(b, it.next());
+      assertSame(c, it.next());
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      a = root.getChild("a");
+      b = root.getChild("b");
+      c = root.getChild("c");
+      b.setHidden(true);
+      d = root.addChild(1, "d");
+      assertEquals(3, root.getChildren().size());
+      it = root.getChildren().iterator();
+      assertSame(a, it.next());
+      assertSame(d, it.next());
+      assertSame(c, it.next());
+      b.setHidden(false);
+      assertEquals(4, root.getChildren().size());
+      it = root.getChildren().iterator();
+      assertSame(a, it.next());
+      assertSame(d, it.next());
+      assertSame(b, it.next());
+      assertSame(c, it.next());
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      a = root.getChild("a");
+      b = root.getChild("b");
+      c = root.getChild("c");
+      b.setHidden(true);
+      d = root.addChild(2, "d");
+      assertEquals(3, root.getChildren().size());
+      it = root.getChildren().iterator();
+      assertSame(a, it.next());
+      assertSame(c, it.next());
+      assertSame(d, it.next());
+      b.setHidden(false);
+      assertEquals(4, root.getChildren().size());
+      it = root.getChildren().iterator();
+      assertSame(a, it.next());
+      assertSame(b, it.next());
+      assertSame(c, it.next());
+      assertSame(d, it.next());
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      a = root.getChild("a");
+      b = root.getChild("b");
+      c = root.getChild("c");
+      b.setHidden(true);
+      d = root.addChild("d");
+      assertEquals(3, root.getChildren().size());
+      it = root.getChildren().iterator();
+      assertSame(a, it.next());
+      assertSame(c, it.next());
+      assertSame(d, it.next());
+      b.setHidden(false);
+      assertEquals(4, root.getChildren().size());
+      it = root.getChildren().iterator();
+      assertSame(a, it.next());
+      assertSame(b, it.next());
+      assertSame(c, it.next());
+      assertSame(d, it.next());
+   }
+
+   public void _testNodeInvalidationByRemoval() throws Exception
+   {
+      //
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "invalidation_by_removal");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("invalidation_by_removal"));
+      Node root = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
+      assertNotNull(root);
+
+      //
+      sync();
+
+      //
+      mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_removal").getRootNavigation().getChild("default").destroy();
+
+      //
+      sync(true);
+
+      //
+      NodeContext<Node> rootCtx = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null);
+      assertNull(rootCtx);
+   }
+
+   public void _testNodeInvalidationByChild() throws Exception
+   {
+      // Create a navigation
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "invalidation_by_child");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      // Put the navigation in the cache
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("invalidation_by_child"));
+      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      Iterator<? extends Node> iterator = root.getChildren().iterator();
+      assertFalse(iterator.hasNext());
+
+      //
+      sync();
+
+      //
+      mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_child").getRootNavigation().getChild("default").addChild("new");
+
+      //
+      sync(true);
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      iterator = root.getChildren().iterator();
+      iterator.next();
+      assertFalse(iterator.hasNext());
+
+      //
+      sync();
+
+      //
+      mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_child").getRootNavigation().getChild("default").getChild("new").destroy();
+
+      //
+      sync(true);
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      iterator = root.getChildren().iterator();
+      assertFalse(iterator.hasNext());
+   }
+
+   public void _testNodeInvalidationByProperty() throws Exception
+   {
+      // Create a navigation
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "invalidation_by_propertychange");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("invalidation_by_propertychange"));
+      Node defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
+      assertNull(defaultNode.getContext().getState().getLabel());
+
+      //
+      sync();
+
+      //
+      Described defaultDescribed = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_propertychange").getRootNavigation().getChild("default").adapt(Described.class);
+      defaultDescribed.setName("bilto");
+
+      //
+      sync(true);
+
+      //
+      defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
+      assertEquals("bilto", defaultNode.getContext().getState().getLabel());
+
+      //
+      sync();
+
+      //
+      defaultDescribed = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_propertychange").getRootNavigation().getChild("default").adapt(Described.class);
+      defaultDescribed.setName("bilta");
+
+      //
+      sync(true);
+
+      //
+      defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
+      assertEquals("bilta", defaultNode.getContext().getState().getLabel());
+
+      //
+      sync();
+
+      //
+      defaultDescribed = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_propertychange").getRootNavigation().getChild("default").adapt(Described.class);
+      defaultDescribed.setName(null);
+
+      //
+      sync(true);
+
+      //
+      defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
+      assertNull(defaultNode.getContext().getState().getLabel());
+   }
+
+   public void _testNodeInvalidationByAttribute() throws Exception
+   {
+      //
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "invalidation_by_attribute");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("invalidation_by_attribute"));
+      Node defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
+
+      //
+      sync();
+
+      //
+      mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_attribute").getRootNavigation().getChild("default").getAttributes().setValue(MappedAttributes.URI, "foo_uri");
+
+      //
+      sync(true);
+
+      //
+      defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
+
+      //
+      sync();
+
+      //
+      mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_attribute").getRootNavigation().getChild("default").getAttributes().setValue(MappedAttributes.URI, "bar_uri");
+
+      //
+      sync(true);
+
+      //
+      defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
+
+      //
+      sync();
+
+      //
+      mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "invalidation_by_attribute").getRootNavigation().getChild("default").getAttributes().setValue(MappedAttributes.URI, null);
+
+      //
+      sync(true);
+
+      //
+      defaultNode = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
+   }
+
+   public void _testWeirdBug() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "reorder_child_2");
+      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
+      rootNavigation.addChild("foo");
+      rootNavigation.addChild("bar");
+      rootNavigation.addChild("juu");
+
+      //
+      sync(true);
+
+      //
+      portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2");
+      rootNavigation = portal.getRootNavigation().getChild("default");
+      rootNavigation.getChild("bar").destroy();
+
+      //
+      sync(true);
+
+      //
+      portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2");
+      rootNavigation = portal.getRootNavigation().getChild("default");
+      rootNavigation.addChild("daa");
+
+      //
+      sync(true);
+
+      //
+      portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2");
+      rootNavigation = portal.getRootNavigation().getChild("default");
+      Navigation daa = rootNavigation.getChildren().get(2);
+      assertEquals("daa", daa.getName());
+   }
+
+   public void _testWeirdBug2() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Session session = mop.getModel().getSession().getJCRSession();
+      javax.jcr.Node container = session.getRootNode().
+         getNode("mop:workspace/mop:portalsites").
+         addNode("mop:reorder_child_2").
+         getNode("mop:rootnavigation/mop:children").
+         addNode("mop:default").
+         getNode("mop:children");
+      container.addNode("mop:foo");
+      container.addNode("mop:bar");
+      container.addNode("mop:juu");
+
+      //
+      sync(true);
+
+      //
+      session = mop.getModel().getSession().getJCRSession();
+      container = session.getRootNode().getNode("mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children");
+      container.getNode("mop:bar").remove();
+
+      //
+      sync(true);
+
+      //
+      session = mop.getModel().getSession().getJCRSession();
+      container = session.getRootNode().getNode("mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children");
+      container.addNode("mop:daa");
+      container.orderBefore("mop:daa", null);
+
+      //
+      sync(true);
+
+      //
+      container = session.getRootNode().getNode("mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children");
+      NodeIterator it = container.getNodes();
+      assertEquals("mop:foo", it.nextNode().getName());
+      assertEquals("mop:juu", it.nextNode().getName());
+      assertEquals("mop:daa", it.nextNode().getName());
+      assertFalse(it.hasNext());
+   }
+
+   public void testCount()
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "count");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("count"));
+      Node root;
+
+      //
+      root = service.loadNode(Node.MODEL, navigation, Scope.SINGLE, null).getNode();
+      assertEquals(0, root.getNodeCount());
+//      assertEquals(-1, root.getSize());
+
+      //
+      root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+      assertEquals(0, root.getNodeCount());
+      assertEquals(0, root.getSize());
+      Node a = root.addChild("a");
+      assertEquals(1, root.getNodeCount());
+      assertEquals(1, root.getSize());
+      a.setHidden(true);
+      assertEquals(0, root.getNodeCount());
+      assertEquals(1, root.getSize());
+   }
+
+   public void testInsertDuplicate()
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "insert_duplicate");
+      portal.getRootNavigation().addChild("default").addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("insert_duplicate"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+      try
+      {
+         root.addChild("a");
+         fail();
+      }
+      catch (IllegalArgumentException e)
+      {
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceRebase.java
===================================================================
--- portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceRebase.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceRebase.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,414 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.mop.SiteKey;
-import org.gatein.mop.api.workspace.Navigation;
-import org.gatein.mop.api.workspace.ObjectType;
-import org.gatein.mop.api.workspace.Site;
-import org.gatein.mop.core.api.MOPService;
-
-import java.util.Iterator;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class TestNavigationServiceRebase extends AbstractTestNavigationService
-{
-
-   public void testRebase1() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase1");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a");
-      def.addChild("d");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase1"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      Node a = root1.getChild("a");
-      Node d = root1.getChild("d");
-      Node b = root1.addChild(1, "b");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      Node c2 = root2.addChild(1, "c");
-      service.saveNode(root2.context, null);
-      sync(true);
-
-      //
-      service.rebaseNode(root1.context, null, null);
-      assertEquals(4, root1.getNodeCount());
-      assertSame(a, root1.getChild(0));
-      assertSame(b, root1.getChild(1));
-      Node c1 = root1.getChild(2);
-      assertEquals("c", c1.getName());
-      assertEquals(c2.getId(), c1.getId());
-      assertSame(d, root1.getChild(3));
-
-   }
-
-   public void testRebase2() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase2");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a");
-      def.addChild("b");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase2"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      Node a = root1.getChild("a");
-      Node b = root1.getChild("b");
-      Node c = a.addChild("c");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      root2.getChild("b").addChild(root2.getChild("a"));
-      service.saveNode(root2.context, null);
-      sync(true);
-
-      //
-      service.rebaseNode(root1.context, null, null);
-      assertEquals(null, root1.getChild("a"));
-      assertSame(b, root1.getChild("b"));
-      assertEquals(root1, b.getParent());
-      assertSame(a, b.getChild("a"));
-      assertEquals(b, a.getParent());
-      assertSame(c, a.getChild("c"));
-      assertEquals(a, c.getParent());
-   }
-
-   public void testRebase3() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase3");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a");
-      def.addChild("b");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase3"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      root.getChild("a").addChild("foo");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      root2.removeChild("a");
-      service.saveNode(root2.context, null);
-      sync(true);
-
-      //
-      try
-      {
-         service.rebaseNode(root.context, null, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.ADD_CONCURRENTLY_REMOVED_PARENT_NODE, e.getError());
-      }
-
-   }
-
-   /**
-    * This test is quite important as it ensures that the copy tree during the rebase operation
-    * is rebuild from the initial state. Indeed the move / destroy operations would fail otherwise
-    * as the move operation would not find its source.
-    */
-   public void testRebase4()
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase4");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a").addChild("b");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase4"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      root.addChild(root.getChild("a").getChild("b"));
-      root.removeChild("a");
-
-      //
-      service.rebaseNode(root.context, null, null);
-   }
-
-   public void testRebaseAddDuplicate() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_add_duplicate");
-      Navigation def = portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_add_duplicate"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      root.addChild("a");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      root2.addChild("a");
-      service.saveNode(root2.context, null);
-      sync(true);
-
-      //
-      try
-      {
-         service.rebaseNode(root.context, null, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.ADD_CONCURRENTLY_ADDED_NODE, e.getError());
-      }
-
-   }
-
-   public void testRebaseMoveDuplicate() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_move_duplicate");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a").addChild("b");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_move_duplicate"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      root.addChild(root.getChild("a").getChild("b"));
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      root2.addChild("b");
-      service.saveNode(root2.context, null);
-      sync(true);
-
-      //
-      try
-      {
-         service.rebaseNode(root.context, null, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.MOVE_CONCURRENTLY_DUPLICATE_NAME, e.getError());
-      }
-
-   }
-
-   public void testRebaseRenameDuplicate() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_rename_duplicate");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_rename_duplicate"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      root.getChild("a").setName("b");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      root2.addChild("b");
-      service.saveNode(root2.context, null);
-      sync(true);
-
-      //
-      try
-      {
-         service.rebaseNode(root.context, null, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.RENAME_CONCURRENTLY_DUPLICATE_NAME, e.getError());
-      }
-   }
-
-   public void testFederation() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_federation");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a").addChild("b");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_federation"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).node;
-      final Node a = root1.getChild("a");
-      final Node c = root1.addChild("c");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      root2.addChild("d").addChild("e");
-      service.saveNode(root2.context, null);
-      sync(true);
-
-      //
-      Iterator<NodeChange<Node>> changes =  a.rebase(service, Scope.CHILDREN);
-      Iterator<Node> children = root1.getChildren().iterator();
-      assertSame(a, children.next());
-      assertSame(c, children.next());
-      Node d = children.next();
-      assertEquals("d", d.getName());
-      assertFalse(children.hasNext());
-      assertFalse(d.context.isExpanded());
-      children = a.getChildren().iterator();
-      Node b = children.next();
-      assertEquals("b", b.getName());
-      assertFalse(children.hasNext());
-      assertFalse(b.context.isExpanded());
-      NodeChange.Added<Node> added1 = (NodeChange.Added<Node>)changes.next();
-      assertSame(b, added1.getTarget());
-      assertSame(null, added1.getPrevious());
-      assertSame(a, added1.getParent());
-      NodeChange.Added<Node> added2 = (NodeChange.Added<Node>)changes.next();
-      assertSame(d, added2.getTarget());
-      assertSame(c, added2.getPrevious());
-      assertSame(root1, added2.getParent());
-      assertFalse(changes.hasNext());
-   }
-
-   public void testTransientParent() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_transient_parent");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_transient_parent"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).node;
-      Node a = root.addChild("a");
-      Node b = root.addChild("b"); // It is only failed if we add more than one transient node
-
-      //
-      service.rebaseNode(a.context, Scope.CHILDREN, null);
-   }
-
-   public void testRemovedNavigation() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_removed_navigation");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_removed_navigation"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      service.destroyNavigation(navigation);
-
-      //
-      sync(true);
-
-      //
-      try
-      {
-         service.rebaseNode(root.context, null, null);
-      }
-      catch (NavigationServiceException e)
-      {
-         assertSame(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE, e.getError());
-      }
-   }
-
-   public void testStateRebase() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_state");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_state"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-
-      NodeState state = new NodeState.Builder().label("foo").build();
-      root.getChild("a").setState(state);
-      assertSame(state, root.getChild("a").getState());
-
-      //
-      sync(true);
-
-      //
-      Iterator<NodeChange<Node>> changes = root.rebase(service, null);
-      assertFalse(changes.hasNext());
-      assertSame(state, root.getChild("a").getState());
-   }
-
-   public void testNameRebase() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_name");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_name"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-
-      Node a = root.getChild("a");
-      a.setName("b");
-      assertSame("b", a.getName());
-
-      //
-      sync(true);
-
-      //
-      Iterator<NodeChange<Node>> changes = root.rebase(service, null);
-      assertFalse(changes.hasNext());
-      assertSame("b", a.getName());
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceRebase.java (from rev 6783, portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceRebase.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceRebase.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceRebase.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,414 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.mop.SiteKey;
+import org.gatein.mop.api.workspace.Navigation;
+import org.gatein.mop.api.workspace.ObjectType;
+import org.gatein.mop.api.workspace.Site;
+import org.gatein.mop.core.api.MOPService;
+
+import java.util.Iterator;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class TestNavigationServiceRebase extends AbstractTestNavigationService
+{
+
+   public void testRebase1() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase1");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a");
+      def.addChild("d");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase1"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      Node a = root1.getChild("a");
+      Node d = root1.getChild("d");
+      Node b = root1.addChild(1, "b");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      Node c2 = root2.addChild(1, "c");
+      service.saveNode(root2.context, null);
+      sync(true);
+
+      //
+      service.rebaseNode(root1.context, null, null);
+      assertEquals(4, root1.getNodeCount());
+      assertSame(a, root1.getChild(0));
+      assertSame(b, root1.getChild(1));
+      Node c1 = root1.getChild(2);
+      assertEquals("c", c1.getName());
+      assertEquals(c2.getId(), c1.getId());
+      assertSame(d, root1.getChild(3));
+
+   }
+
+   public void testRebase2() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase2");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a");
+      def.addChild("b");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase2"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      Node a = root1.getChild("a");
+      Node b = root1.getChild("b");
+      Node c = a.addChild("c");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      root2.getChild("b").addChild(root2.getChild("a"));
+      service.saveNode(root2.context, null);
+      sync(true);
+
+      //
+      service.rebaseNode(root1.context, null, null);
+      assertEquals(null, root1.getChild("a"));
+      assertSame(b, root1.getChild("b"));
+      assertEquals(root1, b.getParent());
+      assertSame(a, b.getChild("a"));
+      assertEquals(b, a.getParent());
+      assertSame(c, a.getChild("c"));
+      assertEquals(a, c.getParent());
+   }
+
+   public void testRebase3() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase3");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a");
+      def.addChild("b");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase3"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      root.getChild("a").addChild("foo");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      root2.removeChild("a");
+      service.saveNode(root2.context, null);
+      sync(true);
+
+      //
+      try
+      {
+         service.rebaseNode(root.context, null, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.ADD_CONCURRENTLY_REMOVED_PARENT_NODE, e.getError());
+      }
+
+   }
+
+   /**
+    * This test is quite important as it ensures that the copy tree during the rebase operation
+    * is rebuild from the initial state. Indeed the move / destroy operations would fail otherwise
+    * as the move operation would not find its source.
+    */
+   public void testRebase4()
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase4");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a").addChild("b");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase4"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      root.addChild(root.getChild("a").getChild("b"));
+      root.removeChild("a");
+
+      //
+      service.rebaseNode(root.context, null, null);
+   }
+
+   public void testRebaseAddDuplicate() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_add_duplicate");
+      Navigation def = portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_add_duplicate"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      root.addChild("a");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      root2.addChild("a");
+      service.saveNode(root2.context, null);
+      sync(true);
+
+      //
+      try
+      {
+         service.rebaseNode(root.context, null, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.ADD_CONCURRENTLY_ADDED_NODE, e.getError());
+      }
+
+   }
+
+   public void testRebaseMoveDuplicate() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_move_duplicate");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a").addChild("b");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_move_duplicate"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      root.addChild(root.getChild("a").getChild("b"));
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      root2.addChild("b");
+      service.saveNode(root2.context, null);
+      sync(true);
+
+      //
+      try
+      {
+         service.rebaseNode(root.context, null, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.MOVE_CONCURRENTLY_DUPLICATE_NAME, e.getError());
+      }
+
+   }
+
+   public void testRebaseRenameDuplicate() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_rename_duplicate");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_rename_duplicate"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      root.getChild("a").setName("b");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      root2.addChild("b");
+      service.saveNode(root2.context, null);
+      sync(true);
+
+      //
+      try
+      {
+         service.rebaseNode(root.context, null, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.RENAME_CONCURRENTLY_DUPLICATE_NAME, e.getError());
+      }
+   }
+
+   public void testFederation() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_federation");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a").addChild("b");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_federation"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).node;
+      final Node a = root1.getChild("a");
+      final Node c = root1.addChild("c");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      root2.addChild("d").addChild("e");
+      service.saveNode(root2.context, null);
+      sync(true);
+
+      //
+      Iterator<NodeChange<Node>> changes =  a.rebase(service, Scope.CHILDREN);
+      Iterator<Node> children = root1.getChildren().iterator();
+      assertSame(a, children.next());
+      assertSame(c, children.next());
+      Node d = children.next();
+      assertEquals("d", d.getName());
+      assertFalse(children.hasNext());
+      assertFalse(d.context.isExpanded());
+      children = a.getChildren().iterator();
+      Node b = children.next();
+      assertEquals("b", b.getName());
+      assertFalse(children.hasNext());
+      assertFalse(b.context.isExpanded());
+      NodeChange.Added<Node> added1 = (NodeChange.Added<Node>)changes.next();
+      assertSame(b, added1.getTarget());
+      assertSame(null, added1.getPrevious());
+      assertSame(a, added1.getParent());
+      NodeChange.Added<Node> added2 = (NodeChange.Added<Node>)changes.next();
+      assertSame(d, added2.getTarget());
+      assertSame(c, added2.getPrevious());
+      assertSame(root1, added2.getParent());
+      assertFalse(changes.hasNext());
+   }
+
+   public void testTransientParent() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_transient_parent");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_transient_parent"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).node;
+      Node a = root.addChild("a");
+      Node b = root.addChild("b"); // It is only failed if we add more than one transient node
+
+      //
+      service.rebaseNode(a.context, Scope.CHILDREN, null);
+   }
+
+   public void testRemovedNavigation() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_removed_navigation");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_removed_navigation"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      service.destroyNavigation(navigation);
+
+      //
+      sync(true);
+
+      //
+      try
+      {
+         service.rebaseNode(root.context, null, null);
+      }
+      catch (NavigationServiceException e)
+      {
+         assertSame(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE, e.getError());
+      }
+   }
+
+   public void testStateRebase() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_state");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_state"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+
+      NodeState state = new NodeState.Builder().label("foo").build();
+      root.getChild("a").setState(state);
+      assertSame(state, root.getChild("a").getState());
+
+      //
+      sync(true);
+
+      //
+      Iterator<NodeChange<Node>> changes = root.rebase(service, null);
+      assertFalse(changes.hasNext());
+      assertSame(state, root.getChild("a").getState());
+   }
+
+   public void testNameRebase() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rebase_name");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("rebase_name"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+
+      Node a = root.getChild("a");
+      a.setName("b");
+      assertSame("b", a.getName());
+
+      //
+      sync(true);
+
+      //
+      Iterator<NodeChange<Node>> changes = root.rebase(service, null);
+      assertFalse(changes.hasNext());
+      assertSame("b", a.getName());
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceSave.java
===================================================================
--- portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceSave.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceSave.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,1722 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.mop.SiteKey;
-import org.exoplatform.portal.mop.Visibility;
-import org.gatein.mop.api.workspace.Navigation;
-import org.gatein.mop.api.workspace.ObjectType;
-import org.gatein.mop.api.workspace.Site;
-import org.gatein.mop.core.api.MOPService;
-
-import javax.jcr.NodeIterator;
-import javax.jcr.Session;
-import java.util.Iterator;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class TestNavigationServiceSave extends AbstractTestNavigationService
-{
-
-   public void testNonExistingSite() throws Exception
-   {
-      assertNull(service.loadNavigation(SiteKey.portal("non_existing")));
-   }
-
-   public void testSaveNavigation() throws Exception
-   {
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_navigation"));
-      assertNull(nav);
-
-      //
-      mgr.getPOMService().getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_navigation");
-
-      //
-      sync(true);
-
-      //
-      nav = service.loadNavigation(SiteKey.portal("save_navigation"));
-      assertNull(nav);
-
-      //
-      nav = new NavigationContext(SiteKey.portal("save_navigation"), new NavigationState(5));
-      assertNull(nav.data);
-      assertNotNull(nav.state);
-      service.saveNavigation(nav);
-      assertNotNull(nav.data);
-      assertNull(nav.state);
-
-      //
-      nav.setState(new NavigationState(5));
-      service.saveNavigation(nav);
-      nav = service.loadNavigation(SiteKey.portal("save_navigation"));
-      assertNull(nav.state);
-      assertNotNull(nav.data.state);
-      assertEquals(5, nav.data.state.getPriority().intValue());
-
-      //
-      sync(true);
-
-      //
-      nav = service.loadNavigation(SiteKey.portal("save_navigation"));
-      assertNotNull(nav);
-      assertEquals(SiteKey.portal("save_navigation"), nav.getKey());
-      NavigationState state = nav.data.state;
-      Integer p = state.getPriority();
-      assertEquals(5, (int) p);
-      assertNotNull(nav.data.rootId);
-   }
-
-   public void testDestroyNavigation() throws Exception
-   {
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("destroy_navigation"));
-      assertNull(nav);
-
-      //
-      mgr.getPOMService().getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "destroy_navigation").getRootNavigation().addChild("default").addChild("a");
-
-      //
-      sync(true);
-      service.clearCache();
-
-      //
-      nav = service.loadNavigation(SiteKey.portal("destroy_navigation"));
-      assertNotNull(nav);
-
-      //
-      Node root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-
-      //
-      assertTrue(service.destroyNavigation(nav));
-      assertNull(nav.state);
-      assertNull(nav.data);
-
-      //
-      try
-      {
-         service.destroyNavigation(nav);
-      }
-      catch (IllegalArgumentException e)
-      {
-      }
-
-      //
-      nav = service.loadNavigation(SiteKey.portal("destroy_navigation"));
-      assertNull(nav);
-
-      //
-      sync(true);
-
-      //
-      nav = service.loadNavigation(SiteKey.portal("destroy_navigation"));
-      assertNull(nav);
-   }
-
-   public void testAddChild() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "add_child");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("add_child"));
-      Node root1 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      assertEquals(0, root1.getNodeCount());
-
-      // Test what happens when null is added
-      try
-      {
-         root1.addChild((String) null);
-         fail();
-      }
-      catch (NullPointerException ignore)
-      {
-      }
-
-      // Test what happens when an illegal index is added
-      try
-      {
-         root1.addChild(-1, "foo");
-         fail();
-      }
-      catch (IndexOutOfBoundsException ignore)
-      {
-      }
-      try
-      {
-         root1.addChild(1, "foo");
-         fail();
-      }
-      catch (IndexOutOfBoundsException ignore)
-      {
-      }
-
-      //
-      Node foo = root1.addChild("foo");
-      assertNull(foo.getId());
-      assertEquals("foo", foo.getName());
-      assertSame(foo, root1.getChild("foo"));
-      assertEquals(1, root1.getNodeCount());
-      service.saveNode(root1.context, null);
-
-      //
-      root1.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      Node foo2 = root2.getChild("foo");
-      assertNotNull(foo2);
-      assertEquals(1, root2.getNodeCount());
-      assertEquals("foo", foo2.getName());
-
-      //
-      root1.assertEquals(root2);
-   }
-
-   public void testRemoveChild() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "remove_child");
-      portal.getRootNavigation().addChild("default").addChild("foo");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("remove_child"));
-      Node root1 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-
-      //
-      try
-      {
-         root1.removeChild(null);
-         fail();
-      }
-      catch (NullPointerException e)
-      {
-      }
-      try
-      {
-         root1.removeChild("bar");
-         fail();
-      }
-      catch (IllegalArgumentException e)
-      {
-      }
-
-      //
-      Node foo1 = root1.getChild("foo");
-      assertNotNull(foo1.getId());
-      assertEquals("foo", foo1.getName());
-      assertSame(foo1, root1.getChild("foo"));
-
-      //
-      assertTrue(root1.removeChild("foo"));
-      assertNull(root1.getChild("foo"));
-      service.saveNode(root1.context, null);
-
-      //
-      root1.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      Node foo2 = root2.getChild("foo");
-      assertNull(foo2);
-
-      //
-      root1.assertEquals(root2);
-   }
-
-   public void testRemoveTransientChild() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "remove_transient_child");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("remove_transient_child"));
-      Node root1 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      Node foo1 = root1.addChild("foo");
-      assertNull(foo1.getId());
-      assertEquals("foo", foo1.getName());
-      assertSame(foo1, root1.getChild("foo"));
-
-      //
-      assertTrue(root1.removeChild("foo"));
-      assertNull(root1.getChild("foo"));
-      service.saveNode(root1.context, null);
-
-      //
-      root1.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      Node foo2 = root2.getChild("foo");
-      assertNull(foo2);
-
-      //
-      root1.assertEquals(root2);
-   }
-
-   public void testRename() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rename");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a");
-      def.addChild("b");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("rename"));
-      Node root1 = service.loadNode(Node.MODEL, nav, Scope.GRANDCHILDREN, null).getNode();
-      try
-      {
-         root1.setName("something");
-         fail();
-      }
-      catch (IllegalStateException e)
-      {
-      }
-
-      //
-      Node a1 = root1.getChild("a");
-      assertEquals(0, a1.context.getIndex());
-      try
-      {
-         a1.setName(null);
-         fail();
-      }
-      catch (NullPointerException e)
-      {
-      }
-      try
-      {
-         a1.setName("b");
-         fail();
-      }
-      catch (IllegalArgumentException e)
-      {
-      }
-
-      //
-      a1.setName("c");
-      assertEquals("c", a1.getName());
-      assertEquals(0, a1.context.getIndex());
-      service.saveNode(a1.context, null);
-
-      //
-      root1.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      nav = service.loadNavigation(SiteKey.portal("rename"));
-      Node root2 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      Node a2 = root2.getChild("c");
-      assertNotNull(a2);
-      // assertEquals(0, a2.context.getIndex());
-
-      // Does not pass randomly because of JCR bugs
-      // root1.assertEquals(root2);
-   }
-
-   public void testReorderChild() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "reorder_child");
-      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
-      rootNavigation.addChild("foo");
-      rootNavigation.addChild("bar");
-      rootNavigation.addChild("juu");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("reorder_child"));
-      Node root1 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      Iterator<Node> i = root1.getChildren().iterator();
-      Node foo1 = i.next();
-      assertEquals("foo", foo1.getName());
-      Node bar1 = i.next();
-      assertEquals("bar", bar1.getName());
-      Node juu1 = i.next();
-      assertEquals("juu", juu1.getName());
-      assertFalse(i.hasNext());
-
-      // Test what happens when null is added
-      try
-      {
-         root1.addChild(1, (Node)null);
-         fail();
-      }
-      catch (NullPointerException expected)
-      {
-      }
-
-      // Test what happens when an illegal index is added
-      try
-      {
-         root1.addChild(-1, juu1);
-         fail();
-      }
-      catch (IndexOutOfBoundsException expected)
-      {
-      }
-      try
-      {
-         root1.addChild(4, juu1);
-         fail();
-      }
-      catch (IndexOutOfBoundsException expected)
-      {
-      }
-
-      //
-      root1.addChild(1, juu1);
-      service.saveNode(root1.context, null);
-
-      //
-      root1.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      i = root2.getChildren().iterator();
-      Node foo2 = i.next();
-      assertEquals("foo", foo2.getName());
-      Node juu2 = i.next();
-      assertEquals("juu", juu2.getName());
-      Node bar2 = i.next();
-      assertEquals("bar", bar2.getName());
-      assertFalse(i.hasNext());
-
-      //
-      root1.assertEquals(root2);
-
-      //
-      root2.addChild(0, bar2);
-
-      //
-      service.saveNode(root2.context, null);
-
-      //
-      root2.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      Node root3 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      i = root3.getChildren().iterator();
-      Node bar3 = i.next();
-      assertEquals("bar", bar3.getName());
-      Node foo3 = i.next();
-      assertEquals("foo", foo3.getName());
-      Node juu3 = i.next();
-      assertEquals("juu", juu3.getName());
-      assertFalse(i.hasNext());
-
-      //
-      root2.assertEquals(root3);
-   }
-
-   public void _testReorderChild2() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "reorder_child_2");
-      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
-      rootNavigation.addChild("foo");
-      rootNavigation.addChild("bar");
-      rootNavigation.addChild("juu");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("reorder_child_2"));
-      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      assertEquals("bar", root.getChild(1).getName());
-      assertTrue(root.removeChild("bar"));
-      service.saveNode(root.context, null);
-
-      //
-      sync(true);
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      root.addChild("daa");
-      Node tab3 = root.getChild(2);
-      assertEquals("daa", tab3.getName());
-      service.saveNode(root.context, null);
-
-      //
-      sync(true);
-
-      //
-      root = new NavigationServiceImpl(mgr).loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      for (Node child : root.getChildren())
-      {
-         System.out.println("child : " + child.getId());
-      }
-      tab3 = root.getChild(2);
-      assertEquals("daa", tab3.getName());
-
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      for (Node child : root.getChildren())
-      {
-         System.out.println("child : " + child.getId());
-      }
-      tab3 = root.getChild(2);
-      assertEquals("daa", tab3.getName());
-   }
-
-   public void _testWeirdBug() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "reorder_child_2");
-      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
-      rootNavigation.addChild("foo");
-      rootNavigation.addChild("bar");
-      rootNavigation.addChild("juu");
-
-      //
-      sync(true);
-
-      //
-      portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2");
-      rootNavigation = portal.getRootNavigation().getChild("default");
-      rootNavigation.getChild("bar").destroy();
-
-      //
-      sync(true);
-
-      //
-      portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2");
-      rootNavigation = portal.getRootNavigation().getChild("default");
-      rootNavigation.addChild("daa");
-
-      //
-      sync(true);
-
-      //
-      portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2");
-      rootNavigation = portal.getRootNavigation().getChild("default");
-      Navigation daa = rootNavigation.getChildren().get(2);
-      assertEquals("daa", daa.getName());
-   }
-
-   public void _testWeirdBug2() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Session session = mop.getModel().getSession().getJCRSession();
-      javax.jcr.Node container = session.getRootNode().
-         getNode("mop:workspace/mop:portalsites").
-         addNode("mop:reorder_child_2").
-         getNode("mop:rootnavigation/mop:children").
-         addNode("mop:default").
-         getNode("mop:children");
-      container.addNode("mop:foo");
-      container.addNode("mop:bar");
-      container.addNode("mop:juu");
-
-      //
-      sync(true);
-
-      //
-      session = mop.getModel().getSession().getJCRSession();
-      container = session.getRootNode().getNode("mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children");
-      container.getNode("mop:bar").remove();
-
-      //
-      sync(true);
-
-      //
-      session = mop.getModel().getSession().getJCRSession();
-      container = session.getRootNode().getNode("mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children");
-      container.addNode("mop:daa");
-      container.orderBefore("mop:daa", null);
-
-      //
-      sync(true);
-
-      //
-      container = session.getRootNode().getNode("mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children");
-      NodeIterator it = container.getNodes();
-      assertEquals("mop:foo", it.nextNode().getName());
-      assertEquals("mop:juu", it.nextNode().getName());
-      assertEquals("mop:daa", it.nextNode().getName());
-      assertFalse(it.hasNext());
-   }
-
-   public void testMoveChild() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "move_child");
-      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
-      rootNavigation.addChild("foo").addChild("juu");
-      rootNavigation.addChild("bar");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("move_child"));
-      Node root1 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-      Node foo1 = root1.getChild("foo");
-      Node bar1 = root1.getChild("bar");
-      Node juu1 = foo1.getChild("juu");
-      bar1.addChild(juu1);
-      service.saveNode(root1.context, null);
-
-      //
-      root1.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-      Node foo2 = root2.getChild("foo");
-      Node juu2 = foo2.getChild("juu");
-      assertNull(juu2);
-      Node bar2 = root2.getChild("bar");
-      juu2 = bar2.getChild("juu");
-      assertNotNull(juu2);
-
-      //
-      root1.assertEquals(root2);
-   }
-
-   public void testMoveAfter1() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_move_after_1");
-      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
-      rootNavigation.addChild("a");
-      rootNavigation.addChild("b");
-      rootNavigation.addChild("c");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_move_after_1"));
-      Node root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-      Node a = root.getChild("a");
-      Node b = root.getChild("b");
-      Node c = root.getChild("c");
-      root.addChild(1, a);
-      assertSame(a, root.getChild(0));
-      assertSame(b, root.getChild(1));
-      assertSame(c, root.getChild(2));
-      service.saveNode(root.context, null);
-
-      //
-      root.assertConsistent();
-      assertSame(a, root.getChild(0));
-      assertSame(b, root.getChild(1));
-      assertSame(c, root.getChild(2));
-
-      //
-      sync(true);
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-      a = root.getChild("a");
-      b = root.getChild("b");
-      c = root.getChild("c");
-      assertSame(a, root.getChild(0));
-      assertSame(b, root.getChild(1));
-      assertSame(c, root.getChild(2));
-   }
-
-   public void testMoveAfter2() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_move_after_2");
-      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
-      rootNavigation.addChild("a");
-      rootNavigation.addChild("b");
-      rootNavigation.addChild("c");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_move_after_2"));
-      Node root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-      Node a = root.getChild("a");
-      Node b = root.getChild("b");
-      Node c = root.getChild("c");
-      root.addChild(2, a);
-      assertSame(b, root.getChild(0));
-      assertSame(a, root.getChild(1));
-      assertSame(c, root.getChild(2));
-      service.saveNode(root.context, null);
-
-      //
-      root.assertConsistent();
-      assertSame(b, root.getChild(0));
-      assertSame(a, root.getChild(1));
-      assertSame(c, root.getChild(2));
-
-      //
-      sync(true);
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-      a = root.getChild("a");
-      b = root.getChild("b");
-      c = root.getChild("c");
-      assertSame(b, root.getChild(0));
-      assertSame(a, root.getChild(1));
-      assertSame(c, root.getChild(2));
-   }
-
-   public void testRenameNode() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rename_node");
-      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
-      rootNavigation.addChild("foo");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("rename_node"));
-      Node root1 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-      Node foo1 = root1.getChild("foo");
-      foo1.setName("foo");
-      service.saveNode(root1.context, null);
-
-      //
-      root1.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      nav = service.loadNavigation(SiteKey.portal("rename_node"));
-      Node root2 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-
-      //
-      root1.assertEquals(root2);
-
-      //
-      Node foo2 = root2.getChild("foo");
-      foo2.setName("bar");
-      assertEquals("bar", foo2.getName());
-      assertSame(foo2, root2.getChild("bar"));
-      service.saveNode(root2.context, null);
-      assertEquals("bar", foo2.getName());
-      assertSame(foo2, root2.getChild("bar"));
-
-      //
-      root2.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      Node root3 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-      Node bar3 = root3.getChild("bar");
-      assertNotNull(bar3);
-      assertSame(bar3, root3.getChild("bar"));
-
-      //
-      root2.assertEquals(root3);
-
-      //
-      root3.addChild("foo");
-      try
-      {
-         bar3.setName("foo");
-         fail();
-      }
-      catch (IllegalArgumentException ignore)
-      {
-      }
-   }
-
-   public void testSaveChildren() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_children");
-      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
-      rootNavigation.addChild("1");
-      rootNavigation.addChild("2");
-      rootNavigation.addChild("3");
-      rootNavigation.addChild("4");
-      rootNavigation.addChild("5");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_children"));
-      Node root1 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      root1.removeChild("5");
-      root1.removeChild("2");
-      root1.addChild(0, root1.getChild("3"));
-      root1.addChild(1, root1.addChild("."));
-      service.saveNode(root1.context, null);
-      Iterator<Node> i = root1.getChildren().iterator();
-      assertEquals("3", i.next().getName());
-      assertEquals(".", i.next().getName());
-      assertEquals("1", i.next().getName());
-      assertEquals("4", i.next().getName());
-      assertFalse(i.hasNext());
-
-      //
-      root1.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      i = root2.getChildren().iterator();
-      assertEquals("3", i.next().getName());
-      assertEquals(".", i.next().getName());
-      assertEquals("1", i.next().getName());
-      assertEquals("4", i.next().getName());
-      assertFalse(i.hasNext());
-
-      //
-      root1.assertEquals(root2);
-   }
-
-   public void testSaveRecursive() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_recursive");
-      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
-      rootNavigation.addChild("foo");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_recursive"));
-      Node root1 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-      Node foo1 = root1.getChild("foo");
-      Node bar1 = foo1.addChild("bar");
-      bar1.addChild("juu");
-      service.saveNode(root1.context, null);
-
-      //
-      root1.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-      Node foo2 = root2.getChild("foo");
-      Node bar2 = foo2.getChild("bar");
-      assertNotNull(bar2.getId());
-      Node juu2 = bar2.getChild("juu");
-      assertNotNull(juu2.getId());
-
-      //
-      root1.assertEquals(root2);
-   }
-
-   public void testSaveState() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_state");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_state"));
-      Node root1 = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
-      NodeState state = root1.getState();
-      assertNull(state.getLabel());
-      assertEquals(-1, state.getStartPublicationTime());
-      assertEquals(-1, state.getEndPublicationTime());
-      long now = System.currentTimeMillis();
-      root1.setState(new NodeState.Builder().endPublicationTime(now).label("bar").build());
-      service.saveNode(root1.context, null);
-
-      //
-      root1.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-      state = root2.getState();
-      assertEquals("bar", state.getLabel());
-      assertEquals(-1, state.getStartPublicationTime());
-      assertEquals(now, state.getEndPublicationTime());
-      assertEquals(Visibility.DISPLAYED, state.getVisibility());
-
-      //
-      root1.assertEquals(root2);
-   }
-
-   public void _testSaveStateOverwrite() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_state_overwrite");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_state_overwrite"));
-      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      root.addChild("foo");
-      service.saveNode(root.context, null);
-
-      //
-      sync(true);
-
-      //
-      root.addChild("bar");
-      service.saveNode(root.context, null);
-
-      //
-      sync(true);
-
-      //
-      nav = service.loadNavigation(SiteKey.portal("save_state_overwrite"));
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      assertEquals(2, root.getChildren().size());
-   }
-
-   public void testRecreateNode() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "recreate_node");
-      portal.getRootNavigation().addChild("default").addChild("foo");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("recreate_node"));
-      Node root1 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      String fooId = root1.getChild("foo").getId();
-      assertTrue(root1.removeChild("foo"));
-      assertNull(root1.addChild("foo").getId());
-      service.saveNode(root1.context, null);
-
-      //
-      root1.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      assertNotNull(root2.getChild("foo").getId());
-      assertNotSame(fooId, root2.getChild("foo").getId());
-
-      //
-      root1.assertEquals(root2);
-   }
-
-   public void testMoveToAdded() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "move_to_added");
-      Navigation nav = portal.getRootNavigation().addChild("default");
-      nav.addChild("a").addChild("b");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("move_to_added"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.GRANDCHILDREN, null).getNode();
-      Node a1 = root1.getChild("a");
-      Node b1 = a1.getChild("b");
-      Node c1 = root1.addChild("c");
-      c1.addChild(b1);
-      service.saveNode(root1.context, null);
-
-      //
-      root1.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      navigation = service.loadNavigation(SiteKey.portal("move_to_added"));
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.GRANDCHILDREN, null).getNode();
-      Node a2 = root2.getChild("a");
-      assertNotNull(a2);
-      Node c2 = root2.getChild("c");
-      assertNotNull(c2);
-      Node b2 = c2.getChild("b");
-      assertNotNull(b2);
-
-      //
-      root1.assertEquals(root2);
-   }
-
-   public void testMoveFromRemoved() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "moved_from_removed");
-      Navigation nav = portal.getRootNavigation().addChild("default");
-      nav.addChild("a").addChild("c");
-      nav.addChild("b");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("moved_from_removed"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.GRANDCHILDREN, null).getNode();
-      Node a1 = root1.getChild("a");
-      Node b1 = root1.getChild("b");
-      Node c1 = a1.getChild("c");
-      b1.addChild(c1);
-      root1.removeChild("a");
-      service.saveNode(root1.context, null);
-
-      //
-      root1.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      navigation = service.loadNavigation(SiteKey.portal("moved_from_removed"));
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.GRANDCHILDREN, null).getNode();
-      assertNull(root2.getChild("a"));
-      Node b2 = root2.getChild("b");
-      assertNotNull(b2);
-      Node c2 = b2.getChild("c");
-      assertNotNull(c2);
-
-      //
-      root1.assertEquals(root2);
-   }
-
-   public void testRemoveAdded() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "remove_added");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("remove_added"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.GRANDCHILDREN, null).getNode();
-      root.addChild("foo");
-      root.removeChild("foo");
-      service.saveNode(root.context, null);
-
-      //
-      root.assertConsistent();
-
-      //
-      sync(true);
-
-      //
-      root = service.loadNode(Node.MODEL, navigation, Scope.GRANDCHILDREN, null).getNode();
-      assertEquals(0, root.getChildren().size());
-   }
-
-   public void testRenameCreatedNode() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_rename_created");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_rename_created"));
-      Node root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
-      Node temp = root.addChild("temp");
-      temp.setName("bar");
-      Iterator<NodeChange<Node>> changes = root.save(service);
-      assertFalse(changes.hasNext());
-   }
-
-   public void testConcurrentAddToRemoved() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "add_to_removed");
-      portal.getRootNavigation().addChild("default").addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("add_to_removed"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root.getChild("a").addChild("b");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.removeChild("a");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      try
-      {
-         service.saveNode(root.context, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.ADD_CONCURRENTLY_REMOVED_PARENT_NODE, e.getError());
-      }
-   }
-
-   public void testConcurrentMerge() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_merge");
-      Navigation nav = portal.getRootNavigation().addChild("default");
-      nav.addChild("a");
-      nav.addChild("b");
-      nav.addChild("c");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("save_merge"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-
-      //
-      sync();
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-      root2.addChild(1, root2.addChild("2"));
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      service.saveNode(root1.context, null);
-      root1.assertConsistent();
-
-      //
-      root1.addChild(1, root1.addChild("1"));
-      service.saveNode(root1.context, null);
-      root1.assertConsistent();
-   }
-
-   public void testConcurrentRemoveRemoved() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "remove_removed");
-      portal.getRootNavigation().addChild("default").addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("remove_removed"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.removeChild("a");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.removeChild("a");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      service.saveNode(root1.context, null);
-
-      //
-      root1.assertEquals(root2);
-   }
-
-   public void testConcurrentMoveRemoved() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "move_removed");
-      portal.getRootNavigation().addChild("default").addChild("a").addChild("b");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("move_removed"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.addChild(root1.getChild("a").getChild("b"));
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.getChild("a").removeChild("b");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      try
-      {
-         service.saveNode(root1.context, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.MOVE_CONCURRENTLY_REMOVED_MOVED_NODE, e.getError());
-      }
-   }
-
-   public void testConcurrentMoveToRemoved() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "move_to_removed");
-      portal.getRootNavigation().addChild("default").addChild("a");
-      portal.getRootNavigation().getChild("default").addChild("b");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("move_to_removed"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.getChild("b").addChild(root1.getChild("a"));
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.removeChild("b");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      try
-      {
-         service.saveNode(root1.context, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.MOVE_CONCURRENTLY_REMOVED_DST_NODE, e.getError());
-      }
-   }
-
-   public void testConcurrentMoveMoved() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "move_moved");
-      portal.getRootNavigation().addChild("default").addChild("a");
-      portal.getRootNavigation().getChild("default").addChild("b");
-      portal.getRootNavigation().getChild("default").addChild("c");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("move_moved"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.getChild("b").addChild(root1.getChild("a"));
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.getChild("c").addChild(root2.getChild("a"));
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      try
-      {
-         service.saveNode(root1.context, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.MOVE_CONCURRENTLY_CHANGED_SRC_NODE, e.getError());
-      }
-   }
-
-   public void testConcurrentAddDuplicate() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "concurrent_add_duplicate");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("concurrent_add_duplicate"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.addChild("a");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      root1.addChild("a");
-      try
-      {
-         service.saveNode(root1.context, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.ADD_CONCURRENTLY_ADDED_NODE, e.getError());
-      }
-   }
-
-   public void testConcurrentAddAfterRemoved() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "concurrent_add_after_removed");
-      portal.getRootNavigation().addChild("default").addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("concurrent_add_after_removed"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.addChild(1, "b");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.removeChild("a");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      try
-      {
-         service.saveNode(root1.context, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.ADD_CONCURRENTLY_REMOVED_PREVIOUS_NODE, e.getError());
-      }
-   }
-
-   public void testConcurrentMoveAfterRemoved() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "concurrent_move_after_removed");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a").addChild("b");
-      def.addChild("c");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("concurrent_move_after_removed"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.addChild(2, root1.getChild("a").getChild("b"));
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.removeChild("c");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      try
-      {
-         service.saveNode(root1.context, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.MOVE_CONCURRENTLY_REMOVED_PREVIOUS_NODE, e.getError());
-      }
-   }
-
-   public void testConcurrentMoveFromRemoved() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "concurrent_move_from_removed");
-      portal.getRootNavigation().addChild("default").addChild("a").addChild("b");
-      portal.getRootNavigation().getChild("default").addChild("c");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("concurrent_move_from_removed"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.getChild("c").addChild(root1.getChild("a").getChild("b"));
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.removeChild("a");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      try
-      {
-         service.saveNode(root1.context, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.MOVE_CONCURRENTLY_REMOVED_SRC_NODE, e.getError());
-      }
-   }
-
-   public void testConcurrentRenameRemoved() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "concurrent_rename_removed");
-      portal.getRootNavigation().addChild("default").addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("concurrent_rename_removed"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.getChild("a").setName("b");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.removeChild("a");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      try
-      {
-         service.saveNode(root1.context, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.RENAME_CONCURRENTLY_REMOVED_NODE, e.getError());
-      }
-   }
-
-   public void testConcurrentDuplicateRename() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "concurrent_duplicate_rename");
-      portal.getRootNavigation().addChild("default").addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("concurrent_duplicate_rename"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.getChild("a").setName("b");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.addChild("b");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      try
-      {
-         service.saveNode(root1.context, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.RENAME_CONCURRENTLY_DUPLICATE_NAME, e.getError());
-      }
-   }
-
-   public void testSavePhantomNode() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "concurrent_save");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("concurrent_save"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.addChild("a");
-      service.saveNode(root1.context, null);
-
-      //
-      sync(true);
-
-      // Reload the root node and modify it
-      root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.getChild("a").setState(root1.getState().builder().label("foo").build());
-
-      //
-      sync(true);
-
-      // Edit navigation in another browser
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.removeChild("a");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      // Now click Save button in the first browser
-      try
-      {
-         service.saveNode(root1.context, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE, e.getError());
-      }
-   }
-
-   public void testConcurrentRemovalDoesNotPreventSave() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "removal_does_not_prevent_save");
-      portal.getRootNavigation().addChild("default").addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("removal_does_not_prevent_save"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.removeChild("a");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      service.saveNode(root1.context, null);
-   }
-
-   public void testConcurrentRename() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_concurrent_rename");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("save_concurrent_rename"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      Node a = root1.getChild("a");
-      a.setName("b");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      Node a2 = root2.getChild("a");
-      a2.setName("c");
-      service.saveNode(root2.context, null);
-
-      //
-      Iterator<NodeChange<Node>> changes = root1.save(service);
-      assertFalse(changes.hasNext());
-   }
-
-   public void testRemovedNavigation() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_removed_navigation");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("save_removed_navigation"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      service.destroyNavigation(navigation);
-
-      //
-      sync(true);
-
-      //
-      try
-      {
-         service.saveNode(root.context, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertSame(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE, e.getError());
-      }
-   }
-
-   public void testPendingChangesBypassCache() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "pending_changes_bypass_cache");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext nav = service.loadNavigation(SiteKey.portal("pending_changes_bypass_cache"));
-      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      root.addChild("foo");
-      service.saveNode(root.context, null);
-
-      //
-      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
-      assertNotNull(root.getChild("foo"));
-   }
-
-   public void testAtomic() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_atomic");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a");
-      def.addChild("b");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("save_atomic"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.getChild("a").addChild("c");
-      root1.getChild("b").addChild("d");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.removeChild("b");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      assertFalse(mgr.getSession().isModified());
-
-      //
-      try
-      {
-         service.saveNode(root1.context, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertSame(NavigationError.ADD_CONCURRENTLY_REMOVED_PARENT_NODE, e.getError());
-      }
-
-      //
-      assertFalse(mgr.getSession().isModified());
-   }
-
-   public void testRebase() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_rebase");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("save_rebase"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      Node a = root1.getChild("a");
-      Node b = root1.addChild("b");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.addChild("c");
-      service.saveNode(root2.context, null);
-
-      //
-      Iterator<NodeChange<Node>> changes = root1.save(service);
-      NodeChange.Added<Node> added = (NodeChange.Added<Node>)changes.next();
-      Node c = added.getTarget();
-      assertEquals("c", c.getName());
-      assertFalse(changes.hasNext());
-      assertSame(a, root1.getChild(0));
-      assertSame(b, root1.getChild(1));
-      assertSame(c, root1.getChild(2));
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceSave.java (from rev 6783, portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceSave.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceSave.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceSave.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,1722 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.Visibility;
+import org.gatein.mop.api.workspace.Navigation;
+import org.gatein.mop.api.workspace.ObjectType;
+import org.gatein.mop.api.workspace.Site;
+import org.gatein.mop.core.api.MOPService;
+
+import javax.jcr.NodeIterator;
+import javax.jcr.Session;
+import java.util.Iterator;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class TestNavigationServiceSave extends AbstractTestNavigationService
+{
+
+   public void testNonExistingSite() throws Exception
+   {
+      assertNull(service.loadNavigation(SiteKey.portal("non_existing")));
+   }
+
+   public void testSaveNavigation() throws Exception
+   {
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_navigation"));
+      assertNull(nav);
+
+      //
+      mgr.getPOMService().getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_navigation");
+
+      //
+      sync(true);
+
+      //
+      nav = service.loadNavigation(SiteKey.portal("save_navigation"));
+      assertNull(nav);
+
+      //
+      nav = new NavigationContext(SiteKey.portal("save_navigation"), new NavigationState(5));
+      assertNull(nav.data);
+      assertNotNull(nav.state);
+      service.saveNavigation(nav);
+      assertNotNull(nav.data);
+      assertNull(nav.state);
+
+      //
+      nav.setState(new NavigationState(5));
+      service.saveNavigation(nav);
+      nav = service.loadNavigation(SiteKey.portal("save_navigation"));
+      assertNull(nav.state);
+      assertNotNull(nav.data.state);
+      assertEquals(5, nav.data.state.getPriority().intValue());
+
+      //
+      sync(true);
+
+      //
+      nav = service.loadNavigation(SiteKey.portal("save_navigation"));
+      assertNotNull(nav);
+      assertEquals(SiteKey.portal("save_navigation"), nav.getKey());
+      NavigationState state = nav.data.state;
+      Integer p = state.getPriority();
+      assertEquals(5, (int) p);
+      assertNotNull(nav.data.rootId);
+   }
+
+   public void testDestroyNavigation() throws Exception
+   {
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("destroy_navigation"));
+      assertNull(nav);
+
+      //
+      mgr.getPOMService().getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "destroy_navigation").getRootNavigation().addChild("default").addChild("a");
+
+      //
+      sync(true);
+      service.clearCache();
+
+      //
+      nav = service.loadNavigation(SiteKey.portal("destroy_navigation"));
+      assertNotNull(nav);
+
+      //
+      Node root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+
+      //
+      assertTrue(service.destroyNavigation(nav));
+      assertNull(nav.state);
+      assertNull(nav.data);
+
+      //
+      try
+      {
+         service.destroyNavigation(nav);
+      }
+      catch (IllegalArgumentException e)
+      {
+      }
+
+      //
+      nav = service.loadNavigation(SiteKey.portal("destroy_navigation"));
+      assertNull(nav);
+
+      //
+      sync(true);
+
+      //
+      nav = service.loadNavigation(SiteKey.portal("destroy_navigation"));
+      assertNull(nav);
+   }
+
+   public void testAddChild() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "add_child");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("add_child"));
+      Node root1 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      assertEquals(0, root1.getNodeCount());
+
+      // Test what happens when null is added
+      try
+      {
+         root1.addChild((String) null);
+         fail();
+      }
+      catch (NullPointerException ignore)
+      {
+      }
+
+      // Test what happens when an illegal index is added
+      try
+      {
+         root1.addChild(-1, "foo");
+         fail();
+      }
+      catch (IndexOutOfBoundsException ignore)
+      {
+      }
+      try
+      {
+         root1.addChild(1, "foo");
+         fail();
+      }
+      catch (IndexOutOfBoundsException ignore)
+      {
+      }
+
+      //
+      Node foo = root1.addChild("foo");
+      assertNull(foo.getId());
+      assertEquals("foo", foo.getName());
+      assertSame(foo, root1.getChild("foo"));
+      assertEquals(1, root1.getNodeCount());
+      service.saveNode(root1.context, null);
+
+      //
+      root1.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      Node foo2 = root2.getChild("foo");
+      assertNotNull(foo2);
+      assertEquals(1, root2.getNodeCount());
+      assertEquals("foo", foo2.getName());
+
+      //
+      root1.assertEquals(root2);
+   }
+
+   public void testRemoveChild() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "remove_child");
+      portal.getRootNavigation().addChild("default").addChild("foo");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("remove_child"));
+      Node root1 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+
+      //
+      try
+      {
+         root1.removeChild(null);
+         fail();
+      }
+      catch (NullPointerException e)
+      {
+      }
+      try
+      {
+         root1.removeChild("bar");
+         fail();
+      }
+      catch (IllegalArgumentException e)
+      {
+      }
+
+      //
+      Node foo1 = root1.getChild("foo");
+      assertNotNull(foo1.getId());
+      assertEquals("foo", foo1.getName());
+      assertSame(foo1, root1.getChild("foo"));
+
+      //
+      assertTrue(root1.removeChild("foo"));
+      assertNull(root1.getChild("foo"));
+      service.saveNode(root1.context, null);
+
+      //
+      root1.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      Node foo2 = root2.getChild("foo");
+      assertNull(foo2);
+
+      //
+      root1.assertEquals(root2);
+   }
+
+   public void testRemoveTransientChild() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "remove_transient_child");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("remove_transient_child"));
+      Node root1 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      Node foo1 = root1.addChild("foo");
+      assertNull(foo1.getId());
+      assertEquals("foo", foo1.getName());
+      assertSame(foo1, root1.getChild("foo"));
+
+      //
+      assertTrue(root1.removeChild("foo"));
+      assertNull(root1.getChild("foo"));
+      service.saveNode(root1.context, null);
+
+      //
+      root1.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      Node foo2 = root2.getChild("foo");
+      assertNull(foo2);
+
+      //
+      root1.assertEquals(root2);
+   }
+
+   public void testRename() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rename");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a");
+      def.addChild("b");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("rename"));
+      Node root1 = service.loadNode(Node.MODEL, nav, Scope.GRANDCHILDREN, null).getNode();
+      try
+      {
+         root1.setName("something");
+         fail();
+      }
+      catch (IllegalStateException e)
+      {
+      }
+
+      //
+      Node a1 = root1.getChild("a");
+      assertEquals(0, a1.context.getIndex());
+      try
+      {
+         a1.setName(null);
+         fail();
+      }
+      catch (NullPointerException e)
+      {
+      }
+      try
+      {
+         a1.setName("b");
+         fail();
+      }
+      catch (IllegalArgumentException e)
+      {
+      }
+
+      //
+      a1.setName("c");
+      assertEquals("c", a1.getName());
+      assertEquals(0, a1.context.getIndex());
+      service.saveNode(a1.context, null);
+
+      //
+      root1.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      nav = service.loadNavigation(SiteKey.portal("rename"));
+      Node root2 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      Node a2 = root2.getChild("c");
+      assertNotNull(a2);
+      // assertEquals(0, a2.context.getIndex());
+
+      // Does not pass randomly because of JCR bugs
+      // root1.assertEquals(root2);
+   }
+
+   public void testReorderChild() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "reorder_child");
+      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
+      rootNavigation.addChild("foo");
+      rootNavigation.addChild("bar");
+      rootNavigation.addChild("juu");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("reorder_child"));
+      Node root1 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      Iterator<Node> i = root1.getChildren().iterator();
+      Node foo1 = i.next();
+      assertEquals("foo", foo1.getName());
+      Node bar1 = i.next();
+      assertEquals("bar", bar1.getName());
+      Node juu1 = i.next();
+      assertEquals("juu", juu1.getName());
+      assertFalse(i.hasNext());
+
+      // Test what happens when null is added
+      try
+      {
+         root1.addChild(1, (Node)null);
+         fail();
+      }
+      catch (NullPointerException expected)
+      {
+      }
+
+      // Test what happens when an illegal index is added
+      try
+      {
+         root1.addChild(-1, juu1);
+         fail();
+      }
+      catch (IndexOutOfBoundsException expected)
+      {
+      }
+      try
+      {
+         root1.addChild(4, juu1);
+         fail();
+      }
+      catch (IndexOutOfBoundsException expected)
+      {
+      }
+
+      //
+      root1.addChild(1, juu1);
+      service.saveNode(root1.context, null);
+
+      //
+      root1.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      i = root2.getChildren().iterator();
+      Node foo2 = i.next();
+      assertEquals("foo", foo2.getName());
+      Node juu2 = i.next();
+      assertEquals("juu", juu2.getName());
+      Node bar2 = i.next();
+      assertEquals("bar", bar2.getName());
+      assertFalse(i.hasNext());
+
+      //
+      root1.assertEquals(root2);
+
+      //
+      root2.addChild(0, bar2);
+
+      //
+      service.saveNode(root2.context, null);
+
+      //
+      root2.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      Node root3 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      i = root3.getChildren().iterator();
+      Node bar3 = i.next();
+      assertEquals("bar", bar3.getName());
+      Node foo3 = i.next();
+      assertEquals("foo", foo3.getName());
+      Node juu3 = i.next();
+      assertEquals("juu", juu3.getName());
+      assertFalse(i.hasNext());
+
+      //
+      root2.assertEquals(root3);
+   }
+
+   public void _testReorderChild2() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "reorder_child_2");
+      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
+      rootNavigation.addChild("foo");
+      rootNavigation.addChild("bar");
+      rootNavigation.addChild("juu");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("reorder_child_2"));
+      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      assertEquals("bar", root.getChild(1).getName());
+      assertTrue(root.removeChild("bar"));
+      service.saveNode(root.context, null);
+
+      //
+      sync(true);
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      root.addChild("daa");
+      Node tab3 = root.getChild(2);
+      assertEquals("daa", tab3.getName());
+      service.saveNode(root.context, null);
+
+      //
+      sync(true);
+
+      //
+      root = new NavigationServiceImpl(mgr).loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      for (Node child : root.getChildren())
+      {
+         System.out.println("child : " + child.getId());
+      }
+      tab3 = root.getChild(2);
+      assertEquals("daa", tab3.getName());
+
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      for (Node child : root.getChildren())
+      {
+         System.out.println("child : " + child.getId());
+      }
+      tab3 = root.getChild(2);
+      assertEquals("daa", tab3.getName());
+   }
+
+   public void _testWeirdBug() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "reorder_child_2");
+      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
+      rootNavigation.addChild("foo");
+      rootNavigation.addChild("bar");
+      rootNavigation.addChild("juu");
+
+      //
+      sync(true);
+
+      //
+      portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2");
+      rootNavigation = portal.getRootNavigation().getChild("default");
+      rootNavigation.getChild("bar").destroy();
+
+      //
+      sync(true);
+
+      //
+      portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2");
+      rootNavigation = portal.getRootNavigation().getChild("default");
+      rootNavigation.addChild("daa");
+
+      //
+      sync(true);
+
+      //
+      portal = mop.getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "reorder_child_2");
+      rootNavigation = portal.getRootNavigation().getChild("default");
+      Navigation daa = rootNavigation.getChildren().get(2);
+      assertEquals("daa", daa.getName());
+   }
+
+   public void _testWeirdBug2() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Session session = mop.getModel().getSession().getJCRSession();
+      javax.jcr.Node container = session.getRootNode().
+         getNode("mop:workspace/mop:portalsites").
+         addNode("mop:reorder_child_2").
+         getNode("mop:rootnavigation/mop:children").
+         addNode("mop:default").
+         getNode("mop:children");
+      container.addNode("mop:foo");
+      container.addNode("mop:bar");
+      container.addNode("mop:juu");
+
+      //
+      sync(true);
+
+      //
+      session = mop.getModel().getSession().getJCRSession();
+      container = session.getRootNode().getNode("mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children");
+      container.getNode("mop:bar").remove();
+
+      //
+      sync(true);
+
+      //
+      session = mop.getModel().getSession().getJCRSession();
+      container = session.getRootNode().getNode("mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children");
+      container.addNode("mop:daa");
+      container.orderBefore("mop:daa", null);
+
+      //
+      sync(true);
+
+      //
+      container = session.getRootNode().getNode("mop:workspace/mop:portalsites/mop:reorder_child_2/mop:rootnavigation/mop:children/mop:default/mop:children");
+      NodeIterator it = container.getNodes();
+      assertEquals("mop:foo", it.nextNode().getName());
+      assertEquals("mop:juu", it.nextNode().getName());
+      assertEquals("mop:daa", it.nextNode().getName());
+      assertFalse(it.hasNext());
+   }
+
+   public void testMoveChild() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "move_child");
+      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
+      rootNavigation.addChild("foo").addChild("juu");
+      rootNavigation.addChild("bar");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("move_child"));
+      Node root1 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+      Node foo1 = root1.getChild("foo");
+      Node bar1 = root1.getChild("bar");
+      Node juu1 = foo1.getChild("juu");
+      bar1.addChild(juu1);
+      service.saveNode(root1.context, null);
+
+      //
+      root1.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+      Node foo2 = root2.getChild("foo");
+      Node juu2 = foo2.getChild("juu");
+      assertNull(juu2);
+      Node bar2 = root2.getChild("bar");
+      juu2 = bar2.getChild("juu");
+      assertNotNull(juu2);
+
+      //
+      root1.assertEquals(root2);
+   }
+
+   public void testMoveAfter1() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_move_after_1");
+      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
+      rootNavigation.addChild("a");
+      rootNavigation.addChild("b");
+      rootNavigation.addChild("c");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_move_after_1"));
+      Node root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+      Node a = root.getChild("a");
+      Node b = root.getChild("b");
+      Node c = root.getChild("c");
+      root.addChild(1, a);
+      assertSame(a, root.getChild(0));
+      assertSame(b, root.getChild(1));
+      assertSame(c, root.getChild(2));
+      service.saveNode(root.context, null);
+
+      //
+      root.assertConsistent();
+      assertSame(a, root.getChild(0));
+      assertSame(b, root.getChild(1));
+      assertSame(c, root.getChild(2));
+
+      //
+      sync(true);
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+      a = root.getChild("a");
+      b = root.getChild("b");
+      c = root.getChild("c");
+      assertSame(a, root.getChild(0));
+      assertSame(b, root.getChild(1));
+      assertSame(c, root.getChild(2));
+   }
+
+   public void testMoveAfter2() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_move_after_2");
+      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
+      rootNavigation.addChild("a");
+      rootNavigation.addChild("b");
+      rootNavigation.addChild("c");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_move_after_2"));
+      Node root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+      Node a = root.getChild("a");
+      Node b = root.getChild("b");
+      Node c = root.getChild("c");
+      root.addChild(2, a);
+      assertSame(b, root.getChild(0));
+      assertSame(a, root.getChild(1));
+      assertSame(c, root.getChild(2));
+      service.saveNode(root.context, null);
+
+      //
+      root.assertConsistent();
+      assertSame(b, root.getChild(0));
+      assertSame(a, root.getChild(1));
+      assertSame(c, root.getChild(2));
+
+      //
+      sync(true);
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+      a = root.getChild("a");
+      b = root.getChild("b");
+      c = root.getChild("c");
+      assertSame(b, root.getChild(0));
+      assertSame(a, root.getChild(1));
+      assertSame(c, root.getChild(2));
+   }
+
+   public void testRenameNode() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "rename_node");
+      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
+      rootNavigation.addChild("foo");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("rename_node"));
+      Node root1 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+      Node foo1 = root1.getChild("foo");
+      foo1.setName("foo");
+      service.saveNode(root1.context, null);
+
+      //
+      root1.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      nav = service.loadNavigation(SiteKey.portal("rename_node"));
+      Node root2 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+
+      //
+      root1.assertEquals(root2);
+
+      //
+      Node foo2 = root2.getChild("foo");
+      foo2.setName("bar");
+      assertEquals("bar", foo2.getName());
+      assertSame(foo2, root2.getChild("bar"));
+      service.saveNode(root2.context, null);
+      assertEquals("bar", foo2.getName());
+      assertSame(foo2, root2.getChild("bar"));
+
+      //
+      root2.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      Node root3 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+      Node bar3 = root3.getChild("bar");
+      assertNotNull(bar3);
+      assertSame(bar3, root3.getChild("bar"));
+
+      //
+      root2.assertEquals(root3);
+
+      //
+      root3.addChild("foo");
+      try
+      {
+         bar3.setName("foo");
+         fail();
+      }
+      catch (IllegalArgumentException ignore)
+      {
+      }
+   }
+
+   public void testSaveChildren() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_children");
+      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
+      rootNavigation.addChild("1");
+      rootNavigation.addChild("2");
+      rootNavigation.addChild("3");
+      rootNavigation.addChild("4");
+      rootNavigation.addChild("5");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_children"));
+      Node root1 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      root1.removeChild("5");
+      root1.removeChild("2");
+      root1.addChild(0, root1.getChild("3"));
+      root1.addChild(1, root1.addChild("."));
+      service.saveNode(root1.context, null);
+      Iterator<Node> i = root1.getChildren().iterator();
+      assertEquals("3", i.next().getName());
+      assertEquals(".", i.next().getName());
+      assertEquals("1", i.next().getName());
+      assertEquals("4", i.next().getName());
+      assertFalse(i.hasNext());
+
+      //
+      root1.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      i = root2.getChildren().iterator();
+      assertEquals("3", i.next().getName());
+      assertEquals(".", i.next().getName());
+      assertEquals("1", i.next().getName());
+      assertEquals("4", i.next().getName());
+      assertFalse(i.hasNext());
+
+      //
+      root1.assertEquals(root2);
+   }
+
+   public void testSaveRecursive() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_recursive");
+      Navigation rootNavigation = portal.getRootNavigation().addChild("default");
+      rootNavigation.addChild("foo");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_recursive"));
+      Node root1 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+      Node foo1 = root1.getChild("foo");
+      Node bar1 = foo1.addChild("bar");
+      bar1.addChild("juu");
+      service.saveNode(root1.context, null);
+
+      //
+      root1.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+      Node foo2 = root2.getChild("foo");
+      Node bar2 = foo2.getChild("bar");
+      assertNotNull(bar2.getId());
+      Node juu2 = bar2.getChild("juu");
+      assertNotNull(juu2.getId());
+
+      //
+      root1.assertEquals(root2);
+   }
+
+   public void testSaveState() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_state");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_state"));
+      Node root1 = service.loadNode(Node.MODEL, nav, Scope.SINGLE, null).getNode();
+      NodeState state = root1.getState();
+      assertNull(state.getLabel());
+      assertEquals(-1, state.getStartPublicationTime());
+      assertEquals(-1, state.getEndPublicationTime());
+      long now = System.currentTimeMillis();
+      root1.setState(new NodeState.Builder().endPublicationTime(now).label("bar").build());
+      service.saveNode(root1.context, null);
+
+      //
+      root1.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+      state = root2.getState();
+      assertEquals("bar", state.getLabel());
+      assertEquals(-1, state.getStartPublicationTime());
+      assertEquals(now, state.getEndPublicationTime());
+      assertEquals(Visibility.DISPLAYED, state.getVisibility());
+
+      //
+      root1.assertEquals(root2);
+   }
+
+   public void _testSaveStateOverwrite() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_state_overwrite");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_state_overwrite"));
+      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      root.addChild("foo");
+      service.saveNode(root.context, null);
+
+      //
+      sync(true);
+
+      //
+      root.addChild("bar");
+      service.saveNode(root.context, null);
+
+      //
+      sync(true);
+
+      //
+      nav = service.loadNavigation(SiteKey.portal("save_state_overwrite"));
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      assertEquals(2, root.getChildren().size());
+   }
+
+   public void testRecreateNode() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "recreate_node");
+      portal.getRootNavigation().addChild("default").addChild("foo");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("recreate_node"));
+      Node root1 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      String fooId = root1.getChild("foo").getId();
+      assertTrue(root1.removeChild("foo"));
+      assertNull(root1.addChild("foo").getId());
+      service.saveNode(root1.context, null);
+
+      //
+      root1.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      assertNotNull(root2.getChild("foo").getId());
+      assertNotSame(fooId, root2.getChild("foo").getId());
+
+      //
+      root1.assertEquals(root2);
+   }
+
+   public void testMoveToAdded() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "move_to_added");
+      Navigation nav = portal.getRootNavigation().addChild("default");
+      nav.addChild("a").addChild("b");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("move_to_added"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.GRANDCHILDREN, null).getNode();
+      Node a1 = root1.getChild("a");
+      Node b1 = a1.getChild("b");
+      Node c1 = root1.addChild("c");
+      c1.addChild(b1);
+      service.saveNode(root1.context, null);
+
+      //
+      root1.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      navigation = service.loadNavigation(SiteKey.portal("move_to_added"));
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.GRANDCHILDREN, null).getNode();
+      Node a2 = root2.getChild("a");
+      assertNotNull(a2);
+      Node c2 = root2.getChild("c");
+      assertNotNull(c2);
+      Node b2 = c2.getChild("b");
+      assertNotNull(b2);
+
+      //
+      root1.assertEquals(root2);
+   }
+
+   public void testMoveFromRemoved() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "moved_from_removed");
+      Navigation nav = portal.getRootNavigation().addChild("default");
+      nav.addChild("a").addChild("c");
+      nav.addChild("b");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("moved_from_removed"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.GRANDCHILDREN, null).getNode();
+      Node a1 = root1.getChild("a");
+      Node b1 = root1.getChild("b");
+      Node c1 = a1.getChild("c");
+      b1.addChild(c1);
+      root1.removeChild("a");
+      service.saveNode(root1.context, null);
+
+      //
+      root1.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      navigation = service.loadNavigation(SiteKey.portal("moved_from_removed"));
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.GRANDCHILDREN, null).getNode();
+      assertNull(root2.getChild("a"));
+      Node b2 = root2.getChild("b");
+      assertNotNull(b2);
+      Node c2 = b2.getChild("c");
+      assertNotNull(c2);
+
+      //
+      root1.assertEquals(root2);
+   }
+
+   public void testRemoveAdded() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "remove_added");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("remove_added"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.GRANDCHILDREN, null).getNode();
+      root.addChild("foo");
+      root.removeChild("foo");
+      service.saveNode(root.context, null);
+
+      //
+      root.assertConsistent();
+
+      //
+      sync(true);
+
+      //
+      root = service.loadNode(Node.MODEL, navigation, Scope.GRANDCHILDREN, null).getNode();
+      assertEquals(0, root.getChildren().size());
+   }
+
+   public void testRenameCreatedNode() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_rename_created");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("save_rename_created"));
+      Node root = service.loadNode(Node.MODEL, nav, Scope.ALL, null).getNode();
+      Node temp = root.addChild("temp");
+      temp.setName("bar");
+      Iterator<NodeChange<Node>> changes = root.save(service);
+      assertFalse(changes.hasNext());
+   }
+
+   public void testConcurrentAddToRemoved() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "add_to_removed");
+      portal.getRootNavigation().addChild("default").addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("add_to_removed"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root.getChild("a").addChild("b");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.removeChild("a");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      try
+      {
+         service.saveNode(root.context, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.ADD_CONCURRENTLY_REMOVED_PARENT_NODE, e.getError());
+      }
+   }
+
+   public void testConcurrentMerge() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_merge");
+      Navigation nav = portal.getRootNavigation().addChild("default");
+      nav.addChild("a");
+      nav.addChild("b");
+      nav.addChild("c");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("save_merge"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+
+      //
+      sync();
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+      root2.addChild(1, root2.addChild("2"));
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      service.saveNode(root1.context, null);
+      root1.assertConsistent();
+
+      //
+      root1.addChild(1, root1.addChild("1"));
+      service.saveNode(root1.context, null);
+      root1.assertConsistent();
+   }
+
+   public void testConcurrentRemoveRemoved() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "remove_removed");
+      portal.getRootNavigation().addChild("default").addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("remove_removed"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.removeChild("a");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.removeChild("a");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      service.saveNode(root1.context, null);
+
+      //
+      root1.assertEquals(root2);
+   }
+
+   public void testConcurrentMoveRemoved() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "move_removed");
+      portal.getRootNavigation().addChild("default").addChild("a").addChild("b");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("move_removed"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.addChild(root1.getChild("a").getChild("b"));
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.getChild("a").removeChild("b");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      try
+      {
+         service.saveNode(root1.context, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.MOVE_CONCURRENTLY_REMOVED_MOVED_NODE, e.getError());
+      }
+   }
+
+   public void testConcurrentMoveToRemoved() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "move_to_removed");
+      portal.getRootNavigation().addChild("default").addChild("a");
+      portal.getRootNavigation().getChild("default").addChild("b");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("move_to_removed"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.getChild("b").addChild(root1.getChild("a"));
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.removeChild("b");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      try
+      {
+         service.saveNode(root1.context, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.MOVE_CONCURRENTLY_REMOVED_DST_NODE, e.getError());
+      }
+   }
+
+   public void testConcurrentMoveMoved() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "move_moved");
+      portal.getRootNavigation().addChild("default").addChild("a");
+      portal.getRootNavigation().getChild("default").addChild("b");
+      portal.getRootNavigation().getChild("default").addChild("c");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("move_moved"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.getChild("b").addChild(root1.getChild("a"));
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.getChild("c").addChild(root2.getChild("a"));
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      try
+      {
+         service.saveNode(root1.context, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.MOVE_CONCURRENTLY_CHANGED_SRC_NODE, e.getError());
+      }
+   }
+
+   public void testConcurrentAddDuplicate() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "concurrent_add_duplicate");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("concurrent_add_duplicate"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.addChild("a");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      root1.addChild("a");
+      try
+      {
+         service.saveNode(root1.context, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.ADD_CONCURRENTLY_ADDED_NODE, e.getError());
+      }
+   }
+
+   public void testConcurrentAddAfterRemoved() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "concurrent_add_after_removed");
+      portal.getRootNavigation().addChild("default").addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("concurrent_add_after_removed"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.addChild(1, "b");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.removeChild("a");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      try
+      {
+         service.saveNode(root1.context, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.ADD_CONCURRENTLY_REMOVED_PREVIOUS_NODE, e.getError());
+      }
+   }
+
+   public void testConcurrentMoveAfterRemoved() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "concurrent_move_after_removed");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a").addChild("b");
+      def.addChild("c");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("concurrent_move_after_removed"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.addChild(2, root1.getChild("a").getChild("b"));
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.removeChild("c");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      try
+      {
+         service.saveNode(root1.context, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.MOVE_CONCURRENTLY_REMOVED_PREVIOUS_NODE, e.getError());
+      }
+   }
+
+   public void testConcurrentMoveFromRemoved() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "concurrent_move_from_removed");
+      portal.getRootNavigation().addChild("default").addChild("a").addChild("b");
+      portal.getRootNavigation().getChild("default").addChild("c");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("concurrent_move_from_removed"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.getChild("c").addChild(root1.getChild("a").getChild("b"));
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.removeChild("a");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      try
+      {
+         service.saveNode(root1.context, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.MOVE_CONCURRENTLY_REMOVED_SRC_NODE, e.getError());
+      }
+   }
+
+   public void testConcurrentRenameRemoved() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "concurrent_rename_removed");
+      portal.getRootNavigation().addChild("default").addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("concurrent_rename_removed"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.getChild("a").setName("b");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.removeChild("a");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      try
+      {
+         service.saveNode(root1.context, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.RENAME_CONCURRENTLY_REMOVED_NODE, e.getError());
+      }
+   }
+
+   public void testConcurrentDuplicateRename() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "concurrent_duplicate_rename");
+      portal.getRootNavigation().addChild("default").addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("concurrent_duplicate_rename"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.getChild("a").setName("b");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.addChild("b");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      try
+      {
+         service.saveNode(root1.context, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.RENAME_CONCURRENTLY_DUPLICATE_NAME, e.getError());
+      }
+   }
+
+   public void testSavePhantomNode() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "concurrent_save");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("concurrent_save"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.addChild("a");
+      service.saveNode(root1.context, null);
+
+      //
+      sync(true);
+
+      // Reload the root node and modify it
+      root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.getChild("a").setState(root1.getState().builder().label("foo").build());
+
+      //
+      sync(true);
+
+      // Edit navigation in another browser
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.removeChild("a");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      // Now click Save button in the first browser
+      try
+      {
+         service.saveNode(root1.context, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE, e.getError());
+      }
+   }
+
+   public void testConcurrentRemovalDoesNotPreventSave() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "removal_does_not_prevent_save");
+      portal.getRootNavigation().addChild("default").addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("removal_does_not_prevent_save"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.removeChild("a");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      service.saveNode(root1.context, null);
+   }
+
+   public void testConcurrentRename() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_concurrent_rename");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("save_concurrent_rename"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      Node a = root1.getChild("a");
+      a.setName("b");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      Node a2 = root2.getChild("a");
+      a2.setName("c");
+      service.saveNode(root2.context, null);
+
+      //
+      Iterator<NodeChange<Node>> changes = root1.save(service);
+      assertFalse(changes.hasNext());
+   }
+
+   public void testRemovedNavigation() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_removed_navigation");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("save_removed_navigation"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      service.destroyNavigation(navigation);
+
+      //
+      sync(true);
+
+      //
+      try
+      {
+         service.saveNode(root.context, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertSame(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE, e.getError());
+      }
+   }
+
+   public void testPendingChangesBypassCache() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "pending_changes_bypass_cache");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext nav = service.loadNavigation(SiteKey.portal("pending_changes_bypass_cache"));
+      Node root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      root.addChild("foo");
+      service.saveNode(root.context, null);
+
+      //
+      root = service.loadNode(Node.MODEL, nav, Scope.CHILDREN, null).getNode();
+      assertNotNull(root.getChild("foo"));
+   }
+
+   public void testAtomic() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_atomic");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a");
+      def.addChild("b");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("save_atomic"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.getChild("a").addChild("c");
+      root1.getChild("b").addChild("d");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.removeChild("b");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      assertFalse(mgr.getSession().isModified());
+
+      //
+      try
+      {
+         service.saveNode(root1.context, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertSame(NavigationError.ADD_CONCURRENTLY_REMOVED_PARENT_NODE, e.getError());
+      }
+
+      //
+      assertFalse(mgr.getSession().isModified());
+   }
+
+   public void testRebase() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "save_rebase");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("save_rebase"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      Node a = root1.getChild("a");
+      Node b = root1.addChild("b");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.addChild("c");
+      service.saveNode(root2.context, null);
+
+      //
+      Iterator<NodeChange<Node>> changes = root1.save(service);
+      NodeChange.Added<Node> added = (NodeChange.Added<Node>)changes.next();
+      Node c = added.getTarget();
+      assertEquals("c", c.getName());
+      assertFalse(changes.hasNext());
+      assertSame(a, root1.getChild(0));
+      assertSame(b, root1.getChild(1));
+      assertSame(c, root1.getChild(2));
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceUpdate.java
===================================================================
--- portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceUpdate.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceUpdate.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,699 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.portal.mop.SiteKey;
-import org.gatein.mop.api.workspace.Navigation;
-import org.gatein.mop.api.workspace.ObjectType;
-import org.gatein.mop.api.workspace.Site;
-import org.gatein.mop.core.api.MOPService;
-
-import java.util.Iterator;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class TestNavigationServiceUpdate extends AbstractTestNavigationService
-{
-
-   public void testNoop() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_no_op");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("a");
-      def.addChild("b");
-      def.addChild("c");
-      def.addChild("d");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_no_op"));
-      NodeContext<Node> root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null);
-      Iterator<NodeChange<Node>> it = root.node.update(service, null);
-      assertFalse(it.hasNext());
-   }
-
-   public void testHasChanges() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_cannot_save");
-      Navigation def = portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_no_op"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-
-      //
-      assertFalse(root.context.hasChanges());
-      root.addChild("foo");
-      assertTrue(root.context.hasChanges());
-
-      //
-      try
-      {
-         root.update(service, null);
-      }
-      catch (IllegalArgumentException expected)
-      {
-      }
-
-      //
-      assertTrue(root.context.hasChanges());
-      service.saveNode(root.context, null);
-      assertFalse(root.context.hasChanges());
-
-      //
-      Iterator<NodeChange<Node>> it = root.update(service, null);
-      assertFalse(it.hasNext());
-   }
-
-   public void testAddFirst() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_add_first");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_add_first"));
-      NodeContext<Node> root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null);
-      assertEquals(0, root1.getNodeSize());
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.addChild("a");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      root1.node.update(service, null);
-      assertEquals(1, root1.getNodeSize());
-      Node a = root1.getNode(0);
-      assertEquals("a", a.getName());
-
-   }
-
-   public void testAddSecond() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_add_second");
-      portal.getRootNavigation().addChild("default").addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_add_second"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      Node a = root1.getChild("a");
-      assertEquals(1, root1.getSize());
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.addChild("b");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      Iterator<NodeChange<Node>> changes = root1.update(service, null);
-      NodeChange.Added<Node> added = (NodeChange.Added<Node>)changes.next();
-      assertSame(root1, added.getParent());
-      assertSame(root1.getChild("b"), added.getTarget());
-      assertSame(a, added.getPrevious());
-      assertFalse(changes.hasNext());
-      assertEquals(2, root1.getSize());
-      assertEquals("a", root1.getChild(0).getName());
-      assertEquals("b", root1.getChild(1).getName());
-   }
-
-   public void testRemove() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_remove");
-      portal.getRootNavigation().addChild("default").addChild("a");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_remove"));
-      NodeContext<Node> root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null);
-      assertEquals(1, root1.getNodeSize());
-      Node a = root1.getNode("a");
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.removeChild("a");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      Iterator<NodeChange<Node>> changes = root1.node.update(service, null);
-      NodeChange.Removed<Node> removed = (NodeChange.Removed<Node>)changes.next();
-      assertSame(root1.node, removed.getParent());
-      assertSame(a, removed.getTarget());
-      assertFalse(changes.hasNext());
-      assertEquals(0, root1.getNodeSize());
-   }
-
-   public void testMove() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_move");
-      portal.getRootNavigation().addChild("default").addChild("a").addChild("b");
-      portal.getRootNavigation().getChild("default").addChild("c");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_move"));
-      NodeContext<Node> root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null);
-      assertEquals(2, root1.getNodeSize());
-      Node a = root1.getNode("a");
-      Node b = a.getChild("b");
-      Node c = root1.getNode("c");
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.getChild("c").addChild(root2.getChild("a").getChild("b"));
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      Iterator<NodeChange<Node>> changes = root1.node.update(service, null);
-      NodeChange.Moved<Node> moved = (NodeChange.Moved<Node>)changes.next();
-      assertSame(a, moved.getFrom());
-      assertSame(c, moved.getTo());
-      assertSame(b, moved.getTarget());
-      assertSame(null, moved.getPrevious());
-      assertFalse(changes.hasNext());
-      assertEquals(0, root1.getNode("a").getSize());
-      assertEquals(1, root1.getNode("c").getSize());
-   }
-
-   public void testAddWithSameName() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_add_with_same_name");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_add_with_same_name"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.addChild("a").addChild("b");
-      root1.addChild("c");
-      service.saveNode(root1.context, null);
-
-      //
-      sync(true);
-
-      //
-      root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      Node a = root1.getChild("a");
-      Node b = a.getChild("b");
-      Node c = root1.getChild("c");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root2.getChild("c").addChild(root2.getChild("a").getChild("b"));
-      Node b2 = root2.getChild("a").addChild("b");
-      service.saveNode(root2.context, null);
-
-      //
-      Iterator<NodeChange<Node>> changes = root1.update(service, null);
-      NodeChange.Added<Node> added = (NodeChange.Added<Node>)changes.next();
-      assertNull(added.getPrevious());
-      assertSame(a, added.getParent());
-      NodeChange.Moved<Node> moved = (NodeChange.Moved<Node>)changes.next();
-      assertNull(moved.getPrevious());
-      assertSame(a, moved.getFrom());
-      assertSame(c, moved.getTo());
-      assertSame(b, moved.getTarget());
-      assertFalse(changes.hasNext());
-
-      //
-      assertSame(a, root1.getChild("a"));
-      assertSame(c, root1.getChild("c"));
-      assertSame(b, c.getChild("b"));
-      assertEquals(b2.getId(), a.getChild("b").getId());
-      assertSame(a.getChild("b"), added.getTarget());
-   }
-
-   public void testComplex() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_complex");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_complex"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      Node a1 = root1.addChild("a");
-      a1.addChild("c");
-      a1.addChild("d");
-      a1.addChild("e");
-      Node b1 = root1.addChild("b");
-      b1.addChild("f");
-      b1.addChild("g");
-      b1.addChild("h");
-      service.saveNode(root1.context, null);
-
-      //
-      sync(true);
-
-      //
-      root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      a1 = root1.getChild("a");
-      Node c1 = a1.getChild("c");
-      Node d1 = a1.getChild("d");
-      Node e1 = a1.getChild("e");
-      b1 = root1.getChild("b");
-      Node f1 = b1.getChild("f");
-      Node g1 = b1.getChild("g");
-      Node h1 = b1.getChild("h");
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      Node a2 = root2.getChild("a");
-      a2.removeChild("e");
-      Node b2 = root2.getChild("b");
-      b2.addChild(2, a2.getChild("d"));
-      a2.addChild(1, "d");
-      b2.removeChild("g");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      Iterator<NodeChange<Node>> changes = root1.update(service, null);
-      NodeChange.Added<Node> added = (NodeChange.Added<Node>)changes.next();
-      assertSame(a1, added.getParent());
-      assertEquals("d", added.getTarget().getName());
-      assertSame(c1, added.getPrevious());
-      NodeChange.Removed<Node> removed1 = (NodeChange.Removed<Node>)changes.next();
-      assertSame(a1 , removed1.getParent());
-      assertSame(e1 , removed1.getTarget());
-      NodeChange.Moved<Node> moved = (NodeChange.Moved<Node>)changes.next();
-      assertSame(a1 , moved.getFrom());
-      assertSame(b1 , moved.getTo());
-      assertSame(d1 , moved.getTarget());
-      assertSame(f1 , moved.getPrevious());
-      NodeChange.Removed<Node> removed2 = (NodeChange.Removed<Node>)changes.next();
-      assertSame(b1 , removed2.getParent());
-      assertSame(g1 , removed2.getTarget());
-      assertFalse(changes.hasNext());
-
-      //
-      assertSame(a1, root1.getChild("a"));
-      assertSame(b1, root1.getChild("b"));
-      assertEquals(2, a1.getSize());
-      assertSame(c1, a1.getChild(0));
-      assertNotNull(a1.getChild(1));
-      assertEquals("d", a1.getChild(1).getName());
-      assertFalse(d1.getId().equals(a1.getChild(1).getId()));
-      assertEquals(3, b1.getSize());
-      assertSame(f1, b1.getChild(0));
-      assertSame(d1, b1.getChild(1));
-      assertSame(h1, b1.getChild(2));
-   }
-
-   public void testReplaceChild() throws NullPointerException, NavigationServiceException
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_replace_child");
-      portal.getRootNavigation().addChild("default").addChild("foo");
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_replace_child"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-      String foo1Id = root1.getChild("foo").getId();
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-      root2.removeChild("foo");
-      Node foo = root2.addChild("foo");
-      foo.setState(new NodeState.Builder().label("foo2").build());
-      service.saveNode(root2.context, null);
-      String foo2Id = foo.getId();
-      sync(true);
-
-      //
-      Iterator<NodeChange<Node>> changes = root1.update(service, null);
-      NodeChange.Added<Node> added = (NodeChange.Added<Node>)changes.next();
-      assertEquals(foo2Id, added.getTarget().getId());
-      NodeChange.Removed<Node> removed = (NodeChange.Removed<Node>)changes.next();
-      assertEquals(foo1Id, removed.getTarget().getId());
-      assertFalse(changes.hasNext());
-
-      //
-      foo = root1.getChild("foo");
-      assertEquals(foo2Id, foo.getId());
-      assertEquals("foo2", root1.getChild("foo").getState().getLabel());
-   }
-
-   public void testRename() throws NullPointerException, NavigationServiceException
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_rename");
-      portal.getRootNavigation().addChild("default").addChild("foo");
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_rename"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-      root2.getChild("foo").setName("bar");
-      service.saveNode(root2.context, null);
-      sync(true);
-
-      //
-      Iterator<NodeChange<Node>> it = root1.update(service, null);
-      Node bar = root1.getChild(0);
-      assertEquals("bar", bar.getName());
-      NodeChange.Renamed<Node> renamed = (NodeChange.Renamed<Node>)it.next();
-      assertEquals("bar", renamed.getName());
-      assertSame(bar, renamed.getTarget());
-   }
-
-   public void testState() throws NullPointerException, NavigationServiceException
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_state");
-      portal.getRootNavigation().addChild("default").addChild("foo").addChild("bar");
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_state"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-      Node root3 = service.loadNode(Node.MODEL, navigation, Scope.GRANDCHILDREN, null).getNode();
-
-      //
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-      root.getChild("foo").setState(new NodeState.Builder().label("foo").build());
-      service.saveNode(root.context, null);
-      sync(true);
-
-      //
-      Iterator<NodeChange<Node>> changes = root1.update(service, Scope.GRANDCHILDREN);
-      Node foo = root1.getChild("foo");
-      assertEquals("foo", foo.getState().getLabel());
-      NodeChange.Added<Node> added = (NodeChange.Added<Node>)changes.next();
-      assertEquals("bar", added.getTarget().getName());
-      assertEquals(null, added.previous);
-      assertEquals("bar", added.target.getName());
-      NodeChange.Updated<Node> updated = (NodeChange.Updated<Node>)changes.next();
-      assertSame(foo, updated.getTarget());
-      assertEquals(new NodeState.Builder().label("foo").build(), updated.getState());
-      assertFalse(changes.hasNext());
-
-      //
-      changes = root2.update(service, null);
-      foo = root2.getChild("foo");
-      assertEquals("foo", foo.getState().getLabel());
-      updated = (NodeChange.Updated<Node>)changes.next();
-      assertSame(foo, updated.getTarget());
-      assertEquals(new NodeState.Builder().label("foo").build(), updated.getState());
-      assertFalse(changes.hasNext());
-
-      //
-      changes = root3.update(service, null);
-      foo = root3.getChild("foo");
-      assertEquals("foo", foo.getState().getLabel());
-      updated = (NodeChange.Updated<Node>)changes.next();
-      assertSame(foo, updated.getTarget());
-      assertEquals(new NodeState.Builder().label("foo").build(), updated.getState());
-      assertFalse(changes.hasNext());
-   }
-
-   public void testUseMostActualChildren() throws NullPointerException, NavigationServiceException
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_with_most_actual_children");
-      portal.getRootNavigation().addChild("default").addChild("foo").addChild("bar");
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_with_most_actual_children"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-      Node foo = root.getChild("foo");
-      sync(true);
-
-      //
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.getChild("foo").removeChild("bar");
-      service.saveNode(root1.context, null);
-      sync(true);
-
-      //
-      foo.update(service, Scope.CHILDREN);
-      assertNull(foo.getChild("bar"));
-
-      // Update a second time (it actually test a previous bug)
-      foo.update(service, Scope.CHILDREN);
-      assertNull(foo.getChild("bar"));
-   }
-
-   public void testUpdateDeletedNode() throws NullPointerException, NavigationServiceException
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_deleted_node");
-      portal.getRootNavigation().addChild("default").addChild("foo").addChild("bar");
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_deleted_node"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      Node bar = root.getChild("foo").getChild("bar");
-      sync(true);
-
-      //
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.getChild("foo").removeChild("bar");
-      service.saveNode(root1.context, null);
-      sync(true);
-
-      //
-      Iterator<NodeChange<Node>>  changes = bar.update(service, Scope.CHILDREN);
-      NodeChange.Removed<Node> removed = (NodeChange.Removed<Node>)changes.next();
-      assertSame(bar, removed.getTarget());
-      assertFalse(changes.hasNext());
-   }
-
-   public void testLoadEvents() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_load_events");
-      Navigation fooNav = portal.getRootNavigation().addChild("default").addChild("foo");
-      fooNav.addChild("bar1");
-      fooNav.addChild("bar2");
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_load_events"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.SINGLE, null).getNode();
-
-      //
-      Iterator<NodeChange<Node>> changes = root.update(service, Scope.ALL);
-
-      //
-      Node foo = root.getChild(0);
-      assertEquals("foo", foo.getName());
-      Node bar1 = foo.getChild(0);
-      assertEquals("bar1", bar1.getName());
-      Node bar2 = foo.getChild(1);
-      assertEquals("bar2", bar2.getName());
-
-      //
-      NodeChange.Added<Node> added1 = (NodeChange.Added<Node>)changes.next();
-      assertSame(foo, added1.getTarget());
-      NodeChange.Added<Node> added2 = (NodeChange.Added<Node>)changes.next();
-      assertSame(bar1, added2.getTarget());
-      NodeChange.Added<Node> added3 = (NodeChange.Added<Node>)changes.next();
-      assertSame(bar2, added3.getTarget());
-      assertFalse(changes.hasNext());
-   }
-
-   public void testUpdateTwice2() throws NullPointerException, NavigationServiceException
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_twice2");
-      portal.getRootNavigation().addChild("default").addChild("foo").addChild("bar");
-      sync(true);
-
-      //Browser 1 : Expand the "foo" node
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_twice2"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-      Node foo = root.getChild("foo");
-      //If this line is commented, the test is passed
-      service.updateNode(foo.context, Scope.CHILDREN, null);
-      sync(true);
-
-      //Browser 2: Change the "foo" node
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      root1.getChild("foo").removeChild("bar");
-      service.saveNode(root1.context, null);
-      sync(true);
-
-      //Browser 1: Try to expand the "foo" node 2 times ---> NPE after the 2nd updateNode method
-      service.updateNode(foo.context, Scope.CHILDREN, null);
-      service.updateNode(foo.context, Scope.CHILDREN, null);
-   }
-
-   public void testMove2() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_move2");
-      portal.getRootNavigation().addChild("default").addChild("a").addChild("b");
-      portal.getRootNavigation().getChild("default").addChild("c");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_move2"));
-      NodeContext<Node> root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null);
-      Node a = root.getNode("a");
-      Node b = a.getChild("b");
-      Node c = root.getNode("c");
-
-      //Browser 2 : move the node "b" from "a" to "c"
-      NodeContext<Node> root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null);
-      root1.getNode("c").addChild(root1.getNode("a").getChild("b"));
-      service.saveNode(root1.getNode().context, null);
-      //
-      sync(true);
-
-      //Browser 1: need NodeChange event to update UI
-      NodeChangeQueue<NodeContext<Node>> queue = new NodeChangeQueue<NodeContext<Node>>();
-      //If update "root1"  --> NodeChange.Moved  --> ok
-      //If update "b"        --> NodeChange.Add      --> ok
-      //update "a"             --> no NodeChange, we need an event here (NodeChange.Remove) so UI can be updated
-      service.updateNode(a.context, Scope.CHILDREN, queue);
-      Iterator<NodeChange<NodeContext<Node>>> changes = queue.iterator();
-      assertTrue(changes.hasNext());
-   }
-
-   public void testScope() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_scope");
-      portal.getRootNavigation().addChild("default").addChild("a").addChild("b");
-      portal.getRootNavigation().getChild("default").addChild("c").addChild("d");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_scope"));
-      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).node;
-      Node a = root1.getChild("a");
-      Node c = root1.getChild("c");
-      assertFalse(a.context.isExpanded());
-      assertFalse(c.context.isExpanded());
-
-      //
-      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
-      root2.addChild("e");
-      service.saveNode(root2.context, null);
-
-      //
-      sync(true);
-
-      //
-      service.updateNode(a.context, Scope.CHILDREN, null);
-      assertSame(a, root1.getChild("a"));
-      assertSame(c, root1.getChild("c"));
-      assertNotNull(root1.getChild("e"));
-      assertTrue(a.context.isExpanded());
-      assertFalse(c.context.isExpanded());
-      assertNotNull(a.getChild("b"));
-   }
-
-   public void _testPendingChange() throws NullPointerException, NavigationServiceException
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_pending_change");
-      Navigation def = portal.getRootNavigation().addChild("default");
-      def.addChild("foo");
-      def.addChild("bar");
-      sync(true);
-
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_pending_change"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-      Node foo = root.getChild("foo");
-      Node bar = root.getChild("bar");
-
-      //Expand and change the "bar" node
-      service.updateNode(bar.context, Scope.CHILDREN, null);
-      bar.addChild("juu");
-
-      //--->  IllegalArgumentException
-      //Can't expand the "foo" node, even it doesn't have any pending changes
-      service.updateNode(foo.context, Scope.CHILDREN, null);
-   }
-
-   public void testRemovedNavigation() throws Exception
-   {
-      MOPService mop = mgr.getPOMService();
-      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_removed_navigation");
-      portal.getRootNavigation().addChild("default");
-
-      //
-      sync(true);
-
-      //
-      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_removed_navigation"));
-      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
-      service.destroyNavigation(navigation);
-
-      //
-      sync(true);
-
-      //
-      try
-      {
-         service.updateNode(root.context, null, null);
-      }
-      catch (NavigationServiceException e)
-      {
-         assertSame(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE, e.getError());
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceUpdate.java (from rev 6783, portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceUpdate.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceUpdate.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceUpdate.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,699 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.portal.mop.SiteKey;
+import org.gatein.mop.api.workspace.Navigation;
+import org.gatein.mop.api.workspace.ObjectType;
+import org.gatein.mop.api.workspace.Site;
+import org.gatein.mop.core.api.MOPService;
+
+import java.util.Iterator;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class TestNavigationServiceUpdate extends AbstractTestNavigationService
+{
+
+   public void testNoop() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_no_op");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("a");
+      def.addChild("b");
+      def.addChild("c");
+      def.addChild("d");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_no_op"));
+      NodeContext<Node> root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null);
+      Iterator<NodeChange<Node>> it = root.node.update(service, null);
+      assertFalse(it.hasNext());
+   }
+
+   public void testHasChanges() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_cannot_save");
+      Navigation def = portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_no_op"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+
+      //
+      assertFalse(root.context.hasChanges());
+      root.addChild("foo");
+      assertTrue(root.context.hasChanges());
+
+      //
+      try
+      {
+         root.update(service, null);
+      }
+      catch (IllegalArgumentException expected)
+      {
+      }
+
+      //
+      assertTrue(root.context.hasChanges());
+      service.saveNode(root.context, null);
+      assertFalse(root.context.hasChanges());
+
+      //
+      Iterator<NodeChange<Node>> it = root.update(service, null);
+      assertFalse(it.hasNext());
+   }
+
+   public void testAddFirst() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_add_first");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_add_first"));
+      NodeContext<Node> root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null);
+      assertEquals(0, root1.getNodeSize());
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.addChild("a");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      root1.node.update(service, null);
+      assertEquals(1, root1.getNodeSize());
+      Node a = root1.getNode(0);
+      assertEquals("a", a.getName());
+
+   }
+
+   public void testAddSecond() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_add_second");
+      portal.getRootNavigation().addChild("default").addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_add_second"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      Node a = root1.getChild("a");
+      assertEquals(1, root1.getSize());
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.addChild("b");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      Iterator<NodeChange<Node>> changes = root1.update(service, null);
+      NodeChange.Added<Node> added = (NodeChange.Added<Node>)changes.next();
+      assertSame(root1, added.getParent());
+      assertSame(root1.getChild("b"), added.getTarget());
+      assertSame(a, added.getPrevious());
+      assertFalse(changes.hasNext());
+      assertEquals(2, root1.getSize());
+      assertEquals("a", root1.getChild(0).getName());
+      assertEquals("b", root1.getChild(1).getName());
+   }
+
+   public void testRemove() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_remove");
+      portal.getRootNavigation().addChild("default").addChild("a");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_remove"));
+      NodeContext<Node> root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null);
+      assertEquals(1, root1.getNodeSize());
+      Node a = root1.getNode("a");
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.removeChild("a");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      Iterator<NodeChange<Node>> changes = root1.node.update(service, null);
+      NodeChange.Removed<Node> removed = (NodeChange.Removed<Node>)changes.next();
+      assertSame(root1.node, removed.getParent());
+      assertSame(a, removed.getTarget());
+      assertFalse(changes.hasNext());
+      assertEquals(0, root1.getNodeSize());
+   }
+
+   public void testMove() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_move");
+      portal.getRootNavigation().addChild("default").addChild("a").addChild("b");
+      portal.getRootNavigation().getChild("default").addChild("c");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_move"));
+      NodeContext<Node> root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null);
+      assertEquals(2, root1.getNodeSize());
+      Node a = root1.getNode("a");
+      Node b = a.getChild("b");
+      Node c = root1.getNode("c");
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.getChild("c").addChild(root2.getChild("a").getChild("b"));
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      Iterator<NodeChange<Node>> changes = root1.node.update(service, null);
+      NodeChange.Moved<Node> moved = (NodeChange.Moved<Node>)changes.next();
+      assertSame(a, moved.getFrom());
+      assertSame(c, moved.getTo());
+      assertSame(b, moved.getTarget());
+      assertSame(null, moved.getPrevious());
+      assertFalse(changes.hasNext());
+      assertEquals(0, root1.getNode("a").getSize());
+      assertEquals(1, root1.getNode("c").getSize());
+   }
+
+   public void testAddWithSameName() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_add_with_same_name");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_add_with_same_name"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.addChild("a").addChild("b");
+      root1.addChild("c");
+      service.saveNode(root1.context, null);
+
+      //
+      sync(true);
+
+      //
+      root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      Node a = root1.getChild("a");
+      Node b = a.getChild("b");
+      Node c = root1.getChild("c");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root2.getChild("c").addChild(root2.getChild("a").getChild("b"));
+      Node b2 = root2.getChild("a").addChild("b");
+      service.saveNode(root2.context, null);
+
+      //
+      Iterator<NodeChange<Node>> changes = root1.update(service, null);
+      NodeChange.Added<Node> added = (NodeChange.Added<Node>)changes.next();
+      assertNull(added.getPrevious());
+      assertSame(a, added.getParent());
+      NodeChange.Moved<Node> moved = (NodeChange.Moved<Node>)changes.next();
+      assertNull(moved.getPrevious());
+      assertSame(a, moved.getFrom());
+      assertSame(c, moved.getTo());
+      assertSame(b, moved.getTarget());
+      assertFalse(changes.hasNext());
+
+      //
+      assertSame(a, root1.getChild("a"));
+      assertSame(c, root1.getChild("c"));
+      assertSame(b, c.getChild("b"));
+      assertEquals(b2.getId(), a.getChild("b").getId());
+      assertSame(a.getChild("b"), added.getTarget());
+   }
+
+   public void testComplex() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_complex");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_complex"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      Node a1 = root1.addChild("a");
+      a1.addChild("c");
+      a1.addChild("d");
+      a1.addChild("e");
+      Node b1 = root1.addChild("b");
+      b1.addChild("f");
+      b1.addChild("g");
+      b1.addChild("h");
+      service.saveNode(root1.context, null);
+
+      //
+      sync(true);
+
+      //
+      root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      a1 = root1.getChild("a");
+      Node c1 = a1.getChild("c");
+      Node d1 = a1.getChild("d");
+      Node e1 = a1.getChild("e");
+      b1 = root1.getChild("b");
+      Node f1 = b1.getChild("f");
+      Node g1 = b1.getChild("g");
+      Node h1 = b1.getChild("h");
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      Node a2 = root2.getChild("a");
+      a2.removeChild("e");
+      Node b2 = root2.getChild("b");
+      b2.addChild(2, a2.getChild("d"));
+      a2.addChild(1, "d");
+      b2.removeChild("g");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      Iterator<NodeChange<Node>> changes = root1.update(service, null);
+      NodeChange.Added<Node> added = (NodeChange.Added<Node>)changes.next();
+      assertSame(a1, added.getParent());
+      assertEquals("d", added.getTarget().getName());
+      assertSame(c1, added.getPrevious());
+      NodeChange.Removed<Node> removed1 = (NodeChange.Removed<Node>)changes.next();
+      assertSame(a1 , removed1.getParent());
+      assertSame(e1 , removed1.getTarget());
+      NodeChange.Moved<Node> moved = (NodeChange.Moved<Node>)changes.next();
+      assertSame(a1 , moved.getFrom());
+      assertSame(b1 , moved.getTo());
+      assertSame(d1 , moved.getTarget());
+      assertSame(f1 , moved.getPrevious());
+      NodeChange.Removed<Node> removed2 = (NodeChange.Removed<Node>)changes.next();
+      assertSame(b1 , removed2.getParent());
+      assertSame(g1 , removed2.getTarget());
+      assertFalse(changes.hasNext());
+
+      //
+      assertSame(a1, root1.getChild("a"));
+      assertSame(b1, root1.getChild("b"));
+      assertEquals(2, a1.getSize());
+      assertSame(c1, a1.getChild(0));
+      assertNotNull(a1.getChild(1));
+      assertEquals("d", a1.getChild(1).getName());
+      assertFalse(d1.getId().equals(a1.getChild(1).getId()));
+      assertEquals(3, b1.getSize());
+      assertSame(f1, b1.getChild(0));
+      assertSame(d1, b1.getChild(1));
+      assertSame(h1, b1.getChild(2));
+   }
+
+   public void testReplaceChild() throws NullPointerException, NavigationServiceException
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_replace_child");
+      portal.getRootNavigation().addChild("default").addChild("foo");
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_replace_child"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+      String foo1Id = root1.getChild("foo").getId();
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+      root2.removeChild("foo");
+      Node foo = root2.addChild("foo");
+      foo.setState(new NodeState.Builder().label("foo2").build());
+      service.saveNode(root2.context, null);
+      String foo2Id = foo.getId();
+      sync(true);
+
+      //
+      Iterator<NodeChange<Node>> changes = root1.update(service, null);
+      NodeChange.Added<Node> added = (NodeChange.Added<Node>)changes.next();
+      assertEquals(foo2Id, added.getTarget().getId());
+      NodeChange.Removed<Node> removed = (NodeChange.Removed<Node>)changes.next();
+      assertEquals(foo1Id, removed.getTarget().getId());
+      assertFalse(changes.hasNext());
+
+      //
+      foo = root1.getChild("foo");
+      assertEquals(foo2Id, foo.getId());
+      assertEquals("foo2", root1.getChild("foo").getState().getLabel());
+   }
+
+   public void testRename() throws NullPointerException, NavigationServiceException
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_rename");
+      portal.getRootNavigation().addChild("default").addChild("foo");
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_rename"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+      root2.getChild("foo").setName("bar");
+      service.saveNode(root2.context, null);
+      sync(true);
+
+      //
+      Iterator<NodeChange<Node>> it = root1.update(service, null);
+      Node bar = root1.getChild(0);
+      assertEquals("bar", bar.getName());
+      NodeChange.Renamed<Node> renamed = (NodeChange.Renamed<Node>)it.next();
+      assertEquals("bar", renamed.getName());
+      assertSame(bar, renamed.getTarget());
+   }
+
+   public void testState() throws NullPointerException, NavigationServiceException
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_state");
+      portal.getRootNavigation().addChild("default").addChild("foo").addChild("bar");
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_state"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+      Node root3 = service.loadNode(Node.MODEL, navigation, Scope.GRANDCHILDREN, null).getNode();
+
+      //
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+      root.getChild("foo").setState(new NodeState.Builder().label("foo").build());
+      service.saveNode(root.context, null);
+      sync(true);
+
+      //
+      Iterator<NodeChange<Node>> changes = root1.update(service, Scope.GRANDCHILDREN);
+      Node foo = root1.getChild("foo");
+      assertEquals("foo", foo.getState().getLabel());
+      NodeChange.Added<Node> added = (NodeChange.Added<Node>)changes.next();
+      assertEquals("bar", added.getTarget().getName());
+      assertEquals(null, added.previous);
+      assertEquals("bar", added.target.getName());
+      NodeChange.Updated<Node> updated = (NodeChange.Updated<Node>)changes.next();
+      assertSame(foo, updated.getTarget());
+      assertEquals(new NodeState.Builder().label("foo").build(), updated.getState());
+      assertFalse(changes.hasNext());
+
+      //
+      changes = root2.update(service, null);
+      foo = root2.getChild("foo");
+      assertEquals("foo", foo.getState().getLabel());
+      updated = (NodeChange.Updated<Node>)changes.next();
+      assertSame(foo, updated.getTarget());
+      assertEquals(new NodeState.Builder().label("foo").build(), updated.getState());
+      assertFalse(changes.hasNext());
+
+      //
+      changes = root3.update(service, null);
+      foo = root3.getChild("foo");
+      assertEquals("foo", foo.getState().getLabel());
+      updated = (NodeChange.Updated<Node>)changes.next();
+      assertSame(foo, updated.getTarget());
+      assertEquals(new NodeState.Builder().label("foo").build(), updated.getState());
+      assertFalse(changes.hasNext());
+   }
+
+   public void testUseMostActualChildren() throws NullPointerException, NavigationServiceException
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_with_most_actual_children");
+      portal.getRootNavigation().addChild("default").addChild("foo").addChild("bar");
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_with_most_actual_children"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+      Node foo = root.getChild("foo");
+      sync(true);
+
+      //
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.getChild("foo").removeChild("bar");
+      service.saveNode(root1.context, null);
+      sync(true);
+
+      //
+      foo.update(service, Scope.CHILDREN);
+      assertNull(foo.getChild("bar"));
+
+      // Update a second time (it actually test a previous bug)
+      foo.update(service, Scope.CHILDREN);
+      assertNull(foo.getChild("bar"));
+   }
+
+   public void testUpdateDeletedNode() throws NullPointerException, NavigationServiceException
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_deleted_node");
+      portal.getRootNavigation().addChild("default").addChild("foo").addChild("bar");
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_deleted_node"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      Node bar = root.getChild("foo").getChild("bar");
+      sync(true);
+
+      //
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.getChild("foo").removeChild("bar");
+      service.saveNode(root1.context, null);
+      sync(true);
+
+      //
+      Iterator<NodeChange<Node>>  changes = bar.update(service, Scope.CHILDREN);
+      NodeChange.Removed<Node> removed = (NodeChange.Removed<Node>)changes.next();
+      assertSame(bar, removed.getTarget());
+      assertFalse(changes.hasNext());
+   }
+
+   public void testLoadEvents() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_load_events");
+      Navigation fooNav = portal.getRootNavigation().addChild("default").addChild("foo");
+      fooNav.addChild("bar1");
+      fooNav.addChild("bar2");
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_load_events"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.SINGLE, null).getNode();
+
+      //
+      Iterator<NodeChange<Node>> changes = root.update(service, Scope.ALL);
+
+      //
+      Node foo = root.getChild(0);
+      assertEquals("foo", foo.getName());
+      Node bar1 = foo.getChild(0);
+      assertEquals("bar1", bar1.getName());
+      Node bar2 = foo.getChild(1);
+      assertEquals("bar2", bar2.getName());
+
+      //
+      NodeChange.Added<Node> added1 = (NodeChange.Added<Node>)changes.next();
+      assertSame(foo, added1.getTarget());
+      NodeChange.Added<Node> added2 = (NodeChange.Added<Node>)changes.next();
+      assertSame(bar1, added2.getTarget());
+      NodeChange.Added<Node> added3 = (NodeChange.Added<Node>)changes.next();
+      assertSame(bar2, added3.getTarget());
+      assertFalse(changes.hasNext());
+   }
+
+   public void testUpdateTwice2() throws NullPointerException, NavigationServiceException
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_twice2");
+      portal.getRootNavigation().addChild("default").addChild("foo").addChild("bar");
+      sync(true);
+
+      //Browser 1 : Expand the "foo" node
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_twice2"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+      Node foo = root.getChild("foo");
+      //If this line is commented, the test is passed
+      service.updateNode(foo.context, Scope.CHILDREN, null);
+      sync(true);
+
+      //Browser 2: Change the "foo" node
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      root1.getChild("foo").removeChild("bar");
+      service.saveNode(root1.context, null);
+      sync(true);
+
+      //Browser 1: Try to expand the "foo" node 2 times ---> NPE after the 2nd updateNode method
+      service.updateNode(foo.context, Scope.CHILDREN, null);
+      service.updateNode(foo.context, Scope.CHILDREN, null);
+   }
+
+   public void testMove2() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_move2");
+      portal.getRootNavigation().addChild("default").addChild("a").addChild("b");
+      portal.getRootNavigation().getChild("default").addChild("c");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_move2"));
+      NodeContext<Node> root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null);
+      Node a = root.getNode("a");
+      Node b = a.getChild("b");
+      Node c = root.getNode("c");
+
+      //Browser 2 : move the node "b" from "a" to "c"
+      NodeContext<Node> root1 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null);
+      root1.getNode("c").addChild(root1.getNode("a").getChild("b"));
+      service.saveNode(root1.getNode().context, null);
+      //
+      sync(true);
+
+      //Browser 1: need NodeChange event to update UI
+      NodeChangeQueue<NodeContext<Node>> queue = new NodeChangeQueue<NodeContext<Node>>();
+      //If update "root1"  --> NodeChange.Moved  --> ok
+      //If update "b"        --> NodeChange.Add      --> ok
+      //update "a"             --> no NodeChange, we need an event here (NodeChange.Remove) so UI can be updated
+      service.updateNode(a.context, Scope.CHILDREN, queue);
+      Iterator<NodeChange<NodeContext<Node>>> changes = queue.iterator();
+      assertTrue(changes.hasNext());
+   }
+
+   public void testScope() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_scope");
+      portal.getRootNavigation().addChild("default").addChild("a").addChild("b");
+      portal.getRootNavigation().getChild("default").addChild("c").addChild("d");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_scope"));
+      Node root1 = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).node;
+      Node a = root1.getChild("a");
+      Node c = root1.getChild("c");
+      assertFalse(a.context.isExpanded());
+      assertFalse(c.context.isExpanded());
+
+      //
+      Node root2 = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).node;
+      root2.addChild("e");
+      service.saveNode(root2.context, null);
+
+      //
+      sync(true);
+
+      //
+      service.updateNode(a.context, Scope.CHILDREN, null);
+      assertSame(a, root1.getChild("a"));
+      assertSame(c, root1.getChild("c"));
+      assertNotNull(root1.getChild("e"));
+      assertTrue(a.context.isExpanded());
+      assertFalse(c.context.isExpanded());
+      assertNotNull(a.getChild("b"));
+   }
+
+   public void _testPendingChange() throws NullPointerException, NavigationServiceException
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_pending_change");
+      Navigation def = portal.getRootNavigation().addChild("default");
+      def.addChild("foo");
+      def.addChild("bar");
+      sync(true);
+
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_pending_change"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+      Node foo = root.getChild("foo");
+      Node bar = root.getChild("bar");
+
+      //Expand and change the "bar" node
+      service.updateNode(bar.context, Scope.CHILDREN, null);
+      bar.addChild("juu");
+
+      //--->  IllegalArgumentException
+      //Can't expand the "foo" node, even it doesn't have any pending changes
+      service.updateNode(foo.context, Scope.CHILDREN, null);
+   }
+
+   public void testRemovedNavigation() throws Exception
+   {
+      MOPService mop = mgr.getPOMService();
+      Site portal = mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "update_removed_navigation");
+      portal.getRootNavigation().addChild("default");
+
+      //
+      sync(true);
+
+      //
+      NavigationContext navigation = service.loadNavigation(SiteKey.portal("update_removed_navigation"));
+      Node root = service.loadNode(Node.MODEL, navigation, Scope.ALL, null).getNode();
+      service.destroyNavigation(navigation);
+
+      //
+      sync(true);
+
+      //
+      try
+      {
+         service.updateNode(root.context, null, null);
+      }
+      catch (NavigationServiceException e)
+      {
+         assertSame(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE, e.getError());
+      }
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceWrapper.java
===================================================================
--- portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceWrapper.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceWrapper.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.container.PortalContainer;
-import org.exoplatform.portal.config.AbstractPortalTest;
-import org.exoplatform.portal.mop.EventType;
-import org.exoplatform.portal.mop.SiteKey;
-import org.exoplatform.portal.pom.config.POMSessionManager;
-import org.exoplatform.services.listener.Event;
-import org.exoplatform.services.listener.Listener;
-import org.exoplatform.services.listener.ListenerService;
-import org.gatein.mop.api.workspace.ObjectType;
-
-import java.util.LinkedList;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class TestNavigationServiceWrapper extends AbstractPortalTest
-{
-
-   /** . */
-   private NavigationService navigationService;
-
-   /** . */
-   private ListenerService listenerService;
-
-   /** . */
-   private POMSessionManager mgr;
-
-   @Override
-   protected void setUp() throws Exception
-   {
-      super.setUp();
-
-      //
-      PortalContainer container = getContainer();
-
-      //
-      listenerService = (ListenerService)container.getComponentInstanceOfType(ListenerService.class);
-      navigationService = (NavigationService)container.getComponentInstanceOfType(NavigationService.class);
-      mgr = (POMSessionManager)container.getComponentInstanceOfType(POMSessionManager.class);
-   }
-
-   public void testNotification() throws NavigationServiceException
-   {
-      class ListenerImpl extends Listener<NavigationService, SiteKey>
-      {
-
-         /** . */
-         private final LinkedList<Event> events = new LinkedList<Event>();
-
-         @Override
-         public void onEvent(Event event) throws Exception
-         {
-            events.addLast(event);
-         }
-      }
-
-      //
-      ListenerImpl createListener = new ListenerImpl();
-      ListenerImpl updateListener = new ListenerImpl();
-      ListenerImpl destroyListener = new ListenerImpl();
-
-      //
-      listenerService.addListener(EventType.NAVIGATION_CREATED, createListener);
-      listenerService.addListener(EventType.NAVIGATION_UPDATED, updateListener);
-      listenerService.addListener(EventType.NAVIGATION_DESTROYED, destroyListener);
-
-      //
-      begin();
-      mgr.getPOMService().getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "notification");
-
-      // Create
-      NavigationContext navigation = new NavigationContext(SiteKey.portal("notification"), new NavigationState(3));
-      navigationService.saveNavigation(navigation);
-      assertEquals(1, createListener.events.size());
-      Event event = createListener.events.removeFirst();
-      assertEquals(SiteKey.portal("notification"), event.getData());
-      assertEquals(EventType.NAVIGATION_CREATED, event.getEventName());
-      assertSame(navigationService, event.getSource());
-      assertEquals(0, updateListener.events.size());
-      assertEquals(0, destroyListener.events.size());
-
-      //
-
-      // Update
-      navigation.setState(new NavigationState(1));
-      navigationService.saveNavigation(navigation);
-      assertEquals(0, createListener.events.size());
-      assertEquals(1, updateListener.events.size());
-      event = updateListener.events.removeFirst();
-      assertEquals(SiteKey.portal("notification"), event.getData());
-      assertEquals(EventType.NAVIGATION_UPDATED, event.getEventName());
-      assertSame(navigationService, event.getSource());
-      assertEquals(0, destroyListener.events.size());
-
-      // Update
-      navigation = navigationService.loadNavigation(SiteKey.portal("notification"));
-      Node root = navigationService.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
-      root.setState(new NodeState.Builder(root.getState()).label("foo").build());
-      navigationService.saveNode(root.context, null);
-      assertEquals(0, createListener.events.size());
-      assertEquals(1, updateListener.events.size());
-      event = updateListener.events.removeFirst();
-      assertEquals(SiteKey.portal("notification"), event.getData());
-      assertEquals(EventType.NAVIGATION_UPDATED, event.getEventName());
-      assertSame(navigationService, event.getSource());
-      assertEquals(0, destroyListener.events.size());
-
-      // Destroy
-      navigationService.destroyNavigation(navigation);
-      assertEquals(0, createListener.events.size());
-      assertEquals(0, updateListener.events.size());
-      assertEquals(1, destroyListener.events.size());
-      event = destroyListener.events.removeFirst();
-      assertEquals(SiteKey.portal("notification"), event.getData());
-      assertEquals(EventType.NAVIGATION_DESTROYED, event.getEventName());
-      assertSame(navigationService, event.getSource());
-
-      //
-      end();
-   }
-
-   public void testCacheInvalidation() throws Exception
-   {
-      SiteKey key = SiteKey.portal("wrapper_cache_invalidation");
-
-      //
-      begin();
-      mgr.getPOMService().getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "wrapper_cache_invalidation").getRootNavigation().addChild("default");
-      end(true);
-
-      //
-      begin();
-      navigationService.saveNavigation(new NavigationContext(key, new NavigationState(0)));
-      end(true);
-
-      //
-      begin();
-      NavigationContext nav = navigationService.loadNavigation(key);
-      assertNotNull(nav);
-      NodeContext<Node> root = navigationService.loadNode(Node.MODEL, nav, Scope.ALL, null);
-      assertNotNull(root);
-      end(true);
-
-      //
-      begin();
-      mgr.getPOMService().getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "wrapper_cache_invalidation").destroy();
-      end(true);
-
-      //
-      begin();
-      assertNull(navigationService.loadNavigation(key));
-      try
-      {
-         navigationService.rebaseNode(root, null, null);
-         fail();
-      }
-      catch (NavigationServiceException e)
-      {
-         assertEquals(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE, e.getError());
-      }
-      end();
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceWrapper.java (from rev 6783, portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceWrapper.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceWrapper.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestNavigationServiceWrapper.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.container.PortalContainer;
+import org.exoplatform.portal.config.AbstractPortalTest;
+import org.exoplatform.portal.mop.EventType;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.pom.config.POMSessionManager;
+import org.exoplatform.services.listener.Event;
+import org.exoplatform.services.listener.Listener;
+import org.exoplatform.services.listener.ListenerService;
+import org.gatein.mop.api.workspace.ObjectType;
+
+import java.util.LinkedList;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class TestNavigationServiceWrapper extends AbstractPortalTest
+{
+
+   /** . */
+   private NavigationService navigationService;
+
+   /** . */
+   private ListenerService listenerService;
+
+   /** . */
+   private POMSessionManager mgr;
+
+   @Override
+   protected void setUp() throws Exception
+   {
+      super.setUp();
+
+      //
+      PortalContainer container = getContainer();
+
+      //
+      listenerService = (ListenerService)container.getComponentInstanceOfType(ListenerService.class);
+      navigationService = (NavigationService)container.getComponentInstanceOfType(NavigationService.class);
+      mgr = (POMSessionManager)container.getComponentInstanceOfType(POMSessionManager.class);
+   }
+
+   public void testNotification() throws NavigationServiceException
+   {
+      class ListenerImpl extends Listener<NavigationService, SiteKey>
+      {
+
+         /** . */
+         private final LinkedList<Event> events = new LinkedList<Event>();
+
+         @Override
+         public void onEvent(Event event) throws Exception
+         {
+            events.addLast(event);
+         }
+      }
+
+      //
+      ListenerImpl createListener = new ListenerImpl();
+      ListenerImpl updateListener = new ListenerImpl();
+      ListenerImpl destroyListener = new ListenerImpl();
+
+      //
+      listenerService.addListener(EventType.NAVIGATION_CREATED, createListener);
+      listenerService.addListener(EventType.NAVIGATION_UPDATED, updateListener);
+      listenerService.addListener(EventType.NAVIGATION_DESTROYED, destroyListener);
+
+      //
+      begin();
+      mgr.getPOMService().getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "notification");
+
+      // Create
+      NavigationContext navigation = new NavigationContext(SiteKey.portal("notification"), new NavigationState(3));
+      navigationService.saveNavigation(navigation);
+      assertEquals(1, createListener.events.size());
+      Event event = createListener.events.removeFirst();
+      assertEquals(SiteKey.portal("notification"), event.getData());
+      assertEquals(EventType.NAVIGATION_CREATED, event.getEventName());
+      assertSame(navigationService, event.getSource());
+      assertEquals(0, updateListener.events.size());
+      assertEquals(0, destroyListener.events.size());
+
+      //
+
+      // Update
+      navigation.setState(new NavigationState(1));
+      navigationService.saveNavigation(navigation);
+      assertEquals(0, createListener.events.size());
+      assertEquals(1, updateListener.events.size());
+      event = updateListener.events.removeFirst();
+      assertEquals(SiteKey.portal("notification"), event.getData());
+      assertEquals(EventType.NAVIGATION_UPDATED, event.getEventName());
+      assertSame(navigationService, event.getSource());
+      assertEquals(0, destroyListener.events.size());
+
+      // Update
+      navigation = navigationService.loadNavigation(SiteKey.portal("notification"));
+      Node root = navigationService.loadNode(Node.MODEL, navigation, Scope.CHILDREN, null).getNode();
+      root.setState(new NodeState.Builder(root.getState()).label("foo").build());
+      navigationService.saveNode(root.context, null);
+      assertEquals(0, createListener.events.size());
+      assertEquals(1, updateListener.events.size());
+      event = updateListener.events.removeFirst();
+      assertEquals(SiteKey.portal("notification"), event.getData());
+      assertEquals(EventType.NAVIGATION_UPDATED, event.getEventName());
+      assertSame(navigationService, event.getSource());
+      assertEquals(0, destroyListener.events.size());
+
+      // Destroy
+      navigationService.destroyNavigation(navigation);
+      assertEquals(0, createListener.events.size());
+      assertEquals(0, updateListener.events.size());
+      assertEquals(1, destroyListener.events.size());
+      event = destroyListener.events.removeFirst();
+      assertEquals(SiteKey.portal("notification"), event.getData());
+      assertEquals(EventType.NAVIGATION_DESTROYED, event.getEventName());
+      assertSame(navigationService, event.getSource());
+
+      //
+      end();
+   }
+
+   public void testCacheInvalidation() throws Exception
+   {
+      SiteKey key = SiteKey.portal("wrapper_cache_invalidation");
+
+      //
+      begin();
+      mgr.getPOMService().getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "wrapper_cache_invalidation").getRootNavigation().addChild("default");
+      end(true);
+
+      //
+      begin();
+      navigationService.saveNavigation(new NavigationContext(key, new NavigationState(0)));
+      end(true);
+
+      //
+      begin();
+      NavigationContext nav = navigationService.loadNavigation(key);
+      assertNotNull(nav);
+      NodeContext<Node> root = navigationService.loadNode(Node.MODEL, nav, Scope.ALL, null);
+      assertNotNull(root);
+      end(true);
+
+      //
+      begin();
+      mgr.getPOMService().getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "wrapper_cache_invalidation").destroy();
+      end(true);
+
+      //
+      begin();
+      assertNull(navigationService.loadNavigation(key));
+      try
+      {
+         navigationService.rebaseNode(root, null, null);
+         fail();
+      }
+      catch (NavigationServiceException e)
+      {
+         assertEquals(NavigationError.UPDATE_CONCURRENTLY_REMOVED_NODE, e.getError());
+      }
+      end();
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestScope.java
===================================================================
--- portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestScope.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestScope.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.component.test.AbstractKernelTest;
-import org.exoplatform.portal.mop.Visibility;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class TestScope extends AbstractKernelTest
-{
-
-   public void testBranchShape()
-   {
-      NodeState nodeState = new NodeState("", null, -1, -1, Visibility.DISPLAYED, "portal::classic::home");
-
-      //
-      Scope scope1 = GenericScope.branchShape(new String[]{"a"}, Scope.CHILDREN);
-      Scope.Visitor visitor1 = scope1.get();
-      assertEquals(VisitMode.ALL_CHILDREN, visitor1.enter(0, "0", "", nodeState));
-      assertEquals(VisitMode.ALL_CHILDREN, visitor1.enter(1, "1", "a", nodeState));
-      assertEquals(VisitMode.NO_CHILDREN, visitor1.enter(1, "2", "b", nodeState));
-
-      //
-      Scope scope2 = GenericScope.branchShape(new String[]{"a"}, Scope.SINGLE);
-      Scope.Visitor visitor2 = scope2.get();
-      assertEquals(VisitMode.ALL_CHILDREN, visitor2.enter(0, "0", "", nodeState));
-      assertEquals(VisitMode.NO_CHILDREN, visitor2.enter(1, "1", "a", nodeState));
-      assertEquals(VisitMode.NO_CHILDREN, visitor2.enter(1, "2", "b", nodeState));
-
-      //
-      Scope scope3 = GenericScope.branchShape(new String[]{"a","c"}, Scope.SINGLE);
-      Scope.Visitor visitor3 = scope3.get();
-      assertEquals(VisitMode.ALL_CHILDREN, visitor3.enter(0, "0", "", nodeState));
-      assertEquals(VisitMode.ALL_CHILDREN, visitor3.enter(1, "1", "a", nodeState));
-      assertEquals(VisitMode.NO_CHILDREN, visitor3.enter(1, "2", "b", nodeState));
-      assertEquals(VisitMode.NO_CHILDREN, visitor3.enter(2, "3", "c", nodeState));
-      assertEquals(VisitMode.NO_CHILDREN, visitor3.enter(2, "4", "d", nodeState));
-
-      //
-      Scope scope4 = GenericScope.branchShape(new String[]{"a"}, GenericScope.branchShape(new String[]{"b"}, Scope.CHILDREN));
-      Scope.Visitor visitor4 = scope4.get();
-      assertEquals(VisitMode.ALL_CHILDREN, visitor4.enter(0, "0", "", nodeState));
-      assertEquals(VisitMode.ALL_CHILDREN, visitor4.enter(1, "1", "a", nodeState));
-      assertEquals(VisitMode.ALL_CHILDREN, visitor4.enter(2, "2", "b", nodeState));
-      assertEquals(VisitMode.NO_CHILDREN, visitor4.enter(2, "3", "c", nodeState));
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestScope.java (from rev 6783, portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestScope.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestScope.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestScope.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.component.test.AbstractKernelTest;
+import org.exoplatform.portal.mop.Visibility;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class TestScope extends AbstractKernelTest
+{
+
+   public void testBranchShape()
+   {
+      NodeState nodeState = new NodeState("", null, -1, -1, Visibility.DISPLAYED, "portal::classic::home");
+
+      //
+      Scope scope1 = GenericScope.branchShape(new String[]{"a"}, Scope.CHILDREN);
+      Scope.Visitor visitor1 = scope1.get();
+      assertEquals(VisitMode.ALL_CHILDREN, visitor1.enter(0, "0", "", nodeState));
+      assertEquals(VisitMode.ALL_CHILDREN, visitor1.enter(1, "1", "a", nodeState));
+      assertEquals(VisitMode.NO_CHILDREN, visitor1.enter(1, "2", "b", nodeState));
+
+      //
+      Scope scope2 = GenericScope.branchShape(new String[]{"a"}, Scope.SINGLE);
+      Scope.Visitor visitor2 = scope2.get();
+      assertEquals(VisitMode.ALL_CHILDREN, visitor2.enter(0, "0", "", nodeState));
+      assertEquals(VisitMode.NO_CHILDREN, visitor2.enter(1, "1", "a", nodeState));
+      assertEquals(VisitMode.NO_CHILDREN, visitor2.enter(1, "2", "b", nodeState));
+
+      //
+      Scope scope3 = GenericScope.branchShape(new String[]{"a","c"}, Scope.SINGLE);
+      Scope.Visitor visitor3 = scope3.get();
+      assertEquals(VisitMode.ALL_CHILDREN, visitor3.enter(0, "0", "", nodeState));
+      assertEquals(VisitMode.ALL_CHILDREN, visitor3.enter(1, "1", "a", nodeState));
+      assertEquals(VisitMode.NO_CHILDREN, visitor3.enter(1, "2", "b", nodeState));
+      assertEquals(VisitMode.NO_CHILDREN, visitor3.enter(2, "3", "c", nodeState));
+      assertEquals(VisitMode.NO_CHILDREN, visitor3.enter(2, "4", "d", nodeState));
+
+      //
+      Scope scope4 = GenericScope.branchShape(new String[]{"a"}, GenericScope.branchShape(new String[]{"b"}, Scope.CHILDREN));
+      Scope.Visitor visitor4 = scope4.get();
+      assertEquals(VisitMode.ALL_CHILDREN, visitor4.enter(0, "0", "", nodeState));
+      assertEquals(VisitMode.ALL_CHILDREN, visitor4.enter(1, "1", "a", nodeState));
+      assertEquals(VisitMode.ALL_CHILDREN, visitor4.enter(2, "2", "b", nodeState));
+      assertEquals(VisitMode.NO_CHILDREN, visitor4.enter(2, "3", "c", nodeState));
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestSerialization.java
===================================================================
--- portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestSerialization.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestSerialization.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.navigation;
-
-import org.exoplatform.component.test.AbstractGateInTest;
-import org.exoplatform.portal.mop.SiteKey;
-import org.gatein.common.io.IOTools;
-
-import java.util.Arrays;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class TestSerialization extends AbstractGateInTest
-{
-
-   public void testNodeStateSerialization() throws Exception
-   {
-      NodeState state = new NodeState.Builder().pageRef("foo").icon("bar").build();
-      NodeState copy = IOTools.clone(state);
-      assertEquals(state, copy);
-   }
-
-   public void testNodeDataSerialization() throws Exception
-   {
-      NodeData data = new NodeData("parent", "this", "foo", new NodeState.Builder().pageRef("bar").icon("bar").build(), new String[]{"child"});
-      NodeData copy = IOTools.clone(data);
-      assertEquals(copy.parentId, data.parentId);
-      assertEquals(copy.id, data.id);
-      assertEquals(copy.name, data.name);
-      assertEquals(Arrays.asList(copy.children), Arrays.asList(data.children));
-      assertEquals(copy.state, data.state);
-   }
-
-   public void testNavigationStateSerialization() throws Exception
-   {
-      NavigationState state = new NavigationState(5);
-      NavigationState copy = IOTools.clone(state);
-      assertEquals(state.getPriority(), copy.getPriority());
-   }
-
-   public void testNavigationDataSerialization() throws Exception
-   {
-      NavigationData data = new NavigationData(SiteKey.portal("classic"), new NavigationState(3), "root");
-      NavigationData copy = IOTools.clone(data);
-      assertEquals(data.rootId, copy.rootId);
-      assertEquals(data.state.getPriority(), copy.state.getPriority());
-      assertEquals(data.key, copy.key);
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestSerialization.java (from rev 6783, portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestSerialization.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestSerialization.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/navigation/TestSerialization.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.navigation;
+
+import org.exoplatform.component.test.AbstractGateInTest;
+import org.exoplatform.portal.mop.SiteKey;
+import org.gatein.common.io.IOTools;
+
+import java.util.Arrays;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class TestSerialization extends AbstractGateInTest
+{
+
+   public void testNodeStateSerialization() throws Exception
+   {
+      NodeState state = new NodeState.Builder().pageRef("foo").icon("bar").build();
+      NodeState copy = IOTools.clone(state);
+      assertEquals(state, copy);
+   }
+
+   public void testNodeDataSerialization() throws Exception
+   {
+      NodeData data = new NodeData("parent", "this", "foo", new NodeState.Builder().pageRef("bar").icon("bar").build(), new String[]{"child"});
+      NodeData copy = IOTools.clone(data);
+      assertEquals(copy.parentId, data.parentId);
+      assertEquals(copy.id, data.id);
+      assertEquals(copy.name, data.name);
+      assertEquals(Arrays.asList(copy.children), Arrays.asList(data.children));
+      assertEquals(copy.state, data.state);
+   }
+
+   public void testNavigationStateSerialization() throws Exception
+   {
+      NavigationState state = new NavigationState(5);
+      NavigationState copy = IOTools.clone(state);
+      assertEquals(state.getPriority(), copy.getPriority());
+   }
+
+   public void testNavigationDataSerialization() throws Exception
+   {
+      NavigationData data = new NavigationData(SiteKey.portal("classic"), new NavigationState(3), "root");
+      NavigationData copy = IOTools.clone(data);
+      assertEquals(data.rootId, copy.rootId);
+      assertEquals(data.state.getPriority(), copy.state.getPriority());
+      assertEquals(data.key, copy.key);
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestParsePath.java
===================================================================
--- portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestParsePath.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestParsePath.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.user;
-
-import junit.framework.TestCase;
-
-import java.util.Arrays;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- */
-public class TestParsePath extends TestCase
-{
-
-   public void testFoo()
-   {
-      assertPath("a", "a");
-      assertPath("a/", "a");
-      assertPath("a//", "a");
-      assertPath("a/b", "a", "b");
-      assertPath("a/b/", "a", "b");
-      assertPath("a/b//", "a", "b");
-      assertPath("a//b", "a", "", "b");
-      assertPath("a//b/", "a", "", "b");
-      assertPath("a//b//", "a", "", "b");
-      assertPath("/", (String[])null);
-      assertPath("//");
-      assertPath("///");
-      assertPath("/a", "a");
-      assertPath("//a", "", "a");
-      assertPath("/a/", "a");
-      assertPath("/a//", "a");
-      assertPath("/a////", "a");
-   }
-
-   private void assertPath(String path, String... expected)
-   {
-      // Previous behavior
-      assertEquals(expected, legacy(path));
-      assertEquals(expected, Utils.parsePath(path));
-   }
-
-   private void assertEquals(String[] expected, String[] actual)
-   {
-      if (actual == null)
-      {
-         assertNull(expected);
-      }
-      else
-      {
-         assertNotNull(expected);
-         assertEquals(Arrays.asList(expected), Arrays.asList(actual));
-      }
-   }
-
-   private String[] legacy(String path)
-   {
-      //  Remove any leading /
-      if (path.length() > 0 && path.charAt(0) == '/')
-      {
-         path = path.substring(1);
-      }
-
-      // Find the first navigation available or return null
-      if (path.length() == 0)
-      {
-         return null;
-      }
-
-      // Split into segments
-      return path.split("/");
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestParsePath.java (from rev 6783, portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestParsePath.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestParsePath.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestParsePath.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.user;
+
+import junit.framework.TestCase;
+
+import java.util.Arrays;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ */
+public class TestParsePath extends TestCase
+{
+
+   public void testFoo()
+   {
+      assertPath("a", "a");
+      assertPath("a/", "a");
+      assertPath("a//", "a");
+      assertPath("a/b", "a", "b");
+      assertPath("a/b/", "a", "b");
+      assertPath("a/b//", "a", "b");
+      assertPath("a//b", "a", "", "b");
+      assertPath("a//b/", "a", "", "b");
+      assertPath("a//b//", "a", "", "b");
+      assertPath("/", (String[])null);
+      assertPath("//");
+      assertPath("///");
+      assertPath("/a", "a");
+      assertPath("//a", "", "a");
+      assertPath("/a/", "a");
+      assertPath("/a//", "a");
+      assertPath("/a////", "a");
+   }
+
+   private void assertPath(String path, String... expected)
+   {
+      // Previous behavior
+      assertEquals(expected, legacy(path));
+      assertEquals(expected, Utils.parsePath(path));
+   }
+
+   private void assertEquals(String[] expected, String[] actual)
+   {
+      if (actual == null)
+      {
+         assertNull(expected);
+      }
+      else
+      {
+         assertNotNull(expected);
+         assertEquals(Arrays.asList(expected), Arrays.asList(actual));
+      }
+   }
+
+   private String[] legacy(String path)
+   {
+      //  Remove any leading /
+      if (path.length() > 0 && path.charAt(0) == '/')
+      {
+         path = path.substring(1);
+      }
+
+      // Find the first navigation available or return null
+      if (path.length() == 0)
+      {
+         return null;
+      }
+
+      // Split into segments
+      return path.split("/");
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestUserPortal.java
===================================================================
--- portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestUserPortal.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestUserPortal.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,1471 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- * 
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.mop.user;
-
-import junit.framework.AssertionFailedError;
-
-import org.exoplatform.container.PortalContainer;
-import org.exoplatform.portal.config.AbstractPortalTest;
-import org.exoplatform.portal.config.DataStorage;
-import org.exoplatform.portal.config.UserPortalConfig;
-import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.PortalConfig;
-import org.exoplatform.portal.mop.SiteKey;
-import org.exoplatform.portal.mop.Visibility;
-import org.exoplatform.portal.mop.navigation.Scope;
-import org.exoplatform.portal.pom.config.POMDataStorage;
-import org.exoplatform.portal.pom.config.POMSessionManager;
-import org.exoplatform.services.listener.Event;
-import org.exoplatform.services.listener.Listener;
-import org.exoplatform.services.listener.ListenerService;
-import org.exoplatform.services.organization.OrganizationService;
-import org.exoplatform.services.security.Authenticator;
-import org.exoplatform.services.security.ConversationState;
-import org.gatein.common.i18n.MapResourceBundle;
-import org.gatein.mop.api.workspace.ObjectType;
-import org.gatein.mop.api.workspace.Site;
-
-import java.util.Collection;
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.ResourceBundle;
-import java.util.TimeZone;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class TestUserPortal extends AbstractPortalTest
-{
-
-   /** . */
-   private UserPortalConfigService userPortalConfigSer_;
-
-   /** . */
-   private OrganizationService orgService_;
-
-   /** . */
-   private DataStorage storage_;
-
-   /** . */
-   private POMSessionManager mgr;
-
-   /** . */
-   private Authenticator authenticator;
-
-   /** . */
-   private ListenerService listenerService;
-
-   /** . */
-   private LinkedList<Event> events;
-
-   /** . */
-   private boolean registered;
-
-   /** . */
-   private POMDataStorage mopStorage;
-
-   public TestUserPortal(String name)
-   {
-      super(name);
-
-      //
-      registered = false;
-   }
-
-   @Override
-   protected void setUp() throws Exception
-   {
-      Listener listener = new Listener()
-      {
-         @Override
-         public void onEvent(Event event) throws Exception
-         {
-            events.add(event);
-         }
-      };
-
-      PortalContainer container = getContainer();
-      userPortalConfigSer_ =
-         (UserPortalConfigService)container.getComponentInstanceOfType(UserPortalConfigService.class);
-      orgService_ = (OrganizationService)container.getComponentInstanceOfType(OrganizationService.class);
-      mgr = (POMSessionManager)container.getComponentInstanceOfType(POMSessionManager.class);
-      authenticator = (Authenticator)container.getComponentInstanceOfType(Authenticator.class);
-      listenerService = (ListenerService)container.getComponentInstanceOfType(ListenerService.class);
-      events = new LinkedList<Event>();
-      storage_ = (DataStorage)container.getComponentInstanceOfType(DataStorage.class);
-      mopStorage = (POMDataStorage)container.getComponentInstanceOfType(POMDataStorage.class);
-
-      // Register only once for all unit tests
-      if (!registered)
-      {
-         // I'm using this due to crappy design of
-         // org.exoplatform.services.listener.ListenerService
-         listenerService.addListener(DataStorage.PAGE_CREATED, listener);
-         listenerService.addListener(DataStorage.PAGE_REMOVED, listener);
-         listenerService.addListener(DataStorage.PAGE_UPDATED, listener);
-      }
-   }
-
-   private static Map<SiteKey, UserNavigation> toMap(UserPortalConfig cfg) throws Exception
-   {
-      return toMap(cfg.getUserPortal().getNavigations());
-   }
-
-   private static Map<SiteKey, UserNavigation> toMap(List<UserNavigation> navigations)
-   {
-      Map<SiteKey, UserNavigation> map = new HashMap<SiteKey, UserNavigation>();
-      for (UserNavigation nav : navigations)
-      {
-         map.put(nav.getKey(), nav);
-      }
-      return map;
-   }
-
-/*
-   public void testUpdatePortalConfig()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "root");
-            assertNotNull(userPortalCfg);
-            PortalConfig portalCfg = userPortalCfg.getPortalConfig();
-            assertNotNull(portalCfg);
-            assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
-            assertEquals("classic", portalCfg.getName());
-            assertEquals("en", portalCfg.getLocale());
-            portalCfg.setLocale("fr");
-
-            storage_.save(portalCfg);
-
-            userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "root");
-            portalCfg = userPortalCfg.getPortalConfig();
-            assertEquals("fr", portalCfg.getLocale());
-         }
-      }.execute("root");
-   }
-
-*/
-
-   public void testRootGetUserPortalConfig()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
-            Map<SiteKey, UserNavigation> navigations = toMap(userPortalCfg);
-            assertEquals(5, navigations.size());
-            assertTrue(navigations.containsKey(SiteKey.portal("classic")));
-            assertTrue(navigations.containsKey(SiteKey.user("root")));
-            assertTrue(navigations.containsKey(SiteKey.group("/platform/administrators")));
-            assertTrue(navigations.containsKey(SiteKey.group("/organization/management/executive-board")));
-            assertTrue(navigations.containsKey(SiteKey.group("/organization/management/executive-board")));
-            assertTrue(navigations.containsKey(SiteKey.group("/platform/users")));
-
-            // Now try with the specific api
-            UserNavigation rootNav = userPortalCfg.getUserPortal().getNavigation(SiteKey.user("root"));
-            assertNotNull(rootNav);
-            assertEquals(SiteKey.user("root"), rootNav.getKey());
-         }
-      }.execute("root");
-   }
-
-   public void testFilter()
-   {
-      UnitTest test = new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
-            UserPortal portal = userPortalCfg.getUserPortal();
-            UserNavigation nav = portal.getNavigation(SiteKey.portal("classic"));
-
-            //
-            UserNode root = portal.getNode(nav, Scope.ALL, UserNodeFilterConfig.builder().build(), null);
-            assertNotNull(root.getChild("home"));
-            assertNotNull(root.getChild("webexplorer"));
-         }
-      };
-
-      //
-      test.execute("root");
-      test.execute(null);
-   }
-
-   public void testFilterWithVisibility()
-   {
-      UnitTest test = new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("system", getUserId());
-            UserPortal portal = userPortalCfg.getUserPortal();
-            UserNavigation nav = portal.getNavigation(SiteKey.portal("system"));
-
-            //
-            UserNode root = portal.getNode(nav, Scope.ALL, UserNodeFilterConfig.builder().withVisibility(Visibility.DISPLAYED).build(), null);
-            assertNotNull(root.getChild("home"));
-            assertNotNull(root.getChild("sitemap"));
-            assertNull(root.getChild("groupnavigation"));
-
-            //
-            root = portal.getNode(nav, Scope.ALL, UserNodeFilterConfig.builder().withVisibility(Visibility.DISPLAYED, Visibility.SYSTEM).build(), null);
-            assertNotNull(root.getChild("home"));
-            assertNotNull(root.getChild("sitemap"));
-            assertNotNull(root.getChild("groupnavigation"));
-         }
-      };
-
-      //
-      test.execute("root");
-   }
-
-   public void testFilterWithAuthorizationCheck()
-   {
-      class Check extends UnitTest
-      {
-
-         /** . */
-         boolean pass = true;
-
-         @Override
-         protected void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
-            UserPortal portal = userPortalCfg.getUserPortal();
-            UserNavigation nav = portal.getNavigation(SiteKey.group("/platform/administrators"));
-
-            //
-            UserNode root = portal.getNode(nav, Scope.ALL, UserNodeFilterConfig.builder().withAuthorizationCheck().build(), null);
-            pass &= root.getChild("administration") != null;
-            pass &= root.getChild("administration").getChild("communityManagement") != null;
-         }
-      }
-
-      //
-      Check root = new Check();
-      root.execute("root");
-      assertTrue(root.pass);
-
-      //
-      Check anon = new Check();
-      anon.execute("john");
-      assertFalse(anon.pass);
-   }
-
-   public void testFilterPropagation()
-   {
-      UnitTest test = new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("system", getUserId());
-            UserPortal portal = userPortalCfg.getUserPortal();
-            UserNavigation nav = portal.getNavigation(SiteKey.portal("system"));
-
-            //
-            UserNode root = portal.getNode(nav, Scope.SINGLE, UserNodeFilterConfig.builder().withVisibility(Visibility.DISPLAYED).build(), null);
-            assertFalse(root.hasChildrenRelationship());
-
-            //
-            portal.updateNode(root, Scope.ALL, null);
-            assertTrue(root.hasChildrenRelationship());
-            assertNotNull(root.getChild("home"));
-            assertNotNull(root.getChild("sitemap"));
-            assertNull(root.getChild("groupnavigation"));
-         }
-      };
-
-      //
-      test.execute("root");
-   }
-/*
-   public void testJohnGetUserPortalConfig()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "john");
-            assertNotNull(userPortalCfg);
-            PortalConfig portalCfg = userPortalCfg.getPortalConfig();
-            assertNotNull(portalCfg);
-            assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
-            assertEquals("classic", portalCfg.getName());
-            assertNotNull(userPortalCfg.getNavigations());
-            Map<String, PageNavigation> navigations = toMap(userPortalCfg);
-            assertEquals("expected to have 5 navigations instead of " + navigations, 5, navigations.size());
-            assertTrue(navigations.containsKey("portal::classic"));
-            assertTrue(navigations.containsKey("group::/platform/administrators"));
-            assertTrue(navigations.containsKey("group::/organization/management/executive-board"));
-            assertTrue(navigations.containsKey("group::/platform/users"));
-            assertTrue(navigations.containsKey("user::john"));
-         }
-      }.execute("john");
-   }
-
-   public void testMaryGetUserPortalConfig()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "mary");
-            assertNotNull(userPortalCfg);
-            PortalConfig portalCfg = userPortalCfg.getPortalConfig();
-            assertNotNull(portalCfg);
-            assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
-            assertEquals("classic", portalCfg.getName());
-            assertNotNull(userPortalCfg.getNavigations());
-            Map<String, PageNavigation> navigations = toMap(userPortalCfg);
-            assertEquals(3, navigations.size());
-            assertTrue(navigations.containsKey("portal::classic"));
-            assertTrue(navigations.containsKey("group::/platform/users"));
-            assertTrue(navigations.containsKey("user::mary"));
-         }
-      }.execute("mary");
-   }
-
-   public void testGuestGetUserPortalConfig()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", null);
-            assertNotNull(userPortalCfg);
-            PortalConfig portalCfg = userPortalCfg.getPortalConfig();
-            assertNotNull(portalCfg);
-            assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
-            assertEquals("classic", portalCfg.getName());
-            assertNotNull(userPortalCfg.getNavigations());
-            Map<String, PageNavigation> navigations = toMap(userPortalCfg);
-            assertEquals("" + navigations, 1, navigations.size());
-            assertTrue(navigations.containsKey("portal::classic"));
-         }
-      }.execute(null);
-   }
-
-*/
-
-   public void testNavigationOrder()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
-            UserPortal userPortal = userPortalCfg.getUserPortal();
-            List<UserNavigation> navigations = userPortal.getNavigations();
-            assertEquals("expected to have 5 navigations instead of " + navigations, 5, navigations.size());
-            assertEquals(SiteKey.portal("classic"), navigations.get(0).getKey()); // 1
-            assertEquals(SiteKey.group("/platform/administrators"), navigations.get(1).getKey()); // 2
-            assertEquals(SiteKey.user("root"), navigations.get(2).getKey()); // 3
-            assertEquals(SiteKey.group("/organization/management/executive-board"), navigations.get(3).getKey()); // 4
-            assertEquals(SiteKey.group("/platform/users"), navigations.get(4).getKey()); // 5
-         }
-      }.execute("root");
-   }
-
-   public void testPathResolution()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
-            UserPortal userPortal = userPortalCfg.getUserPortal();
-
-            //
-            UserNode nav = userPortal.resolvePath(null, "/");
-            assertEquals(SiteKey.portal("classic"), nav.getNavigation().getKey());
-            assertEquals("home", nav.getName());
-            assertEquals("default", nav.getParent().getName());
-            assertNull(nav.getParent().getParent());
-
-            //
-            nav = userPortal.resolvePath(null, "/foo");
-            assertEquals(SiteKey.portal("classic"), nav.getNavigation().getKey());
-            assertEquals("home", nav.getName());
-            assertEquals("default", nav.getParent().getName());
-            assertNull(nav.getParent().getParent());
-
-            //
-            nav = userPortal.resolvePath(null, "/home");
-            assertEquals(SiteKey.portal("classic"), nav.getNavigation().getKey());
-            assertEquals("home", nav.getName());
-            assertEquals("default", nav.getParent().getName());
-            assertNull(nav.getParent().getParent());
-
-            //
-            nav = userPortal.resolvePath(null, "/administration/communityManagement");
-            assertEquals(SiteKey.group("/platform/administrators"), nav.getNavigation().getKey());
-            assertEquals("communityManagement", nav.getName());
-            assertEquals("administration", nav.getParent().getName());
-            assertEquals("default", nav.getParent().getParent().getName());
-            assertNull(nav.getParent().getParent().getParent());
-         }
-      }.execute("root");
-   }
-
-   public void testPathResolutionPerNavigation()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
-            UserPortal userPortal = userPortalCfg.getUserPortal();
-            UserNavigation navigation = userPortal.getNavigation(SiteKey.group("/platform/administrators"));
-
-            //
-            UserNode path = userPortal.resolvePath(navigation, null, "/");
-            assertNull(path);
-
-            //
-            path = userPortal.resolvePath(navigation, null, "/foo");
-            assertNull(path);
-
-            //
-            path = userPortal.resolvePath(navigation, null, "/administration");
-            assertNotNull(path);
-            assertEquals("administration", path.getName());
-
-            //
-            path = userPortal.resolvePath(navigation, null, "/administration/communityManagement");
-            assertNotNull(path);
-            assertEquals("communityManagement", path.getName());
-         }
-      }.execute("root");
-   }
-
-   public void testLabel()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            UserPortalContext userPortalContext = new UserPortalContext()
-            {
-               final MapResourceBundle bundle;
-
-               {
-                  Map<String, Object> map = new HashMap<String, Object>();
-                  map.put("portal.classic.home", "foo");
-                  map.put("portal.classic.emoh", "bar");
-                  bundle = new MapResourceBundle(map);
-               }
-
-               public ResourceBundle getBundle(UserNavigation navigation)
-               {
-                  return bundle;
-               }
-            };
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId(), userPortalContext);
-            UserPortal userPortal = userPortalCfg.getUserPortal();
-
-            //
-            UserNode path = userPortal.resolvePath(null, "/home");
-            assertEquals("#{portal.classic.home}", path.getLabel());
-            assertEquals("foo", path.getResolvedLabel());
-
-            // Note that we don't save otherwise that may affect other tests
-            // this is fine for this test I think
-            path.setLabel("#{portal.classic.emoh}");
-            assertEquals("bar", path.getResolvedLabel());
-         }
-      }.execute("root");
-   }
-
-   public void testLoadNode()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
-            UserPortal userPortal = userPortalCfg.getUserPortal();
-            UserNavigation navigation = userPortal.getNavigation(SiteKey.group("/platform/administrators"));
-
-            //
-            UserNode root = userPortal.getNode(navigation, Scope.SINGLE, null, null);
-            assertEquals("default", root.getName());
-            assertEquals(1, root.getChildrenCount());
-            assertEquals(0, root.getChildren().size());
-            assertFalse(root.hasChildrenRelationship());
-
-            //
-            root = userPortal.getNode(navigation, Scope.CHILDREN, null, null);
-            assertEquals("default", root.getName());
-            assertEquals(1, root.getChildrenCount());
-            assertEquals(1, root.getChildren().size());
-            assertTrue(root.hasChildrenRelationship());
-            Iterator<UserNode> children = root.getChildren().iterator();
-            UserNode administration = children.next();
-            assertEquals("administration", administration.getName());
-            assertEquals(5, administration.getChildrenCount());
-            assertEquals(0, administration.getChildren().size());
-            assertFalse(administration.hasChildrenRelationship());
-
-            //
-            userPortal.updateNode(administration, Scope.CHILDREN, null);
-            assertEquals("administration", administration.getName());
-            assertEquals(5, administration.getChildrenCount());
-            assertEquals(5, administration.getChildren().size());
-            assertTrue(administration.hasChildrenRelationship());
-
-            //
-            UserNode registry = administration.getChildren().iterator().next();
-            assertEquals("registry", registry.getName());
-            assertEquals(0, registry.getChildrenCount());
-            assertEquals(0, registry.getChildren().size());
-            assertFalse(registry.hasChildrenRelationship());
-
-            // I'm too lazy to check the remaining nodes...
-         }
-      }.execute("root");
-   }
-
-   public void testPublicationTime()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("test", getUserId());
-            UserPortal userPortal = userPortalCfg.getUserPortal();
-            UserNavigation navigation = userPortal.getNavigation(SiteKey.portal("test"));
-            
-            UserNode root = userPortal.getNode(navigation, Scope.ALL, UserNodeFilterConfig.builder().withTemporalCheck().build(), null);
-            GregorianCalendar start = new GregorianCalendar(2000, 2, 21, 1, 33, 0);
-            start.setTimeZone(TimeZone.getTimeZone("UTC"));
-            GregorianCalendar end = new GregorianCalendar(2050, 2, 21, 1, 33, 0);
-            end.setTimeZone(TimeZone.getTimeZone("UTC"));
-
-            assertEquals(3, root.getChildrenCount());
-            
-            UserNode node1 = root.getChild("node_name1");
-            assertNotNull(node1);
-            assertEquals(start.getTimeInMillis(), node1.getStartPublicationTime());
-            assertEquals(end.getTimeInMillis(), node1.getEndPublicationTime());
-
-            UserNode node2 = root.getChild("node_name3");
-            assertNotNull(node2);
-            assertEquals(-1, node2.getStartPublicationTime());
-            assertEquals(end.getTimeInMillis(), node2.getEndPublicationTime());
-            
-            UserNode node3 = root.getChild("node_name4");
-            assertNotNull(node3);
-            assertEquals(-1, node3.getStartPublicationTime());
-            assertEquals(-1, node3.getEndPublicationTime());
-         }
-      }.execute("root");
-   }
-
-   public void testSave()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            storage_.create(new PortalConfig("portal", "usernode_recursive"));
-            end(true);
-
-            //
-            begin();
-            Site site = mgr.getPOMService().getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "usernode_recursive");
-            site.getRootNavigation().addChild("default");
-            end(true);
-
-            //
-            begin();
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("usernode_recursive", getUserId());
-            UserPortal userPortal = userPortalCfg.getUserPortal();
-            UserNavigation navigation = userPortal.getNavigation(SiteKey.portal("usernode_recursive"));
-            UserNode root = userPortal.getNode(navigation, Scope.CHILDREN, null, null);
-            root.addChild("foo");
-            userPortal.saveNode(root, null);
-            end(true);
-
-            //
-            begin();
-            root = userPortal.getNode(navigation, Scope.ALL, null, null);
-            root.addChild("bar");
-            root.getChild("foo").addChild("juu");
-            userPortal.saveNode(root, null);
-            end(true);
-
-            //
-            begin();
-            userPortalCfg = userPortalConfigSer_.getUserPortalConfig("usernode_recursive", getUserId());
-            userPortal = userPortalCfg.getUserPortal();
-            navigation = userPortal.getNavigation(SiteKey.portal("usernode_recursive"));
-            root = userPortal.getNode(navigation, Scope.ALL, null, null);
-            assertNotNull(root.getChild("bar"));
-            UserNode foo = root.getChild("foo");
-            assertNotNull(foo.getChild("juu"));
-            
-            root.removeChild("foo");
-            root.addChild("foo");
-            userPortal.saveNode(root, null);
-            end(true);
-            
-            begin();
-            root = userPortal.getNode(navigation, Scope.ALL, null, null);
-            foo = root.getChild("foo");
-            assertNull(foo.getChild("juu"));
-         }
-      }.execute("root");
-   }
-   
-   public void testNodeExtension()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            storage_.create(new PortalConfig("portal", "node_extension"));
-            end(true);
-
-            //
-            begin();
-            Site site = mgr.getPOMService().getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "node_extension");
-            site.getRootNavigation().addChild("default");
-            end(true);
-            
-            begin();
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("node_extension", getUserId());
-            UserPortal userPortal = userPortalCfg.getUserPortal();
-            UserNavigation navigation = userPortal.getNavigation(SiteKey.portal("node_extension"));
-            UserNode root1 = userPortal.getNode(navigation, Scope.CHILDREN, null, null);
-            end(true);
-            
-            begin();
-            UserNode root2 = userPortal.getNode(navigation, Scope.CHILDREN, null, null);
-            UserNode foo2 = root2.addChild("foo");
-            userPortal.saveNode(root2, null);
-            end(true);
-
-            begin();
-            UserNode foo1 = root1.getChild("foo");
-            assertNull(foo1);
-            userPortal.updateNode(root1, Scope.GRANDCHILDREN, null);
-            foo1 = root1.getChild("foo");
-            assertNotNull(foo1);
-            foo1.addChild("bar");
-            userPortal.saveNode(root1, null);
-            end(true);
-            
-            begin();
-            UserNode bar2 = foo2.getChild("bar");
-            assertNull(foo2.getChild("bar"));
-            userPortal.updateNode(foo2, Scope.GRANDCHILDREN, null);
-            bar2 = foo2.getChild("bar");
-            assertNotNull(bar2);
-            bar2.addChild("foo_bar");
-            userPortal.saveNode(root2, null);
-            end(true);
-            
-            begin();
-            root1 = userPortal.getNode(navigation, Scope.ALL, null, null);
-            UserNode bar1 = root1.getChild("foo").getChild("bar");
-            assertNotNull(bar1);
-            assertNotNull(bar1.getChild("foo_bar"));
-         }
-      }.execute("root");
-   }
-   
-   public void testCacheInvalidation()
-   {
-
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            storage_.create(new PortalConfig("portal", "cache_invalidation"));
-            end(true);
-
-            //
-            begin();
-            Site site = mgr.getPOMService().getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "cache_invalidation");
-            site.getRootNavigation().addChild("default");
-            end(true);
-
-            begin();
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("cache_invalidation", "root");
-            UserPortal userPortal = userPortalCfg.getUserPortal();
-            UserNavigation navigation = userPortal.getNavigation(SiteKey.portal("cache_invalidation"));
-            UserNode root = userPortal.getNode(navigation, Scope.CHILDREN, null, null);
-            root.addChild("foo");
-
-            userPortal.saveNode(root, null);
-            root = userPortal.getNode(navigation, Scope.CHILDREN, null, null);
-            assertNotNull(root.getChild("foo")); // should Cache be invalidated right after save()
-         }
-      }.execute("root");
-   }
-   
-   public void testInfiniteLoop()
-   {
-      new UnitTest()
-      {
-         @Override
-         protected void execute() throws Exception
-         {
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
-            UserPortal portal = userPortalCfg.getUserPortal();
-            UserNavigation nav = portal.getNavigation(SiteKey.group("/platform/administrators"));
-
-            //
-            UserNode root = portal.getNode(nav, Scope.GRANDCHILDREN, null, null);
-            portal.updateNode(root, Scope.GRANDCHILDREN, null); //Re-update the root node
-            Collection<UserNode> children = root.getChildren();
-            int level = 0;
-            for (UserNode child : children)
-            {
-               println(child, level);
-            }
-         }
-
-         private void println(UserNode node, int level)
-         {
-            Collection<UserNode> children = node.getChildren();
-            UserNode temp = null;
-            Iterator<UserNode> it = children.iterator();
-            while (it.hasNext())
-            {
-               UserNode child = it.next();
-               if (child == temp)
-               {
-                  child = it.next();
-                  fail("There is infinite loop");
-               }
-               temp = child;
-               println(child, level + 1);
-            }
-         }
-      }.execute("root");
-   }
-
-/*
-   public void testCreateUserPortalConfig()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            userPortalConfigSer_.createUserPortalConfig(PortalConfig.PORTAL_TYPE, "jazz", "test");
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("jazz", "root");
-            assertNotNull(userPortalCfg);
-            PortalConfig portalCfg = userPortalCfg.getPortalConfig();
-            assertNotNull(portalCfg);
-            assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
-            assertEquals("jazz", portalCfg.getName());
-            assertNotNull(userPortalCfg.getNavigations());
-            Map<String, PageNavigation> navigations = toMap(userPortalCfg);
-            assertEquals("expected to have 5 navigations instead of " + navigations, 5, navigations.size());
-            assertTrue(navigations.containsKey("portal::jazz"));
-            assertTrue(navigations.containsKey("group::/platform/administrators"));
-            assertTrue(navigations.containsKey("group::/organization/management/executive-board"));
-            assertTrue(navigations.containsKey("group::/platform/users"));
-            assertTrue(navigations.containsKey("user::root"));
-
-            queryPage();
-         }
-
-         private void queryPage()
-         {
-            Query<Page> query = new Query<Page>("portal", null, null, null, Page.class);
-            try
-            {
-               storage_.find(query);
-            }
-            catch (Exception ex)
-            {
-               assertTrue("Exception while querying pages with new portal", false);
-            }
-         }
-
-      }.execute("root");
-   }
-
-   public void testRemoveUserPortalConfig()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            userPortalConfigSer_.createUserPortalConfig(PortalConfig.PORTAL_TYPE, "jazz", "test");
-            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("jazz", "root");
-            assertNotNull(userPortalCfg);
-            saveMOP();
-            userPortalConfigSer_.removeUserPortalConfig("jazz");
-            saveMOP();
-            assertNull(userPortalConfigSer_.getUserPortalConfig("jazz", "root"));
-         }
-      }.execute("root");
-   }
-
-   public void testRootGetMakableNavigations()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            Set<String> navigations = new HashSet<String>(userPortalConfigSer_.getMakableNavigations("root", false));
-            Set<String> expectedNavigations =
-               new HashSet<String>(Arrays.asList("/platform/users", "/organization/management/human-resources",
-                  "/partners", "/customers", "/organization/communication", "/organization/management/executive-board",
-                  "/organization/management", "/organization/operations", "/organization", "/platform",
-                  "/organization/communication/marketing", "/platform/guests",
-                  "/organization/communication/press-and-media", "/platform/administrators",
-                  "/organization/operations/sales", "/organization/operations/finances"));
-            assertEquals(expectedNavigations, navigations);
-         }
-      }.execute(null);
-   }
-
-   public void testJohnGetMakableNavigations()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            Set<String> navigations = new HashSet<String>(userPortalConfigSer_.getMakableNavigations("john", false));
-            Set<String> expectedNavigations = Collections.singleton("/organization/management/executive-board");
-            assertEquals(expectedNavigations, navigations);
-         }
-      }.execute(null);
-   }
-
-   public void testMaryGetMakableNavigations()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            Set<String> navigations = new HashSet<String>(userPortalConfigSer_.getMakableNavigations("mary", false));
-            Set<String> expectedNavigations = Collections.emptySet();
-            assertEquals(expectedNavigations, navigations);
-         }
-      }.execute(null);
-   }
-
-   public void testRootGetPage()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            assertEquals("group::/platform/administrators::newAccount", userPortalConfigSer_.getPage(
-               "group::/platform/administrators::newAccount", null).getPageId());
-            assertEquals("group::/organization/management/executive-board::newStaff", userPortalConfigSer_.getPage(
-               "group::/organization/management/executive-board::newStaff", null).getPageId());
-         }
-      }.execute("root");
-   }
-
-   public void testJohnGetPage()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            assertEquals(null, userPortalConfigSer_.getPage("group::/platform/administrators::newAccount", null));
-            assertEquals("group::/organization/management/executive-board::newStaff", userPortalConfigSer_.getPage(
-               "group::/organization/management/executive-board::newStaff", null).getPageId());
-         }
-      }.execute("john");
-   }
-
-   public void testMaryGetPage()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            assertEquals(null, userPortalConfigSer_.getPage("group::/platform/administrators::newAccount", null));
-            assertEquals(null, userPortalConfigSer_.getPage(
-               "group::/organization/management/executive-board::newStaff", null));
-         }
-      }.execute("mary");
-   }
-
-   public void testAnonymousGetPage()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            assertEquals(null, userPortalConfigSer_.getPage("group::/platform/administrators::newAccount", null));
-            assertEquals(null, userPortalConfigSer_.getPage(
-               "group::/organization/management/executive-board::newStaff", null));
-         }
-      }.execute(null);
-   }
-
-   public void testRemovePage()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            Page page = new Page();
-            page.setOwnerType("group");
-            page.setOwnerId("/platform/administrators");
-            page.setName("newAccount");
-            assertTrue(events.isEmpty());
-            storage_.remove(page);
-            assertEquals(1, events.size());
-            Event event = events.removeFirst();
-            assertEquals(DataStorage.PAGE_REMOVED, event.getEventName());
-            Page p = ((Page)event.getData());
-            assertEquals("group", p.getOwnerType());
-            assertEquals("/platform/administrators", p.getOwnerId());
-            assertEquals("newAccount", p.getName());
-            assertEquals(null, userPortalConfigSer_.getPage("group::/platform/administrators::newAccount"));
-         }
-      }.execute(null);
-   }
-
-   public void testCreatePage()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            Page page = new Page();
-            page.setOwnerType("group");
-            page.setOwnerId("/platform/administrators");
-            page.setName("whatever");
-            assertTrue(events.isEmpty());
-            storage_.create(page);
-            assertEquals(1, events.size());
-            Event event = events.removeFirst();
-            assertEquals(DataStorage.PAGE_CREATED, event.getEventName());
-            Page p = ((Page)event.getData());
-            assertEquals("group", p.getOwnerType());
-            assertEquals("/platform/administrators", p.getOwnerId());
-            assertEquals("whatever", p.getName());
-            assertNotNull(userPortalConfigSer_.getPage("group::/platform/administrators::whatever"));
-         }
-      }.execute(null);
-   }
-
-   // Julien : see who added that and find out is test is relevant or not
-
-   public void testClonePage()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            Page page = new Page();
-            page.setOwnerType("group");
-            page.setOwnerId("/platform/administrators");
-            page.setName("whatever");
-            page.setTitle("testTitle");
-            storage_.create(page);
-
-            String newName = "newPage";
-            Page newPage = storage_.clonePage(page.getPageId(), page.getOwnerType(), page.getOwnerId(), newName);
-            
-            assertEquals(newName, newPage.getName());
-            assertEquals(page.getTitle(), newPage.getTitle());
-         }
-      }.execute(null);
-   }
-
-   public void testUpdatePage()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            Page page = new Page();
-            page.setOwnerType("group");
-            page.setOwnerId("/platform/administrators");
-            page.setName("newAccount");
-            page.setShowMaxWindow(true);
-            page.setTitle("newAccount title");
-            assertTrue(events.isEmpty());
-            storage_.create(page);
-            assertEquals(1, events.size());
-            Event event = events.removeFirst();
-            assertEquals(DataStorage.PAGE_CREATED, event.getEventName());
-            Page p = ((Page)event.getData());
-            assertEquals("group", p.getOwnerType());
-            assertEquals("/platform/administrators", p.getOwnerId());
-            assertEquals("newAccount", p.getName());
-            assertEquals("newAccount title", p.getTitle());
-            assertTrue(p.isShowMaxWindow());
-
-            p.setShowMaxWindow(false);
-            storage_.save(p);
-            p = userPortalConfigSer_.getPage("group::/platform/administrators::newAccount");
-            assertFalse(p.isShowMaxWindow());
-            p.setShowMaxWindow(true);
-            storage_.save(p);
-            p = userPortalConfigSer_.getPage("group::/platform/administrators::newAccount");
-            assertTrue(p.isShowMaxWindow());
-            p.setShowMaxWindow(false);
-            storage_.save(p);
-            p = userPortalConfigSer_.getPage("group::/platform/administrators::newAccount");
-            assertFalse(p.isShowMaxWindow());
-            p.setShowMaxWindow(true);
-            storage_.save(p);
-            p = userPortalConfigSer_.getPage("group::/platform/administrators::newAccount");
-            assertTrue(p.isShowMaxWindow());
-
-            Page p2 = userPortalConfigSer_.getPage("group::/platform/administrators::newAccount");
-            assertEquals("group", p2.getOwnerType());
-            assertEquals("/platform/administrators", p2.getOwnerId());
-            assertEquals("newAccount", p2.getName());
-            //            assertFalse(p2.isShowMaxWindow());
-            p2.setTitle("newAccount title 1");
-            p2.setShowMaxWindow(true);
-            storage_.save(p2);
-
-            Page p3 = userPortalConfigSer_.getPage("group::/platform/administrators::newAccount");
-            assertEquals("newAccount title 1", p3.getTitle());
-            //            assertTrue(p3.isShowMaxWindow());
-
-         }
-      }.execute(null);
-   }
-
-   public void testRemoveNavigation()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            PageNavigation navigation = new PageNavigation();
-            navigation.setOwnerType("group");
-            navigation.setOwnerId("/platform/administrators");
-            assertTrue(events.isEmpty());
-            storage_.remove(navigation);
-            assertEquals(1, events.size());
-            Event event = events.removeFirst();
-            assertEquals(DataStorage.NAVIGATION_REMOVED, event.getEventName());
-            PageNavigation n = ((PageNavigation)event.getData());
-            assertEquals("group", n.getOwnerType());
-            assertEquals("/platform/administrators", n.getOwnerId());
-            assertEquals(null, storage_.getPageNavigation("group", "/platform/administrators"));
-         }
-      }.execute(null);
-   }
-
-   public void testCreateNavigation()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            PageNavigation navigation = new PageNavigation();
-            navigation.setOwnerType("group");
-            navigation.setOwnerId("/platform/administrators");
-            storage_.remove(navigation);
-            assertNotNull(events.removeLast());
-            assertTrue(events.isEmpty());
-            storage_.create(navigation);
-            assertEquals(1, events.size());
-            Event event = events.removeFirst();
-            assertEquals(DataStorage.NAVIGATION_CREATED, event.getEventName());
-            PageNavigation n = ((PageNavigation)event.getData());
-            assertEquals("group", n.getOwnerType());
-            assertEquals("/platform/administrators", n.getOwnerId());
-            PageNavigation n2 = storage_.getPageNavigation("group", "/platform/administrators");
-            assertEquals("group", n2.getOwnerType());
-            assertEquals("/platform/administrators", n2.getOwnerId());
-         }
-      }.execute(null);
-   }
-
-   */
-/*
-      public void testCreateMultipleNavigations(){
-         for(int i =0; i < 10; i++){
-            createNavigation(null, "group", "/platform/administrators" + i);
-         }
-      }
-      
-      private void createNavigation(final String user, final String ownerType, final String ownerId)
-      {
-         new UnitTest()
-         {
-
-            public void execute() throws Exception
-            {
-               createNavigationInSeperatedThread();
-            }
-
-            private void createNavigationInSeperatedThread()
-            {
-               Thread task = new Thread()
-               {
-                  public void run()
-                  {
-                     PageNavigation navigation = new PageNavigation();
-                     navigation.setOwnerType(ownerType);
-                     navigation.setOwnerId(ownerId);
-                     try
-                     {
-                        userPortalConfigSer_.create(navigation);
-                        Event event = events.removeFirst();
-                        assertEquals(DataStorage.CREATE_NAVIGATION_EVENT, event.getEventName());
-                        PageNavigation n1 = (PageNavigation)event.getSource();
-                        assertEquals(ownerType, n1.getOwnerType());
-                        assertEquals(ownerId, n1.getOwnerId());
-                        PageNavigation n2 = storage_.getPageNavigation(ownerType, ownerId);
-                        assertEquals(ownerType, n2.getOwnerType());
-                        assertEquals(ownerId, n2.getOwnerId());
-                     }
-                     catch (Exception ex)
-                     {
-                        assertTrue("Failed while create '" + ownerType + " ' navigation for owner: " + ownerId, false);
-                        ex.printStackTrace();
-                     }
-                  }
-               };
-
-               task.start();
-               try
-               {
-                  task.sleep(200);
-               }
-               catch (InterruptedException ex)
-               {
-                  ex.printStackTrace();
-               }
-            }
-         }.execute(user);
-      }
-   *//*
-
-
-   public void testUpdateNavigation()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            PageNavigation navigation = new PageNavigation();
-            navigation.setOwnerType("group");
-            navigation.setOwnerId("/platform/administrators");
-            navigation.setPriority(3);
-            assertTrue(events.isEmpty());
-            storage_.save(navigation);
-            assertEquals(1, events.size());
-            Event event = events.removeFirst();
-            assertEquals(DataStorage.NAVIGATION_UPDATED, event.getEventName());
-            PageNavigation n = ((PageNavigation)event.getData());
-            assertEquals("group", n.getOwnerType());
-            assertEquals("/platform/administrators", n.getOwnerId());
-            assertEquals(3, n.getPriority());
-            PageNavigation n2 = storage_.getPageNavigation("group", "/platform/administrators");
-            assertEquals("group", n2.getOwnerType());
-            assertEquals("/platform/administrators", n2.getOwnerId());
-            assertEquals(3, n2.getPriority());
-         }
-      }.execute(null);
-   }
-   
-   public void testRenewPage()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            Page clone = storage_.clonePage("portal::test::test4", "portal", "test", "test5");
-            assertNotNull(clone);
-            assertEquals("portal", clone.getOwnerType());
-            assertEquals("test", clone.getOwnerId());
-            assertEquals("test5", clone.getName());
-
-            //
-            Application<Portlet> app = (Application<Portlet>)clone.getChildren().get(0);
-            Portlet prefs2 = storage_.load(app.getState(), ApplicationType.PORTLET);
-            assertEquals(new PortletBuilder().add("template",
-               "par:/groovy/groovy/webui/component/UIBannerPortlet.gtmpl").build(), prefs2);
-
-            // Update prefs of original page
-            PortletPreferences prefs = new PortletPreferences();
-            prefs.setWindowId("portal#test:/web/BannerPortlet/banner");
-            storage_.save(prefs);
-
-            //
-            prefs2 = storage_.load(app.getState(), ApplicationType.PORTLET);
-            assertEquals(new PortletBuilder().add("template",
-               "par:/groovy/groovy/webui/component/UIBannerPortlet.gtmpl").build(), prefs2);
-         }
-      }.execute(null);
-   }
-
-   public void testCreateFromTemplate()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            Page clone = userPortalConfigSer_.createPageTemplate("dashboard", "portal", "test");
-            assertNotNull(clone);
-            assertEquals("portal", clone.getOwnerType());
-            assertEquals("test", clone.getOwnerId());
-
-            //
-            assertEquals(1, clone.getChildren().size());
-
-            //
-            Application<Portlet> app = (Application<Portlet>)clone.getChildren().get(0);
-            assertEquals("Dashboard", app.getTitle());
-            assertNotNull(app.getState());
-            assertEquals("dashboard/DashboardPortlet", storage_.getId(app.getState()));
-            // assertEquals("portal", app.getInstanceState().getOwnerType());
-            // assertEquals("test", app.getInstanceState().getOwnerId());
-            Portlet prefs2 = storage_.load(app.getState(), ApplicationType.PORTLET);
-            assertNull(prefs2);
-         }
-      }.execute(null);
-   }
-
-   public void testOverwriteUserLayout()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            mgr.clearCache();
-
-            PortalConfig cfg = storage_.getPortalConfig(PortalConfig.USER_TYPE, "overwritelayout");
-            assertNotNull(cfg);
-
-            Container container = cfg.getPortalLayout();
-            assertNotNull(container);
-            assertEquals(2, container.getChildren().size());
-            assertTrue(container.getChildren().get(0) instanceof PageBody);
-            assertTrue(((Application)container.getChildren().get(1)).getType() == ApplicationType.PORTLET);
-            Application<Portlet> pa = (Application<Portlet>)container.getChildren().get(1);
-            ApplicationState<Portlet> state = pa.getState();
-            assertEquals("overwrite_application_ref/overwrite_portlet_ref", storage_.getId(state));
-         }
-      }.execute(null);
-   }
-
-   public void testUserTemplate()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            assertNull(storage_.getPortalConfig(PortalConfig.USER_TYPE, "user"));
-            assertNull(storage_.getPortalConfig(PortalConfig.USER_TYPE, "julien"));
-
-            //
-            UserHandler userHandler = orgService_.getUserHandler();
-            User user = userHandler.createUserInstance("julien");
-            user.setPassword("default");
-            user.setFirstName("default");
-            user.setLastName("default");
-            user.setEmail("exo at exoportal.org");
-            userHandler.createUser(user, true);
-
-            //
-            PortalConfig cfg = storage_.getPortalConfig(PortalConfig.USER_TYPE, "julien");
-            assertNotNull(cfg);
-            Container container = cfg.getPortalLayout();
-            assertNotNull(container);
-            assertEquals(2, container.getChildren().size());
-            assertTrue(container.getChildren().get(0) instanceof PageBody);
-            assertTrue(((Application)container.getChildren().get(1)).getType() == ApplicationType.PORTLET);
-            Application<Portlet> pa = (Application<Portlet>)container.getChildren().get(1);
-            ApplicationState state = pa.getState();
-            assertEquals("foo/bar", storage_.getId(pa.getState()));
-         }
-      }.execute(null);
-   }
-
-   public void testGroupTemplate()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            String groupName = "groupTest";
-            assertNull(storage_.getPortalConfig(PortalConfig.GROUP_TYPE, groupName));
-
-            //
-            GroupHandler groupHandler = orgService_.getGroupHandler();
-            Group group = groupHandler.createGroupInstance();
-            group.setGroupName(groupName);
-            group.setDescription("this is a group for test");
-            groupHandler.addChild(null, group, true);
-
-            //
-            PortalConfig cfg = storage_.getPortalConfig(PortalConfig.GROUP_TYPE, "/" + groupName);
-            assertNotNull(cfg);
-            Container container = cfg.getPortalLayout();
-            assertNotNull(container);
-            assertEquals(4, container.getChildren().size());
-            assertTrue(container.getChildren().get(2) instanceof PageBody);
-            assertTrue(((Application)container.getChildren().get(1)).getType() == ApplicationType.PORTLET);
-            
-            groupHandler.removeGroup(group, true);
-         }
-      }.execute(null);
-   }
-   
-   public void testCacheUserPortalConfig()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            mgr.clearCache();
-            DataCache cache = mgr.getDecorator(DataCache.class);
-            long readCount0 = cache.getReadCount();
-            userPortalConfigSer_.getUserPortalConfig("classic", null);
-            long readCount1 = cache.getReadCount();
-            assertTrue(readCount1 > readCount0);
-            userPortalConfigSer_.getUserPortalConfig("classic", null);
-            long readCount2 = cache.getReadCount();
-            assertEquals(readCount1, readCount2);
-         }
-      }.execute(null);
-   }
-
-   public void testCachePage()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            mgr.clearCache();
-            DataCache cache = mgr.getDecorator(DataCache.class);
-            long readCount0 = cache.getReadCount();
-            userPortalConfigSer_.getPage("portal::test::test1");
-            long readCount1 = cache.getReadCount();
-            assertTrue(readCount1 > readCount0);
-            userPortalConfigSer_.getPage("portal::test::test1");
-            long readCount2 = cache.getReadCount();
-            assertEquals(readCount1, readCount2);
-         }
-      }.execute(null);
-   }
-
-   public void testCachePageNavigation()
-   {
-      new UnitTest()
-      {
-         public void execute() throws Exception
-         {
-            mgr.clearCache();
-            DataCache cache = mgr.getDecorator(DataCache.class);
-            long readCount0 = cache.getReadCount();
-            storage_.getPageNavigation("portal", "test");
-            long readCount1 = cache.getReadCount();
-            assertTrue(readCount1 > readCount0);
-            storage_.getPageNavigation("portal", "test");
-            long readCount2 = cache.getReadCount();
-            assertEquals(readCount1, readCount2);
-         }
-      }.execute(null);
-   }
-
-   */
-
-   private abstract class UnitTest
-   {
-
-      /** . */
-      private String userId;
-
-      protected final void execute(String userId)
-      {
-         Throwable failure = null;
-
-         //
-         begin();
-
-         //
-         ConversationState conversationState = null;
-         if (userId != null)
-         {
-            try
-            {
-               conversationState = new ConversationState(authenticator.createIdentity(userId));
-            }
-            catch (Exception e)
-            {
-               failure = e;
-            }
-         }
-
-         //
-         if (failure == null)
-         {
-            // Clear cache for test
-            mgr.clearCache();
-
-            //
-            this.userId = userId;
-            ConversationState.setCurrent(conversationState);
-            try
-            {
-               execute();
-            }
-            catch (Exception e)
-            {
-               failure = e;
-               log.error("Test failed", e);
-            }
-            finally
-            {
-               this.userId = null;
-               ConversationState.setCurrent(null);
-               end();
-            }
-         }
-
-         // Report error as a junit assertion failure
-         if (failure != null)
-         {
-            AssertionFailedError err = new AssertionFailedError();
-            err.initCause(failure);
-            throw err;
-         }
-      }
-
-      public final String getUserId()
-      {
-         return userId;
-      }
-
-      protected abstract void execute() throws Exception;
-
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestUserPortal.java (from rev 6783, portal/trunk/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestUserPortal.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestUserPortal.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/mop/user/TestUserPortal.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,1471 @@
+/**
+ * Copyright (C) 2009 eXo Platform SAS.
+ * 
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.mop.user;
+
+import junit.framework.AssertionFailedError;
+
+import org.exoplatform.container.PortalContainer;
+import org.exoplatform.portal.config.AbstractPortalTest;
+import org.exoplatform.portal.config.DataStorage;
+import org.exoplatform.portal.config.UserPortalConfig;
+import org.exoplatform.portal.config.UserPortalConfigService;
+import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.mop.navigation.Scope;
+import org.exoplatform.portal.pom.config.POMDataStorage;
+import org.exoplatform.portal.pom.config.POMSessionManager;
+import org.exoplatform.services.listener.Event;
+import org.exoplatform.services.listener.Listener;
+import org.exoplatform.services.listener.ListenerService;
+import org.exoplatform.services.organization.OrganizationService;
+import org.exoplatform.services.security.Authenticator;
+import org.exoplatform.services.security.ConversationState;
+import org.gatein.common.i18n.MapResourceBundle;
+import org.gatein.mop.api.workspace.ObjectType;
+import org.gatein.mop.api.workspace.Site;
+
+import java.util.Collection;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.TimeZone;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class TestUserPortal extends AbstractPortalTest
+{
+
+   /** . */
+   private UserPortalConfigService userPortalConfigSer_;
+
+   /** . */
+   private OrganizationService orgService_;
+
+   /** . */
+   private DataStorage storage_;
+
+   /** . */
+   private POMSessionManager mgr;
+
+   /** . */
+   private Authenticator authenticator;
+
+   /** . */
+   private ListenerService listenerService;
+
+   /** . */
+   private LinkedList<Event> events;
+
+   /** . */
+   private boolean registered;
+
+   /** . */
+   private POMDataStorage mopStorage;
+
+   public TestUserPortal(String name)
+   {
+      super(name);
+
+      //
+      registered = false;
+   }
+
+   @Override
+   protected void setUp() throws Exception
+   {
+      Listener listener = new Listener()
+      {
+         @Override
+         public void onEvent(Event event) throws Exception
+         {
+            events.add(event);
+         }
+      };
+
+      PortalContainer container = getContainer();
+      userPortalConfigSer_ =
+         (UserPortalConfigService)container.getComponentInstanceOfType(UserPortalConfigService.class);
+      orgService_ = (OrganizationService)container.getComponentInstanceOfType(OrganizationService.class);
+      mgr = (POMSessionManager)container.getComponentInstanceOfType(POMSessionManager.class);
+      authenticator = (Authenticator)container.getComponentInstanceOfType(Authenticator.class);
+      listenerService = (ListenerService)container.getComponentInstanceOfType(ListenerService.class);
+      events = new LinkedList<Event>();
+      storage_ = (DataStorage)container.getComponentInstanceOfType(DataStorage.class);
+      mopStorage = (POMDataStorage)container.getComponentInstanceOfType(POMDataStorage.class);
+
+      // Register only once for all unit tests
+      if (!registered)
+      {
+         // I'm using this due to crappy design of
+         // org.exoplatform.services.listener.ListenerService
+         listenerService.addListener(DataStorage.PAGE_CREATED, listener);
+         listenerService.addListener(DataStorage.PAGE_REMOVED, listener);
+         listenerService.addListener(DataStorage.PAGE_UPDATED, listener);
+      }
+   }
+
+   private static Map<SiteKey, UserNavigation> toMap(UserPortalConfig cfg) throws Exception
+   {
+      return toMap(cfg.getUserPortal().getNavigations());
+   }
+
+   private static Map<SiteKey, UserNavigation> toMap(List<UserNavigation> navigations)
+   {
+      Map<SiteKey, UserNavigation> map = new HashMap<SiteKey, UserNavigation>();
+      for (UserNavigation nav : navigations)
+      {
+         map.put(nav.getKey(), nav);
+      }
+      return map;
+   }
+
+/*
+   public void testUpdatePortalConfig()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "root");
+            assertNotNull(userPortalCfg);
+            PortalConfig portalCfg = userPortalCfg.getPortalConfig();
+            assertNotNull(portalCfg);
+            assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
+            assertEquals("classic", portalCfg.getName());
+            assertEquals("en", portalCfg.getLocale());
+            portalCfg.setLocale("fr");
+
+            storage_.save(portalCfg);
+
+            userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "root");
+            portalCfg = userPortalCfg.getPortalConfig();
+            assertEquals("fr", portalCfg.getLocale());
+         }
+      }.execute("root");
+   }
+
+*/
+
+   public void testRootGetUserPortalConfig()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
+            Map<SiteKey, UserNavigation> navigations = toMap(userPortalCfg);
+            assertEquals(5, navigations.size());
+            assertTrue(navigations.containsKey(SiteKey.portal("classic")));
+            assertTrue(navigations.containsKey(SiteKey.user("root")));
+            assertTrue(navigations.containsKey(SiteKey.group("/platform/administrators")));
+            assertTrue(navigations.containsKey(SiteKey.group("/organization/management/executive-board")));
+            assertTrue(navigations.containsKey(SiteKey.group("/organization/management/executive-board")));
+            assertTrue(navigations.containsKey(SiteKey.group("/platform/users")));
+
+            // Now try with the specific api
+            UserNavigation rootNav = userPortalCfg.getUserPortal().getNavigation(SiteKey.user("root"));
+            assertNotNull(rootNav);
+            assertEquals(SiteKey.user("root"), rootNav.getKey());
+         }
+      }.execute("root");
+   }
+
+   public void testFilter()
+   {
+      UnitTest test = new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
+            UserPortal portal = userPortalCfg.getUserPortal();
+            UserNavigation nav = portal.getNavigation(SiteKey.portal("classic"));
+
+            //
+            UserNode root = portal.getNode(nav, Scope.ALL, UserNodeFilterConfig.builder().build(), null);
+            assertNotNull(root.getChild("home"));
+            assertNotNull(root.getChild("webexplorer"));
+         }
+      };
+
+      //
+      test.execute("root");
+      test.execute(null);
+   }
+
+   public void testFilterWithVisibility()
+   {
+      UnitTest test = new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("system", getUserId());
+            UserPortal portal = userPortalCfg.getUserPortal();
+            UserNavigation nav = portal.getNavigation(SiteKey.portal("system"));
+
+            //
+            UserNode root = portal.getNode(nav, Scope.ALL, UserNodeFilterConfig.builder().withVisibility(Visibility.DISPLAYED).build(), null);
+            assertNotNull(root.getChild("home"));
+            assertNotNull(root.getChild("sitemap"));
+            assertNull(root.getChild("groupnavigation"));
+
+            //
+            root = portal.getNode(nav, Scope.ALL, UserNodeFilterConfig.builder().withVisibility(Visibility.DISPLAYED, Visibility.SYSTEM).build(), null);
+            assertNotNull(root.getChild("home"));
+            assertNotNull(root.getChild("sitemap"));
+            assertNotNull(root.getChild("groupnavigation"));
+         }
+      };
+
+      //
+      test.execute("root");
+   }
+
+   public void testFilterWithAuthorizationCheck()
+   {
+      class Check extends UnitTest
+      {
+
+         /** . */
+         boolean pass = true;
+
+         @Override
+         protected void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
+            UserPortal portal = userPortalCfg.getUserPortal();
+            UserNavigation nav = portal.getNavigation(SiteKey.group("/platform/administrators"));
+
+            //
+            UserNode root = portal.getNode(nav, Scope.ALL, UserNodeFilterConfig.builder().withAuthorizationCheck().build(), null);
+            pass &= root.getChild("administration") != null;
+            pass &= root.getChild("administration").getChild("communityManagement") != null;
+         }
+      }
+
+      //
+      Check root = new Check();
+      root.execute("root");
+      assertTrue(root.pass);
+
+      //
+      Check anon = new Check();
+      anon.execute("john");
+      assertFalse(anon.pass);
+   }
+
+   public void testFilterPropagation()
+   {
+      UnitTest test = new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("system", getUserId());
+            UserPortal portal = userPortalCfg.getUserPortal();
+            UserNavigation nav = portal.getNavigation(SiteKey.portal("system"));
+
+            //
+            UserNode root = portal.getNode(nav, Scope.SINGLE, UserNodeFilterConfig.builder().withVisibility(Visibility.DISPLAYED).build(), null);
+            assertFalse(root.hasChildrenRelationship());
+
+            //
+            portal.updateNode(root, Scope.ALL, null);
+            assertTrue(root.hasChildrenRelationship());
+            assertNotNull(root.getChild("home"));
+            assertNotNull(root.getChild("sitemap"));
+            assertNull(root.getChild("groupnavigation"));
+         }
+      };
+
+      //
+      test.execute("root");
+   }
+/*
+   public void testJohnGetUserPortalConfig()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "john");
+            assertNotNull(userPortalCfg);
+            PortalConfig portalCfg = userPortalCfg.getPortalConfig();
+            assertNotNull(portalCfg);
+            assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
+            assertEquals("classic", portalCfg.getName());
+            assertNotNull(userPortalCfg.getNavigations());
+            Map<String, PageNavigation> navigations = toMap(userPortalCfg);
+            assertEquals("expected to have 5 navigations instead of " + navigations, 5, navigations.size());
+            assertTrue(navigations.containsKey("portal::classic"));
+            assertTrue(navigations.containsKey("group::/platform/administrators"));
+            assertTrue(navigations.containsKey("group::/organization/management/executive-board"));
+            assertTrue(navigations.containsKey("group::/platform/users"));
+            assertTrue(navigations.containsKey("user::john"));
+         }
+      }.execute("john");
+   }
+
+   public void testMaryGetUserPortalConfig()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", "mary");
+            assertNotNull(userPortalCfg);
+            PortalConfig portalCfg = userPortalCfg.getPortalConfig();
+            assertNotNull(portalCfg);
+            assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
+            assertEquals("classic", portalCfg.getName());
+            assertNotNull(userPortalCfg.getNavigations());
+            Map<String, PageNavigation> navigations = toMap(userPortalCfg);
+            assertEquals(3, navigations.size());
+            assertTrue(navigations.containsKey("portal::classic"));
+            assertTrue(navigations.containsKey("group::/platform/users"));
+            assertTrue(navigations.containsKey("user::mary"));
+         }
+      }.execute("mary");
+   }
+
+   public void testGuestGetUserPortalConfig()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", null);
+            assertNotNull(userPortalCfg);
+            PortalConfig portalCfg = userPortalCfg.getPortalConfig();
+            assertNotNull(portalCfg);
+            assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
+            assertEquals("classic", portalCfg.getName());
+            assertNotNull(userPortalCfg.getNavigations());
+            Map<String, PageNavigation> navigations = toMap(userPortalCfg);
+            assertEquals("" + navigations, 1, navigations.size());
+            assertTrue(navigations.containsKey("portal::classic"));
+         }
+      }.execute(null);
+   }
+
+*/
+
+   public void testNavigationOrder()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+            List<UserNavigation> navigations = userPortal.getNavigations();
+            assertEquals("expected to have 5 navigations instead of " + navigations, 5, navigations.size());
+            assertEquals(SiteKey.portal("classic"), navigations.get(0).getKey()); // 1
+            assertEquals(SiteKey.group("/platform/administrators"), navigations.get(1).getKey()); // 2
+            assertEquals(SiteKey.user("root"), navigations.get(2).getKey()); // 3
+            assertEquals(SiteKey.group("/organization/management/executive-board"), navigations.get(3).getKey()); // 4
+            assertEquals(SiteKey.group("/platform/users"), navigations.get(4).getKey()); // 5
+         }
+      }.execute("root");
+   }
+
+   public void testPathResolution()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+
+            //
+            UserNode nav = userPortal.resolvePath(null, "/");
+            assertEquals(SiteKey.portal("classic"), nav.getNavigation().getKey());
+            assertEquals("home", nav.getName());
+            assertEquals("default", nav.getParent().getName());
+            assertNull(nav.getParent().getParent());
+
+            //
+            nav = userPortal.resolvePath(null, "/foo");
+            assertEquals(SiteKey.portal("classic"), nav.getNavigation().getKey());
+            assertEquals("home", nav.getName());
+            assertEquals("default", nav.getParent().getName());
+            assertNull(nav.getParent().getParent());
+
+            //
+            nav = userPortal.resolvePath(null, "/home");
+            assertEquals(SiteKey.portal("classic"), nav.getNavigation().getKey());
+            assertEquals("home", nav.getName());
+            assertEquals("default", nav.getParent().getName());
+            assertNull(nav.getParent().getParent());
+
+            //
+            nav = userPortal.resolvePath(null, "/administration/communityManagement");
+            assertEquals(SiteKey.group("/platform/administrators"), nav.getNavigation().getKey());
+            assertEquals("communityManagement", nav.getName());
+            assertEquals("administration", nav.getParent().getName());
+            assertEquals("default", nav.getParent().getParent().getName());
+            assertNull(nav.getParent().getParent().getParent());
+         }
+      }.execute("root");
+   }
+
+   public void testPathResolutionPerNavigation()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+            UserNavigation navigation = userPortal.getNavigation(SiteKey.group("/platform/administrators"));
+
+            //
+            UserNode path = userPortal.resolvePath(navigation, null, "/");
+            assertNull(path);
+
+            //
+            path = userPortal.resolvePath(navigation, null, "/foo");
+            assertNull(path);
+
+            //
+            path = userPortal.resolvePath(navigation, null, "/administration");
+            assertNotNull(path);
+            assertEquals("administration", path.getName());
+
+            //
+            path = userPortal.resolvePath(navigation, null, "/administration/communityManagement");
+            assertNotNull(path);
+            assertEquals("communityManagement", path.getName());
+         }
+      }.execute("root");
+   }
+
+   public void testLabel()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            UserPortalContext userPortalContext = new UserPortalContext()
+            {
+               final MapResourceBundle bundle;
+
+               {
+                  Map<String, Object> map = new HashMap<String, Object>();
+                  map.put("portal.classic.home", "foo");
+                  map.put("portal.classic.emoh", "bar");
+                  bundle = new MapResourceBundle(map);
+               }
+
+               public ResourceBundle getBundle(UserNavigation navigation)
+               {
+                  return bundle;
+               }
+            };
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId(), userPortalContext);
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+
+            //
+            UserNode path = userPortal.resolvePath(null, "/home");
+            assertEquals("#{portal.classic.home}", path.getLabel());
+            assertEquals("foo", path.getResolvedLabel());
+
+            // Note that we don't save otherwise that may affect other tests
+            // this is fine for this test I think
+            path.setLabel("#{portal.classic.emoh}");
+            assertEquals("bar", path.getResolvedLabel());
+         }
+      }.execute("root");
+   }
+
+   public void testLoadNode()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+            UserNavigation navigation = userPortal.getNavigation(SiteKey.group("/platform/administrators"));
+
+            //
+            UserNode root = userPortal.getNode(navigation, Scope.SINGLE, null, null);
+            assertEquals("default", root.getName());
+            assertEquals(1, root.getChildrenCount());
+            assertEquals(0, root.getChildren().size());
+            assertFalse(root.hasChildrenRelationship());
+
+            //
+            root = userPortal.getNode(navigation, Scope.CHILDREN, null, null);
+            assertEquals("default", root.getName());
+            assertEquals(1, root.getChildrenCount());
+            assertEquals(1, root.getChildren().size());
+            assertTrue(root.hasChildrenRelationship());
+            Iterator<UserNode> children = root.getChildren().iterator();
+            UserNode administration = children.next();
+            assertEquals("administration", administration.getName());
+            assertEquals(5, administration.getChildrenCount());
+            assertEquals(0, administration.getChildren().size());
+            assertFalse(administration.hasChildrenRelationship());
+
+            //
+            userPortal.updateNode(administration, Scope.CHILDREN, null);
+            assertEquals("administration", administration.getName());
+            assertEquals(5, administration.getChildrenCount());
+            assertEquals(5, administration.getChildren().size());
+            assertTrue(administration.hasChildrenRelationship());
+
+            //
+            UserNode registry = administration.getChildren().iterator().next();
+            assertEquals("registry", registry.getName());
+            assertEquals(0, registry.getChildrenCount());
+            assertEquals(0, registry.getChildren().size());
+            assertFalse(registry.hasChildrenRelationship());
+
+            // I'm too lazy to check the remaining nodes...
+         }
+      }.execute("root");
+   }
+
+   public void testPublicationTime()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("test", getUserId());
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+            UserNavigation navigation = userPortal.getNavigation(SiteKey.portal("test"));
+            
+            UserNode root = userPortal.getNode(navigation, Scope.ALL, UserNodeFilterConfig.builder().withTemporalCheck().build(), null);
+            GregorianCalendar start = new GregorianCalendar(2000, 2, 21, 1, 33, 0);
+            start.setTimeZone(TimeZone.getTimeZone("UTC"));
+            GregorianCalendar end = new GregorianCalendar(2050, 2, 21, 1, 33, 0);
+            end.setTimeZone(TimeZone.getTimeZone("UTC"));
+
+            assertEquals(3, root.getChildrenCount());
+            
+            UserNode node1 = root.getChild("node_name1");
+            assertNotNull(node1);
+            assertEquals(start.getTimeInMillis(), node1.getStartPublicationTime());
+            assertEquals(end.getTimeInMillis(), node1.getEndPublicationTime());
+
+            UserNode node2 = root.getChild("node_name3");
+            assertNotNull(node2);
+            assertEquals(-1, node2.getStartPublicationTime());
+            assertEquals(end.getTimeInMillis(), node2.getEndPublicationTime());
+            
+            UserNode node3 = root.getChild("node_name4");
+            assertNotNull(node3);
+            assertEquals(-1, node3.getStartPublicationTime());
+            assertEquals(-1, node3.getEndPublicationTime());
+         }
+      }.execute("root");
+   }
+
+   public void testSave()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            storage_.create(new PortalConfig("portal", "usernode_recursive"));
+            end(true);
+
+            //
+            begin();
+            Site site = mgr.getPOMService().getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "usernode_recursive");
+            site.getRootNavigation().addChild("default");
+            end(true);
+
+            //
+            begin();
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("usernode_recursive", getUserId());
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+            UserNavigation navigation = userPortal.getNavigation(SiteKey.portal("usernode_recursive"));
+            UserNode root = userPortal.getNode(navigation, Scope.CHILDREN, null, null);
+            root.addChild("foo");
+            userPortal.saveNode(root, null);
+            end(true);
+
+            //
+            begin();
+            root = userPortal.getNode(navigation, Scope.ALL, null, null);
+            root.addChild("bar");
+            root.getChild("foo").addChild("juu");
+            userPortal.saveNode(root, null);
+            end(true);
+
+            //
+            begin();
+            userPortalCfg = userPortalConfigSer_.getUserPortalConfig("usernode_recursive", getUserId());
+            userPortal = userPortalCfg.getUserPortal();
+            navigation = userPortal.getNavigation(SiteKey.portal("usernode_recursive"));
+            root = userPortal.getNode(navigation, Scope.ALL, null, null);
+            assertNotNull(root.getChild("bar"));
+            UserNode foo = root.getChild("foo");
+            assertNotNull(foo.getChild("juu"));
+            
+            root.removeChild("foo");
+            root.addChild("foo");
+            userPortal.saveNode(root, null);
+            end(true);
+            
+            begin();
+            root = userPortal.getNode(navigation, Scope.ALL, null, null);
+            foo = root.getChild("foo");
+            assertNull(foo.getChild("juu"));
+         }
+      }.execute("root");
+   }
+   
+   public void testNodeExtension()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            storage_.create(new PortalConfig("portal", "node_extension"));
+            end(true);
+
+            //
+            begin();
+            Site site = mgr.getPOMService().getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "node_extension");
+            site.getRootNavigation().addChild("default");
+            end(true);
+            
+            begin();
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("node_extension", getUserId());
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+            UserNavigation navigation = userPortal.getNavigation(SiteKey.portal("node_extension"));
+            UserNode root1 = userPortal.getNode(navigation, Scope.CHILDREN, null, null);
+            end(true);
+            
+            begin();
+            UserNode root2 = userPortal.getNode(navigation, Scope.CHILDREN, null, null);
+            UserNode foo2 = root2.addChild("foo");
+            userPortal.saveNode(root2, null);
+            end(true);
+
+            begin();
+            UserNode foo1 = root1.getChild("foo");
+            assertNull(foo1);
+            userPortal.updateNode(root1, Scope.GRANDCHILDREN, null);
+            foo1 = root1.getChild("foo");
+            assertNotNull(foo1);
+            foo1.addChild("bar");
+            userPortal.saveNode(root1, null);
+            end(true);
+            
+            begin();
+            UserNode bar2 = foo2.getChild("bar");
+            assertNull(foo2.getChild("bar"));
+            userPortal.updateNode(foo2, Scope.GRANDCHILDREN, null);
+            bar2 = foo2.getChild("bar");
+            assertNotNull(bar2);
+            bar2.addChild("foo_bar");
+            userPortal.saveNode(root2, null);
+            end(true);
+            
+            begin();
+            root1 = userPortal.getNode(navigation, Scope.ALL, null, null);
+            UserNode bar1 = root1.getChild("foo").getChild("bar");
+            assertNotNull(bar1);
+            assertNotNull(bar1.getChild("foo_bar"));
+         }
+      }.execute("root");
+   }
+   
+   public void testCacheInvalidation()
+   {
+
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            storage_.create(new PortalConfig("portal", "cache_invalidation"));
+            end(true);
+
+            //
+            begin();
+            Site site = mgr.getPOMService().getModel().getWorkspace().getSite(ObjectType.PORTAL_SITE, "cache_invalidation");
+            site.getRootNavigation().addChild("default");
+            end(true);
+
+            begin();
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("cache_invalidation", "root");
+            UserPortal userPortal = userPortalCfg.getUserPortal();
+            UserNavigation navigation = userPortal.getNavigation(SiteKey.portal("cache_invalidation"));
+            UserNode root = userPortal.getNode(navigation, Scope.CHILDREN, null, null);
+            root.addChild("foo");
+
+            userPortal.saveNode(root, null);
+            root = userPortal.getNode(navigation, Scope.CHILDREN, null, null);
+            assertNotNull(root.getChild("foo")); // should Cache be invalidated right after save()
+         }
+      }.execute("root");
+   }
+   
+   public void testInfiniteLoop()
+   {
+      new UnitTest()
+      {
+         @Override
+         protected void execute() throws Exception
+         {
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("classic", getUserId());
+            UserPortal portal = userPortalCfg.getUserPortal();
+            UserNavigation nav = portal.getNavigation(SiteKey.group("/platform/administrators"));
+
+            //
+            UserNode root = portal.getNode(nav, Scope.GRANDCHILDREN, null, null);
+            portal.updateNode(root, Scope.GRANDCHILDREN, null); //Re-update the root node
+            Collection<UserNode> children = root.getChildren();
+            int level = 0;
+            for (UserNode child : children)
+            {
+               println(child, level);
+            }
+         }
+
+         private void println(UserNode node, int level)
+         {
+            Collection<UserNode> children = node.getChildren();
+            UserNode temp = null;
+            Iterator<UserNode> it = children.iterator();
+            while (it.hasNext())
+            {
+               UserNode child = it.next();
+               if (child == temp)
+               {
+                  child = it.next();
+                  fail("There is infinite loop");
+               }
+               temp = child;
+               println(child, level + 1);
+            }
+         }
+      }.execute("root");
+   }
+
+/*
+   public void testCreateUserPortalConfig()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            userPortalConfigSer_.createUserPortalConfig(PortalConfig.PORTAL_TYPE, "jazz", "test");
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("jazz", "root");
+            assertNotNull(userPortalCfg);
+            PortalConfig portalCfg = userPortalCfg.getPortalConfig();
+            assertNotNull(portalCfg);
+            assertEquals(PortalConfig.PORTAL_TYPE, portalCfg.getType());
+            assertEquals("jazz", portalCfg.getName());
+            assertNotNull(userPortalCfg.getNavigations());
+            Map<String, PageNavigation> navigations = toMap(userPortalCfg);
+            assertEquals("expected to have 5 navigations instead of " + navigations, 5, navigations.size());
+            assertTrue(navigations.containsKey("portal::jazz"));
+            assertTrue(navigations.containsKey("group::/platform/administrators"));
+            assertTrue(navigations.containsKey("group::/organization/management/executive-board"));
+            assertTrue(navigations.containsKey("group::/platform/users"));
+            assertTrue(navigations.containsKey("user::root"));
+
+            queryPage();
+         }
+
+         private void queryPage()
+         {
+            Query<Page> query = new Query<Page>("portal", null, null, null, Page.class);
+            try
+            {
+               storage_.find(query);
+            }
+            catch (Exception ex)
+            {
+               assertTrue("Exception while querying pages with new portal", false);
+            }
+         }
+
+      }.execute("root");
+   }
+
+   public void testRemoveUserPortalConfig()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            userPortalConfigSer_.createUserPortalConfig(PortalConfig.PORTAL_TYPE, "jazz", "test");
+            UserPortalConfig userPortalCfg = userPortalConfigSer_.getUserPortalConfig("jazz", "root");
+            assertNotNull(userPortalCfg);
+            saveMOP();
+            userPortalConfigSer_.removeUserPortalConfig("jazz");
+            saveMOP();
+            assertNull(userPortalConfigSer_.getUserPortalConfig("jazz", "root"));
+         }
+      }.execute("root");
+   }
+
+   public void testRootGetMakableNavigations()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            Set<String> navigations = new HashSet<String>(userPortalConfigSer_.getMakableNavigations("root", false));
+            Set<String> expectedNavigations =
+               new HashSet<String>(Arrays.asList("/platform/users", "/organization/management/human-resources",
+                  "/partners", "/customers", "/organization/communication", "/organization/management/executive-board",
+                  "/organization/management", "/organization/operations", "/organization", "/platform",
+                  "/organization/communication/marketing", "/platform/guests",
+                  "/organization/communication/press-and-media", "/platform/administrators",
+                  "/organization/operations/sales", "/organization/operations/finances"));
+            assertEquals(expectedNavigations, navigations);
+         }
+      }.execute(null);
+   }
+
+   public void testJohnGetMakableNavigations()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            Set<String> navigations = new HashSet<String>(userPortalConfigSer_.getMakableNavigations("john", false));
+            Set<String> expectedNavigations = Collections.singleton("/organization/management/executive-board");
+            assertEquals(expectedNavigations, navigations);
+         }
+      }.execute(null);
+   }
+
+   public void testMaryGetMakableNavigations()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            Set<String> navigations = new HashSet<String>(userPortalConfigSer_.getMakableNavigations("mary", false));
+            Set<String> expectedNavigations = Collections.emptySet();
+            assertEquals(expectedNavigations, navigations);
+         }
+      }.execute(null);
+   }
+
+   public void testRootGetPage()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            assertEquals("group::/platform/administrators::newAccount", userPortalConfigSer_.getPage(
+               "group::/platform/administrators::newAccount", null).getPageId());
+            assertEquals("group::/organization/management/executive-board::newStaff", userPortalConfigSer_.getPage(
+               "group::/organization/management/executive-board::newStaff", null).getPageId());
+         }
+      }.execute("root");
+   }
+
+   public void testJohnGetPage()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            assertEquals(null, userPortalConfigSer_.getPage("group::/platform/administrators::newAccount", null));
+            assertEquals("group::/organization/management/executive-board::newStaff", userPortalConfigSer_.getPage(
+               "group::/organization/management/executive-board::newStaff", null).getPageId());
+         }
+      }.execute("john");
+   }
+
+   public void testMaryGetPage()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            assertEquals(null, userPortalConfigSer_.getPage("group::/platform/administrators::newAccount", null));
+            assertEquals(null, userPortalConfigSer_.getPage(
+               "group::/organization/management/executive-board::newStaff", null));
+         }
+      }.execute("mary");
+   }
+
+   public void testAnonymousGetPage()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            assertEquals(null, userPortalConfigSer_.getPage("group::/platform/administrators::newAccount", null));
+            assertEquals(null, userPortalConfigSer_.getPage(
+               "group::/organization/management/executive-board::newStaff", null));
+         }
+      }.execute(null);
+   }
+
+   public void testRemovePage()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            Page page = new Page();
+            page.setOwnerType("group");
+            page.setOwnerId("/platform/administrators");
+            page.setName("newAccount");
+            assertTrue(events.isEmpty());
+            storage_.remove(page);
+            assertEquals(1, events.size());
+            Event event = events.removeFirst();
+            assertEquals(DataStorage.PAGE_REMOVED, event.getEventName());
+            Page p = ((Page)event.getData());
+            assertEquals("group", p.getOwnerType());
+            assertEquals("/platform/administrators", p.getOwnerId());
+            assertEquals("newAccount", p.getName());
+            assertEquals(null, userPortalConfigSer_.getPage("group::/platform/administrators::newAccount"));
+         }
+      }.execute(null);
+   }
+
+   public void testCreatePage()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            Page page = new Page();
+            page.setOwnerType("group");
+            page.setOwnerId("/platform/administrators");
+            page.setName("whatever");
+            assertTrue(events.isEmpty());
+            storage_.create(page);
+            assertEquals(1, events.size());
+            Event event = events.removeFirst();
+            assertEquals(DataStorage.PAGE_CREATED, event.getEventName());
+            Page p = ((Page)event.getData());
+            assertEquals("group", p.getOwnerType());
+            assertEquals("/platform/administrators", p.getOwnerId());
+            assertEquals("whatever", p.getName());
+            assertNotNull(userPortalConfigSer_.getPage("group::/platform/administrators::whatever"));
+         }
+      }.execute(null);
+   }
+
+   // Julien : see who added that and find out is test is relevant or not
+
+   public void testClonePage()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            Page page = new Page();
+            page.setOwnerType("group");
+            page.setOwnerId("/platform/administrators");
+            page.setName("whatever");
+            page.setTitle("testTitle");
+            storage_.create(page);
+
+            String newName = "newPage";
+            Page newPage = storage_.clonePage(page.getPageId(), page.getOwnerType(), page.getOwnerId(), newName);
+            
+            assertEquals(newName, newPage.getName());
+            assertEquals(page.getTitle(), newPage.getTitle());
+         }
+      }.execute(null);
+   }
+
+   public void testUpdatePage()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            Page page = new Page();
+            page.setOwnerType("group");
+            page.setOwnerId("/platform/administrators");
+            page.setName("newAccount");
+            page.setShowMaxWindow(true);
+            page.setTitle("newAccount title");
+            assertTrue(events.isEmpty());
+            storage_.create(page);
+            assertEquals(1, events.size());
+            Event event = events.removeFirst();
+            assertEquals(DataStorage.PAGE_CREATED, event.getEventName());
+            Page p = ((Page)event.getData());
+            assertEquals("group", p.getOwnerType());
+            assertEquals("/platform/administrators", p.getOwnerId());
+            assertEquals("newAccount", p.getName());
+            assertEquals("newAccount title", p.getTitle());
+            assertTrue(p.isShowMaxWindow());
+
+            p.setShowMaxWindow(false);
+            storage_.save(p);
+            p = userPortalConfigSer_.getPage("group::/platform/administrators::newAccount");
+            assertFalse(p.isShowMaxWindow());
+            p.setShowMaxWindow(true);
+            storage_.save(p);
+            p = userPortalConfigSer_.getPage("group::/platform/administrators::newAccount");
+            assertTrue(p.isShowMaxWindow());
+            p.setShowMaxWindow(false);
+            storage_.save(p);
+            p = userPortalConfigSer_.getPage("group::/platform/administrators::newAccount");
+            assertFalse(p.isShowMaxWindow());
+            p.setShowMaxWindow(true);
+            storage_.save(p);
+            p = userPortalConfigSer_.getPage("group::/platform/administrators::newAccount");
+            assertTrue(p.isShowMaxWindow());
+
+            Page p2 = userPortalConfigSer_.getPage("group::/platform/administrators::newAccount");
+            assertEquals("group", p2.getOwnerType());
+            assertEquals("/platform/administrators", p2.getOwnerId());
+            assertEquals("newAccount", p2.getName());
+            //            assertFalse(p2.isShowMaxWindow());
+            p2.setTitle("newAccount title 1");
+            p2.setShowMaxWindow(true);
+            storage_.save(p2);
+
+            Page p3 = userPortalConfigSer_.getPage("group::/platform/administrators::newAccount");
+            assertEquals("newAccount title 1", p3.getTitle());
+            //            assertTrue(p3.isShowMaxWindow());
+
+         }
+      }.execute(null);
+   }
+
+   public void testRemoveNavigation()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            PageNavigation navigation = new PageNavigation();
+            navigation.setOwnerType("group");
+            navigation.setOwnerId("/platform/administrators");
+            assertTrue(events.isEmpty());
+            storage_.remove(navigation);
+            assertEquals(1, events.size());
+            Event event = events.removeFirst();
+            assertEquals(DataStorage.NAVIGATION_REMOVED, event.getEventName());
+            PageNavigation n = ((PageNavigation)event.getData());
+            assertEquals("group", n.getOwnerType());
+            assertEquals("/platform/administrators", n.getOwnerId());
+            assertEquals(null, storage_.getPageNavigation("group", "/platform/administrators"));
+         }
+      }.execute(null);
+   }
+
+   public void testCreateNavigation()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            PageNavigation navigation = new PageNavigation();
+            navigation.setOwnerType("group");
+            navigation.setOwnerId("/platform/administrators");
+            storage_.remove(navigation);
+            assertNotNull(events.removeLast());
+            assertTrue(events.isEmpty());
+            storage_.create(navigation);
+            assertEquals(1, events.size());
+            Event event = events.removeFirst();
+            assertEquals(DataStorage.NAVIGATION_CREATED, event.getEventName());
+            PageNavigation n = ((PageNavigation)event.getData());
+            assertEquals("group", n.getOwnerType());
+            assertEquals("/platform/administrators", n.getOwnerId());
+            PageNavigation n2 = storage_.getPageNavigation("group", "/platform/administrators");
+            assertEquals("group", n2.getOwnerType());
+            assertEquals("/platform/administrators", n2.getOwnerId());
+         }
+      }.execute(null);
+   }
+
+   */
+/*
+      public void testCreateMultipleNavigations(){
+         for(int i =0; i < 10; i++){
+            createNavigation(null, "group", "/platform/administrators" + i);
+         }
+      }
+      
+      private void createNavigation(final String user, final String ownerType, final String ownerId)
+      {
+         new UnitTest()
+         {
+
+            public void execute() throws Exception
+            {
+               createNavigationInSeperatedThread();
+            }
+
+            private void createNavigationInSeperatedThread()
+            {
+               Thread task = new Thread()
+               {
+                  public void run()
+                  {
+                     PageNavigation navigation = new PageNavigation();
+                     navigation.setOwnerType(ownerType);
+                     navigation.setOwnerId(ownerId);
+                     try
+                     {
+                        userPortalConfigSer_.create(navigation);
+                        Event event = events.removeFirst();
+                        assertEquals(DataStorage.CREATE_NAVIGATION_EVENT, event.getEventName());
+                        PageNavigation n1 = (PageNavigation)event.getSource();
+                        assertEquals(ownerType, n1.getOwnerType());
+                        assertEquals(ownerId, n1.getOwnerId());
+                        PageNavigation n2 = storage_.getPageNavigation(ownerType, ownerId);
+                        assertEquals(ownerType, n2.getOwnerType());
+                        assertEquals(ownerId, n2.getOwnerId());
+                     }
+                     catch (Exception ex)
+                     {
+                        assertTrue("Failed while create '" + ownerType + " ' navigation for owner: " + ownerId, false);
+                        ex.printStackTrace();
+                     }
+                  }
+               };
+
+               task.start();
+               try
+               {
+                  task.sleep(200);
+               }
+               catch (InterruptedException ex)
+               {
+                  ex.printStackTrace();
+               }
+            }
+         }.execute(user);
+      }
+   *//*
+
+
+   public void testUpdateNavigation()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            PageNavigation navigation = new PageNavigation();
+            navigation.setOwnerType("group");
+            navigation.setOwnerId("/platform/administrators");
+            navigation.setPriority(3);
+            assertTrue(events.isEmpty());
+            storage_.save(navigation);
+            assertEquals(1, events.size());
+            Event event = events.removeFirst();
+            assertEquals(DataStorage.NAVIGATION_UPDATED, event.getEventName());
+            PageNavigation n = ((PageNavigation)event.getData());
+            assertEquals("group", n.getOwnerType());
+            assertEquals("/platform/administrators", n.getOwnerId());
+            assertEquals(3, n.getPriority());
+            PageNavigation n2 = storage_.getPageNavigation("group", "/platform/administrators");
+            assertEquals("group", n2.getOwnerType());
+            assertEquals("/platform/administrators", n2.getOwnerId());
+            assertEquals(3, n2.getPriority());
+         }
+      }.execute(null);
+   }
+   
+   public void testRenewPage()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            Page clone = storage_.clonePage("portal::test::test4", "portal", "test", "test5");
+            assertNotNull(clone);
+            assertEquals("portal", clone.getOwnerType());
+            assertEquals("test", clone.getOwnerId());
+            assertEquals("test5", clone.getName());
+
+            //
+            Application<Portlet> app = (Application<Portlet>)clone.getChildren().get(0);
+            Portlet prefs2 = storage_.load(app.getState(), ApplicationType.PORTLET);
+            assertEquals(new PortletBuilder().add("template",
+               "par:/groovy/groovy/webui/component/UIBannerPortlet.gtmpl").build(), prefs2);
+
+            // Update prefs of original page
+            PortletPreferences prefs = new PortletPreferences();
+            prefs.setWindowId("portal#test:/web/BannerPortlet/banner");
+            storage_.save(prefs);
+
+            //
+            prefs2 = storage_.load(app.getState(), ApplicationType.PORTLET);
+            assertEquals(new PortletBuilder().add("template",
+               "par:/groovy/groovy/webui/component/UIBannerPortlet.gtmpl").build(), prefs2);
+         }
+      }.execute(null);
+   }
+
+   public void testCreateFromTemplate()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            Page clone = userPortalConfigSer_.createPageTemplate("dashboard", "portal", "test");
+            assertNotNull(clone);
+            assertEquals("portal", clone.getOwnerType());
+            assertEquals("test", clone.getOwnerId());
+
+            //
+            assertEquals(1, clone.getChildren().size());
+
+            //
+            Application<Portlet> app = (Application<Portlet>)clone.getChildren().get(0);
+            assertEquals("Dashboard", app.getTitle());
+            assertNotNull(app.getState());
+            assertEquals("dashboard/DashboardPortlet", storage_.getId(app.getState()));
+            // assertEquals("portal", app.getInstanceState().getOwnerType());
+            // assertEquals("test", app.getInstanceState().getOwnerId());
+            Portlet prefs2 = storage_.load(app.getState(), ApplicationType.PORTLET);
+            assertNull(prefs2);
+         }
+      }.execute(null);
+   }
+
+   public void testOverwriteUserLayout()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            mgr.clearCache();
+
+            PortalConfig cfg = storage_.getPortalConfig(PortalConfig.USER_TYPE, "overwritelayout");
+            assertNotNull(cfg);
+
+            Container container = cfg.getPortalLayout();
+            assertNotNull(container);
+            assertEquals(2, container.getChildren().size());
+            assertTrue(container.getChildren().get(0) instanceof PageBody);
+            assertTrue(((Application)container.getChildren().get(1)).getType() == ApplicationType.PORTLET);
+            Application<Portlet> pa = (Application<Portlet>)container.getChildren().get(1);
+            ApplicationState<Portlet> state = pa.getState();
+            assertEquals("overwrite_application_ref/overwrite_portlet_ref", storage_.getId(state));
+         }
+      }.execute(null);
+   }
+
+   public void testUserTemplate()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            assertNull(storage_.getPortalConfig(PortalConfig.USER_TYPE, "user"));
+            assertNull(storage_.getPortalConfig(PortalConfig.USER_TYPE, "julien"));
+
+            //
+            UserHandler userHandler = orgService_.getUserHandler();
+            User user = userHandler.createUserInstance("julien");
+            user.setPassword("default");
+            user.setFirstName("default");
+            user.setLastName("default");
+            user.setEmail("exo at exoportal.org");
+            userHandler.createUser(user, true);
+
+            //
+            PortalConfig cfg = storage_.getPortalConfig(PortalConfig.USER_TYPE, "julien");
+            assertNotNull(cfg);
+            Container container = cfg.getPortalLayout();
+            assertNotNull(container);
+            assertEquals(2, container.getChildren().size());
+            assertTrue(container.getChildren().get(0) instanceof PageBody);
+            assertTrue(((Application)container.getChildren().get(1)).getType() == ApplicationType.PORTLET);
+            Application<Portlet> pa = (Application<Portlet>)container.getChildren().get(1);
+            ApplicationState state = pa.getState();
+            assertEquals("foo/bar", storage_.getId(pa.getState()));
+         }
+      }.execute(null);
+   }
+
+   public void testGroupTemplate()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            String groupName = "groupTest";
+            assertNull(storage_.getPortalConfig(PortalConfig.GROUP_TYPE, groupName));
+
+            //
+            GroupHandler groupHandler = orgService_.getGroupHandler();
+            Group group = groupHandler.createGroupInstance();
+            group.setGroupName(groupName);
+            group.setDescription("this is a group for test");
+            groupHandler.addChild(null, group, true);
+
+            //
+            PortalConfig cfg = storage_.getPortalConfig(PortalConfig.GROUP_TYPE, "/" + groupName);
+            assertNotNull(cfg);
+            Container container = cfg.getPortalLayout();
+            assertNotNull(container);
+            assertEquals(4, container.getChildren().size());
+            assertTrue(container.getChildren().get(2) instanceof PageBody);
+            assertTrue(((Application)container.getChildren().get(1)).getType() == ApplicationType.PORTLET);
+            
+            groupHandler.removeGroup(group, true);
+         }
+      }.execute(null);
+   }
+   
+   public void testCacheUserPortalConfig()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            mgr.clearCache();
+            DataCache cache = mgr.getDecorator(DataCache.class);
+            long readCount0 = cache.getReadCount();
+            userPortalConfigSer_.getUserPortalConfig("classic", null);
+            long readCount1 = cache.getReadCount();
+            assertTrue(readCount1 > readCount0);
+            userPortalConfigSer_.getUserPortalConfig("classic", null);
+            long readCount2 = cache.getReadCount();
+            assertEquals(readCount1, readCount2);
+         }
+      }.execute(null);
+   }
+
+   public void testCachePage()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            mgr.clearCache();
+            DataCache cache = mgr.getDecorator(DataCache.class);
+            long readCount0 = cache.getReadCount();
+            userPortalConfigSer_.getPage("portal::test::test1");
+            long readCount1 = cache.getReadCount();
+            assertTrue(readCount1 > readCount0);
+            userPortalConfigSer_.getPage("portal::test::test1");
+            long readCount2 = cache.getReadCount();
+            assertEquals(readCount1, readCount2);
+         }
+      }.execute(null);
+   }
+
+   public void testCachePageNavigation()
+   {
+      new UnitTest()
+      {
+         public void execute() throws Exception
+         {
+            mgr.clearCache();
+            DataCache cache = mgr.getDecorator(DataCache.class);
+            long readCount0 = cache.getReadCount();
+            storage_.getPageNavigation("portal", "test");
+            long readCount1 = cache.getReadCount();
+            assertTrue(readCount1 > readCount0);
+            storage_.getPageNavigation("portal", "test");
+            long readCount2 = cache.getReadCount();
+            assertEquals(readCount1, readCount2);
+         }
+      }.execute(null);
+   }
+
+   */
+
+   private abstract class UnitTest
+   {
+
+      /** . */
+      private String userId;
+
+      protected final void execute(String userId)
+      {
+         Throwable failure = null;
+
+         //
+         begin();
+
+         //
+         ConversationState conversationState = null;
+         if (userId != null)
+         {
+            try
+            {
+               conversationState = new ConversationState(authenticator.createIdentity(userId));
+            }
+            catch (Exception e)
+            {
+               failure = e;
+            }
+         }
+
+         //
+         if (failure == null)
+         {
+            // Clear cache for test
+            mgr.clearCache();
+
+            //
+            this.userId = userId;
+            ConversationState.setCurrent(conversationState);
+            try
+            {
+               execute();
+            }
+            catch (Exception e)
+            {
+               failure = e;
+               log.error("Test failed", e);
+            }
+            finally
+            {
+               this.userId = null;
+               ConversationState.setCurrent(null);
+               end();
+            }
+         }
+
+         // Report error as a junit assertion failure
+         if (failure != null)
+         {
+            AssertionFailedError err = new AssertionFailedError();
+            err.initCause(failure);
+            throw err;
+         }
+      }
+
+      public final String getUserId()
+      {
+         return userId;
+      }
+
+      protected abstract void execute() throws Exception;
+
+   }
+}

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/tree/list/TestListTree.java
===================================================================
--- portal/trunk/component/portal/src/test/java/org/exoplatform/portal/tree/list/TestListTree.java	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/tree/list/TestListTree.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,738 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.tree.list;
-
-import junit.framework.TestCase;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-/**
- * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class TestListTree extends TestCase
-{
-
-   public static class IntegerTree extends ListTree<IntegerTree>
-   {
-
-      /** . */
-      private final int value;
-
-      public IntegerTree(int value)
-      {
-         this.value = value;
-      }
-   }
-
-   private static IntegerTree tree(String name, int value, IntegerTree... trees)
-   {
-      IntegerTree tree = new IntegerTree(value);
-      if (trees != null)
-      {
-         for (IntegerTree child : trees)
-         {
-            tree.insertAt(null, child);
-         }
-      }
-      return tree;
-   }
-
-   private void assertChildren(IntegerTree tree, Integer... expected)
-   {
-      List<Integer> children = new ArrayList<Integer>();
-      for (Iterator<IntegerTree> iterator = tree.listIterator();iterator.hasNext();)
-      {
-         IntegerTree next = iterator.next();
-         children.add(next.value);
-      }
-      assertEquals(Arrays.asList(expected), children);
-   }
-
-   private void assertAllChildren(IntegerTree tree, Integer... expected)
-   {
-      List<Integer> children = new ArrayList<Integer>();
-      for (IntegerTree current = tree.getFirst();current != null;current = current.getNext())
-      {
-         children.add(current.value);
-      }
-      assertEquals(Arrays.asList(expected), children);
-   }
-
-   private void assertAllChildren(IntegerTree tree)
-   {
-      assertAllChildren(tree, new Integer[0]);
-   }
-
-   public void testInsert1()
-   {
-      IntegerTree root = tree("", 0);
-      assertChildren(root);
-      assertAllChildren(root);
-
-      //
-      root = tree("", 0);
-      root.insertAt(0, tree("a", 1));
-      assertChildren(root, 1);
-      assertAllChildren(root, 1);
-
-      //
-      root = tree("", 0);
-      root.insertAt(null, tree("a", 1));
-      assertChildren(root, 1);
-      assertAllChildren(root, 1);
-   }
-
-/*
-   public void testInsertDuplicate()
-   {
-      IntegerTree root = tree("", 0, tree("a", 1));
-      assertChildren(root, 1);
-      assertAllChildren(root, 1);
-
-      //
-      try
-      {
-         root.insertAt(0, tree("a", 2));
-         fail();
-      }
-      catch (IllegalArgumentException ignore)
-      {
-         assertAllChildren(root, 1);
-      }
-   }
-*/
-
-   public void testInsertMove1()
-   {
-      IntegerTree a = tree("a", 1);
-      IntegerTree b = tree("b", 2);
-      IntegerTree root1 = tree("", 0, a, b);
-
-      //
-      root1.insertAt(0, b);
-      assertAllChildren(root1, 2, 1);
-   }
-
-   public void testInsertMove2()
-   {
-      IntegerTree a = tree("a", 1);
-      IntegerTree root1 = tree("", 0, a);
-
-      //
-      root1.insertAt(null, a);
-      assertAllChildren(root1, 1);
-
-      //
-      root1.insertAt(0, a);
-      assertAllChildren(root1, 1);
-   }
-
-   public void testInsertMove3()
-   {
-      IntegerTree a = tree("a", 1);
-      IntegerTree root1 = tree("", 0, a);
-      IntegerTree root2 = tree("", 0);
-
-      //
-      root2.insertAt(0, a);
-      assertAllChildren(root1);
-      assertAllChildren(root2, 1);
-      assertSame(root2, a.getParent());
-   }
-
-   public void testInsertReorder1()
-   {
-      IntegerTree a = tree("a", 1);
-      IntegerTree root1 = tree("", 0, a);
-
-      //
-      root1.insertAt(0, a);
-      assertAllChildren(root1, 1);
-      assertSame(root1, a.getParent());
-   }
-
-   public void testInsertReorder2()
-   {
-      IntegerTree a = tree("a", 1);
-      IntegerTree root1 = tree("", 0, a, tree("b", 2));
-
-      //
-      root1.insertAt(2, a);
-      assertAllChildren(root1, 2, 1);
-      assertSame(root1, a.getParent());
-
-      //
-      root1.insertAt(0, a);
-      assertAllChildren(root1, 1, 2);
-      assertSame(root1, a.getParent());
-   }
-
-   public void testRemove()
-   {
-      IntegerTree root = tree("", 0, tree("a", 1), tree("b", 2), tree("c", 3));
-      assertAllChildren(root, 1, 2, 3);
-
-      //
-      IntegerTree b = root.get(1);
-      b.remove();
-      assertNull(b.getParent());
-      assertNull(b.getPrevious());
-      assertNull(b.getNext());
-      assertEquals(2, b.value);
-      assertAllChildren(root, 1, 3);
-   }
-
-   public void testRemoveLast()
-   {
-      IntegerTree root = tree("", 0, tree("a", 1), tree("b", 2));
-      assertAllChildren(root, 1, 2);
-
-      //
-      IntegerTree b = root.get(1);
-      assertEquals(2, b.value);
-      b.remove();
-      assertAllChildren(root, 1);
-      assertEquals(1, root.getLast().value);
-   }
-
-/*
-   public void testRename()
-   {
-      IntegerTree root = tree("", 0, tree("a", 1), tree("b", 2), tree("c", 3));
-      assertAllChildren(root, 1, 2, 3);
-      assertAllChildren(root, "a", "b", "c");
-
-      //
-      root.rename("a", "a");
-      assertAllChildren(root, 1, 2, 3);
-      assertAllChildren(root, "a", "b", "c");
-
-      //
-      root.rename("a", "d");
-      assertAllChildren(root, 1, 2, 3);
-      assertAllChildren(root, "d", "b", "c");
-   }
-
-   public void testRenameWithNoChildren()
-   {
-      IntegerTree root = tree("", 0, (IntegerTree[]) null);
-      assertFalse(root.hasTrees());
-
-      //
-      try
-      {
-         root.rename("a", "b");
-         fail();
-      }
-      catch (IllegalStateException e)
-      {
-         assertFalse(root.hasTrees());
-      }
-   }
-
-   public void testRenameWithNonExisting()
-   {
-      IntegerTree root = tree("", 0, tree("a", 1), tree("b", 2), tree("c", 3));
-      assertAllChildren(root, 1, 2, 3);
-      assertAllChildren(root, "a", "b", "c");
-
-      //
-      try
-      {
-         root.rename("d", "e");
-         fail();
-      }
-      catch (IllegalArgumentException e)
-      {
-         assertAllChildren(root, 1, 2, 3);
-         assertAllChildren(root, "a", "b", "c");
-      }
-   }
-
-   public void testRenameWithExisting()
-   {
-      IntegerTree root = tree("", 0, tree("a", 1), tree("b", 2), tree("c", 3));
-      assertAllChildren(root, 1, 2, 3);
-      assertAllChildren(root, "a", "b", "c");
-
-      //
-      try
-      {
-         root.rename("a", "c");
-         fail();
-      }
-      catch (IllegalArgumentException e)
-      {
-         assertAllChildren(root, 1, 2, 3);
-         assertAllChildren(root, "a", "b", "c");
-      }
-   }
-*/
-
-/*
-   public void testGetByIndexWithNoChildren()
-   {
-      IntegerTree root = tree("", 0, (IntegerTree[]) null);
-
-      //
-      try
-      {
-         root.get(0);
-         fail();
-      }
-      catch (IllegalStateException e)
-      {
-      }
-   }
-*/
-
-   public void testIteratorRemove()
-   {
-      IntegerTree root = tree("", 0, tree("a", 1));
-      Iterator<IntegerTree> it = root.listIterator();
-
-      //
-      try
-      {
-         it.remove();
-         fail();
-      }
-      catch (IllegalStateException e)
-      {
-      }
-
-      //
-      IntegerTree a = it.next();
-      it.remove();
-      assertNull(a.getParent());
-      assertFalse(it.hasNext());
-      assertAllChildren(root);
-   }
-
-   public void testListIterator1()
-   {
-      IntegerTree a = tree("a", 1);
-      IntegerTree root = tree("", 0, a);
-
-      //
-      ListIterator<IntegerTree> i = root.listIterator();
-      assertTrue(i.hasNext());
-      assertEquals(0, i.nextIndex());
-      assertFalse(i.hasPrevious());
-      assertEquals(-1, i.previousIndex());
-
-      //
-      assertSame(a, i.next());
-      assertFalse(i.hasNext());
-      assertEquals(1, i.nextIndex());
-      assertTrue(i.hasPrevious());
-      assertEquals(0, i.previousIndex());
-
-      //
-      assertSame(a, i.previous());
-      assertTrue(i.hasNext());
-      assertEquals(0, i.nextIndex());
-      assertFalse(i.hasPrevious());
-      assertEquals(-1, i.previousIndex());
-   }
-
-   public void testListIterator2()
-   {
-      IntegerTree a = tree("a", 1);
-      IntegerTree b = tree("b", 2);
-      IntegerTree root = tree("", 0, a, b);
-
-      //
-      ListIterator<IntegerTree> i = root.listIterator();
-      assertTrue(i.hasNext());
-      assertEquals(0, i.nextIndex());
-      assertFalse(i.hasPrevious());
-      assertEquals(-1, i.previousIndex());
-      assertSame(a, i.next());
-      assertTrue(i.hasNext());
-      assertEquals(1, i.nextIndex());
-      assertTrue(i.hasPrevious());
-      assertEquals(0, i.previousIndex());
-      assertSame(b, i.next());
-      assertFalse(i.hasNext());
-      assertEquals(2, i.nextIndex());
-      assertTrue(i.hasPrevious());
-      assertEquals(1, i.previousIndex());
-      i.remove();
-      assertFalse(i.hasNext());
-      assertEquals(1, i.nextIndex());
-      assertTrue(i.hasPrevious());
-      assertEquals(0, i.previousIndex());
-   }
-
-   public void testListIterator3()
-   {
-      // Remove middle
-      IntegerTree a = tree("a", 1);
-      IntegerTree b = tree("b", 2);
-      IntegerTree c = tree("c", 3);
-      IntegerTree root = tree("", 0, a, b, c);
-      ListIterator<IntegerTree> i = root.listIterator();
-      i.next();
-      i.next();
-      i.remove();
-      assertTrue(i.hasNext());
-      assertEquals(1, i.nextIndex());
-      assertTrue(i.hasPrevious());
-      assertEquals(0, i.previousIndex());
-      assertSame(c, i.next());
-
-      // Remove middle
-      root = tree("", 0, a = tree("a", 1), b = tree("b", 2), c = tree("c", 3));
-      i = root.listIterator();
-      i.next();
-      i.next();
-      i.next();
-      i.previous();
-      i.previous();
-      i.remove();
-      assertTrue(i.hasNext());
-      assertEquals(1, i.nextIndex());
-      assertTrue(i.hasPrevious());
-      assertEquals(0, i.previousIndex());
-      assertSame(c, i.next());
-
-      // Remove middle
-      root = tree("", 0, a = tree("a", 1), b = tree("b", 2), c = tree("c", 3));
-      i = root.listIterator();
-      i.next();
-      i.next();
-      i.remove();
-      assertTrue(i.hasNext());
-      assertEquals(1, i.nextIndex());
-      assertTrue(i.hasPrevious());
-      assertEquals(0, i.previousIndex());
-      assertSame(a, i.previous());
-
-      // Remove middle
-      root = tree("", 0, a = tree("a", 1), b = tree("b", 2), c = tree("c", 3));
-      i = root.listIterator();
-      i.next();
-      i.next();
-      i.next();
-      i.previous();
-      i.previous();
-      i.remove();
-      assertTrue(i.hasNext());
-      assertEquals(1, i.nextIndex());
-      assertTrue(i.hasPrevious());
-      assertEquals(0, i.previousIndex());
-      assertSame(a, i.previous());
-   }
-
-   @SuppressWarnings("unchecked")
-   public void testListIteratorNavigation()
-   {
-      IntegerTree root = tree("", 0, tree("1", 1), tree("2", 2), tree("3", 3), tree("4", 4), tree("5", 5));
-      ListIterator<IntegerTree> it = root.listIterator();
-      assertTrue(it.hasNext());
-      assertTrue(!it.hasPrevious());
-      assertEquals(-1, it.previousIndex());
-      assertEquals(0, it.nextIndex());
-      assertEquals(1, it.next().value);
-      assertTrue(it.hasNext());
-      assertTrue(it.hasPrevious());
-      assertEquals(0, it.previousIndex());
-      assertEquals(1, it.nextIndex());
-      assertEquals(1, it.previous().value);
-      assertTrue(it.hasNext());
-      assertTrue(!it.hasPrevious());
-      assertEquals(-1, it.previousIndex());
-      assertEquals(0, it.nextIndex());
-      assertEquals(1, it.next().value);
-      assertTrue(it.hasNext());
-      assertTrue(it.hasPrevious());
-      assertEquals(0, it.previousIndex());
-      assertEquals(1, it.nextIndex());
-      assertEquals(2, it.next().value);
-      assertTrue(it.hasNext());
-      assertTrue(it.hasPrevious());
-      assertEquals(1, it.previousIndex());
-      assertEquals(2, it.nextIndex());
-      assertEquals(2, it.previous().value);
-      assertTrue(it.hasNext());
-      assertTrue(it.hasPrevious());
-      assertEquals(0, it.previousIndex());
-      assertEquals(1, it.nextIndex());
-      assertEquals(2, it.next().value);
-      assertTrue(it.hasNext());
-      assertTrue(it.hasPrevious());
-      assertEquals(1, it.previousIndex());
-      assertEquals(2, it.nextIndex());
-      assertEquals(3, it.next().value);
-      assertTrue(it.hasNext());
-      assertTrue(it.hasPrevious());
-      assertEquals(2, it.previousIndex());
-      assertEquals(3, it.nextIndex());
-      assertEquals(4, it.next().value);
-      assertTrue(it.hasNext());
-      assertTrue(it.hasPrevious());
-      assertEquals(3, it.previousIndex());
-      assertEquals(4, it.nextIndex());
-      assertEquals(5, it.next().value);
-      assertTrue(!it.hasNext());
-      assertTrue(it.hasPrevious());
-      assertEquals(4, it.previousIndex());
-      assertEquals(5, it.nextIndex());
-      assertEquals(5, it.previous().value);
-      assertTrue(it.hasNext());
-      assertTrue(it.hasPrevious());
-      assertEquals(3, it.previousIndex());
-      assertEquals(4, it.nextIndex());
-      assertEquals(4, it.previous().value);
-      assertTrue(it.hasNext());
-      assertTrue(it.hasPrevious());
-      assertEquals(2, it.previousIndex());
-      assertEquals(3, it.nextIndex());
-      assertEquals(3, it.previous().value);
-      assertTrue(it.hasNext());
-      assertTrue(it.hasPrevious());
-      assertEquals(1, it.previousIndex());
-      assertEquals(2, it.nextIndex());
-      assertEquals(2, it.previous().value);
-      assertTrue(it.hasNext());
-      assertTrue(it.hasPrevious());
-      assertEquals(0, it.previousIndex());
-      assertEquals(1, it.nextIndex());
-      assertEquals(1, it.previous().value);
-      assertTrue(it.hasNext());
-      assertTrue(!it.hasPrevious());
-      assertEquals(-1, it.previousIndex());
-      assertEquals(0, it.nextIndex());
-   }
-
-   /*
-      @Override
-      @SuppressWarnings("unchecked")
-      public void testListIteratorSet() {
-          list.add((E) "1");
-          list.add((E) "2");
-          list.add((E) "3");
-          list.add((E) "4");
-          list.add((E) "5");
-
-          ListIterator<E> it = list.listIterator();
-          assertEquals("1", it.next());
-          it.set((E) "a");
-          assertEquals("a", it.previous());
-          it.set((E) "A");
-          assertEquals("A", it.next());
-          assertEquals("2", it.next());
-          it.set((E) "B");
-          assertEquals("3", it.next());
-          assertEquals("4", it.next());
-          it.set((E) "D");
-          assertEquals("5", it.next());
-          it.set((E) "E");
-          assertEquals("[A, B, 3, D, E]", list.toString());
-      }
-   */
-
-   public void testListIteratorRemove()
-   {
-      IntegerTree root = tree("", 0, tree("1", 1), tree("2", 2), tree("3", 3), tree("4", 4), tree("5", 5));
-      ListIterator<IntegerTree> it = root.listIterator();
-      try
-      {
-         it.remove();
-         fail();
-      }
-      catch (IllegalStateException e)
-      {
-         // expected
-      }
-      assertEquals(1, it.next().value);
-      assertEquals(2, it.next().value);
-      assertAllChildren(root, 1, 2, 3, 4, 5);
-      it.remove();
-      assertAllChildren(root, 1, 3, 4, 5);
-      assertEquals(3, it.next().value);
-      assertEquals(3, it.previous().value);
-      assertEquals(1, it.previous().value);
-      it.remove();
-      assertAllChildren(root, 3, 4, 5);
-      assertTrue(!it.hasPrevious());
-      assertEquals(3, it.next().value);
-      it.remove();
-      assertAllChildren(root, 4, 5);
-      try
-      {
-         it.remove();
-         fail();
-      }
-      catch (IllegalStateException e)
-      {
-         // expected
-      }
-      assertEquals(4, it.next().value);
-      assertEquals(5, it.next().value);
-      it.remove();
-      assertAllChildren(root, 4);
-      assertEquals(4, it.previous().value);
-      it.remove();
-      assertAllChildren(root);
-   }
-
-   public void testListIteratorAdd()
-   {
-      IntegerTree root = tree("", 0);
-      ListIterator<IntegerTree> it = root.listIterator();
-      it.add(tree("a", 1));
-      assertEquals(0, it.previousIndex());
-      assertEquals(1, it.nextIndex());
-      assertAllChildren(root, 1);
-      it.add(tree("c", 3));
-      assertEquals(1, it.previousIndex());
-      assertEquals(2, it.nextIndex());
-      assertAllChildren(root, 1, 3);
-      it.add(tree("e", 5));
-      assertEquals(2, it.previousIndex());
-      assertEquals(3, it.nextIndex());
-      assertAllChildren(root, 1, 3, 5);
-      assertEquals(5, it.previous().value);
-      assertEquals(1, it.previousIndex());
-      assertEquals(2, it.nextIndex());
-      it.add(tree("d", 4));
-      assertEquals(2, it.previousIndex());
-      assertEquals(3, it.nextIndex());
-      assertAllChildren(root, 1, 3, 4, 5);
-      assertEquals(4, it.previous().value);
-      assertEquals(1, it.previousIndex());
-      assertEquals(2, it.nextIndex());
-      assertEquals(3, it.previous().value);
-      assertEquals(0, it.previousIndex());
-      assertEquals(1, it.nextIndex());
-      it.add(tree("b", 2));
-      assertEquals(1, it.previousIndex());
-      assertEquals(2, it.nextIndex());
-      assertAllChildren(root, 1, 2, 3, 4, 5);
-   }
-
-   public void testListIteratorMove()
-   {
-      IntegerTree root = tree("", 0, tree("a", 1), tree("b", 2), tree("c", 3));
-      ListIterator<IntegerTree> it = root.listIterator();
-      it.add(root.get(2));
-      assertAllChildren(root, 3, 1, 2);
-   }
-
-   public void testInsertFirstThrowsNPE()
-   {
-      IntegerTree a = tree("a", 0);
-      try
-      {
-         a.insertFirst(null);
-         fail();
-      }
-      catch (NullPointerException ignore)
-      {
-      }
-   }
-
-   public void testInsertLastThrowsNPE()
-   {
-      IntegerTree a = tree("a", 0);
-      try
-      {
-         a.insertLast(null);
-         fail();
-      }
-      catch (NullPointerException ignore)
-      {
-      }
-   }
-
-   public void testInsertBeforeThrowsNPE()
-   {
-      IntegerTree a = tree("a", 0);
-      try
-      {
-         a.insertBefore(null);
-         fail();
-      }
-      catch (NullPointerException ignore)
-      {
-      }
-   }
-
-   public void testInsertBeforeThrowsISE()
-   {
-      IntegerTree a = tree("a", 0);
-      IntegerTree b = tree("b", 1);
-      try
-      {
-         a.insertBefore(b);
-         fail();
-      }
-      catch (IllegalStateException ignore)
-      {
-      }
-   }
-
-   public void testInsertAfterThrowsNPE()
-   {
-      IntegerTree a = tree("a", 0);
-      try
-      {
-         a.insertAfter(null);
-         fail();
-      }
-      catch (NullPointerException ignore)
-      {
-      }
-   }
-
-   public void testInsertAfterThrowsISE()
-   {
-      IntegerTree a = tree("a", 0);
-      IntegerTree b = tree("b", 1);
-      try
-      {
-         a.insertAfter(b);
-         fail();
-      }
-      catch (IllegalStateException ignore)
-      {
-      }
-   }
-
-   public void testRemoveThrowsISE()
-   {
-      IntegerTree a = tree("a", 0);
-      try
-      {
-         a.remove();
-         fail();
-      }
-      catch (IllegalStateException ignore)
-      {
-      }
-   }
-}
\ No newline at end of file

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/tree/list/TestListTree.java (from rev 6783, portal/trunk/component/portal/src/test/java/org/exoplatform/portal/tree/list/TestListTree.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/tree/list/TestListTree.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/java/org/exoplatform/portal/tree/list/TestListTree.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,738 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.portal.tree.list;
+
+import junit.framework.TestCase;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class TestListTree extends TestCase
+{
+
+   public static class IntegerTree extends ListTree<IntegerTree>
+   {
+
+      /** . */
+      private final int value;
+
+      public IntegerTree(int value)
+      {
+         this.value = value;
+      }
+   }
+
+   private static IntegerTree tree(String name, int value, IntegerTree... trees)
+   {
+      IntegerTree tree = new IntegerTree(value);
+      if (trees != null)
+      {
+         for (IntegerTree child : trees)
+         {
+            tree.insertAt(null, child);
+         }
+      }
+      return tree;
+   }
+
+   private void assertChildren(IntegerTree tree, Integer... expected)
+   {
+      List<Integer> children = new ArrayList<Integer>();
+      for (Iterator<IntegerTree> iterator = tree.listIterator();iterator.hasNext();)
+      {
+         IntegerTree next = iterator.next();
+         children.add(next.value);
+      }
+      assertEquals(Arrays.asList(expected), children);
+   }
+
+   private void assertAllChildren(IntegerTree tree, Integer... expected)
+   {
+      List<Integer> children = new ArrayList<Integer>();
+      for (IntegerTree current = tree.getFirst();current != null;current = current.getNext())
+      {
+         children.add(current.value);
+      }
+      assertEquals(Arrays.asList(expected), children);
+   }
+
+   private void assertAllChildren(IntegerTree tree)
+   {
+      assertAllChildren(tree, new Integer[0]);
+   }
+
+   public void testInsert1()
+   {
+      IntegerTree root = tree("", 0);
+      assertChildren(root);
+      assertAllChildren(root);
+
+      //
+      root = tree("", 0);
+      root.insertAt(0, tree("a", 1));
+      assertChildren(root, 1);
+      assertAllChildren(root, 1);
+
+      //
+      root = tree("", 0);
+      root.insertAt(null, tree("a", 1));
+      assertChildren(root, 1);
+      assertAllChildren(root, 1);
+   }
+
+/*
+   public void testInsertDuplicate()
+   {
+      IntegerTree root = tree("", 0, tree("a", 1));
+      assertChildren(root, 1);
+      assertAllChildren(root, 1);
+
+      //
+      try
+      {
+         root.insertAt(0, tree("a", 2));
+         fail();
+      }
+      catch (IllegalArgumentException ignore)
+      {
+         assertAllChildren(root, 1);
+      }
+   }
+*/
+
+   public void testInsertMove1()
+   {
+      IntegerTree a = tree("a", 1);
+      IntegerTree b = tree("b", 2);
+      IntegerTree root1 = tree("", 0, a, b);
+
+      //
+      root1.insertAt(0, b);
+      assertAllChildren(root1, 2, 1);
+   }
+
+   public void testInsertMove2()
+   {
+      IntegerTree a = tree("a", 1);
+      IntegerTree root1 = tree("", 0, a);
+
+      //
+      root1.insertAt(null, a);
+      assertAllChildren(root1, 1);
+
+      //
+      root1.insertAt(0, a);
+      assertAllChildren(root1, 1);
+   }
+
+   public void testInsertMove3()
+   {
+      IntegerTree a = tree("a", 1);
+      IntegerTree root1 = tree("", 0, a);
+      IntegerTree root2 = tree("", 0);
+
+      //
+      root2.insertAt(0, a);
+      assertAllChildren(root1);
+      assertAllChildren(root2, 1);
+      assertSame(root2, a.getParent());
+   }
+
+   public void testInsertReorder1()
+   {
+      IntegerTree a = tree("a", 1);
+      IntegerTree root1 = tree("", 0, a);
+
+      //
+      root1.insertAt(0, a);
+      assertAllChildren(root1, 1);
+      assertSame(root1, a.getParent());
+   }
+
+   public void testInsertReorder2()
+   {
+      IntegerTree a = tree("a", 1);
+      IntegerTree root1 = tree("", 0, a, tree("b", 2));
+
+      //
+      root1.insertAt(2, a);
+      assertAllChildren(root1, 2, 1);
+      assertSame(root1, a.getParent());
+
+      //
+      root1.insertAt(0, a);
+      assertAllChildren(root1, 1, 2);
+      assertSame(root1, a.getParent());
+   }
+
+   public void testRemove()
+   {
+      IntegerTree root = tree("", 0, tree("a", 1), tree("b", 2), tree("c", 3));
+      assertAllChildren(root, 1, 2, 3);
+
+      //
+      IntegerTree b = root.get(1);
+      b.remove();
+      assertNull(b.getParent());
+      assertNull(b.getPrevious());
+      assertNull(b.getNext());
+      assertEquals(2, b.value);
+      assertAllChildren(root, 1, 3);
+   }
+
+   public void testRemoveLast()
+   {
+      IntegerTree root = tree("", 0, tree("a", 1), tree("b", 2));
+      assertAllChildren(root, 1, 2);
+
+      //
+      IntegerTree b = root.get(1);
+      assertEquals(2, b.value);
+      b.remove();
+      assertAllChildren(root, 1);
+      assertEquals(1, root.getLast().value);
+   }
+
+/*
+   public void testRename()
+   {
+      IntegerTree root = tree("", 0, tree("a", 1), tree("b", 2), tree("c", 3));
+      assertAllChildren(root, 1, 2, 3);
+      assertAllChildren(root, "a", "b", "c");
+
+      //
+      root.rename("a", "a");
+      assertAllChildren(root, 1, 2, 3);
+      assertAllChildren(root, "a", "b", "c");
+
+      //
+      root.rename("a", "d");
+      assertAllChildren(root, 1, 2, 3);
+      assertAllChildren(root, "d", "b", "c");
+   }
+
+   public void testRenameWithNoChildren()
+   {
+      IntegerTree root = tree("", 0, (IntegerTree[]) null);
+      assertFalse(root.hasTrees());
+
+      //
+      try
+      {
+         root.rename("a", "b");
+         fail();
+      }
+      catch (IllegalStateException e)
+      {
+         assertFalse(root.hasTrees());
+      }
+   }
+
+   public void testRenameWithNonExisting()
+   {
+      IntegerTree root = tree("", 0, tree("a", 1), tree("b", 2), tree("c", 3));
+      assertAllChildren(root, 1, 2, 3);
+      assertAllChildren(root, "a", "b", "c");
+
+      //
+      try
+      {
+         root.rename("d", "e");
+         fail();
+      }
+      catch (IllegalArgumentException e)
+      {
+         assertAllChildren(root, 1, 2, 3);
+         assertAllChildren(root, "a", "b", "c");
+      }
+   }
+
+   public void testRenameWithExisting()
+   {
+      IntegerTree root = tree("", 0, tree("a", 1), tree("b", 2), tree("c", 3));
+      assertAllChildren(root, 1, 2, 3);
+      assertAllChildren(root, "a", "b", "c");
+
+      //
+      try
+      {
+         root.rename("a", "c");
+         fail();
+      }
+      catch (IllegalArgumentException e)
+      {
+         assertAllChildren(root, 1, 2, 3);
+         assertAllChildren(root, "a", "b", "c");
+      }
+   }
+*/
+
+/*
+   public void testGetByIndexWithNoChildren()
+   {
+      IntegerTree root = tree("", 0, (IntegerTree[]) null);
+
+      //
+      try
+      {
+         root.get(0);
+         fail();
+      }
+      catch (IllegalStateException e)
+      {
+      }
+   }
+*/
+
+   public void testIteratorRemove()
+   {
+      IntegerTree root = tree("", 0, tree("a", 1));
+      Iterator<IntegerTree> it = root.listIterator();
+
+      //
+      try
+      {
+         it.remove();
+         fail();
+      }
+      catch (IllegalStateException e)
+      {
+      }
+
+      //
+      IntegerTree a = it.next();
+      it.remove();
+      assertNull(a.getParent());
+      assertFalse(it.hasNext());
+      assertAllChildren(root);
+   }
+
+   public void testListIterator1()
+   {
+      IntegerTree a = tree("a", 1);
+      IntegerTree root = tree("", 0, a);
+
+      //
+      ListIterator<IntegerTree> i = root.listIterator();
+      assertTrue(i.hasNext());
+      assertEquals(0, i.nextIndex());
+      assertFalse(i.hasPrevious());
+      assertEquals(-1, i.previousIndex());
+
+      //
+      assertSame(a, i.next());
+      assertFalse(i.hasNext());
+      assertEquals(1, i.nextIndex());
+      assertTrue(i.hasPrevious());
+      assertEquals(0, i.previousIndex());
+
+      //
+      assertSame(a, i.previous());
+      assertTrue(i.hasNext());
+      assertEquals(0, i.nextIndex());
+      assertFalse(i.hasPrevious());
+      assertEquals(-1, i.previousIndex());
+   }
+
+   public void testListIterator2()
+   {
+      IntegerTree a = tree("a", 1);
+      IntegerTree b = tree("b", 2);
+      IntegerTree root = tree("", 0, a, b);
+
+      //
+      ListIterator<IntegerTree> i = root.listIterator();
+      assertTrue(i.hasNext());
+      assertEquals(0, i.nextIndex());
+      assertFalse(i.hasPrevious());
+      assertEquals(-1, i.previousIndex());
+      assertSame(a, i.next());
+      assertTrue(i.hasNext());
+      assertEquals(1, i.nextIndex());
+      assertTrue(i.hasPrevious());
+      assertEquals(0, i.previousIndex());
+      assertSame(b, i.next());
+      assertFalse(i.hasNext());
+      assertEquals(2, i.nextIndex());
+      assertTrue(i.hasPrevious());
+      assertEquals(1, i.previousIndex());
+      i.remove();
+      assertFalse(i.hasNext());
+      assertEquals(1, i.nextIndex());
+      assertTrue(i.hasPrevious());
+      assertEquals(0, i.previousIndex());
+   }
+
+   public void testListIterator3()
+   {
+      // Remove middle
+      IntegerTree a = tree("a", 1);
+      IntegerTree b = tree("b", 2);
+      IntegerTree c = tree("c", 3);
+      IntegerTree root = tree("", 0, a, b, c);
+      ListIterator<IntegerTree> i = root.listIterator();
+      i.next();
+      i.next();
+      i.remove();
+      assertTrue(i.hasNext());
+      assertEquals(1, i.nextIndex());
+      assertTrue(i.hasPrevious());
+      assertEquals(0, i.previousIndex());
+      assertSame(c, i.next());
+
+      // Remove middle
+      root = tree("", 0, a = tree("a", 1), b = tree("b", 2), c = tree("c", 3));
+      i = root.listIterator();
+      i.next();
+      i.next();
+      i.next();
+      i.previous();
+      i.previous();
+      i.remove();
+      assertTrue(i.hasNext());
+      assertEquals(1, i.nextIndex());
+      assertTrue(i.hasPrevious());
+      assertEquals(0, i.previousIndex());
+      assertSame(c, i.next());
+
+      // Remove middle
+      root = tree("", 0, a = tree("a", 1), b = tree("b", 2), c = tree("c", 3));
+      i = root.listIterator();
+      i.next();
+      i.next();
+      i.remove();
+      assertTrue(i.hasNext());
+      assertEquals(1, i.nextIndex());
+      assertTrue(i.hasPrevious());
+      assertEquals(0, i.previousIndex());
+      assertSame(a, i.previous());
+
+      // Remove middle
+      root = tree("", 0, a = tree("a", 1), b = tree("b", 2), c = tree("c", 3));
+      i = root.listIterator();
+      i.next();
+      i.next();
+      i.next();
+      i.previous();
+      i.previous();
+      i.remove();
+      assertTrue(i.hasNext());
+      assertEquals(1, i.nextIndex());
+      assertTrue(i.hasPrevious());
+      assertEquals(0, i.previousIndex());
+      assertSame(a, i.previous());
+   }
+
+   @SuppressWarnings("unchecked")
+   public void testListIteratorNavigation()
+   {
+      IntegerTree root = tree("", 0, tree("1", 1), tree("2", 2), tree("3", 3), tree("4", 4), tree("5", 5));
+      ListIterator<IntegerTree> it = root.listIterator();
+      assertTrue(it.hasNext());
+      assertTrue(!it.hasPrevious());
+      assertEquals(-1, it.previousIndex());
+      assertEquals(0, it.nextIndex());
+      assertEquals(1, it.next().value);
+      assertTrue(it.hasNext());
+      assertTrue(it.hasPrevious());
+      assertEquals(0, it.previousIndex());
+      assertEquals(1, it.nextIndex());
+      assertEquals(1, it.previous().value);
+      assertTrue(it.hasNext());
+      assertTrue(!it.hasPrevious());
+      assertEquals(-1, it.previousIndex());
+      assertEquals(0, it.nextIndex());
+      assertEquals(1, it.next().value);
+      assertTrue(it.hasNext());
+      assertTrue(it.hasPrevious());
+      assertEquals(0, it.previousIndex());
+      assertEquals(1, it.nextIndex());
+      assertEquals(2, it.next().value);
+      assertTrue(it.hasNext());
+      assertTrue(it.hasPrevious());
+      assertEquals(1, it.previousIndex());
+      assertEquals(2, it.nextIndex());
+      assertEquals(2, it.previous().value);
+      assertTrue(it.hasNext());
+      assertTrue(it.hasPrevious());
+      assertEquals(0, it.previousIndex());
+      assertEquals(1, it.nextIndex());
+      assertEquals(2, it.next().value);
+      assertTrue(it.hasNext());
+      assertTrue(it.hasPrevious());
+      assertEquals(1, it.previousIndex());
+      assertEquals(2, it.nextIndex());
+      assertEquals(3, it.next().value);
+      assertTrue(it.hasNext());
+      assertTrue(it.hasPrevious());
+      assertEquals(2, it.previousIndex());
+      assertEquals(3, it.nextIndex());
+      assertEquals(4, it.next().value);
+      assertTrue(it.hasNext());
+      assertTrue(it.hasPrevious());
+      assertEquals(3, it.previousIndex());
+      assertEquals(4, it.nextIndex());
+      assertEquals(5, it.next().value);
+      assertTrue(!it.hasNext());
+      assertTrue(it.hasPrevious());
+      assertEquals(4, it.previousIndex());
+      assertEquals(5, it.nextIndex());
+      assertEquals(5, it.previous().value);
+      assertTrue(it.hasNext());
+      assertTrue(it.hasPrevious());
+      assertEquals(3, it.previousIndex());
+      assertEquals(4, it.nextIndex());
+      assertEquals(4, it.previous().value);
+      assertTrue(it.hasNext());
+      assertTrue(it.hasPrevious());
+      assertEquals(2, it.previousIndex());
+      assertEquals(3, it.nextIndex());
+      assertEquals(3, it.previous().value);
+      assertTrue(it.hasNext());
+      assertTrue(it.hasPrevious());
+      assertEquals(1, it.previousIndex());
+      assertEquals(2, it.nextIndex());
+      assertEquals(2, it.previous().value);
+      assertTrue(it.hasNext());
+      assertTrue(it.hasPrevious());
+      assertEquals(0, it.previousIndex());
+      assertEquals(1, it.nextIndex());
+      assertEquals(1, it.previous().value);
+      assertTrue(it.hasNext());
+      assertTrue(!it.hasPrevious());
+      assertEquals(-1, it.previousIndex());
+      assertEquals(0, it.nextIndex());
+   }
+
+   /*
+      @Override
+      @SuppressWarnings("unchecked")
+      public void testListIteratorSet() {
+          list.add((E) "1");
+          list.add((E) "2");
+          list.add((E) "3");
+          list.add((E) "4");
+          list.add((E) "5");
+
+          ListIterator<E> it = list.listIterator();
+          assertEquals("1", it.next());
+          it.set((E) "a");
+          assertEquals("a", it.previous());
+          it.set((E) "A");
+          assertEquals("A", it.next());
+          assertEquals("2", it.next());
+          it.set((E) "B");
+          assertEquals("3", it.next());
+          assertEquals("4", it.next());
+          it.set((E) "D");
+          assertEquals("5", it.next());
+          it.set((E) "E");
+          assertEquals("[A, B, 3, D, E]", list.toString());
+      }
+   */
+
+   public void testListIteratorRemove()
+   {
+      IntegerTree root = tree("", 0, tree("1", 1), tree("2", 2), tree("3", 3), tree("4", 4), tree("5", 5));
+      ListIterator<IntegerTree> it = root.listIterator();
+      try
+      {
+         it.remove();
+         fail();
+      }
+      catch (IllegalStateException e)
+      {
+         // expected
+      }
+      assertEquals(1, it.next().value);
+      assertEquals(2, it.next().value);
+      assertAllChildren(root, 1, 2, 3, 4, 5);
+      it.remove();
+      assertAllChildren(root, 1, 3, 4, 5);
+      assertEquals(3, it.next().value);
+      assertEquals(3, it.previous().value);
+      assertEquals(1, it.previous().value);
+      it.remove();
+      assertAllChildren(root, 3, 4, 5);
+      assertTrue(!it.hasPrevious());
+      assertEquals(3, it.next().value);
+      it.remove();
+      assertAllChildren(root, 4, 5);
+      try
+      {
+         it.remove();
+         fail();
+      }
+      catch (IllegalStateException e)
+      {
+         // expected
+      }
+      assertEquals(4, it.next().value);
+      assertEquals(5, it.next().value);
+      it.remove();
+      assertAllChildren(root, 4);
+      assertEquals(4, it.previous().value);
+      it.remove();
+      assertAllChildren(root);
+   }
+
+   public void testListIteratorAdd()
+   {
+      IntegerTree root = tree("", 0);
+      ListIterator<IntegerTree> it = root.listIterator();
+      it.add(tree("a", 1));
+      assertEquals(0, it.previousIndex());
+      assertEquals(1, it.nextIndex());
+      assertAllChildren(root, 1);
+      it.add(tree("c", 3));
+      assertEquals(1, it.previousIndex());
+      assertEquals(2, it.nextIndex());
+      assertAllChildren(root, 1, 3);
+      it.add(tree("e", 5));
+      assertEquals(2, it.previousIndex());
+      assertEquals(3, it.nextIndex());
+      assertAllChildren(root, 1, 3, 5);
+      assertEquals(5, it.previous().value);
+      assertEquals(1, it.previousIndex());
+      assertEquals(2, it.nextIndex());
+      it.add(tree("d", 4));
+      assertEquals(2, it.previousIndex());
+      assertEquals(3, it.nextIndex());
+      assertAllChildren(root, 1, 3, 4, 5);
+      assertEquals(4, it.previous().value);
+      assertEquals(1, it.previousIndex());
+      assertEquals(2, it.nextIndex());
+      assertEquals(3, it.previous().value);
+      assertEquals(0, it.previousIndex());
+      assertEquals(1, it.nextIndex());
+      it.add(tree("b", 2));
+      assertEquals(1, it.previousIndex());
+      assertEquals(2, it.nextIndex());
+      assertAllChildren(root, 1, 2, 3, 4, 5);
+   }
+
+   public void testListIteratorMove()
+   {
+      IntegerTree root = tree("", 0, tree("a", 1), tree("b", 2), tree("c", 3));
+      ListIterator<IntegerTree> it = root.listIterator();
+      it.add(root.get(2));
+      assertAllChildren(root, 3, 1, 2);
+   }
+
+   public void testInsertFirstThrowsNPE()
+   {
+      IntegerTree a = tree("a", 0);
+      try
+      {
+         a.insertFirst(null);
+         fail();
+      }
+      catch (NullPointerException ignore)
+      {
+      }
+   }
+
+   public void testInsertLastThrowsNPE()
+   {
+      IntegerTree a = tree("a", 0);
+      try
+      {
+         a.insertLast(null);
+         fail();
+      }
+      catch (NullPointerException ignore)
+      {
+      }
+   }
+
+   public void testInsertBeforeThrowsNPE()
+   {
+      IntegerTree a = tree("a", 0);
+      try
+      {
+         a.insertBefore(null);
+         fail();
+      }
+      catch (NullPointerException ignore)
+      {
+      }
+   }
+
+   public void testInsertBeforeThrowsISE()
+   {
+      IntegerTree a = tree("a", 0);
+      IntegerTree b = tree("b", 1);
+      try
+      {
+         a.insertBefore(b);
+         fail();
+      }
+      catch (IllegalStateException ignore)
+      {
+      }
+   }
+
+   public void testInsertAfterThrowsNPE()
+   {
+      IntegerTree a = tree("a", 0);
+      try
+      {
+         a.insertAfter(null);
+         fail();
+      }
+      catch (NullPointerException ignore)
+      {
+      }
+   }
+
+   public void testInsertAfterThrowsISE()
+   {
+      IntegerTree a = tree("a", 0);
+      IntegerTree b = tree("b", 1);
+      try
+      {
+         a.insertAfter(b);
+         fail();
+      }
+      catch (IllegalStateException ignore)
+      {
+      }
+   }
+
+   public void testRemoveThrowsISE()
+   {
+      IntegerTree a = tree("a", 0);
+      try
+      {
+         a.remove();
+         fail();
+      }
+      catch (IllegalStateException ignore)
+      {
+      }
+   }
+}
\ No newline at end of file

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/conf/exo.portal.component.portal-configuration1.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/conf/exo.portal.component.portal-configuration1.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/conf/exo.portal.component.portal-configuration1.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -106,6 +106,11 @@
   </component>
 
   <component>
+    <key>org.exoplatform.portal.mop.navigation.NavigationService</key>
+    <type>org.exoplatform.portal.mop.navigation.NavigationServiceWrapper</type>
+  </component>
+
+  <component>
     <key>org.exoplatform.portal.config.UserPortalConfigService</key>
     <type>org.exoplatform.portal.config.UserPortalConfigService</type>
   </component>

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/conf/exo.portal.component.portal-configuration2.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/conf/exo.portal.component.portal-configuration2.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/conf/exo.portal.component.portal-configuration2.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -95,6 +95,9 @@
                 <value>
                   <string>system</string>
                 </value>
+                <value>
+                  <string>large</string>
+                </value>
               </collection>
             </field>
             <field name="ownerType">

Deleted: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/portal/portal/large/navigation.xml
===================================================================
--- portal/trunk/component/portal/src/test/resources/portal/portal/large/navigation.xml	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/portal/portal/large/navigation.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Copyright (C) 2009 eXo Platform SAS.
-    
-    This is free software; you can redistribute it and/or modify it
-    under the terms of the GNU Lesser General Public License as
-    published by the Free Software Foundation; either version 2.1 of
-    the License, or (at your option) any later version.
-    
-    This software is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-    Lesser General Public License for more details.
-    
-    You should have received a copy of the GNU Lesser General Public
-    License along with this software; if not, write to the Free
-    Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-    02110-1301 USA, or see the FSF site: http://www.fsf.org.
-
--->
-
-<node-navigation>
-  <owner-type>portal</owner-type>
-  <owner-id>large</owner-id>
-  <priority>1</priority>
-
-  <page-nodes>
-	  <node>
-	    <uri>a</uri>
-	    <name>a</name>
-	    <label>A</label>
-      <node>
-        <uri>c</uri>
-        <name>c</name>
-        <label>C</label>
-      </node>
-	  </node>
-    <node>
-      <uri>b</uri>
-      <name>b</name>
-      <label>B</label>
-      <node>
-        <uri>d</uri>
-        <name>d</name>
-        <label>D</label>
-        <node>
-          <uri>e</uri>
-          <name>e</name>
-          <label>E</label>
-        </node>
-      </node>
-    </node>
-  </page-nodes>
-</node-navigation>

Copied: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/portal/portal/large/navigation.xml (from rev 6783, portal/trunk/component/portal/src/test/resources/portal/portal/large/navigation.xml)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/portal/portal/large/navigation.xml	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/portal/portal/large/navigation.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (C) 2009 eXo Platform SAS.
+    
+    This is free software; you can redistribute it and/or modify it
+    under the terms of the GNU Lesser General Public License as
+    published by the Free Software Foundation; either version 2.1 of
+    the License, or (at your option) any later version.
+    
+    This software is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+    Lesser General Public License for more details.
+    
+    You should have received a copy of the GNU Lesser General Public
+    License along with this software; if not, write to the Free
+    Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+    02110-1301 USA, or see the FSF site: http://www.fsf.org.
+
+-->
+
+<node-navigation>
+  <owner-type>portal</owner-type>
+  <owner-id>large</owner-id>
+  <priority>1</priority>
+
+  <page-nodes>
+	  <node>
+	    <uri>a</uri>
+	    <name>a</name>
+	    <label>A</label>
+      <node>
+        <uri>c</uri>
+        <name>c</name>
+        <label>C</label>
+      </node>
+	  </node>
+    <node>
+      <uri>b</uri>
+      <name>b</name>
+      <label>B</label>
+      <node>
+        <uri>d</uri>
+        <name>d</name>
+        <label>D</label>
+        <node>
+          <uri>e</uri>
+          <name>e</name>
+          <label>E</label>
+        </node>
+      </node>
+    </node>
+  </page-nodes>
+</node-navigation>

Modified: epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/portal/portal/test/navigation.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/portal/portal/test/navigation.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/component/portal/src/test/resources/portal/portal/test/navigation.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,46 +1,59 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!--
+<!-- Copyright (C) 2009 eXo Platform SAS. This is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License 
+   as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This software is distributed in the hope 
+   that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 
+   Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this software; if not, write to the Free Software 
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF site: http://www.fsf.org. -->
 
-    Copyright (C) 2009 eXo Platform SAS.
-    
-    This is free software; you can redistribute it and/or modify it
-    under the terms of the GNU Lesser General Public License as
-    published by the Free Software Foundation; either version 2.1 of
-    the License, or (at your option) any later version.
-    
-    This software is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-    Lesser General Public License for more details.
-    
-    You should have received a copy of the GNU Lesser General Public
-    License along with this software; if not, write to the Free
-    Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-    02110-1301 USA, or see the FSF site: http://www.fsf.org.
-
--->
-
 <node-navigation>
-  <owner-type>portal</owner-type>
-  <owner-id>test</owner-id>
-  <priority>1</priority>
+   <owner-type>portal</owner-type>
+   <owner-id>test</owner-id>
+   <priority>1</priority>
 
-  <page-nodes>
-	  <node>
-	    <uri>node_uri</uri>
-	    <name>node_name</name>
-	    <label>node_label</label>
-      <icon>node_icon</icon>
-      <start-publication-date>2000-03-21T01:33:00</start-publication-date>
-      <end-publication-date>2009-03-21T01:33:00</end-publication-date>
-      <visibility>TEMPORAL</visibility>
-	    <page-reference>portal::test::test</page-reference>
-	  </node>    
-    <node>
-      <uri>node_uri2</uri>
-      <name>node_name2</name>
-      <label>node_label2</label>
-      <page-reference>portal::test::test</page-reference>
-    </node>
-  </page-nodes>
+   <page-nodes>
+      <node>
+         <uri>node_uri</uri>
+         <name>node_name</name>
+         <label>node_label</label>
+         <icon>node_icon</icon>
+         <start-publication-date>2000-03-21T01:33:00</start-publication-date>
+         <end-publication-date>2009-03-21T01:33:00</end-publication-date>
+         <visibility>TEMPORAL</visibility>
+         <page-reference>portal::test::test1</page-reference>
+      </node>
+      <node>
+         <uri>node_uri</uri>
+         <name>node_name1</name>
+         <label>node_label</label>
+         <icon>node_icon</icon>
+         <start-publication-date>2000-03-21T01:33:00</start-publication-date>
+         <end-publication-date>2050-03-21T01:33:00</end-publication-date>
+         <visibility>TEMPORAL</visibility>
+         <page-reference>portal::test::test1</page-reference>
+      </node>
+      <node>
+         <uri>node_uri</uri>
+         <name>node_name2</name>
+         <label>node_label</label>
+         <icon>node_icon</icon>
+         <start-publication-date>2050-03-21T01:33:00</start-publication-date>
+         <visibility>TEMPORAL</visibility>
+         <page-reference>portal::test::test1</page-reference>
+      </node>
+      <node>
+         <uri>node_uri</uri>
+         <name>node_name3</name>
+         <label>node_label</label>
+         <icon>node_icon</icon>
+         <end-publication-date>2050-03-21T01:33:00</end-publication-date>
+         <visibility>TEMPORAL</visibility>
+         <page-reference>portal::test::test1</page-reference>
+      </node>
+      <node>
+         <uri>node_uri</uri>
+         <name>node_name4</name>
+         <label>node_label4</label>
+         <page-reference>portal::test::test1</page-reference>
+      </node>
+   </page-nodes>
 </node-navigation>

Modified: epp/portal/branches/EPP_5_2_Branch/examples/skins/simpleskin/src/main/webapp/WEB-INF/gatein-resources.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/examples/skins/simpleskin/src/main/webapp/WEB-INF/gatein-resources.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/examples/skins/simpleskin/src/main/webapp/WEB-INF/gatein-resources.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -54,13 +54,6 @@
 	
 	<portlet-skin>
 		<application-name>web</application-name>
-		<portlet-name>PortalNavigationPortlet</portlet-name>
-		<skin-name>SimpleSkin</skin-name>
-		<css-path>/skin/webPortlet/webui/component/UIPortalNavigationPortlet/Stylesheet.css</css-path>
-	</portlet-skin>
-	
-	<portlet-skin>
-		<application-name>web</application-name>
 		<portlet-name>SiteMapPortlet</portlet-name>
 		<skin-name>SimpleSkin</skin-name>
 		<css-path>/skin/webPortlet/webui/component/UISiteMap/Stylesheet.css</css-path>

Modified: epp/portal/branches/EPP_5_2_Branch/pom.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/pom.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/pom.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -49,7 +49,12 @@
       <org.gatein.pc.version>2.3.0-Beta04</org.gatein.pc.version>
       <org.picketlink.idm>1.3.0.Alpha03</org.picketlink.idm>
       <org.gatein.wsrp.version>2.1.0-Beta04</org.gatein.wsrp.version>
-      <org.gatein.mop.version>1.1.0-Beta02</org.gatein.mop.version>
+      <org.gatein.mop.version>1.1.0-Beta03</org.gatein.mop.version>
+      <org.slf4j.version>1.5.8</org.slf4j.version>
+      <commons-pool.version>1.5.5</commons-pool.version>
+      <rhino.version>1.6R5</rhino.version>
+      <org.codehaus.groovy.version>1.7.6</org.codehaus.groovy.version>
+      <javax.servlet.version>2.5</javax.servlet.version>
       <org.slf4j.version>1.5.6</org.slf4j.version>
       <rhino.version>1.6R5</rhino.version>
       <org.codehaus.groovy.version>1.7.6</org.codehaus.groovy.version>

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/dashboard/src/main/java/org/exoplatform/dashboard/webui/component/UIDashboardPortlet.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/dashboard/src/main/java/org/exoplatform/dashboard/webui/component/UIDashboardPortlet.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/dashboard/src/main/java/org/exoplatform/dashboard/webui/component/UIDashboardPortlet.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -23,10 +23,8 @@
 import org.exoplatform.portal.config.DataStorage;
 import org.exoplatform.portal.config.UserACL;
 import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNode;
+import org.exoplatform.portal.mop.user.UserNode;
 import org.exoplatform.portal.webui.container.UIContainer;
-import org.exoplatform.portal.webui.page.UIPage;
-import org.exoplatform.portal.webui.page.UIPageBody;
 import org.exoplatform.portal.webui.portal.UIPortal;
 import org.exoplatform.portal.webui.workspace.UIPortalApplication;
 import org.exoplatform.webui.application.WebuiRequestContext;
@@ -75,10 +73,10 @@
       //
       try
       {
-         PageNode node = portal.getSelectedNode();
+         UserNode node = portal.getSelectedUserNode();
          if (node != null)
          {
-            String pageRef = node.getPageReference();
+            String pageRef = node.getPageRef();
             DataStorage storage = portal.getApplicationComponent(DataStorage.class);
             Page page = storage.getPage(pageRef);
             if (page != null)

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/dashboard/src/main/java/org/exoplatform/dashboard/webui/component/UITabPaneDashboard.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/dashboard/src/main/java/org/exoplatform/dashboard/webui/component/UITabPaneDashboard.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/dashboard/src/main/java/org/exoplatform/dashboard/webui/component/UITabPaneDashboard.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,15 +19,29 @@
 
 package org.exoplatform.dashboard.webui.component;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
 import org.exoplatform.portal.application.PortalRequestContext;
 import org.exoplatform.portal.config.DataStorage;
 import org.exoplatform.portal.config.UserPortalConfigService;
 import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.mop.navigation.NavigationServiceException;
+import org.exoplatform.portal.mop.navigation.Scope;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.mop.user.UserNodeFilterConfig;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.portal.webui.page.UIPageBody;
 import org.exoplatform.portal.webui.portal.UIPortal;
 import org.exoplatform.portal.webui.util.Util;
+import org.exoplatform.portal.webui.workspace.UIPortalApplication;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
 import org.exoplatform.web.application.ApplicationMessage;
@@ -40,10 +54,6 @@
 import org.exoplatform.webui.event.Event;
 import org.exoplatform.webui.event.EventListener;
 
-import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * 
  * Created by eXoPlatform SAS
@@ -74,35 +84,30 @@
    private DataStorage dataService;
 
    private UIPortal uiPortal;
+   
+   private UserNode cachedParent;
 
    final private static int MAX_SHOWED_TAB_NUMBER = 6;
 
    final public static String PAGE_TEMPLATE = "dashboard";
 
+   final private UserNodeFilterConfig filterConfig;
+   static final private Scope TAB_PANE_DASHBOARD_SCOPE = Scope.CHILDREN;
+
    public UITabPaneDashboard() throws Exception
    {
       configService = getApplicationComponent(UserPortalConfigService.class);
       dataService = getApplicationComponent(DataStorage.class);
       uiPortal = Util.getUIPortal();
-   }
 
-   /*
-   private PageNavigation getPageNavigation(String owner) throws Exception
-   {
-      List<PageNavigation> allNavigations = uiPortal.getNavigations();
-      for (PageNavigation nav : allNavigations)
-      {
-         if (nav.getOwner().equals(owner))
-            return nav;
-      }
-      return null;
+      UserNodeFilterConfig.Builder scopeBuilder = UserNodeFilterConfig.builder();
+      scopeBuilder.withAuthorizationCheck().withVisibility(Visibility.DISPLAYED, Visibility.TEMPORAL);
+      scopeBuilder.withTemporalCheck();
+      filterConfig = scopeBuilder.build();
    }
 
-   */
-
    public int getCurrentNumberOfTabs() throws Exception
    {
-
       return getSameSiblingsNode().size();
    }
 
@@ -123,81 +128,106 @@
       }
    }
 
-   public List<PageNode> getSameSiblingsNode() throws Exception
+   public UserNode getParentTab() throws Exception
    {
-      List<PageNode> siblings = getPageNavigation().getNodes();
-      List<PageNode> selectedPath = Util.getUIPortal().getSelectedPath();
-      if (selectedPath != null && selectedPath.size() > 1)
+      UserPortal userPortal = getUserPortal();
+      UserNode selectedNode =  uiPortal.getSelectedUserNode();
+      UserNode currParent = selectedNode.getParent();
+      
+      UserNode parent = this.cachedParent;    
+      if (parent == null || (currParent != null && !currParent.getId().equals(parent.getId())))
+      {         
+         if ("".equals(currParent.getURI()))
+         {
+            this.cachedParent = userPortal.getNode(currParent.getNavigation(), TAB_PANE_DASHBOARD_SCOPE, filterConfig, null);
+         }
+         else
+         {
+            this.cachedParent = userPortal.resolvePath(currParent.getNavigation(), filterConfig, currParent.getURI());            
+         }
+         parent = this.cachedParent;
+      }
+            
+      if (parent != null)
       {
-         PageNode currentParent = selectedPath.get(selectedPath.size() - 2);
-         siblings = currentParent.getChildren();
+         try
+         {            
+            userPortal.updateNode(parent, TAB_PANE_DASHBOARD_SCOPE, null);
+         }
+         catch (NavigationServiceException e)
+         {
+            parent = null;
+         }
+      }      
+      this.cachedParent = parent;      
+      return parent;
+   }
+
+   public Collection<UserNode> getSameSiblingsNode() throws Exception
+   {                                                                 
+      UserNode parentTab =  getParentTab();
+
+      if (parentTab == null)
+      {
+         return Collections.emptyList();
       }
-      return siblings;
+      return parentTab.getChildren();
+   }   
+
+   public UserNavigation getCurrentUserNavigation() throws Exception
+   {
+      UserPortal userPortal = getUserPortal();
+      WebuiRequestContext rcontext = WebuiRequestContext.getCurrentInstance();
+      return userPortal.getNavigation(SiteKey.user(rcontext.getRemoteUser()));
    }
 
-   public PageNavigation getPageNavigation() throws Exception
+   private UserPortal getUserPortal()
    {
-      return uiPortal.getSelectedNavigation();
+      UIPortalApplication uiApp = Util.getUIPortalApplication();
+      return uiApp.getUserPortalConfig().getUserPortal();
    }
 
    /**
-    * Remove node specified by nodeIndex and returns the node to switch to
-    * @param nodeIndex
-    * @return
+    * Remove node specified by nodeName and returns the node to switch to
+    * @param nodeName - name of the Node that will be remove
+    * @return return the node that should be selected after remove node
     */
-   public PageNode removePageNode(int nodeIndex)
+   public UserNode removePageNode(String nodeName)
    {
       try
-      {
-         PageNavigation pageNavigation = getPageNavigation();
-         List<PageNode> nodes = pageNavigation.getNodes();
-         PageNode tobeRemoved = nodes.get(nodeIndex);
-         PageNode selectedNode = uiPortal.getSelectedNode();
-
-         boolean isRemoved = true; // To check 
-         PageNavigation updateNav =
-            dataService.getPageNavigation(pageNavigation.getOwnerType(), pageNavigation.getOwnerId());
-         for (PageNode pageNode : updateNav.getNodes())
+      {         
+         UserNode parentNode = getParentTab();
+         if (parentNode == null || parentNode.getChild(nodeName) == null)
          {
-            if (pageNode.getUri().equals(tobeRemoved.getUri()))
-            {
-               isRemoved = false;
-               break;
-            }
+            return null;
          }
 
-         if (nodes.size() >= 2)
+         UserNode tobeRemoved = parentNode.getChild(nodeName);
+         UserNode prevNode = null;
+
+         if (parentNode.getChildrenCount() >= 2)
          {
-            // Remove node
-            nodes.remove(tobeRemoved);
-
-            // Choose selected Node
-            if (tobeRemoved.getUri().equals(selectedNode.getUri()))
+            for (UserNode child : parentNode.getChildren())
             {
-               selectedNode = nodes.get(Math.max(0, nodeIndex - 1));
-
+               if (child.getName().equals(nodeName))
+               {
+                  parentNode.removeChild(nodeName);
+                  break;
+               }
+               prevNode = child;
             }
-            else if (!nodes.contains(selectedNode))
-            {
-               selectedNode = nodes.get(0);
-            }
 
-            // Update
-            if (!isRemoved)
+            String pageRef = tobeRemoved.getPageRef();
+            if (pageRef != null && pageRef.length() > 0)
             {
-               String pageRef = tobeRemoved.getPageReference();
-               if (pageRef != null && pageRef.length() > 0)
-               {
-                  Page page = configService.getPage(pageRef);
-                  if (page != null)
-                     dataService.remove(page);
-                  UIPortal uiPortal = Util.getUIPortal();
-                  // Remove from cache
-                  uiPortal.setUIPage(pageRef, null);
-               }
-               //uiPortal.setSelectedNode(selectedNode);
-               dataService.save(pageNavigation);
+               Page page = configService.getPage(pageRef);
+               if (page != null)
+                  dataService.remove(page);
+               UIPortal uiPortal = Util.getUIPortal();
+               // Remove from cache
+               uiPortal.setUIPage(pageRef, null);
             }
+            getUserPortal().saveNode(parentNode, null);
          }
          else
          {
@@ -206,6 +236,11 @@
             return null;
          }
 
+         UserNode selectedNode = uiPortal.getSelectedUserNode();
+         if (nodeName.equals(selectedNode.getName()))
+         {
+            selectedNode = prevNode != null ? prevNode : parentNode.getChildren().iterator().next();
+         }
          return selectedNode;
       }
       catch (Exception ex)
@@ -222,49 +257,35 @@
          {
             nodeLabel = "Tab_" + getCurrentNumberOfTabs();
          }
-         PageNavigation pageNavigation = getPageNavigation();
-         Page page =
-            configService.createPageTemplate(UITabPaneDashboard.PAGE_TEMPLATE, pageNavigation.getOwnerType(),
-               pageNavigation.getOwnerId());
-         page.setTitle(nodeLabel);
 
-         List<PageNode> selectedPath = uiPortal.getSelectedPath();
-         PageNode parentNode = null;
-         if (selectedPath != null && selectedPath.size() > 1)
+         UserNavigation userNav = getCurrentUserNavigation();
+         UserNode parentNode = getParentTab();
+         if (userNav == null || parentNode == null)
          {
-            parentNode = selectedPath.get(selectedPath.size() - 2);
+            return null;
          }
 
-         PageNode pageNode = new PageNode();
-         pageNode.setLabel(nodeLabel);
          String uniqueNodeName = nodeLabel.toLowerCase().replace(' ', '_');
-         if (nameExisted(uniqueNodeName))
-         {
-            uniqueNodeName = uniqueNodeName + "_" + System.currentTimeMillis();
-         }
 
-         String fullName = (parentNode != null) ? parentNode.getUri() + "/" + uniqueNodeName : uniqueNodeName;
+         SiteKey siteKey = userNav.getKey();
+         Page page =
+            configService.createPageTemplate(UITabPaneDashboard.PAGE_TEMPLATE, siteKey.getTypeName(), siteKey.getName());
+         page.setTitle(nodeLabel);
+         page.setName(uniqueNodeName + page.hashCode());
+         dataService.create(page);
 
-         page.setName(uniqueNodeName);
-         pageNode.setName(uniqueNodeName);
-         pageNode.setUri(fullName);
-         pageNode.setPageReference(page.getPageId());
-
-         if (parentNode == null)
+         if (parentNode.getChild(uniqueNodeName) != null)
          {
-            pageNavigation.addNode(pageNode);
+            uniqueNodeName = uniqueNodeName + "_" + System.currentTimeMillis();
          }
-         else if (parentNode.getChildren() != null)
-         {
-            parentNode.getChildren().add(pageNode);
-         }
 
-         //uiPortal.setSelectedNode(pageNode);
+         UserNode tabNode = parentNode.addChild(uniqueNodeName);
+         tabNode.setLabel(nodeLabel);
+         tabNode.setPageRef(page.getPageId());
 
-         dataService.create(page);
-         dataService.save(pageNavigation);
+         getUserPortal().saveNode(parentNode, null);
 
-         return fullName;
+         return tabNode.getURI();
       }
       catch (Exception ex)
       {
@@ -296,58 +317,34 @@
       return true;
    }
 
-   private boolean nameExisted(String nodeName) throws Exception
+   public String renamePageNode(String nodeName, String newNodeLabel)
    {
-      for (PageNode node : getPageNavigation().getNodes())
-      {
-         if (node.getName().equals(nodeName))
-         {
-            return true;
-         }
-      }
-      return false;
-   }
-
-   public String renamePageNode(int nodeIndex, String newNodeLabel)
-   {
       try
       {
-         PageNavigation pageNavigation = getPageNavigation();
-         List<PageNode> nodes = pageNavigation.getNodes();
-         List<PageNode> selectedPath = uiPortal.getSelectedPath();
-         PageNode parentNode = null;
-         if (selectedPath != null && selectedPath.size() > 1)
+         UserNode parentNode = getParentTab();
+         if (parentNode == null || parentNode.getChild(nodeName) == null)
          {
-            parentNode = selectedPath.get(selectedPath.size() - 2);
-            nodes = parentNode.getChildren();
-         }
-
-         PageNode renamedNode = nodes.get(nodeIndex);
-         if (renamedNode == null || newNodeLabel.length() == 0)
-         {
             return null;
          }
-
+         UserNode renamedNode = parentNode.getChild(nodeName);
          renamedNode.setLabel(newNodeLabel);
 
          String newNodeName = newNodeLabel.toLowerCase().replace(' ', '_');
-         if (nameExisted(newNodeName))
+         if (parentNode.getChild(newNodeName) != null)
          {
             newNodeName = newNodeName + "_" + System.currentTimeMillis();
          }
          renamedNode.setName(newNodeName);
 
-         String newUri = (parentNode != null) ? parentNode.getUri() + "/" + newNodeName : newNodeName;
-
-         renamedNode.setUri(newUri);
-
-         Page page = configService.getPage(renamedNode.getPageReference());
-         page.setTitle(newNodeLabel);
+         Page page = configService.getPage(renamedNode.getPageRef());
          if (page != null)
+         {
+            page.setTitle(newNodeLabel);
             dataService.save(page);
-         
-         dataService.save(pageNavigation);
-         return newUri;
+         }
+
+         getUserPortal().saveNode(parentNode, null);
+         return renamedNode.getURI();
       }
       catch (Exception ex)
       {
@@ -360,10 +357,11 @@
     * 
     * @param firstIndex
     * @param secondIndex
-    * @return
     */
-   public boolean permutePageNode(int firstIndex, int secondIndex)
+   public boolean permutePageNode(int firstIndex, int secondIndex) throws Exception
    {
+      UserNode parentNode = getParentTab();
+      List<UserNode> siblings = new ArrayList<UserNode>(getSameSiblingsNode());
       if (firstIndex == secondIndex)
       {
          return false;
@@ -371,14 +369,10 @@
 
       try
       {
-         PageNavigation pageNavigation = getPageNavigation();
-         ArrayList<PageNode> nodes = pageNavigation.getNodes();
-         PageNode firstNode = nodes.get(firstIndex);
-         PageNode secondNode = nodes.get(secondIndex);
-         nodes.set(firstIndex, secondNode);
-         nodes.set(secondIndex, firstNode);
+         UserNode firstNode = siblings.get(firstIndex);
+         parentNode.addChild(secondIndex, firstNode);
 
-         dataService.save(pageNavigation);
+         getUserPortal().saveNode(parentNode, null);
          return true;
       }
       catch (Exception ex)
@@ -387,14 +381,34 @@
       }
    }
 
+   private String encodeURI(String uri) throws UnsupportedEncodingException
+   {
+      if (uri == null || uri.isEmpty())
+      {
+         return "";
+      }
+      String[] path = uri.split("/");
+      StringBuilder uriBuilder = new StringBuilder();
+      for (String name : path)
+      {
+         uriBuilder.append("/").append(URLEncoder.encode(name, "UTF-8"));
+      }
+      if (uriBuilder.indexOf("/") == 0)
+      {
+         uriBuilder.deleteCharAt(0);
+      }
+      return uriBuilder.toString();
+   }
+
    static public class DeleteTabActionListener extends EventListener<UITabPaneDashboard>
    {
       public void execute(Event<UITabPaneDashboard> event) throws Exception
       {
          UITabPaneDashboard source = event.getSource();
          WebuiRequestContext context = event.getRequestContext();
-         int removedNodeIndex = Integer.parseInt(context.getRequestParameter(UIComponent.OBJECTID));
-         PageNode selectedNode = source.removePageNode(removedNodeIndex);
+         String nodeName = context.getRequestParameter(UIComponent.OBJECTID);
+         String newUri = source.getFirstAvailableURI();
+         UserNode selectedNode = source.removePageNode(nodeName);
 
          //If the node is removed successfully, then redirect to the node specified by tab on the left
          if (selectedNode != null)
@@ -406,11 +420,12 @@
             {
                uiPageBody.setMaximizedUIComponent(null);
             }
+            newUri = selectedNode.getURI();
+         }
 
-            PortalRequestContext prContext = Util.getPortalRequestContext();
-            prContext.setResponseComplete(true);
-            prContext.getResponse().sendRedirect(prContext.getPortalURI() + URLEncoder.encode(selectedNode.getUri(), "UTF-8"));
-         }
+         PortalRequestContext prContext = Util.getPortalRequestContext();
+         prContext.setResponseComplete(true);
+         prContext.getResponse().sendRedirect(prContext.getPortalURI() + source.encodeURI(newUri));
       }
    }
 
@@ -421,27 +436,24 @@
          UITabPaneDashboard tabPane = event.getSource();
          WebuiRequestContext context = event.getRequestContext();
          String newTabLabel = context.getRequestParameter(UIComponent.OBJECTID);
+         String newUri = tabPane.getFirstAvailableURI();
          if (!tabPane.validateName(newTabLabel))
-         {
-            //TODO nguyenanhkien2a at gmail.com
-            //We should redirect to current node while adding new tab fails
-            PageNode currentNode = tabPane.uiPortal.getSelectedNode();
-            PortalRequestContext prContext = Util.getPortalRequestContext();
-            prContext.getResponse().sendRedirect(prContext.getPortalURI() + URLEncoder.encode(currentNode.getUri(), "UTF-8"));
-            
+         {            
             Object[] args = {newTabLabel};
             context.getUIApplication().addMessage(new ApplicationMessage("UITabPaneDashboard.msg.wrongTabName", args));
-            return;
          }
-         String uri = tabPane.createNewPageNode(newTabLabel);
-
-         //If new node is created with success, then redirect to it
-         if (uri != null)
+         else
          {
-            PortalRequestContext prContext = Util.getPortalRequestContext();
-            prContext.setResponseComplete(true);
-            prContext.getResponse().sendRedirect(prContext.getPortalURI() + URLEncoder.encode(uri, "UTF-8"));
+            String uri = tabPane.createNewPageNode(newTabLabel);
+            if (uri != null)
+            {
+               newUri = uri;
+            }
          }
+
+         PortalRequestContext prContext = Util.getPortalRequestContext();
+         prContext.setResponseComplete(true);
+         prContext.getResponse().sendRedirect(prContext.getPortalURI() + tabPane.encodeURI(newUri));
       }
    }
 
@@ -459,29 +471,29 @@
 
       public void execute(Event<UITabPaneDashboard> event) throws Exception
       {
-         UITabPaneDashboard tabPane = event.getSource();
+         UITabPaneDashboard tabPane = event.getSource();         
          WebuiRequestContext context = event.getRequestContext();
-         int nodeIndex = Integer.parseInt(context.getRequestParameter(UIComponent.OBJECTID));
+         UIApplication rootUI = context.getUIApplication();
+                  
          String newTabLabel = context.getRequestParameter(RENAMED_TAB_LABEL_PARAMETER);
+         String newUri = tabPane.getFirstAvailableURI();
          if (!tabPane.validateName(newTabLabel))
-         {
-            //We should redirect to current node while renaming fails
-            PageNode currentNode = tabPane.uiPortal.getSelectedNode();
-            PortalRequestContext prContext = Util.getPortalRequestContext();
-            prContext.getResponse().sendRedirect(prContext.getPortalURI() + URLEncoder.encode(currentNode.getUri(), "UTF-8"));
-            
+         {            
             Object[] args = {newTabLabel};
-            context.getUIApplication().addMessage(new ApplicationMessage("UITabPaneDashboard.msg.wrongTabName", args));
-            return;
+            rootUI.addMessage(new ApplicationMessage("UITabPaneDashboard.msg.wrongTabName", args));
          }
-         String newUri = tabPane.renamePageNode(nodeIndex, newTabLabel);
-
-         //If page node is renamed with success, then redirect to new URL
-         if (newUri != null)
+         else
          {
-            PortalRequestContext prContext = Util.getPortalRequestContext();
-            prContext.getResponse().sendRedirect(prContext.getPortalURI() + URLEncoder.encode(newUri, "UTF-8"));
+            String nodeName = context.getRequestParameter(UIComponent.OBJECTID);
+            String returnUri = tabPane.renamePageNode(nodeName, newTabLabel);            
+            if (returnUri != null)
+            {            
+               newUri = returnUri;               
+            }
          }
+         PortalRequestContext prContext = Util.getPortalRequestContext();
+         prContext.getResponse().sendRedirect(prContext.getPortalURI() + tabPane.encodeURI(newUri));
+         prContext.setResponseComplete(true);
       }
    }
 
@@ -504,4 +516,33 @@
          }
       }
    }
+
+   /**
+    * Return the current node uri, if it's been deleted, return first sibling node uri
+    * if there is no node remain, return default path 
+    * @throws Exception
+    */
+   public String getFirstAvailableURI() throws Exception
+   {           
+      UserNode parentTab = getParentTab();      
+      if (parentTab != null)
+      {
+         UserNode currNode = Util.getUIPortal().getSelectedUserNode();
+         if (parentTab.getChildren().size() == 0 && parentTab.getURI() != null)
+         {
+            return parentTab.getURI();
+         } 
+         
+         if (parentTab.getChild(currNode.getName()) != null)
+         {
+            return currNode.getURI();
+         } 
+         else 
+         {
+            return parentTab.getChild(0).getURI(); 
+         }
+      }   
+
+      return getUserPortal().getDefaultPath(null).getURI();
+   }
 }

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/dashboard/src/main/webapp/groovy/dashboard/webui/component/UITabPaneDashboard.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/dashboard/src/main/webapp/groovy/dashboard/webui/component/UITabPaneDashboard.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/dashboard/src/main/webapp/groovy/dashboard/webui/component/UITabPaneDashboard.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,23 +1,18 @@
-<%
-	import java.util.ArrayList; 
-	import org.exoplatform.portal.config.model.PageNavigation;
-	import org.exoplatform.portal.config.model.PageNode;
+<%
 	import org.exoplatform.portal.webui.util.Util;
 	import org.exoplatform.portal.webui.portal.UIPortal;
 	import org.exoplatform.portal.application.PortalRequestContext;
 	import org.exoplatform.web.application.JavascriptManager;
-	import org.gatein.common.text.EntityEncoder;
+	import org.gatein.common.text.EntityEncoder;
+	import org.exoplatform.portal.mop.user.UserNode;
 	
-	//PageNavigation pageNavigation = uicomponent.getPageNavigation();
-	//ArrayList<PageNode> nodes = pageNavigation.getNodes();
-	ArrayList<PageNode> nodes = uicomponent.getSameSiblingsNode();
+	def nodes = uicomponent.getSameSiblingsNode();
 	def tabNbs = nodes.size();
 
 	PortalRequestContext pcontext = Util.getPortalRequestContext();	
-	def String portalURI = pcontext.getPortalURI();
+	def portalURI = pcontext.getPortalURI();
 
-	PageNode selectedNode = Util.getUIPortal().getSelectedNode();
-	PageNode node; 
+	def selectedNode = Util.getUIPortal().getSelectedUserNode();
 	
 	JavascriptManager jsManager = pcontext.getJavascriptManager();
 	jsManager.importJavascript("eXo.webui.UITabbedDashboard");
@@ -26,24 +21,29 @@
 <div id="$uicomponent.id" class="UITabPaneDashboard">
 	<div class="LtTabDashboard">
 		<div class="RtTabDashboard">
-			<div class="CtTabDashboard">
-				<div class="UIHorizontalTabs">
+			<div class="CtTabDashboard">
+				<div class="UIHorizontalTabs">
 					<div class="TabsContainer ClearFix">
-						<% for(int i = 0;i < tabNbs;i++){ 
-							 		node = nodes.get(i);
-							 		String tabLabel = node.getResolvedLabel();
-									EntityEncoder encoder = EntityEncoder.FULL;
-									tabLabel = encoder.encode(tabLabel);
-									String param = "" + i;
-									if(node.getUri().equals(selectedNode.getUri())){ 
+						<%
+									int 	i = 	0;
+									for(UserNode node : nodes){
+									   def tabLabel = node.getLabel();
+										if ("Tab_Default".equals(node.getName()))
+										{
+											tabLabel = _ctx.appRes("UIUserToolBarDashboard.page." + node.getLabel());
+										}
+										EntityEncoder encoder = EntityEncoder.FULL;
+										tabLabel = encoder.encode(tabLabel);
+									    String param = node.getName();
+									    if(node.getURI().equals(selectedNode.getURI())){ 
 		  						%>
 								<div class="UITab GrayTabStyle">
 										<div class="SelectedTab">
 												<div class="LeftTab">
 														<div class="RightTab">
 																<div class="MiddleTab">
-																		<% 
-																			String ondblclick = "eXo.webui.UITabbedDashboard.showEditLabelInput(this," + i + ",\"" + tabLabel + "\")"; 
+																		<% 
+																			String ondblclick = "eXo.webui.UITabbedDashboard.showEditLabelInput(this,\"" + param + "\",\"" + tabLabel + "\")"; 
 																		%>
 																		<span ondblclick='$ondblclick'>$tabLabel</span>
 																		<a  href="<%= uicomponent.url("DeleteTab",param); %>">
@@ -60,7 +60,7 @@
 										<div class="LeftTab">
 											<div class="RightTab">
 												<div class="MiddleTab">
-													<a	href="<%= portalURI + node.getUri(); %>"><span>$tabLabel</span></a>
+													<a	href="<%= portalURI + node.getURI(); %>"><span>$tabLabel</span></a>
 													<a  href="<%= uicomponent.url("DeleteTab",param); %>">
 														<img class="CloseIcon" src="/eXoResources/skin/sharedImages/Blank.gif" alt="DEL" />
 													</a>	

Copied: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/TreeNode.java (from rev 6783, portal/trunk/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/TreeNode.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/TreeNode.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/TreeNode.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,363 @@
+package org.exoplatform.navigation.webui;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.mop.navigation.NavigationServiceException;
+import org.exoplatform.portal.mop.navigation.NodeChangeListener;
+import org.exoplatform.portal.mop.navigation.NodeState;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
+
+/**
+ * A wrapper class of {@link UserNode} for manipulation in WebUI part
+ * 
+ * @author <a href="mailto:trong.tran at exoplatform.com">Trong Tran</a>
+ * @version $Revision$
+ */
+public class TreeNode implements NodeChangeListener<UserNode>
+{
+   private Map<String, TreeNode> caches;
+
+   private UserNavigation nav;
+
+   private UserNode node;
+
+   private TreeNode rootNode;
+
+   private boolean deleteNode = false;
+
+   private boolean cloneNode = false;
+
+   private String id;
+
+   private List<TreeNode> children;
+
+   public TreeNode(UserNavigation nav, UserNode node)
+   {
+      this(nav, node, null);
+      this.rootNode = this;
+      this.caches = new HashMap<String, TreeNode>();
+      addToCached(this);
+   }
+
+   private TreeNode(UserNavigation nav, UserNode node, TreeNode rootNode)
+   {
+      this.rootNode = rootNode;
+      this.nav = nav;
+      this.node = node;
+   }
+
+   public List<TreeNode> getChildren()
+   {
+      if (children == null)
+      {
+         children = new LinkedList<TreeNode>();
+         for (UserNode child : node.getChildren())
+         {
+            String key = child.getId() == null ? String.valueOf(child.hashCode()) : child.getId();
+            TreeNode node = findNode(key);
+            if (node == null)
+            {
+               throw new IllegalStateException("Can' find node " + child.getURI() + " in the cache");
+            }
+            children.add(node);
+         }
+      }
+      return children;
+   }
+
+   public TreeNode getChild(String name)
+   {
+      UserNode child = node.getChild(name);
+      if (child == null)
+      {
+         return null;
+      }
+      return findNode(child.getId() == null ? String.valueOf(child.hashCode()) : child.getId());
+   }
+
+   public boolean removeChild(TreeNode child)
+   {
+      children = null;
+      if (child == null)
+      {
+         return false;
+      }
+      removeFromCached(child); 
+      return node.removeChild(child.getName());
+   }
+
+   public TreeNode getParent()
+   {
+      UserNode parent = node.getParent();
+      if (parent == null)
+         return null;
+
+      return findNode(parent.getId() == null ? String.valueOf(parent.hashCode()) : parent.getId());
+   }
+
+   public TreeNode getChild(int childIndex) throws IndexOutOfBoundsException
+   {
+      UserNode child = node.getChild(childIndex);
+      if (child == null)
+      {
+         return null;
+      }
+      return findNode(child.getId() == null ? String.valueOf(child.hashCode()) : child.getId());
+   }
+
+   public TreeNode addChild(String childName)
+   {
+      children = null;
+      UserNode child = node.addChild(childName);
+      return addToCached(new TreeNode(nav, child, this.rootNode));
+   }
+
+   public void addChild(TreeNode child)
+   {
+      TreeNode oldParent = child.getParent();
+      if (oldParent != null)
+      {
+         oldParent.children = null;
+      }
+      children = null; 
+      this.node.addChild(child.getNode());
+   }
+   
+   public void addChild(int index, TreeNode child)
+   {
+      TreeNode oldParent = child.getParent();
+      if (oldParent != null)
+      {
+         oldParent.children = null;
+      }
+      children = null;
+      node.addChild(index, child.getNode());
+   }
+
+   public TreeNode findNode(String nodeID)
+   {
+      return this.rootNode.caches.get(nodeID);
+   }
+
+   public UserNode getNode()
+   {
+      return node;
+   }
+
+   public UserNavigation getPageNavigation()
+   {
+      return nav;
+   }
+
+   public boolean isDeleteNode()
+   {
+      return deleteNode;
+   }
+
+   public void setDeleteNode(boolean deleteNode)
+   {
+      this.deleteNode = deleteNode;
+   }
+
+   public boolean isCloneNode()
+   {
+      return cloneNode;
+   }
+
+   public void setCloneNode(boolean b)
+   {
+      cloneNode = b;
+   }
+
+   public String getPageRef()
+   {
+      return node.getPageRef();
+   }
+
+   public String getId()
+   {
+      if (this.id == null)
+      {
+         this.id = node.getId() == null ? String.valueOf(node.hashCode()) : node.getId();
+      }
+      return this.id;
+   }
+
+   public String getURI()
+   {
+      return node.getURI();
+   }
+
+   public String getIcon()
+   {
+      return node.getIcon();
+   }
+
+   public void setIcon(String icon)
+   {
+      node.setIcon(icon);
+   }
+
+   public String getEncodedResolvedLabel()
+   {
+      String encodedLabel = node.getEncodedResolvedLabel();
+      return encodedLabel == null ? "" : encodedLabel;
+   }
+
+   public String getName()
+   {
+      return node.getName();
+   }
+
+   public void setName(String name)
+   {
+      node.setName(name);
+   }
+
+   public String getLabel()
+   {
+      return node.getLabel();
+   }
+
+   public void setLabel(String label)
+   {
+      node.setLabel(label);
+   }
+
+   public Visibility getVisibility()
+   {
+      return node.getVisibility();
+   }
+
+   public void setVisibility(Visibility visibility)
+   {
+      node.setVisibility(visibility);
+   }
+
+   public long getStartPublicationTime()
+   {
+      return node.getStartPublicationTime();
+   }
+
+   public void setStartPublicationTime(long startPublicationTime)
+   {
+      node.setStartPublicationTime(startPublicationTime);
+   }
+
+   public long getEndPublicationTime()
+   {
+      return node.getEndPublicationTime();
+   }
+
+   public void setEndPublicationTime(long endPublicationTime)
+   {
+      node.setEndPublicationTime(endPublicationTime);
+   }
+
+   public void setPageRef(String pageRef)
+   {
+      node.setPageRef(pageRef);
+   }
+
+   public String getResolvedLabel()
+   {
+      String resolvedLabel = node.getResolvedLabel();
+      return resolvedLabel == null ? "" : resolvedLabel;
+   }
+
+   public boolean hasChildrenRelationship()
+   {
+      return node.hasChildrenRelationship();
+   }
+
+   public int getChildrenCount()
+   {
+      return node.getChildrenCount();
+   }
+
+   private TreeNode addToCached(TreeNode node)
+   {
+      if (node == null)
+      {
+         return null;
+      }
+
+      if (findNode(node.getId()) != null)
+      {
+         return node;
+      }
+      
+      this.rootNode.caches.put(node.getId(), node);
+      for (UserNode child : node.getNode().getChildren())
+      {
+         addToCached(new TreeNode(nav, child, this.rootNode));
+      }
+      return node;
+   }
+
+   private TreeNode removeFromCached(TreeNode node)
+   {
+      if (node == null)
+      {
+         return null;
+      }
+
+      this.rootNode.caches.remove(node.getId());
+      if (node.hasChildrenRelationship())
+      {
+         for (TreeNode child : node.getChildren())
+         {
+            removeFromCached(child);
+         }
+      }
+      return node;
+   }
+
+   @Override
+   public void onAdd(UserNode target, UserNode parent, UserNode previous)
+   {
+      addToCached(new TreeNode(this.nav, target, this.rootNode));
+      findNode(parent.getId()).children = null;
+   }
+
+   @Override
+   public void onCreate(UserNode target, UserNode parent, UserNode previous, String name)
+   {
+   }
+
+   @Override
+   public void onRemove(UserNode target, UserNode parent)
+   {
+      removeFromCached(findNode(target.getId()));
+      findNode(parent.getId()).children = null;
+   }
+
+   @Override
+   public void onDestroy(UserNode target, UserNode parent)
+   {
+   }
+
+   @Override
+   public void onRename(UserNode target, UserNode parent, String name)
+   {
+   }
+
+   @Override
+   public void onUpdate(UserNode target, NodeState state)
+   {
+   }
+
+   @Override
+   public void onMove(UserNode target, UserNode from, UserNode to, UserNode previous)
+   {
+      TreeNode fromTreeNode = findNode(from.getId());
+      TreeNode toTreeNode = findNode(to.getId());
+      fromTreeNode.children = null;
+      toTreeNode.children = null;
+   }
+}

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UIGroupNavigationManagement.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UIGroupNavigationManagement.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UIGroupNavigationManagement.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -20,18 +20,17 @@
 package org.exoplatform.navigation.webui.component;
 
 import org.exoplatform.commons.utils.ObjectPageList;
+import org.exoplatform.navigation.webui.TreeNode;
 import org.exoplatform.portal.application.PortalRequestContext;
-import org.exoplatform.portal.config.DataStorage;
 import org.exoplatform.portal.config.UserACL;
-import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.SiteType;
+import org.exoplatform.portal.mop.navigation.NavigationContext;
+import org.exoplatform.portal.mop.navigation.NavigationService;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.portal.webui.navigation.UIAddGroupNavigation;
-import org.exoplatform.portal.webui.navigation.UINavigationManagement;
-import org.exoplatform.portal.webui.navigation.UINavigationNodeSelector;
 import org.exoplatform.portal.webui.navigation.UIPageNavigationForm;
-import org.exoplatform.portal.webui.page.UIPageNodeForm;
-import org.exoplatform.portal.webui.portal.UIPortal;
 import org.exoplatform.portal.webui.util.Util;
 import org.exoplatform.portal.webui.workspace.UIMaskWorkspace;
 import org.exoplatform.portal.webui.workspace.UIPortalApplication;
@@ -49,9 +48,8 @@
 import org.exoplatform.webui.core.UIVirtualList;
 import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
 import org.exoplatform.webui.event.Event;
-import org.exoplatform.webui.event.EventListener;
 import org.exoplatform.webui.event.Event.Phase;
-
+import org.exoplatform.webui.event.EventListener;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -76,14 +74,14 @@
       @EventConfig(listeners = UIPageNodeForm.SwitchPublicationDateActionListener.class, phase = Phase.DECODE),
       @EventConfig(listeners = UIPageNodeForm.SwitchVisibleActionListener.class, phase = Phase.DECODE),
       @EventConfig(listeners = UIPageNodeForm.ClearPageActionListener.class, phase = Phase.DECODE),
-      @EventConfig(listeners = UIPageNodeForm.CreatePageActionListener.class, phase = Phase.DECODE)})})
+      @EventConfig(listeners = UIPageNodeForm.CreatePageActionListener.class, phase = Phase.DECODE)}),
+   @ComponentConfig(type = UIPopupWindow.class, template = "system:/groovy/webui/core/UIPopupWindow.gtmpl",
+      events = @EventConfig(listeners = UIGroupNavigationManagement.CloseActionListener.class, name = "ClosePopup"))})
 public class UIGroupNavigationManagement extends UIContainer
 {
 
-   private List<PageNavigation> navigations;
+   private UINavigationManagement naviManager;
 
-   private PageNavigation selectedNavigation;
-
    public UIGroupNavigationManagement() throws Exception
    {
       UIVirtualList virtualList = addChild(UIVirtualList.class, null, "GroupNavigationList");
@@ -96,80 +94,22 @@
 
    public void loadNavigations() throws Exception
    {
-      UserPortalConfigService userPortalConfigService = getApplicationComponent(UserPortalConfigService.class);
-      navigations = userPortalConfigService.loadEditableNavigations();
-      UIVirtualList virtualList = getChild(UIVirtualList.class);
-      virtualList.dataBind(new ObjectPageList<PageNavigation>(navigations, navigations.size()));
-   }
+      UserPortal userPortal = Util.getUIPortalApplication().getUserPortalConfig().getUserPortal();
 
-   public List<PageNavigation> getNavigations()
-   {
-      return navigations;
-   }
-
-   public void addPageNavigation(PageNavigation navigation)
-   {
-      if (navigations == null)
+      List<UserNavigation> allNavs = userPortal.getNavigations();
+      List<UserNavigation> groupNav = new ArrayList<UserNavigation>();
+      for (UserNavigation nav : allNavs)
       {
-         navigations = new ArrayList<PageNavigation>();
-      }
-      navigations.add(navigation);
-   }
-
-   public void deletePageNavigation(PageNavigation navigation)
-   {
-      if (navigations == null || navigations.size() < 1)
-      {
-         return;
-      }
-      navigations.remove(navigation);
-   }
-
-   public PageNavigation getPageNavigation(int id)
-   {
-      for (PageNavigation ele : getPageNavigations())
-      {
-         if (ele.getId() == id)
+         if (nav.getKey().getType().equals(SiteType.GROUP) && nav.isModifiable())
          {
-            return ele;
+            groupNav.add(nav);
          }
       }
-      return null;
-   }
 
-   public List<PageNavigation> getPageNavigations()
-   {
-      if (navigations == null)
-      {
-         navigations = new ArrayList<PageNavigation>();
-      }
-      return navigations;
+      UIVirtualList virtualList = getChild(UIVirtualList.class);                  
+      virtualList.dataBind(new ObjectPageList<UserNavigation>(groupNav, groupNav.size()));
    }
 
-   public PageNavigation getNavigationById(Integer navId)
-   {
-      PageNavigation navigation = new PageNavigation();
-      for (PageNavigation nav : navigations)
-      {
-         if (nav.getId() == navId)
-         {
-            navigation = nav;
-            break;
-         }
-      }
-      return navigation;
-   }
-
-   public PageNavigation getSelectedNavigation()
-   {
-      return selectedNavigation;
-   }
-
-   public void setSelectedNavigation(PageNavigation navigation)
-   {
-      selectedNavigation = navigation;
-   }
-
    /**
     * User has right to add navigation to a group in below cases
     * 
@@ -177,7 +117,7 @@
     * 
     * 2. He/She is manager of the group
     * 
-    * @param pcontext
+    * @param 
     * @return
     */
    private boolean userHasRightToAddNavigation()
@@ -199,172 +139,122 @@
       try
       {
          Collection<?> groups = orgService.getGroupHandler().findGroupByMembership(remoteUser, userACL.getMakableMT());
-         if (groups != null && groups.size() > 0)
-         {
-            return true;
-         }
-         else
-         {
-            return false;
-         }
+         return groups != null && groups.size() > 0;
       }
       catch (Exception ex)
       {
          return false;
       }
    }
-   
-   static public class EditNavigationActionListener extends EventListener<UIGroupNavigationManagement>
+
+   static public abstract class BaseEditAction extends EventListener<UIGroupNavigationManagement>
    {
       public void execute(Event<UIGroupNavigationManagement> event) throws Exception
       {
-
+         UserPortal userPortal = Util.getUIPortalApplication().getUserPortalConfig().getUserPortal();
          UIGroupNavigationManagement uicomp = event.getSource();
-
-         // get navigation id
-         String id = event.getRequestContext().getRequestParameter(OBJECTID);
-         Integer navId = Integer.parseInt(id);
-         // get PageNavigation by navigation id
-         PageNavigation navigation = uicomp.getNavigationById(navId);
-         uicomp.setSelectedNavigation(navigation);
          WebuiRequestContext context = event.getRequestContext();
          UIApplication uiApplication = context.getUIApplication();
 
+         // get navigation id
+         String groupName = event.getRequestContext().getRequestParameter(OBJECTID);
+         SiteKey siteKey = SiteKey.group(groupName);
+         
          // check edit permission, ensure that user has edit permission on that
          // navigation
          UserACL userACL = uicomp.getApplicationComponent(UserACL.class);
-
-         if (!userACL.hasEditPermission(navigation))
+         if (!userACL.hasEditPermissionOnNavigation(siteKey))
          {
             uiApplication.addMessage(new ApplicationMessage("UIGroupNavigationManagement.msg.Invalid-editPermission", null));
             return;
          }
 
-         // ensure this navigation is exist
-         DataStorage service = uicomp.getApplicationComponent(DataStorage.class);
-         if (service.getPageNavigation(navigation.getOwnerType(), navigation.getOwnerId()) == null)
+         UserNavigation navigation = userPortal.getNavigation(siteKey);
+         if (navigation == null)
          {
             uiApplication.addMessage(new ApplicationMessage("UIGroupNavigationManagement.msg.navigation-not-exist", null));
+            UIWorkingWorkspace uiWorkingWS = Util.getUIPortalApplication().getChild(UIWorkingWorkspace.class);
+            uiWorkingWS.updatePortletsByName("UserToolbarGroupPortlet");       
             return;
          }
 
-         UIPopupWindow popUp = uicomp.getChild(UIPopupWindow.class);
+         doEdit(navigation, event);
+      }
 
-         UINavigationManagement pageManager = popUp.createUIComponent(UINavigationManagement.class, null, null, popUp);
-         pageManager.setOwner(navigation.getOwnerId());
-         pageManager.setOwnerType(navigation.getOwnerType());
+      protected abstract void doEdit(UserNavigation navigation, Event<UIGroupNavigationManagement> event) throws Exception;
+   }
+   
+   static public class EditNavigationActionListener extends BaseEditAction
+   {
+      @Override
+      protected void doEdit(UserNavigation nav, Event<UIGroupNavigationManagement> event) throws Exception
+      {         
+         UserPortal userPortal = Util.getUIPortalApplication().getUserPortalConfig().getUserPortal();
+         UIGroupNavigationManagement uicomp = event.getSource();
+         SiteKey siteKey = nav.getKey();
 
-         UINavigationNodeSelector selector = pageManager.getChild(UINavigationNodeSelector.class);
-       
-         selector.setEdittedNavigation(navigation);
+         UIPopupWindow popUp = uicomp.getChild(UIPopupWindow.class);
+         UINavigationManagement naviManager = popUp.createUIComponent(UINavigationManagement.class, null, null, popUp);
+         uicomp.naviManager = naviManager;
+         
+         naviManager.setOwner(siteKey.getName());
+         naviManager.setOwnerType(siteKey.getTypeName());
+
+         UINavigationNodeSelector selector = naviManager.getChild(UINavigationNodeSelector.class);
+         selector.setEdittedNavigation(nav);
+         selector.setUserPortal(userPortal);
          selector.initTreeData();
-         popUp.setUIComponent(pageManager);
+
+         popUp.setUIComponent(naviManager);
          popUp.setWindowSize(400, 400);
          popUp.setShowMask(true);
          popUp.setShow(true);
       }
    }
 
-   static public class EditPropertiesActionListener extends EventListener<UIGroupNavigationManagement>
+   static public class EditPropertiesActionListener extends BaseEditAction
    {
-      public void execute(Event<UIGroupNavigationManagement> event) throws Exception
+      @Override
+      protected void doEdit(UserNavigation navigation, Event<UIGroupNavigationManagement> event) throws Exception
       {
-
          UIGroupNavigationManagement uicomp = event.getSource();
+         SiteKey siteKey = navigation.getKey();
 
-         // get navigation id
-         String id = event.getRequestContext().getRequestParameter(OBJECTID);
-         Integer navId = Integer.parseInt(id);
-
-         // get PageNavigation by navigation id
-         PageNavigation navigation = uicomp.getNavigationById(navId);
-
          // open a add navigation popup
          UIPopupWindow popUp = uicomp.getChild(UIPopupWindow.class);
          UIPageNavigationForm pageNavigation = popUp.createUIComponent(UIPageNavigationForm.class, null, null, popUp);
-         pageNavigation.setOwnerId(navigation.getOwnerId());
-         pageNavigation.setOwnerType(navigation.getOwnerType());
+         pageNavigation.setOwnerId(siteKey.getName());
+         pageNavigation.setOwnerType(siteKey.getTypeName());
          pageNavigation.setPriority(String.valueOf(navigation.getPriority()));
          pageNavigation.addFormInput();
-         pageNavigation.setPageNav(navigation);
+         pageNavigation.setUserNav(navigation);
          popUp.setUIComponent(pageNavigation);
          popUp.setWindowSize(600, 400);
          popUp.setShowMask(true);
-         popUp.setShow(true);
+         popUp.setShow(true);   
       }
    }
 
-   static public class DeleteNavigationActionListener extends EventListener<UIGroupNavigationManagement>
+   static public class DeleteNavigationActionListener extends BaseEditAction
    {
-      public void execute(Event<UIGroupNavigationManagement> event) throws Exception
+      @Override
+      protected void doEdit(UserNavigation navigation, Event<UIGroupNavigationManagement> event) throws Exception
       {
          UIGroupNavigationManagement uicomp = event.getSource();
+         NavigationService service = uicomp.getApplicationComponent(NavigationService.class);
 
-         WebuiRequestContext context = event.getRequestContext();
-         UIApplication uiApplication = context.getUIApplication();
-
-         // get navigation id
-         String id = event.getRequestContext().getRequestParameter(OBJECTID);
-         Integer navId = Integer.parseInt(id);
-
-         // get PageNavigation by navigation id
-         PageNavigation navigation = uicomp.getNavigationById(navId);
-
-         // check edit permission, ensure that user has edit permission on that
-         // navigation
-         UserACL userACL = uicomp.getApplicationComponent(UserACL.class);
-
-         if (!userACL.hasEditPermission(navigation))
+         NavigationContext ctx = service.loadNavigation(navigation.getKey());
+         if (ctx != null)
          {
-            uiApplication.addMessage(new ApplicationMessage("UIGroupNavigationManagement.msg.Invalid-editPermission", null));
-            return;
+            service.destroyNavigation(ctx);
          }
 
-         // TODO ensure this navigation is exist
-         DataStorage service = uicomp.getApplicationComponent(DataStorage.class);
-         if (service.getPageNavigation(navigation.getOwnerType(), navigation.getOwnerId()) == null)
-         {
-            uiApplication.addMessage(new ApplicationMessage("UIGroupNavigationManagement.msg.navigation-not-exist", null));
-            return;
-         }
-
-         // remove selected navigation
-         if (uicomp.navigations == null || uicomp.navigations.size() < 1)
-         {
-            return;
-         }
-         uicomp.navigations.remove(navigation);
-
-         // remove navigation from UIPortalApplication
-         UIPortalApplication uiPortalApp = Util.getUIPortalApplication();
-         removeNavigationByID(uiPortalApp.getUserPortalConfig().getNavigations(), navigation);
-         removeNavigationByID(uiPortalApp.getNavigations(), navigation);
-         
-         
-         service.remove(navigation);
+         //
          event.getRequestContext().addUIComponentToUpdateByAjax(uicomp);
-
          //Update UserToolbarGroupPortlet
-         UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChild(UIWorkingWorkspace.class);
-         uiWorkingWS.updatePortletsByName("UserToolbarGroupPortlet");
+         UIWorkingWorkspace uiWorkingWS = Util.getUIPortalApplication().getChild(UIWorkingWorkspace.class);
+         uiWorkingWS.updatePortletsByName("UserToolbarGroupPortlet");         
       }
-
-      private void removeNavigationByID(List<PageNavigation> navs, PageNavigation target)
-      {
-         if (navs == null)
-         {
-            return;
-         }
-         for (PageNavigation nav : navs)
-         {
-            if (nav.getId() == target.getId())
-            {
-               navs.remove(nav);
-               return;
-            }
-         }
-      }
-
    }
 
    static public class AddNavigationActionListener extends EventListener<UIGroupNavigationManagement>
@@ -381,7 +271,10 @@
          uiMaskWS.setUIComponent(uiNewPortal);
          uiMaskWS.setShow(true);
          prContext.addUIComponentToUpdateByAjax(uiMaskWS);
-
+         
+         //If other users has add or remove group navigation, we need to refresh this portlet
+         UIWorkingWorkspace uiWorkingWS = Util.getUIPortalApplication().getChild(UIWorkingWorkspace.class);
+         uiWorkingWS.updatePortletsByName("UserToolbarGroupPortlet");  
       }
    }
 
@@ -391,32 +284,36 @@
       public void execute(Event<UIPageNodeForm> event) throws Exception
       {
          UIPageNodeForm uiPageNodeForm = event.getSource();
-         PageNavigation contextNavigation = uiPageNodeForm.getContextPageNavigation();
-         
          UIGroupNavigationManagement uiGroupNavigation =
             uiPageNodeForm.getAncestorOfType(UIGroupNavigationManagement.class);
-         PageNavigation selectedNavigation = uiGroupNavigation.getSelectedNavigation();
-         UIPopupWindow uiNavigationPopup = uiGroupNavigation.getChild(UIPopupWindow.class);
-         UINavigationManagement navigationManager =
-            uiPageNodeForm.createUIComponent(UINavigationManagement.class, null, null);
-         navigationManager.setOwner(contextNavigation.getOwnerId());
-         navigationManager.setOwnerType(contextNavigation.getOwnerType());
-         UINavigationNodeSelector selector = navigationManager.getChild(UINavigationNodeSelector.class);
-         selector.setEdittedNavigation(contextNavigation);
-         selector.initTreeData();
+         UINavigationManagement navigationManager = uiGroupNavigation.naviManager;
          
-         if (uiPageNodeForm.getSelectedParent() instanceof PageNode)
-         {
-            PageNode selectedParent = (PageNode)uiPageNodeForm.getSelectedParent();
-            selector.selectPageNodeByUri(selectedParent.getUri());
-         }
-         
+         UINavigationNodeSelector selector = navigationManager.getChild(UINavigationNodeSelector.class);
+         TreeNode selectedParent = (TreeNode)uiPageNodeForm.getSelectedParent();
+         selector.selectNode(selectedParent);                 
+
+         UIPopupWindow uiNavigationPopup = uiGroupNavigation.getChild(UIPopupWindow.class);
          uiNavigationPopup.setUIComponent(navigationManager);
          uiNavigationPopup.setWindowSize(400, 400);
          uiNavigationPopup.setRendered(true);
-
          event.getRequestContext().addUIComponentToUpdateByAjax(uiNavigationPopup.getParent());
+         
+         selector.createEvent("NodeModified", Phase.PROCESS, event.getRequestContext()).broadcast();
       }
 
    }
+
+   static public class CloseActionListener extends UIPopupWindow.CloseActionListener
+   {
+      public void execute(Event<UIPopupWindow> event) throws Exception
+      {
+         UIPopupWindow popWindow = event.getSource();
+         popWindow.setUIComponent(null);
+         
+         UIGroupNavigationManagement grpMan = popWindow.getAncestorOfType(UIGroupNavigationManagement.class);
+         grpMan.naviManager = null;
+         
+         super.execute(event);
+      }
+   }
 }

Copied: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UINavigationManagement.java (from rev 6783, portal/trunk/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UINavigationManagement.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UINavigationManagement.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UINavigationManagement.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,155 @@
+/**
+ * Copyright (C) 2009 eXo Platform SAS.
+ * 
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.navigation.webui.component;
+
+import org.exoplatform.portal.application.PortalRequestContext;
+import org.exoplatform.portal.config.UserPortalConfig;
+import org.exoplatform.portal.config.UserPortalConfigService;
+import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.navigation.NavigationServiceException;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.webui.util.Util;
+import org.exoplatform.portal.webui.workspace.UIPortalApplication;
+import org.exoplatform.portal.webui.workspace.UIWorkingWorkspace;
+import org.exoplatform.web.application.ApplicationMessage;
+import org.exoplatform.webui.config.annotation.ComponentConfig;
+import org.exoplatform.webui.config.annotation.EventConfig;
+import org.exoplatform.webui.core.UIComponent;
+import org.exoplatform.webui.core.UIContainer;
+import org.exoplatform.webui.core.UIPopupWindow;
+import org.exoplatform.webui.core.UIRightClickPopupMenu;
+import org.exoplatform.webui.core.UITree;
+import org.exoplatform.webui.event.Event;
+import org.exoplatform.webui.event.Event.Phase;
+import org.exoplatform.webui.event.EventListener;
+
+ at ComponentConfig(template = "app:/groovy/navigation/webui/component/UINavigationManagement.gtmpl", events = {
+   @EventConfig(listeners = UINavigationManagement.SaveActionListener.class),
+   @EventConfig(listeners = UINavigationManagement.AddRootNodeActionListener.class)})
+public class UINavigationManagement extends UIContainer
+{
+
+   private String owner;
+
+   private String ownerType;
+
+   public UINavigationManagement() throws Exception
+   {
+      addChild(UINavigationNodeSelector.class, null, null);
+   }
+
+   public void setOwner(String owner)
+   {
+      this.owner = owner;
+   }
+
+   public String getOwner()
+   {
+      return this.owner;
+   }
+
+   public <T extends UIComponent> T setRendered(boolean b)
+   {
+      return super.<T> setRendered(b);
+   }
+
+   public void loadView(Event<? extends UIComponent> event) throws Exception
+   {
+      UINavigationNodeSelector uiNodeSelector = getChild(UINavigationNodeSelector.class);
+      UITree uiTree = uiNodeSelector.getChild(UITree.class);
+      uiTree.createEvent("ChangeNode", event.getExecutionPhase(), event.getRequestContext()).broadcast();
+   }
+
+   public void setOwnerType(String ownerType)
+   {
+      this.ownerType = ownerType;
+   }
+
+   public String getOwnerType()
+   {
+      return this.ownerType;
+   }
+
+   static public class SaveActionListener extends EventListener<UINavigationManagement>
+   {
+
+      public void execute(Event<UINavigationManagement> event) throws Exception
+      {
+         PortalRequestContext prContext = Util.getPortalRequestContext();
+         UINavigationManagement uiManagement = event.getSource();
+         UINavigationNodeSelector uiNodeSelector = uiManagement.getChild(UINavigationNodeSelector.class);
+         UserPortalConfigService portalConfigService = uiManagement.getApplicationComponent(UserPortalConfigService.class);
+
+         UIPopupWindow uiPopup = uiManagement.getParent();
+         uiPopup.createEvent("ClosePopup", Phase.PROCESS, event.getRequestContext()).broadcast();
+         
+         UIPortalApplication uiPortalApp = (UIPortalApplication)prContext.getUIApplication();
+         UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
+         prContext.addUIComponentToUpdateByAjax(uiWorkingWS);
+         prContext.setFullRender(true);
+
+         UserNavigation navigation = uiNodeSelector.getEdittedNavigation();
+         SiteKey siteKey = navigation.getKey();
+         String editedOwnerId = siteKey.getName();
+
+         // Check existed
+         UserPortalConfig userPortalConfig;
+         if (PortalConfig.PORTAL_TYPE.equals(siteKey.getTypeName()))
+         {
+            userPortalConfig = portalConfigService.getUserPortalConfig(editedOwnerId, event.getRequestContext().getRemoteUser());
+            if (userPortalConfig == null)
+            {
+               prContext.getUIApplication().addMessage(
+                  new ApplicationMessage("UIPortalForm.msg.notExistAnymore", null, ApplicationMessage.ERROR));
+               return;
+            }
+         }
+         else
+         {
+            userPortalConfig =  portalConfigService.getUserPortalConfig(prContext.getPortalOwner(), event.getRequestContext().getRemoteUser());
+         }
+
+         UserNavigation persistNavigation =  userPortalConfig.getUserPortal().getNavigation(siteKey);
+         if (persistNavigation == null)
+         {
+            prContext.getUIApplication().addMessage(
+               new ApplicationMessage("UINavigationManagement.msg.NavigationNotExistAnymore", null, ApplicationMessage.ERROR));
+            return;
+         }         
+
+         uiNodeSelector.save();
+      }
+   }
+
+   static public class AddRootNodeActionListener extends EventListener<UINavigationManagement>
+   {
+
+      @Override
+      public void execute(Event<UINavigationManagement> event) throws Exception
+      {
+         UINavigationManagement uiManagement = event.getSource();
+         UINavigationNodeSelector uiNodeSelector = uiManagement.getChild(UINavigationNodeSelector.class);
+         UIRightClickPopupMenu menu = uiNodeSelector.getChild(UIRightClickPopupMenu.class);
+         menu.createEvent("AddNode", Phase.PROCESS, event.getRequestContext()).broadcast();
+      }
+
+   }
+}
\ No newline at end of file

Copied: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UINavigationNodeSelector.java (from rev 6783, portal/trunk/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UINavigationNodeSelector.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UINavigationNodeSelector.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UINavigationNodeSelector.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,822 @@
+/**
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.navigation.webui.component;
+
+import java.util.Collection;
+
+import org.exoplatform.navigation.webui.TreeNode;
+import org.exoplatform.portal.application.PortalRequestContext;
+import org.exoplatform.portal.config.DataStorage;
+import org.exoplatform.portal.config.UserACL;
+import org.exoplatform.portal.config.UserPortalConfigService;
+import org.exoplatform.portal.config.model.Page;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.mop.navigation.NavigationError;
+import org.exoplatform.portal.mop.navigation.NavigationServiceException;
+import org.exoplatform.portal.mop.navigation.Scope;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.mop.user.UserNodeFilterConfig;
+import org.exoplatform.portal.mop.user.UserPortal;
+import org.exoplatform.portal.webui.page.UIPage;
+import org.exoplatform.portal.webui.portal.UIPortalComposer;
+import org.exoplatform.portal.webui.util.PortalDataMapper;
+import org.exoplatform.portal.webui.util.Util;
+import org.exoplatform.portal.webui.workspace.UIEditInlineWorkspace;
+import org.exoplatform.portal.webui.workspace.UIPortalApplication;
+import org.exoplatform.portal.webui.workspace.UIPortalToolPanel;
+import org.exoplatform.portal.webui.workspace.UIWorkingWorkspace;
+import org.exoplatform.web.application.ApplicationMessage;
+import org.exoplatform.webui.application.WebuiRequestContext;
+import org.exoplatform.webui.config.annotation.ComponentConfig;
+import org.exoplatform.webui.config.annotation.ComponentConfigs;
+import org.exoplatform.webui.config.annotation.EventConfig;
+import org.exoplatform.webui.core.UIApplication;
+import org.exoplatform.webui.core.UIComponent;
+import org.exoplatform.webui.core.UIContainer;
+import org.exoplatform.webui.core.UIPopupWindow;
+import org.exoplatform.webui.core.UIRightClickPopupMenu;
+import org.exoplatform.webui.core.UITree;
+import org.exoplatform.webui.event.Event;
+import org.exoplatform.webui.event.Event.Phase;
+import org.exoplatform.webui.event.EventListener;
+import org.gatein.common.util.ParameterValidation;
+
+/** Copied by The eXo Platform SARL Author May 28, 2009 3:07:15 PM */
+ at ComponentConfigs({
+   @ComponentConfig(template = "system:/groovy/portal/webui/navigation/UINavigationNodeSelector.gtmpl", events = {
+      @EventConfig(listeners = UINavigationNodeSelector.ChangeNodeActionListener.class),
+      @EventConfig(listeners = UINavigationNodeSelector.NodeModifiedActionListener.class)}),
+   @ComponentConfig(id = "NavigationNodePopupMenu", type = UIRightClickPopupMenu.class, template = "system:/groovy/webui/core/UIRightClickPopupMenu.gtmpl", events = {
+      @EventConfig(listeners = UINavigationNodeSelector.AddNodeActionListener.class),
+      @EventConfig(listeners = UINavigationNodeSelector.EditPageNodeActionListener.class),
+      @EventConfig(listeners = UINavigationNodeSelector.EditSelectedNodeActionListener.class),
+      @EventConfig(listeners = UINavigationNodeSelector.CopyNodeActionListener.class),
+      @EventConfig(listeners = UINavigationNodeSelector.CutNodeActionListener.class),
+      @EventConfig(listeners = UINavigationNodeSelector.CloneNodeActionListener.class),
+      @EventConfig(listeners = UINavigationNodeSelector.PasteNodeActionListener.class),
+      @EventConfig(listeners = UINavigationNodeSelector.MoveUpActionListener.class),
+      @EventConfig(listeners = UINavigationNodeSelector.MoveDownActionListener.class),
+      @EventConfig(listeners = UINavigationNodeSelector.DeleteNodeActionListener.class, confirm = "UIPageNodeSelector.deleteNavigation")}),
+   @ComponentConfig(id = "UINavigationNodeSelectorPopupMenu", type = UIRightClickPopupMenu.class, template = "system:/groovy/webui/core/UIRightClickPopupMenu.gtmpl", events = {
+      @EventConfig(listeners = UINavigationNodeSelector.AddNodeActionListener.class),
+      @EventConfig(listeners = UINavigationNodeSelector.PasteNodeActionListener.class)})})
+public class UINavigationNodeSelector extends UIContainer
+{
+   private UserNavigation edittedNavigation;
+
+   /**
+    * This field holds transient copy of edittedTreeNodeData, which is used when
+    * user pastes the content to a new tree node
+    */
+   private TreeNode copyOfTreeNodeData;
+
+   private TreeNode rootNode;
+
+   private UserPortal userPortal;
+
+   private UserNodeFilterConfig filterConfig;
+
+   private static final Scope NODE_SCOPE = Scope.GRANDCHILDREN;
+
+   public UINavigationNodeSelector() throws Exception
+   {
+      UIRightClickPopupMenu rightClickPopup =
+         addChild(UIRightClickPopupMenu.class, "UINavigationNodeSelectorPopupMenu", null).setRendered(true);
+      rightClickPopup.setActions(new String[]{"AddNode", "PasteNode"});
+
+      UITree uiTree = addChild(UITree.class, null, "TreeNodeSelector");
+      uiTree.setIcon("DefaultPageIcon");
+      uiTree.setSelectedIcon("DefaultPageIcon");
+      uiTree.setBeanIdField("Id");
+      uiTree.setBeanChildCountField("childrenCount");
+      uiTree.setBeanLabelField("encodedResolvedLabel");
+      uiTree.setBeanIconField("icon");
+
+      UIRightClickPopupMenu uiPopupMenu =
+         createUIComponent(UIRightClickPopupMenu.class, "NavigationNodePopupMenu", null);
+      uiPopupMenu.setActions(new String[]{"AddNode", "EditPageNode", "EditSelectedNode", "CopyNode", "CloneNode",
+         "CutNode", "DeleteNode", "MoveUp", "MoveDown"});
+      uiTree.setUIRightClickPopupMenu(uiPopupMenu);
+   }
+
+   /**
+    * Init the UITree wrapped in UINavigationNodeSelector
+    * 
+    * @throws Exception
+    */
+   public void initTreeData() throws Exception
+   {
+      if (edittedNavigation == null || userPortal == null)
+      {
+         throw new IllegalStateException("edittedNavigation and userPortal must be initialized first");
+      }
+
+      try
+      {
+         this.rootNode =
+            new TreeNode(edittedNavigation, userPortal.getNode(edittedNavigation, NODE_SCOPE, filterConfig, null));
+         
+         TreeNode node = this.rootNode;
+         if (this.rootNode.getChildren().size() > 0)
+         {
+            node = rebaseNode(this.rootNode.getChild(0), NODE_SCOPE);
+            if (node == null)
+            {
+               initTreeData();
+               return;
+            }
+         }
+         selectNode(node);
+      }
+      catch (Exception ex)
+      {
+         // Navigation deleted --> close the editor
+         this.rootNode = null;
+         
+         WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
+         context.getUIApplication().addMessage(
+            new ApplicationMessage("UINavigationNodeSelector.msg." + NavigationError.NAVIGATION_NO_SITE.name(), null,
+               ApplicationMessage.ERROR));
+
+         UIPopupWindow popup = getAncestorOfType(UIPopupWindow.class);
+         popup.createEvent("ClosePopup", Phase.PROCESS, context).broadcast();
+         
+         PortalRequestContext prContext = Util.getPortalRequestContext();
+         UIWorkingWorkspace uiWorkingWS = Util.getUIPortalApplication().getChild(UIWorkingWorkspace.class);
+         prContext.addUIComponentToUpdateByAjax(uiWorkingWS);
+         prContext.setFullRender(true);
+      }      
+   }
+
+   public TreeNode selectNode(TreeNode node) throws Exception
+   {
+      if (node == null)
+      {
+         return null;
+      }
+
+      UITree tree = getChild(UITree.class);
+      tree.setSelected(node);
+      if (node.getId().equals(rootNode.getId()))
+      {
+         tree.setChildren(null);
+         tree.setSibbling(node.getChildren());
+         tree.setParentSelected(node);
+      }
+      else
+      {
+         TreeNode parentNode = node.getParent();
+         tree.setChildren(node.getChildren());
+         tree.setSibbling(parentNode.getChildren());
+         tree.setParentSelected(parentNode);
+      }
+      return node;
+   }
+
+   public TreeNode rebaseNode(TreeNode treeNode, Scope scope) throws Exception
+   {
+      if (treeNode == null || treeNode.getNode() == null)
+      {
+         return null;
+      }
+
+      UserNode userNode = treeNode.getNode();
+      if (userNode.getId() == null)
+      {
+         // Transient node
+         return treeNode;
+      }
+
+      userPortal.rebaseNode(userNode, scope, getRootNode());           
+      //this line return null if node has been deleted
+      return findNode(treeNode.getId());
+   }
+
+   public void save()
+   {
+      WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
+      try 
+      {
+         userPortal.saveNode(getRootNode().getNode(), null);
+      }
+      catch (NavigationServiceException ex)
+      {           
+         context.getUIApplication().addMessage(
+            new ApplicationMessage("UINavigationNodeSelector.msg." + ex.getError().name(), null, ApplicationMessage.ERROR));            
+      }
+   }
+   
+   public TreeNode getCopyNode()
+   {
+      return copyOfTreeNodeData;
+   }
+
+   public void setCopyNode(TreeNode copyNode)
+   {
+      this.copyOfTreeNodeData = copyNode;
+   }
+
+   public TreeNode getRootNode()
+   {
+      return rootNode;
+   }
+
+   public void setUserPortal(UserPortal userPortal) throws Exception
+   {
+      this.userPortal = userPortal;
+      setFilterConfig(UserNodeFilterConfig.builder().withAuthorizationCheck().build());
+   }
+
+   private void setFilterConfig(UserNodeFilterConfig config)
+   {
+      this.filterConfig = config;
+   }
+
+   public void setEdittedNavigation(UserNavigation nav) throws Exception
+   {
+      this.edittedNavigation = nav;
+   }
+
+   public UserNavigation getEdittedNavigation()
+   {
+      return this.edittedNavigation;
+   }
+
+   public TreeNode findNode(String nodeID)
+   {
+      if (getRootNode() == null)
+      {
+         return null;
+      }
+      return getRootNode().findNode(nodeID);
+   }
+
+   static public abstract class BaseActionListener<T> extends EventListener<T>
+   {
+      protected TreeNode rebaseNode(TreeNode node, UINavigationNodeSelector selector) throws Exception
+      {
+         return rebaseNode(node, UINavigationNodeSelector.NODE_SCOPE, selector);
+      }
+      
+      protected TreeNode rebaseNode(TreeNode node, Scope scope, UINavigationNodeSelector selector) throws Exception
+      {
+         WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
+         TreeNode rebased = selector.rebaseNode(node, scope);
+         if (rebased == null)
+         {
+            context.getUIApplication().addMessage(new ApplicationMessage("UINavigationNodeSelector.msg.staleData", null,
+               ApplicationMessage.WARNING));
+            selector.selectNode(selector.getRootNode());
+            context.addUIComponentToUpdateByAjax(selector);
+         }
+         return rebased;
+      }
+      
+      protected void handleError(NavigationError error, UINavigationNodeSelector selector) throws Exception
+      {
+         selector.initTreeData();
+         if (selector.getRootNode() != null)
+         {
+            WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
+            UIApplication uiApp = context.getUIApplication();
+            uiApp.addMessage(new ApplicationMessage("UINavigationNodeSelector.msg." + error.name(), null,
+               ApplicationMessage.ERROR));
+         }                 
+      }
+   }
+
+   static public class ChangeNodeActionListener extends BaseActionListener<UITree>
+   {
+      public void execute(Event<UITree> event) throws Exception
+      {
+         WebuiRequestContext context = event.getRequestContext();
+         UINavigationNodeSelector uiNodeSelector = event.getSource().getParent();
+
+         String nodeID = context.getRequestParameter(OBJECTID);
+         TreeNode node = uiNodeSelector.findNode(nodeID);
+
+         try
+         {
+            node = rebaseNode(node, uiNodeSelector);
+         }
+         catch (NavigationServiceException ex)
+         {
+            handleError(ex.getError(), uiNodeSelector);
+            return;
+         }
+
+         uiNodeSelector.selectNode(node);
+         context.addUIComponentToUpdateByAjax(uiNodeSelector);
+      }
+   }
+
+   static public class AddNodeActionListener extends BaseActionListener<UIRightClickPopupMenu>
+   {
+      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
+      {
+         WebuiRequestContext context = event.getRequestContext();
+         UIRightClickPopupMenu uiPopupMenu = event.getSource();
+         UINavigationNodeSelector uiNodeSelector = uiPopupMenu.getAncestorOfType(UINavigationNodeSelector.class);
+
+         String nodeID = context.getRequestParameter(UIComponent.OBJECTID);
+         TreeNode node;
+         if (ParameterValidation.isNullOrEmpty(nodeID))
+         {
+            node = uiNodeSelector.getRootNode();
+         }
+         else
+         {
+            node = uiNodeSelector.findNode(nodeID);            
+         }
+         
+         try
+         {
+            node = rebaseNode(node, uiNodeSelector);
+            if (node == null) return;
+         }
+         catch (NavigationServiceException ex)
+         {
+            handleError(ex.getError(), uiNodeSelector);
+            return;
+         }
+
+         UIPopupWindow uiManagementPopup = uiNodeSelector.getAncestorOfType(UIPopupWindow.class);
+         UIPageNodeForm uiNodeForm = uiManagementPopup.createUIComponent(UIPageNodeForm.class, null, null);
+         uiNodeForm.setValues(null);
+         uiManagementPopup.setUIComponent(uiNodeForm);
+
+         uiNodeForm.setSelectedParent(node);
+         UserNavigation edittedNavigation = uiNodeSelector.getEdittedNavigation();
+         uiNodeForm.setContextPageNavigation(edittedNavigation);
+         uiManagementPopup.setWindowSize(800, 500);
+         event.getRequestContext().addUIComponentToUpdateByAjax(uiManagementPopup.getParent());
+      }
+   }
+
+   static public class NodeModifiedActionListener extends BaseActionListener<UINavigationNodeSelector>
+   {
+      @Override
+      public void execute(Event<UINavigationNodeSelector> event) throws Exception
+      {
+         UINavigationNodeSelector uiNodeSelector = event.getSource();
+
+         try
+         {
+            rebaseNode(uiNodeSelector.getRootNode(), uiNodeSelector);
+         }
+         catch (NavigationServiceException ex)
+         {
+            handleError(ex.getError(), uiNodeSelector);
+         }
+      }
+   }
+
+   static public class EditPageNodeActionListener extends EventListener<UIRightClickPopupMenu>
+   {
+      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
+      {
+         // get nodeID
+         String nodeID = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
+
+         // get UINavigationNodeSelector
+         UIRightClickPopupMenu uiPopupMenu = event.getSource();
+         UINavigationNodeSelector uiNodeSelector = uiPopupMenu.getAncestorOfType(UINavigationNodeSelector.class);
+
+         // get Selected Node
+         TreeNode selectedPageNode = uiNodeSelector.findNode(nodeID);
+
+         UIPortalApplication uiApp = Util.getUIPortalApplication();
+         if (selectedPageNode == null || selectedPageNode.getPageRef() == null)
+         {
+            uiApp.addMessage(new ApplicationMessage("UIPageNodeSelector.msg.notAvailable", null));
+            return;
+         }
+
+         UserPortalConfigService userService = uiNodeSelector.getApplicationComponent(UserPortalConfigService.class);
+
+         // get selected page
+         String pageId = selectedPageNode.getPageRef();
+         Page selectPage = (pageId != null) ? userService.getPage(pageId) : null;
+         if (selectPage != null)
+         {
+            UserACL userACL = uiApp.getApplicationComponent(UserACL.class);
+            if (!userACL.hasEditPermission(selectPage))
+            {
+               uiApp.addMessage(new ApplicationMessage("UIPageBrowser.msg.UserNotPermission", new String[]{pageId}, 1));
+               return;
+            }
+
+            uiApp.setModeState(UIPortalApplication.APP_BLOCK_EDIT_MODE);
+            // uiWorkingWS.setRenderedChild(UIPortalToolPanel.class);
+            // uiWorkingWS.addChild(UIPortalComposer.class, "UIPageEditor",
+            // null);
+
+            UIWorkingWorkspace uiWorkingWS = uiApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
+            UIPortalToolPanel uiToolPanel =
+               uiWorkingWS.findFirstComponentOfType(UIPortalToolPanel.class).setRendered(true);
+            uiWorkingWS.setRenderedChild(UIEditInlineWorkspace.class);
+
+            UIPortalComposer portalComposer =
+               uiWorkingWS.findFirstComponentOfType(UIPortalComposer.class).setRendered(true);
+            portalComposer.setShowControl(true);
+            portalComposer.setEditted(false);
+            portalComposer.setCollapse(false);
+            portalComposer.setId("UIPageEditor");
+            portalComposer.setComponentConfig(UIPortalComposer.class, "UIPageEditor");
+
+            uiToolPanel.setShowMaskLayer(false);
+            uiToolPanel.setWorkingComponent(UIPage.class, null);
+            UIPage uiPage = (UIPage)uiToolPanel.getUIComponent();
+
+            if (selectPage.getTitle() == null)
+               selectPage.setTitle(selectedPageNode.getLabel());
+
+            // convert Page to UIPage
+            PortalDataMapper.toUIPage(uiPage, selectPage);
+            Util.getPortalRequestContext().addUIComponentToUpdateByAjax(uiWorkingWS);
+            Util.getPortalRequestContext().ignoreAJAXUpdateOnPortlets(true);
+         }
+         else
+         {
+            uiApp.addMessage(new ApplicationMessage("UIPageNodeSelector.msg.notAvailable", null));
+         }
+      }
+   }
+
+   static public class EditSelectedNodeActionListener extends BaseActionListener<UIRightClickPopupMenu>
+   {
+      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
+      {
+         WebuiRequestContext context = event.getRequestContext();
+         UIRightClickPopupMenu popupMenu = event.getSource();
+         UINavigationNodeSelector uiNodeSelector = popupMenu.getAncestorOfType(UINavigationNodeSelector.class);
+
+         String nodeID = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
+         TreeNode node = uiNodeSelector.findNode(nodeID);
+         try
+         {
+            node = rebaseNode(node, uiNodeSelector);
+            if (node == null) return;
+         }
+         catch (NavigationServiceException ex)
+         {
+            handleError(ex.getError(), uiNodeSelector);
+            return;
+         }
+
+         UIApplication uiApp = context.getUIApplication();
+         UserPortalConfigService service = uiApp.getApplicationComponent(UserPortalConfigService.class);
+         String pageId = node.getPageRef();
+         Page page = (pageId != null) ? service.getPage(pageId) : null;
+         if (page != null)
+         {
+            UserACL userACL = uiApp.getApplicationComponent(UserACL.class);
+            if (!userACL.hasPermission(page))
+            {
+               uiApp.addMessage(new ApplicationMessage("UIPageBrowser.msg.UserNotPermission", new String[]{pageId}, 1));
+               return;
+            }
+         }
+
+         UIPopupWindow uiManagementPopup = uiNodeSelector.getAncestorOfType(UIPopupWindow.class);
+         UIPageNodeForm uiNodeForm = uiApp.createUIComponent(UIPageNodeForm.class, null, null);
+         uiManagementPopup.setUIComponent(uiNodeForm);
+
+         UserNavigation edittedNav = uiNodeSelector.getEdittedNavigation();
+         uiNodeForm.setContextPageNavigation(edittedNav);
+         uiNodeForm.setValues(node);
+         uiNodeForm.setSelectedParent(node.getParent());
+         uiManagementPopup.setWindowSize(800, 500);
+         event.getRequestContext().addUIComponentToUpdateByAjax(uiManagementPopup.getParent());
+      }
+   }
+
+   static public class CopyNodeActionListener extends BaseActionListener<UIRightClickPopupMenu>
+   {
+      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
+      {
+         WebuiRequestContext context = event.getRequestContext();
+         UINavigationNodeSelector uiNodeSelector = event.getSource().getAncestorOfType(UINavigationNodeSelector.class);
+         event.getRequestContext().addUIComponentToUpdateByAjax(uiNodeSelector);
+
+         String nodeID = context.getRequestParameter(UIComponent.OBJECTID);
+         TreeNode node = uiNodeSelector.findNode(nodeID);
+         try
+         {
+            node = rebaseNode(node, Scope.ALL, uiNodeSelector);
+            if (node == null) return;
+         }
+         catch (NavigationServiceException ex)
+         {
+            handleError(ex.getError(), uiNodeSelector);
+            return;
+         }
+
+         node.setDeleteNode(false);
+         uiNodeSelector.setCopyNode(node);
+         event.getSource().setActions(
+            new String[]{"AddNode", "EditPageNode", "EditSelectedNode", "CopyNode", "CloneNode", "CutNode",
+               "PasteNode", "DeleteNode", "MoveUp", "MoveDown"});
+      }
+   }
+
+   static public class CutNodeActionListener extends BaseActionListener<UIRightClickPopupMenu>
+   {
+      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
+      {
+         WebuiRequestContext context = event.getRequestContext();
+         UINavigationNodeSelector uiNodeSelector = event.getSource().getAncestorOfType(UINavigationNodeSelector.class);
+         context.addUIComponentToUpdateByAjax(uiNodeSelector);
+
+         String nodeID = context.getRequestParameter(UIComponent.OBJECTID);
+         TreeNode node = uiNodeSelector.findNode(nodeID);
+         try
+         {
+            node = rebaseNode(node, Scope.SINGLE, uiNodeSelector);
+            if (node == null) return;
+         }
+         catch (NavigationServiceException ex)
+         {
+            handleError(ex.getError(), uiNodeSelector);
+            return;
+         }
+
+         if (node != null && Visibility.SYSTEM.equals(node.getVisibility()))
+         {
+            context.getUIApplication().addMessage(
+               new ApplicationMessage("UINavigationNodeSelector.msg.systemnode-move", null));
+            return;
+         }
+
+         node.setDeleteNode(true);
+         uiNodeSelector.setCopyNode(node);
+         event.getSource().setActions(
+            new String[]{"AddNode", "EditPageNode", "EditSelectedNode", "CopyNode", "CloneNode", "CutNode",
+               "PasteNode", "DeleteNode", "MoveUp", "MoveDown"});
+      }
+   }
+
+   static public class CloneNodeActionListener extends CopyNodeActionListener
+   {
+      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
+      {
+         super.execute(event);
+         UINavigationNodeSelector uiNodeSelector = event.getSource().getAncestorOfType(UINavigationNodeSelector.class);
+         TreeNode currNode = uiNodeSelector.getCopyNode();
+         String nodeID = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
+         if (currNode != null && currNode.getId().equals(nodeID))
+            currNode.setCloneNode(true);
+      }
+   }
+
+   static public class PasteNodeActionListener extends BaseActionListener<UIRightClickPopupMenu>
+   {
+      private UINavigationNodeSelector uiNodeSelector;
+
+      private DataStorage dataStorage;
+
+      private UserPortalConfigService service;
+
+      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
+      {
+         WebuiRequestContext context = event.getRequestContext();
+         UIRightClickPopupMenu uiPopupMenu = event.getSource();
+         uiNodeSelector = uiPopupMenu.getAncestorOfType(UINavigationNodeSelector.class);
+         context.addUIComponentToUpdateByAjax(uiNodeSelector);
+
+         String nodeID = context.getRequestParameter(UIComponent.OBJECTID);
+         TreeNode targetNode = uiNodeSelector.findNode(nodeID);
+         TreeNode sourceNode = uiNodeSelector.getCopyNode();
+         if (sourceNode == null)
+            return;
+
+         try
+         {
+            targetNode = rebaseNode(targetNode, uiNodeSelector);
+            if (targetNode == null) return;
+         }
+         catch (NavigationServiceException ex)
+         {
+            handleError(ex.getError(), uiNodeSelector);
+            return;
+         }
+
+         if (sourceNode.getId().equals(targetNode.getId()))
+         {
+            context.getUIApplication().addMessage(
+               new ApplicationMessage("UIPageNodeSelector.msg.paste.sameSrcAndDes", null));
+            return;
+         }
+
+         if (isExistChild(targetNode, sourceNode))
+         {
+            context.getUIApplication()
+               .addMessage(new ApplicationMessage("UIPageNodeSelector.msg.paste.sameName", null));
+            return;
+         }
+
+         UITree uitree = uiNodeSelector.getChild(UITree.class);
+         UIRightClickPopupMenu popup = uitree.getUIRightClickPopupMenu();
+         popup.setActions(new String[]{"AddNode", "EditPageNode", "EditSelectedNode", "CopyNode", "CutNode",
+            "CloneNode", "DeleteNode", "MoveUp", "MoveDown"});
+         uiNodeSelector.setCopyNode(null);         
+
+         if (uiNodeSelector.findNode(sourceNode.getId()) == null)
+         {
+            context.getUIApplication().addMessage(
+               new ApplicationMessage("UINavigationNodeSelector.msg.copiedNode.deleted", null, ApplicationMessage.WARNING));
+            uiNodeSelector.selectNode(uiNodeSelector.getRootNode());
+            return;
+         }
+         
+         if (sourceNode.isDeleteNode())
+         {
+            targetNode.addChild(sourceNode);
+            uiNodeSelector.selectNode(targetNode);
+            return;
+         }
+
+         service = uiNodeSelector.getApplicationComponent(UserPortalConfigService.class);
+         dataStorage = uiNodeSelector.getApplicationComponent(DataStorage.class);
+         pasteNode(sourceNode, targetNode, sourceNode.isCloneNode());
+         uiNodeSelector.selectNode(targetNode);
+      }
+
+      private TreeNode pasteNode(TreeNode sourceNode, TreeNode parent, boolean isClone) throws Exception
+      {
+         TreeNode node = parent.addChild(sourceNode.getName());
+         node.setLabel(sourceNode.getLabel());
+         node.setVisibility(sourceNode.getVisibility());
+         node.setIcon(sourceNode.getIcon());
+         node.setStartPublicationTime(sourceNode.getStartPublicationTime());
+         node.setEndPublicationTime(sourceNode.getEndPublicationTime());
+
+         if (isClone)
+         {
+            String pageName = "page" + node.hashCode();
+            node.setPageRef(clonePageFromNode(sourceNode, pageName, sourceNode.getPageNavigation().getKey()));
+         }
+         else
+         {
+            node.setPageRef(sourceNode.getPageRef());
+         }
+
+         for (TreeNode child : sourceNode.getChildren())
+         {
+            pasteNode(child, node, isClone);
+         }
+
+         return node;
+      }
+
+      private String clonePageFromNode(TreeNode node, String pageName, SiteKey siteKey) throws Exception
+      {
+         String pageId = node.getPageRef();
+         if (pageId != null)
+         {
+            Page page = service.getPage(pageId);
+            if (page != null)
+            {
+               page = dataStorage.clonePage(pageId, siteKey.getTypeName(), siteKey.getName(), pageName);
+               return page.getPageId();
+            }
+         }
+         return null;
+      }
+
+      private boolean isExistChild(TreeNode parent, TreeNode child)
+      {
+         return parent != null && parent.getChild(child.getName()) != null;
+      }
+   }
+
+   static public class MoveUpActionListener extends BaseActionListener<UIRightClickPopupMenu>
+   {
+      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
+      {
+         moveNode(event, -1);
+      }
+
+      protected void moveNode(Event<UIRightClickPopupMenu> event, int i) throws Exception
+      {
+         WebuiRequestContext context = event.getRequestContext();
+         UINavigationNodeSelector uiNodeSelector = event.getSource().getAncestorOfType(UINavigationNodeSelector.class);
+         context.addUIComponentToUpdateByAjax(uiNodeSelector.getParent());
+
+         String nodeID = context.getRequestParameter(UIComponent.OBJECTID);
+         TreeNode targetNode = uiNodeSelector.findNode(nodeID);
+         // This happen when browser's not sync with server
+         if (targetNode == null)
+            return;
+
+         TreeNode parentNode = targetNode.getParent();
+         try
+         {
+            parentNode = rebaseNode(parentNode, uiNodeSelector);
+            if (parentNode == null) return;
+            // After update the parentNode, maybe targetNode has been deleted or moved
+            TreeNode temp = parentNode.getChild(targetNode.getName()); 
+            if (temp == null || !temp.getId().equals(targetNode.getId()))
+            {
+               context.getUIApplication().addMessage(new ApplicationMessage("UINavigationNodeSelector.msg.staleData", null,
+                  ApplicationMessage.WARNING));
+               uiNodeSelector.selectNode(uiNodeSelector.getRootNode());
+               context.addUIComponentToUpdateByAjax(uiNodeSelector);
+               return;
+            }
+         }
+         catch (NavigationServiceException ex)
+         {
+            handleError(ex.getError(), uiNodeSelector);
+            return;
+         }
+
+         Collection<TreeNode> children = parentNode.getChildren();
+
+         int k;
+         for (k = 0; k < children.size(); k++)
+         {
+            if (parentNode.getChild(k).getId().equals(targetNode.getId()))
+            {
+               break;
+            }
+         }
+
+         if (k == 0 && i == -1)
+         {
+            return;
+         }
+         if (k == children.size() - 1 && i == 2)
+         {
+            return;
+         }
+          
+         parentNode.addChild(k + i, targetNode);
+         
+         //These lines help to refresh the tree
+         TreeNode selectedNode = uiNodeSelector.getSelectedNode();
+         uiNodeSelector.selectNode(parentNode);
+         uiNodeSelector.selectNode(selectedNode);
+      }
+   }
+
+   static public class MoveDownActionListener extends UINavigationNodeSelector.MoveUpActionListener
+   {
+      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
+      {
+         super.moveNode(event, 2);
+      }
+   }
+
+   static public class DeleteNodeActionListener extends EventListener<UIRightClickPopupMenu>
+   {
+      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
+      {
+         WebuiRequestContext pcontext = event.getRequestContext();
+         UINavigationNodeSelector uiNodeSelector = event.getSource().getAncestorOfType(UINavigationNodeSelector.class);
+         pcontext.addUIComponentToUpdateByAjax(uiNodeSelector);
+
+         String nodeID = pcontext.getRequestParameter(UIComponent.OBJECTID);
+         TreeNode childNode = uiNodeSelector.findNode(nodeID);
+         if (childNode == null)
+         {
+            return;
+         }
+         TreeNode parentNode = childNode.getParent();
+
+         if (Visibility.SYSTEM.equals(childNode.getVisibility()))
+         {
+            UIApplication uiApp = pcontext.getUIApplication();
+            uiApp.addMessage(new ApplicationMessage("UINavigationNodeSelector.msg.systemnode-delete", null));
+            return;
+         }
+
+         parentNode.removeChild(childNode);
+         uiNodeSelector.selectNode(parentNode);
+      }
+   }
+
+   public TreeNode getSelectedNode()
+   {
+      return getChild(UITree.class).getSelected();
+   }
+}

Copied: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UIPageNodeForm.java (from rev 6783, portal/trunk/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UIPageNodeForm.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UIPageNodeForm.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UIPageNodeForm.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,495 @@
+/**
+ * Copyright (C) 2009 eXo Platform SAS.
+ * 
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.navigation.webui.component;
+
+import org.exoplatform.navigation.webui.TreeNode;
+import org.exoplatform.portal.application.PortalRequestContext;
+import org.exoplatform.portal.config.DataStorage;
+import org.exoplatform.portal.config.UserACL;
+import org.exoplatform.portal.config.model.ModelObject;
+import org.exoplatform.portal.config.model.Page;
+import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.webui.page.UIPageSelector;
+import org.exoplatform.portal.webui.page.UIWizardPageSetInfo;
+import org.exoplatform.portal.webui.portal.UIPortal;
+import org.exoplatform.portal.webui.util.Util;
+import org.exoplatform.portal.webui.workspace.UIPortalApplication;
+import org.exoplatform.web.application.ApplicationMessage;
+import org.exoplatform.webui.application.WebuiRequestContext;
+import org.exoplatform.webui.core.UIApplication;
+import org.exoplatform.webui.core.UIComponent;
+import org.exoplatform.webui.core.UIPopupWindow;
+import org.exoplatform.webui.event.Event;
+import org.exoplatform.webui.event.Event.Phase;
+import org.exoplatform.webui.event.EventListener;
+import org.exoplatform.webui.exception.MessageException;
+import org.exoplatform.webui.form.UIFormCheckBoxInput;
+import org.exoplatform.webui.form.UIFormDateTimeInput;
+import org.exoplatform.webui.form.UIFormInputBase;
+import org.exoplatform.webui.form.UIFormInputIconSelector;
+import org.exoplatform.webui.form.UIFormInputSet;
+import org.exoplatform.webui.form.UIFormStringInput;
+import org.exoplatform.webui.form.UIFormTabPane;
+import org.exoplatform.webui.form.validator.DateTimeValidator;
+import org.exoplatform.webui.form.validator.IdentifierValidator;
+import org.exoplatform.webui.form.validator.MandatoryValidator;
+import org.exoplatform.webui.form.validator.StringLengthValidator;
+import org.exoplatform.webui.form.validator.Validator;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.EnumSet;
+import java.util.List;
+
+/**
+ * Author : Dang Van Minh, Pham Tuan minhdv81 at yahoo.com Jun 14, 2006
+ */
+public class UIPageNodeForm extends UIFormTabPane
+{
+
+   private TreeNode pageNode_;
+
+   private Object selectedParent;
+   
+   /**
+    * PageNavigation to which editted PageNode belongs
+    */
+   private UserNavigation contextPageNavigation;
+   
+   final private static String SHOW_PUBLICATION_DATE = "showPublicationDate";
+
+   final private static String START_PUBLICATION_DATE = "startPublicationDate";
+
+   final private static String END_PUBLICATION_DATE = "endPublicationDate";
+   
+   final private static String VISIBLE = "visible";
+
+   public UIPageNodeForm() throws Exception
+   {
+      super("UIPageNodeForm");
+
+      UIFormInputSet uiSettingSet = new UIFormInputSet("PageNodeSetting");
+      UIFormCheckBoxInput<Boolean> uiDateInputCheck =
+         new UIFormCheckBoxInput<Boolean>(SHOW_PUBLICATION_DATE, null, false);
+      UIFormCheckBoxInput<Boolean> uiVisibleCheck = new UIFormCheckBoxInput<Boolean>(VISIBLE, null, true);
+      
+      uiDateInputCheck.setOnChange("SwitchPublicationDate");
+      uiVisibleCheck.setOnChange("SwitchVisible");
+      uiSettingSet.addUIFormInput(new UIFormStringInput("URI", "URI", null).setEditable(false))
+      				.addUIFormInput(new UIFormStringInput("name", "name", null).addValidator(MandatoryValidator.class).addValidator(StringLengthValidator.class, 3, 30).addValidator(IdentifierValidator.class))
+      				.addUIFormInput(new UIFormStringInput("label", "label", null).addValidator(StringLengthValidator.class, 3, 120))
+      				.addUIFormInput(uiVisibleCheck.setChecked(true))
+      				.addUIFormInput(uiDateInputCheck)
+      				.addUIFormInput(new UIFormDateTimeInput(START_PUBLICATION_DATE, null, null).addValidator(DateTimeValidator.class))
+      				.addUIFormInput(new UIFormDateTimeInput(END_PUBLICATION_DATE, null, null).addValidator(DateTimeValidator.class));
+      
+      addUIFormInput(uiSettingSet);
+      setSelectedTab(uiSettingSet.getId());
+
+      UIPageSelector uiPageSelector = createUIComponent(UIPageSelector.class, null, null);
+      uiPageSelector.configure("UIPageSelector", "pageRef");
+      addUIFormInput(uiPageSelector);
+
+      UIFormInputIconSelector uiIconSelector = new UIFormInputIconSelector("Icon", "icon");
+      addUIFormInput(uiIconSelector);
+      setActions(new String[]{"Save", "Back"});
+   }
+
+   public TreeNode getPageNode()
+   {
+      return pageNode_;
+   }
+
+   public void setValues(TreeNode pageNode) throws Exception
+   {
+      pageNode_ = pageNode;
+      if (pageNode == null)
+      {
+         getUIStringInput("name").setEditable(UIFormStringInput.ENABLE);
+         getChild(UIFormInputIconSelector.class).setSelectedIcon("Default");
+         setShowPublicationDate(false);
+         return;
+      }
+      getUIStringInput("name").setEditable(UIFormStringInput.DISABLE);
+      invokeGetBindingBean(pageNode_);
+   }
+
+   public void invokeGetBindingBean(Object bean) throws Exception
+   {
+      super.invokeGetBindingBean(bean);
+      TreeNode pageNode = (TreeNode)bean;
+
+      String icon = pageNode.getIcon();
+      if (icon == null || icon.length() < 0)
+         icon = "Default";
+      getChild(UIFormInputIconSelector.class).setSelectedIcon(icon);
+      getUIStringInput("label").setValue(pageNode.getLabel());
+      if(pageNode.getVisibility() == Visibility.SYSTEM)
+      {
+         UIFormInputSet uiSettingSet = getChildById("PageNodeSetting");
+         uiSettingSet.removeChildById(VISIBLE);
+         uiSettingSet.removeChildById(SHOW_PUBLICATION_DATE);
+         uiSettingSet.removeChildById(START_PUBLICATION_DATE);
+         uiSettingSet.removeChildById(END_PUBLICATION_DATE);
+      }
+      else
+      {
+         Visibility visibility = pageNode.getVisibility();
+         boolean isVisible = visibility == null || EnumSet.of(Visibility.DISPLAYED, Visibility.TEMPORAL).contains(visibility);
+         getUIFormCheckBoxInput(VISIBLE).setChecked(isVisible);
+         getUIFormCheckBoxInput(SHOW_PUBLICATION_DATE).setChecked(Visibility.TEMPORAL.equals(visibility));
+         setShowCheckPublicationDate(isVisible);
+         Calendar cal = Calendar.getInstance();
+         if (pageNode.getStartPublicationTime() != -1)
+         {
+            cal.setTime(new Date(pageNode.getStartPublicationTime()));
+            getUIFormDateTimeInput(START_PUBLICATION_DATE).setCalendar(cal);
+         }
+         else
+            getUIFormDateTimeInput(START_PUBLICATION_DATE).setValue(null);
+         if (pageNode.getEndPublicationTime() != -1)
+         {
+            cal.setTime(new Date(pageNode.getEndPublicationTime()));
+            getUIFormDateTimeInput(END_PUBLICATION_DATE).setCalendar(cal);
+         }
+         else
+            getUIFormDateTimeInput(END_PUBLICATION_DATE).setValue(null);
+      }
+   }
+
+   public void invokeSetBindingBean(Object bean) throws Exception
+   {
+      super.invokeSetBindingBean(bean);
+      TreeNode node = (TreeNode) bean;      
+
+      if (node.getVisibility() != Visibility.SYSTEM)
+      {
+         Visibility visibility;
+         if (getUIFormCheckBoxInput(VISIBLE).isChecked())
+         {
+            UIFormCheckBoxInput showPubDate = getUIFormCheckBoxInput(SHOW_PUBLICATION_DATE);
+            visibility = showPubDate.isChecked() ?  Visibility.TEMPORAL : Visibility.DISPLAYED;  
+         }
+         else
+         {
+            visibility = Visibility.HIDDEN;
+         }
+         node.setVisibility(visibility);
+         
+         Calendar cal = getUIFormDateTimeInput(START_PUBLICATION_DATE).getCalendar();
+         Date date = (cal != null) ? cal.getTime() : null;
+         node.setStartPublicationTime(date == null ? -1 : date.getTime());
+         cal = getUIFormDateTimeInput(END_PUBLICATION_DATE).getCalendar();
+         date = (cal != null) ? cal.getTime() : null;
+         node.setEndPublicationTime(date == null ? -1 : date.getTime());
+      }
+   }
+
+   public void setShowCheckPublicationDate(boolean show)
+   {
+   	getUIFormCheckBoxInput(VISIBLE).setChecked(show);
+   	UIFormCheckBoxInput<Boolean> uiForm = getUIFormCheckBoxInput(SHOW_PUBLICATION_DATE);
+   	uiForm.setRendered(show);
+   	setShowPublicationDate(show && uiForm.isChecked());
+   }
+   
+   public void setShowPublicationDate(boolean show)
+   {
+      getUIFormDateTimeInput(START_PUBLICATION_DATE).setRendered(show);
+      getUIFormDateTimeInput(END_PUBLICATION_DATE).setRendered(show);
+   }
+
+   public Object getSelectedParent()
+   {
+      return selectedParent;
+   }
+
+   public void setSelectedParent(Object obj)
+   {
+      this.selectedParent = obj;
+   }
+   
+   public void processRender(WebuiRequestContext context) throws Exception
+   {
+      super.processRender(context);
+
+      UIPageSelector uiPageSelector = getChild(UIPageSelector.class);
+      if (uiPageSelector == null)
+         return;
+      UIPopupWindow uiPopupWindowPage = uiPageSelector.getChild(UIPopupWindow.class);
+      if (uiPopupWindowPage == null)
+         return;
+      uiPopupWindowPage.processRender(context);
+   }
+
+   public String getOwner()
+   {
+      return contextPageNavigation.getKey().getName();
+   }
+
+   public String getOwnerType()
+   {
+      return contextPageNavigation.getKey().getTypeName();
+   }
+   
+   public void setContextPageNavigation(UserNavigation _contextPageNav)
+   {
+      this.contextPageNavigation = _contextPageNav;
+   }
+   
+   public UserNavigation getContextPageNavigation()
+   {
+      return this.contextPageNavigation;
+   }
+
+   static public class SaveActionListener extends EventListener<UIPageNodeForm>
+   {
+      public void execute(Event<UIPageNodeForm> event) throws Exception
+      {
+         WebuiRequestContext ctx = event.getRequestContext();
+         UIPageNodeForm uiPageNodeForm = event.getSource();
+         UIApplication uiPortalApp = ctx.getUIApplication();
+         TreeNode pageNode = uiPageNodeForm.getPageNode();
+         
+         if (pageNode == null || (pageNode.getVisibility() != Visibility.SYSTEM &&
+            uiPageNodeForm.getUIFormCheckBoxInput(SHOW_PUBLICATION_DATE).isChecked()))
+         {
+            Calendar currentCalendar = Calendar.getInstance();
+            currentCalendar.set(currentCalendar.get(Calendar.YEAR), currentCalendar.get(Calendar.MONTH), currentCalendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
+            Date currentDate = currentCalendar.getTime();
+            
+            Calendar startCalendar =
+               uiPageNodeForm.getUIFormDateTimeInput(UIWizardPageSetInfo.START_PUBLICATION_DATE).getCalendar();
+            Date startDate = startCalendar != null ? startCalendar.getTime() : currentDate;
+            Calendar endCalendar =
+               uiPageNodeForm.getUIFormDateTimeInput(UIWizardPageSetInfo.END_PUBLICATION_DATE).getCalendar();
+            Date endDate = endCalendar != null ? endCalendar.getTime() : null;
+            
+            // Case 1: current date after start date
+            if (currentDate.after(startDate))
+            {
+               Object[] args = {};
+               uiPortalApp.addMessage(new ApplicationMessage("UIPageNodeForm.msg.currentDateBeforeStartDate", args, ApplicationMessage.WARNING));
+               return;
+            }
+            // Case 2: start date after end date
+            else if ((endCalendar != null) && (startCalendar != null) && (startDate.after(endDate)))
+            {
+               Object[] args = {};
+               uiPortalApp.addMessage(new ApplicationMessage("UIPageNodeForm.msg.startDateBeforeEndDate", args, ApplicationMessage.WARNING));
+               return;
+            }
+            // Case 3: start date is null and current date after end date
+            else if((endCalendar != null) && (currentDate.after(endDate)))
+            {
+               Object[] args = {};
+               uiPortalApp.addMessage(new ApplicationMessage("UIPageNodeForm.msg.currentDateBeforeEndDate", args, ApplicationMessage.WARNING));
+               return;
+            }
+            
+         }
+
+         UIFormStringInput nameInput = uiPageNodeForm.getUIStringInput("name");
+         String nodeName = nameInput.getValue();
+
+         TreeNode selectedParent = (TreeNode)uiPageNodeForm.getSelectedParent();
+         if (pageNode == null && selectedParent.getChild(nodeName) != null)
+         {
+            uiPortalApp.addMessage(new ApplicationMessage("UIPageNodeForm.msg.SameName", null));
+            return;
+         }
+
+         //Add node that need to be rebased to context
+         if (pageNode == null)
+         {
+            pageNode = selectedParent.addChild(nodeName);
+         } 
+
+
+         UIPageSelector pageSelector = uiPageNodeForm.getChild(UIPageSelector.class);
+         if (pageSelector.getPage() == null)
+         {
+            pageSelector.setValue(null);
+         }
+         else
+         {
+            Page page = pageSelector.getPage();
+            DataStorage storage = uiPageNodeForm.getApplicationComponent(DataStorage.class);
+            if (storage.getPage(page.getPageId()) == null)
+            {
+               storage.create(page);
+               pageSelector.setValue(page.getPageId());
+            }
+         }
+         
+         UIFormInputIconSelector uiIconSelector = uiPageNodeForm.getChild(UIFormInputIconSelector.class);
+         if (uiIconSelector.getSelectedIcon().equals("Default"))
+            pageNode.setIcon(null);
+         else
+            pageNode.setIcon(uiIconSelector.getSelectedIcon());
+         if (pageNode.getLabel() == null)
+            pageNode.setLabel(pageNode.getName());
+         
+         uiPageNodeForm.invokeSetBindingBean(pageNode);
+
+         uiPageNodeForm.createEvent("Back", Phase.DECODE, ctx).broadcast();
+      }
+   }
+
+   static public class BackActionListener extends EventListener<UIPageNodeForm>
+   {
+
+      public void execute(Event<UIPageNodeForm> event) throws Exception
+      {
+      }
+
+   }
+
+   static public class SwitchPublicationDateActionListener extends EventListener<UIPageNodeForm>
+   {
+      public void execute(Event<UIPageNodeForm> event) throws Exception
+      {
+         UIPageNodeForm uiForm = event.getSource();
+         boolean isCheck = uiForm.getUIFormCheckBoxInput(SHOW_PUBLICATION_DATE).isChecked();
+         uiForm.setShowPublicationDate(isCheck);
+         event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
+      }
+   }
+   
+   static public class SwitchVisibleActionListener extends EventListener<UIPageNodeForm>
+   {
+		@Override
+		public void execute(Event<UIPageNodeForm> event) throws Exception
+		{
+			UIPageNodeForm uiForm = event.getSource();
+			boolean isCheck = uiForm.getUIFormCheckBoxInput(VISIBLE).isChecked();
+			uiForm.setShowCheckPublicationDate(isCheck);
+			event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
+		}
+   }
+
+   static public class ClearPageActionListener extends EventListener<UIPageNodeForm>
+   {
+      public void execute(Event<UIPageNodeForm> event) throws Exception
+      {
+         UIPageNodeForm uiForm = event.getSource();
+         UIPageSelector pageSelector = uiForm.findFirstComponentOfType(UIPageSelector.class);
+         pageSelector.setPage(null);
+         event.getRequestContext().addUIComponentToUpdateByAjax(pageSelector);
+      }
+   }
+
+   static public class CreatePageActionListener extends EventListener<UIPageNodeForm>
+   {
+      public void execute(Event<UIPageNodeForm> event) throws Exception
+      {
+         UIPageNodeForm uiForm = event.getSource();
+         UIPageSelector pageSelector = uiForm.findFirstComponentOfType(UIPageSelector.class);
+
+         PortalRequestContext pcontext = Util.getPortalRequestContext();
+         UIPortalApplication uiPortalApp = Util.getUIPortalApplication();
+
+         UIFormInputSet uiInputSet = pageSelector.getChild(UIFormInputSet.class);
+         List<UIComponent> children = uiInputSet.getChildren();
+         /*********************************************************************/
+         for (UIComponent uiChild : children)
+         {
+            if (uiChild instanceof UIFormInputBase)
+            {
+               UIFormInputBase uiInput = (UIFormInputBase)uiChild;
+               if (!uiInput.isValid())
+                  continue;
+               List<Validator> validators = uiInput.getValidators();
+               if (validators == null)
+                  continue;
+               try
+               {
+                  for (Validator validator : validators)
+                     validator.validate(uiInput);
+               }
+               catch (MessageException ex)
+               {
+                  uiPortalApp.addMessage(ex.getDetailMessage());
+                  return;
+               }
+               catch (Exception ex)
+               {
+                  //TODO:  This is a  critical exception and should be handle  in the UIApplication
+                  uiPortalApp.addMessage(new ApplicationMessage(ex.getMessage(), null));
+                  return;
+               }
+            }
+         }
+
+         UserACL userACL = uiForm.getApplicationComponent(UserACL.class);
+
+         String ownerId = uiForm.getOwner();
+         String[] accessPermission = new String[1];
+         accessPermission[0] = "*:" + ownerId;
+         String editPermission = userACL.getMakableMT() + ":" + ownerId;
+         
+         if (PortalConfig.PORTAL_TYPE.equals(uiForm.getOwnerType()))
+         {
+            UIPortal uiPortal = Util.getUIPortal();
+            accessPermission = uiPortal.getAccessPermissions();
+            editPermission = uiPortal.getEditPermission();
+         }
+         
+         
+         UIFormStringInput uiPageName = uiInputSet.getChildById("pageName");
+         UIFormStringInput uiPageTitle = uiInputSet.getChildById("pageTitle");
+
+         Page page = new Page();
+         page.setOwnerType(uiForm.getOwnerType());
+         page.setOwnerId(ownerId);
+         page.setName(uiPageName.getValue());
+         String title = uiPageTitle.getValue();
+         if (title == null || title.trim().length() < 1)
+            title = page.getName();
+         page.setTitle(title);
+
+         page.setShowMaxWindow(false);
+
+         page.setAccessPermissions(accessPermission);
+         page.setEditPermission(editPermission);
+
+         userACL.hasPermission(page);
+
+         page.setModifiable(true);
+         if (page.getChildren() == null)
+            page.setChildren(new ArrayList<ModelObject>());
+
+         // check page is exist
+         DataStorage dataService = uiForm.getApplicationComponent(DataStorage.class);
+         Page existPage = dataService.getPage(page.getPageId());
+         if (existPage != null)
+         {
+            uiPortalApp.addMessage(new ApplicationMessage("UIPageForm.msg.sameName", null));
+            pcontext.addUIComponentToUpdateByAjax(uiPortalApp.getUIPopupMessages());
+            return;
+         }
+
+         pageSelector.setPage(page);
+      }
+   }
+}

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UISiteManagement.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UISiteManagement.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/navigation/webui/component/UISiteManagement.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -21,19 +21,17 @@
 
 import org.exoplatform.commons.utils.LazyPageList;
 import org.exoplatform.commons.utils.ListAccess;
+import org.exoplatform.navigation.webui.TreeNode;
 import org.exoplatform.portal.application.PortalRequestContext;
 import org.exoplatform.portal.config.DataStorage;
 import org.exoplatform.portal.config.Query;
 import org.exoplatform.portal.config.UserACL;
 import org.exoplatform.portal.config.UserPortalConfig;
 import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
 import org.exoplatform.portal.config.model.PortalConfig;
-import org.exoplatform.portal.webui.navigation.PageNavigationUtils;
-import org.exoplatform.portal.webui.navigation.UINavigationManagement;
-import org.exoplatform.portal.webui.navigation.UINavigationNodeSelector;
-import org.exoplatform.portal.webui.page.UIPageNodeForm;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.portal.webui.page.UISiteBody;
 import org.exoplatform.portal.webui.portal.UIPortal;
 import org.exoplatform.portal.webui.portal.UIPortalComposer;
@@ -54,16 +52,14 @@
 import org.exoplatform.webui.core.UIPopupWindow;
 import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
 import org.exoplatform.webui.event.Event;
+import org.exoplatform.webui.event.Event.Phase;
 import org.exoplatform.webui.event.EventListener;
-import org.exoplatform.webui.event.Event.Phase;
-
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.UUID;
-
 import javax.servlet.http.HttpServletRequest;
 
 @ComponentConfigs({
@@ -77,7 +73,9 @@
       @EventConfig(listeners = UIPageNodeForm.SwitchPublicationDateActionListener.class, phase = Phase.DECODE),
       @EventConfig(listeners = UIPageNodeForm.SwitchVisibleActionListener.class, phase = Phase.DECODE),
       @EventConfig(listeners = UIPageNodeForm.ClearPageActionListener.class, phase = Phase.DECODE),
-      @EventConfig(listeners = UIPageNodeForm.CreatePageActionListener.class, phase = Phase.DECODE)})})
+      @EventConfig(listeners = UIPageNodeForm.CreatePageActionListener.class, phase = Phase.DECODE)}),
+   @ComponentConfig(type = UIPopupWindow.class, template = "system:/groovy/webui/core/UIPopupWindow.gtmpl", 
+      events = @EventConfig(listeners = UISiteManagement.CloseActionListener.class, name = "ClosePopup"))})
 public class UISiteManagement extends UIContainer
 {
 
@@ -85,7 +83,7 @@
 
    private LazyPageList pageList;
 
-   private PageNavigation selectedNavigation;
+   private UINavigationManagement naviManager;
 
    public UISiteManagement() throws Exception
    {
@@ -183,16 +181,6 @@
 
    }
 
-   public PageNavigation getOriginalSelectedNavigation()
-   {
-      return selectedNavigation;
-   }
-
-   public void setOriginalSelectedNavigation(PageNavigation navigation)
-   {
-      selectedNavigation = navigation;
-   }
-
    private boolean stillKeptInPageList(String portalName) throws Exception {
       List<PortalConfig> portals = this.getPortalConfigs();
       for(PortalConfig p : portals) {
@@ -272,8 +260,9 @@
          UISiteManagement uicomp = event.getSource();
          String portalName = event.getRequestContext().getRequestParameter(OBJECTID);
          UserPortalConfigService service = uicomp.getApplicationComponent(UserPortalConfigService.class);
-         PortalRequestContext prContext = Util.getPortalRequestContext();
+         PortalRequestContext prContext = Util.getPortalRequestContext();         
          UIPortalApplication portalApp = (UIPortalApplication)prContext.getUIApplication();
+         UIWorkingWorkspace uiWorkingWS = portalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
 
          UserPortalConfig userConfig = service.getUserPortalConfig(portalName, prContext.getRemoteUser());
 
@@ -281,6 +270,7 @@
          {
             portalApp.addMessage(new ApplicationMessage("UISiteManagement.msg.portal-not-exist",
                new String[]{portalName}));
+            uiWorkingWS.updatePortletsByName("UserToolbarSitePortlet");
             return;
          }
          PortalConfig portalConfig = userConfig.getPortalConfig();
@@ -292,8 +282,7 @@
                new String[]{portalConfig.getName()}));
             return;
          }
-
-         UIWorkingWorkspace uiWorkingWS = portalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
+        
          //UIEditInlineWorkspace uiEditWS = uiWorkingWS.addChild(UIEditInlineWorkspace.class, null, UIPortalApplication.UI_EDITTING_WS_ID);
          UIEditInlineWorkspace uiEditWS = uiWorkingWS.getChildById(UIPortalApplication.UI_EDITTING_WS_ID);
          UIPortalComposer uiComposer = uiEditWS.getComposer().setRendered(true);
@@ -313,9 +302,10 @@
          // Check if edit current portal
          if (uiPortal.getName().equals(editPortal.getName()))
          {
-            editPortal.setSelectedNode(uiPortal.getSelectedNode());
-            editPortal.setSelectedNavigation(uiPortal.getSelectedNavigation());
-            editPortal.setSelectedPath(uiPortal.getSelectedPath());
+//            editPortal.setSelectedNode(uiPortal.getSelectedNode());
+//            editPortal.setNavigation(uiPortal.getNavigation());
+//            editPortal.setSelectedPath(uiPortal.getSelectedPath());
+            editPortal.setNavPath(uiPortal.getNavPath());
             UISiteBody siteBody = uiWorkingWS.findFirstComponentOfType(UISiteBody.class);
             siteBody.setUIComponent(null);
          }
@@ -331,35 +321,35 @@
 
    static public class EditNavigationActionListener extends EventListener<UISiteManagement>
    {
+
       public void execute(Event<UISiteManagement> event) throws Exception
       {
          UISiteManagement uicomp = event.getSource();
          String portalName = event.getRequestContext().getRequestParameter(OBJECTID);
-         DataStorage dataService = uicomp.getApplicationComponent(DataStorage.class);
          WebuiRequestContext context = event.getRequestContext();
-         UIApplication uiApplication = context.getUIApplication();
+         UIApplication uiApplication = context.getUIApplication();         
          
          //Minh Hoang TO: User could edit navigation if he/she has edit permissions on PortalConfig. That is not
          //at all logical and should be modified after release 3.1 GA
          UserPortalConfigService configService = uicomp.getApplicationComponent(UserPortalConfigService.class);
-         UserPortalConfig userPortalConfig = configService.getUserPortalConfig(portalName, context.getRemoteUser());
+         UserPortalConfig userPortalConfig = configService.getUserPortalConfig(portalName, context.getRemoteUser(),
+            PortalRequestContext.USER_PORTAL_CONTEXT);
          if(userPortalConfig == null)
          {
             uiApplication.addMessage(new ApplicationMessage("UISiteManagement.msg.portal-not-exist",
-               new String[]{portalName}));
+               new String[]{portalName}));         
+            UIWorkingWorkspace uiWorkingWS = Util.getUIPortalApplication().getChildById(UIPortalApplication.UI_WORKING_WS_ID);
+            uiWorkingWS.updatePortletsByName("UserToolbarSitePortlet");
             return;
          }
          
          UserACL userACL = uicomp.getApplicationComponent(UserACL.class);
          if (!userACL.hasEditPermission(userPortalConfig.getPortalConfig()))
          {
-            uiApplication.addMessage(new ApplicationMessage("UISiteManagement.msg.Invalid-editPermission", null));;
+            uiApplication.addMessage(new ApplicationMessage("UISiteManagement.msg.Invalid-editPermission", null));
             return;
          }
          
-         PageNavigation edittedNavigation = dataService.getPageNavigation(PortalConfig.PORTAL_TYPE, portalName);
-         
-         
          //Minh Hoang TO: For release 3.1, Edit Permission check would be rollback to former checks on PortalConfig
          /*
          if (edittedNavigation == null)
@@ -379,17 +369,22 @@
          
          UIPopupWindow popUp = uicomp.getChild(UIPopupWindow.class);
          UINavigationManagement naviManager = popUp.createUIComponent(UINavigationManagement.class, null, null, popUp);
+         uicomp.naviManager = naviManager;
+
          naviManager.setOwner(portalName);
          naviManager.setOwnerType(PortalConfig.PORTAL_TYPE);
 
+         UserPortal userPortal = userPortalConfig.getUserPortal();
+         UserNavigation edittedNavigation = userPortal.getNavigation(SiteKey.portal(portalName));
+
          UINavigationNodeSelector selector = naviManager.getChild(UINavigationNodeSelector.class);
          selector.setEdittedNavigation(edittedNavigation);
+         selector.setUserPortal(userPortal);
          selector.initTreeData();
-
          popUp.setUIComponent(naviManager);
          popUp.setShowMask(true);
          popUp.setShow(true);
-
+         popUp.setWindowSize(400, 400);         
       }
    }
 
@@ -399,28 +394,36 @@
       public void execute(Event<UIPageNodeForm> event) throws Exception
       {
          UIPageNodeForm uiPageNodeForm = event.getSource();
-         PageNavigation contextNavigation = uiPageNodeForm.getContextPageNavigation();
          UISiteManagement uiSiteManagement = uiPageNodeForm.getAncestorOfType(UISiteManagement.class);
+         UINavigationManagement navigationManager = uiSiteManagement.naviManager;
+
+         UINavigationNodeSelector selector = navigationManager.getChild(UINavigationNodeSelector.class);
+         TreeNode selectedParent = (TreeNode)uiPageNodeForm.getSelectedParent();
+         selector.selectNode(selectedParent);
+
+         WebuiRequestContext context = event.getRequestContext();
          UIPopupWindow uiNavigationPopup = uiSiteManagement.getChild(UIPopupWindow.class);
-         UINavigationManagement navigationManager = uiPageNodeForm.createUIComponent(UINavigationManagement.class, null, null);
-         navigationManager.setOwner(contextNavigation.getOwnerId());
-         navigationManager.setOwnerType(contextNavigation.getOwnerType());
-         UINavigationNodeSelector selector = navigationManager.getChild(UINavigationNodeSelector.class);
-         
-         selector.setEdittedNavigation(uiPageNodeForm.getContextPageNavigation());
-         selector.initTreeData();
-         
-         if (uiPageNodeForm.getSelectedParent() instanceof PageNode)
-         {
-            PageNode selectedParent = (PageNode)uiPageNodeForm.getSelectedParent();
-            selector.selectPageNodeByUri(selectedParent.getUri());
-         }
-         
          uiNavigationPopup.setUIComponent(navigationManager);
          uiNavigationPopup.setWindowSize(400, 400);
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiNavigationPopup.getParent());
+         context.addUIComponentToUpdateByAjax(uiNavigationPopup.getParent());
+         
+         selector.createEvent("NodeModified", Phase.PROCESS, context).broadcast();
       }
 
    }
 
+   static public class CloseActionListener extends UIPopupWindow.CloseActionListener
+   {
+      public void execute(Event<UIPopupWindow> event) throws Exception
+      {
+         UIPopupWindow popWindow = event.getSource();
+         popWindow.setUIComponent(null);
+         
+         UISiteManagement siteMan = popWindow.getAncestorOfType(UISiteManagement.class);
+         siteMan.naviManager = null;
+         
+         super.execute(event);
+      }
+   }
+
 }

Copied: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/BasePartialUpdateToolbar.java (from rev 6783, portal/trunk/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/BasePartialUpdateToolbar.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/BasePartialUpdateToolbar.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/BasePartialUpdateToolbar.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,216 @@
+/**
+ * Copyright (C) 2009 eXo Platform SAS.
+ * 
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.toolbar.webui.component;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import javax.portlet.MimeResponse;
+import javax.portlet.PortletPreferences;
+import javax.portlet.PortletRequest;
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceURL;
+
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.navigation.GenericScope;
+import org.exoplatform.portal.mop.navigation.NodeChange;
+import org.exoplatform.portal.mop.navigation.NodeChangeQueue;
+import org.exoplatform.portal.mop.navigation.Scope;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.mop.user.UserNodeFilterConfig;
+import org.exoplatform.portal.mop.user.UserPortal;
+import org.exoplatform.portal.webui.util.Util;
+import org.exoplatform.portal.webui.workspace.UIPortalApplication;
+import org.exoplatform.webui.application.WebuiRequestContext;
+import org.exoplatform.webui.application.portlet.PortletRequestContext;
+import org.exoplatform.webui.core.UIPortletApplication;
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+/**
+ * @author <a href="mailto:phuong.vu at exoplatform.com">Vu Viet Phuong</a>
+ * @version $Id$
+ *
+ */
+public abstract class BasePartialUpdateToolbar extends UIPortletApplication
+{
+
+   protected UserNodeFilterConfig toolbarFilterConfig;
+   protected Scope toolbarScope;
+   protected static final int DEFAULT_LEVEL = 2;
+
+   public BasePartialUpdateToolbar() throws Exception
+   {     
+      int level = DEFAULT_LEVEL; 
+      try 
+      {
+         PortletRequestContext context = (PortletRequestContext)WebuiRequestContext.getCurrentInstance();
+         PortletRequest prequest = context.getRequest();
+         PortletPreferences prefers = prequest.getPreferences();
+         
+         level = Integer.valueOf(prefers.getValue("level", String.valueOf(DEFAULT_LEVEL)));       
+      }
+      catch (Exception ex) 
+      {
+         log.warn("Preference for navigation level can only be integer");
+      }
+
+      if (level <= 0)
+      {
+         toolbarScope = Scope.ALL;           
+      }
+      else
+      {
+         toolbarScope = new GenericScope(level);
+      }
+   }
+   
+   protected Collection<UserNode> getNavigationNodes(UserNavigation nav) throws Exception
+   {
+      UserPortal userPortal = getUserPortal();
+      if (nav != null)
+      {
+         try 
+         {
+            UserNode rootNodes =  userPortal.getNode(nav, toolbarScope, toolbarFilterConfig, null);
+            return rootNodes.getChildren();
+         } 
+         catch (Exception ex)
+         {
+            log.warn(nav.getKey().getName() + " has been deleted");
+         }
+      }
+      return Collections.emptyList();
+   }
+   
+   protected UserNavigation getNavigation(SiteKey key) throws Exception
+   {
+      UserPortal userPortal = getUserPortal();
+      return userPortal.getNavigation(key);
+   }
+
+   @Override
+   public void serveResource(WebuiRequestContext context) throws Exception
+   {      
+      super.serveResource(context);
+      
+      ResourceRequest req = context.getRequest();
+      String id = req.getResourceID();
+      
+      JSONArray jsChilds = getChildrenAsJSON(getNodeFromResourceID(id));
+      if (jsChilds == null)
+      {
+         return;
+      }
+      
+      MimeResponse res = context.getResponse(); 
+      res.setContentType("text/json"); 
+      res.getWriter().write(jsChilds.toString());
+   }
+   
+   private JSONArray getChildrenAsJSON(UserNode userNode) throws Exception
+   {           
+      if (userNode == null)
+      {
+         return null;
+      }
+
+      NodeChangeQueue<UserNode> queue = new NodeChangeQueue<UserNode>();
+      getUserPortal().updateNode(userNode, toolbarScope, queue);         
+      for (NodeChange<UserNode> change : queue)
+      {
+         if (change instanceof NodeChange.Removed)
+         {
+            UserNode deletedNode = ((NodeChange.Removed<UserNode>)change).getTarget();
+            if (hasRelationship(deletedNode, userNode))
+            {
+               return null;
+            }
+         }
+      }
+      Collection<UserNode> childs = userNode.getChildren();         
+      
+      JSONArray jsChilds = new JSONArray();       
+      WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();       
+      MimeResponse res = context.getResponse();
+      for (UserNode child : childs)
+      {
+         jsChilds.put(toJSON(child, userNode.getNavigation().getKey().getName(), res));
+      }
+      return jsChilds;
+   }
+
+   protected JSONObject toJSON(UserNode node, String navId, MimeResponse res) throws Exception
+   {
+      JSONObject json = new JSONObject();
+      String nodeId = node.getId();
+      
+      json.put("label", node.getEncodedResolvedLabel());      
+      json.put("hasChild", node.getChildrenCount() > 0);            
+      json.put("isSelected", nodeId.equals(getSelectedNode().getId()));
+      json.put("icon", node.getIcon());       
+      
+      ResourceURL rsURL = res.createResourceURL();
+      rsURL.setResourceID(res.encodeURL(getResourceIdFromNode(node, navId)));
+      json.put("getNodeURL", rsURL.toString());                  
+      json.put("actionLink", Util.getPortalRequestContext().getPortalURI() + node.getURI());
+      
+      JSONArray childs = new JSONArray();
+      for (UserNode child : node.getChildren())
+      {
+         childs.put(toJSON(child, navId, res));
+      }      
+      json.put("childs", childs);
+      return json;
+   }
+   
+
+   protected UserPortal getUserPortal()
+   {
+      UIPortalApplication uiApp = Util.getUIPortalApplication();
+      return uiApp.getUserPortalConfig().getUserPortal();
+   }
+   
+   protected UserNode getSelectedNode() throws Exception
+   {
+      return Util.getUIPortal().getSelectedUserNode();
+   }
+   
+   private boolean hasRelationship(UserNode parent, UserNode userNode)
+   {
+      if (parent.getId().equals(userNode.getId()))
+      {
+         return true;
+      }
+      for (UserNode child : parent.getChildren())
+      {
+         if (hasRelationship(child, userNode))
+         {
+            return true;
+         }
+      }
+      return false;
+   }
+   
+   protected abstract String getResourceIdFromNode(UserNode node, String navId) throws Exception;
+   
+   protected abstract UserNode getNodeFromResourceID(String resourceId) throws Exception;
+}
\ No newline at end of file

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIAdminToolbarPortlet.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIAdminToolbarPortlet.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIAdminToolbarPortlet.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -22,9 +22,8 @@
 import org.exoplatform.portal.config.DataStorage;
 import org.exoplatform.portal.config.UserACL;
 import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
-import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
 import org.exoplatform.portal.webui.page.UIPage;
 import org.exoplatform.portal.webui.page.UIPageBody;
 import org.exoplatform.portal.webui.portal.UIPortal;
@@ -45,9 +44,9 @@
    {
    }
 
-   public PageNavigation getSelectedNavigation() throws Exception
+   public UserNavigation getSelectedNavigation() throws Exception
    {
-      return Util.getUIPortal().getSelectedNavigation();
+      return Util.getUIPortal().getUserNavigation(); 
    }
 
    @Override
@@ -64,21 +63,12 @@
 
    private boolean hasEditPermissionOnNavigation() throws Exception
    {
-      PageNavigation selectedNavigation = getSelectedNavigation();
-      UIPortalApplication portalApp = Util.getUIPortalApplication();
-      UserACL userACL = portalApp.getApplicationComponent(UserACL.class);
-      if (selectedNavigation == null || userACL == null)
+      UserNavigation selectedNavigation = getSelectedNavigation();
+      if (selectedNavigation == null)
       {
          return false;
       }
-      else
-      {
-         if (PortalConfig.PORTAL_TYPE.equals(selectedNavigation.getOwnerType()))
-         {
-            return hasEditPermissionOnPortal();
-         }
-         return userACL.hasEditPermission(selectedNavigation);
-      }
+      return selectedNavigation.isModifiable();
    }
    
    private boolean hasEditPermissionOnPortal() throws Exception
@@ -104,8 +94,8 @@
       else
       {
          UIPortal currentUIPortal = portalApp.<UIWorkingWorkspace>findComponentById(UIPortalApplication.UI_WORKING_WS_ID).findFirstComponentOfType(UIPortal.class);
-         PageNode currentNode = currentUIPortal.getSelectedNode();
-         String pageReference = currentNode.getPageReference();
+         UserNode currentNode = currentUIPortal.getSelectedUserNode();
+         String pageReference = currentNode.getPageRef();
          if(pageReference == null)
          {
             return false;

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIUserToolBarDashboardPortlet.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIUserToolBarDashboardPortlet.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIUserToolBarDashboardPortlet.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,20 +19,28 @@
 
 package org.exoplatform.toolbar.webui.component;
 
+import java.util.Collection;
+
+import javax.portlet.EventRequest;
+
 import org.exoplatform.portal.application.PortalRequestContext;
 import org.exoplatform.portal.config.DataStorage;
 import org.exoplatform.portal.config.UserPortalConfigService;
 import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
-import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.mop.navigation.Scope;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.mop.user.UserNodeFilterConfig;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.portal.webui.util.Util;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
+import org.exoplatform.webui.application.WebuiRequestContext;
 import org.exoplatform.webui.config.annotation.ComponentConfig;
 import org.exoplatform.webui.config.annotation.EventConfig;
 import org.exoplatform.webui.core.UIComponent;
-import org.exoplatform.webui.core.UIPortletApplication;
 import org.exoplatform.webui.core.lifecycle.UIApplicationLifecycle;
 import org.exoplatform.webui.event.Event;
 import org.exoplatform.webui.event.EventListener;
@@ -48,39 +56,62 @@
  */
 @ComponentConfig(lifecycle = UIApplicationLifecycle.class, template = "app:/groovy/admintoolbar/webui/component/UIUserToolBarDashboardPortlet.gtmpl",
    events = {@EventConfig(name = "AddDefaultDashboard", listeners = UIUserToolBarDashboardPortlet.AddDashboardActionListener.class),
-      @EventConfig(listeners = UIUserToolBarDashboardPortlet.UserPageNodeDeletedActionListener.class)})
-public class UIUserToolBarDashboardPortlet extends UIPortletApplication
+      @EventConfig(listeners = UIUserToolBarDashboardPortlet.NavigationChangeActionListener.class)})
+public class UIUserToolBarDashboardPortlet extends BasePartialUpdateToolbar
 {
 
    public static String DEFAULT_TAB_NAME = "Tab_0";
 
    public UIUserToolBarDashboardPortlet() throws Exception
    {
+      UserNodeFilterConfig.Builder builder = UserNodeFilterConfig.builder();
+      builder.withAuthorizationCheck().withVisibility(Visibility.DISPLAYED, Visibility.TEMPORAL);
+      builder.withTemporalCheck();
+      toolbarFilterConfig = builder.build();      
    }
 
-   public PageNavigation getCurrentUserNavigation() throws Exception
+   public UserNavigation getCurrentUserNavigation() throws Exception
    {
-      String remoteUser = Util.getPortalRequestContext().getRemoteUser();
-      return getPageNavigation(PortalConfig.USER_TYPE + "::" + remoteUser);
+      WebuiRequestContext rcontext = WebuiRequestContext.getCurrentInstance();
+      return getNavigation(SiteKey.user(rcontext.getRemoteUser()));
+   }  
+   
+   @Override
+   protected String getResourceIdFromNode(UserNode node, String navId) throws Exception
+   {
+      if (node == null) 
+      {
+         throw new IllegalArgumentException("node can't be null");
+      }
+      return node.getURI(); 
    }
 
-   private PageNavigation getPageNavigation(String owner) throws Exception
+   @Override
+   protected UserNode getNodeFromResourceID(String resourceId) throws Exception
    {
-      //List<PageNavigation> allNavigations = Util.getUIPortal().getNavigations();
-      List<PageNavigation> allNavigations = Util.getUIPortalApplication().getNavigations();
-      for (PageNavigation nav : allNavigations)
+      UserNavigation currNav = getCurrentUserNavigation();
+      if (currNav == null) return null;
+    
+      UserPortal userPortal = getUserPortal(); 
+      UserNode node = userPortal.resolvePath(currNav, toolbarFilterConfig, resourceId);
+      if (node != null && node.getURI().equals(resourceId))
       {
-         if (nav.getOwner().equals(owner))
-            return nav;
+         return node;
       }
       return null;
    }
+   
+   static public class NavigationChangeActionListener extends EventListener<UIUserToolBarDashboardPortlet>
+   {
+      private Log log = ExoLogger.getExoLogger(NavigationChangeActionListener.class);
 
-   public PageNode getSelectedPageNode() throws Exception
-   {
-      return Util.getUIPortal().getSelectedNode();
+      @Override
+      public void execute(Event<UIUserToolBarDashboardPortlet> event) throws Exception
+      {
+         log.debug("PageNode : " + ((EventRequest)event.getRequestContext().getRequest()).getEvent().getValue() + " is deleted");
+      }
    }
-
+   
    static public class UserPageNodeDeletedActionListener extends EventListener<UIUserToolBarDashboardPortlet>
    {
       private Log log = ExoLogger.getExoLogger(UserPageNodeDeletedActionListener.class);
@@ -104,29 +135,20 @@
          UIUserToolBarDashboardPortlet toolBarPortlet = event.getSource();
          String nodeName = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
 
-         PageNavigation cachedNavigation = toolBarPortlet.getCurrentUserNavigation();
-         
-         // Update navigation for prevent create first node which already existed
-         DataStorage dataStorage = toolBarPortlet.getApplicationComponent(DataStorage.class);         
-         PageNavigation userNavigation =
-            dataStorage.getPageNavigation(cachedNavigation.getOwnerType(), cachedNavigation.getOwnerId());
-         cachedNavigation.merge(userNavigation);
-
-         UserPortalConfigService configService = toolBarPortlet.getApplicationComponent(UserPortalConfigService.class);
-         if (cachedNavigation != null && configService != null && cachedNavigation.getNodes().size() < 1)
+         Collection<UserNode> nodes = toolBarPortlet.getNavigationNodes(toolBarPortlet.getCurrentUserNavigation());
+         if (nodes.size() < 1)
          {
-            createDashboard(nodeName, cachedNavigation, configService);
+            createDashboard(nodeName, toolBarPortlet);
          }
          else
          {
             PortalRequestContext prContext = Util.getPortalRequestContext();
             prContext.getResponse().sendRedirect(
-               prContext.getPortalURI() + cachedNavigation.getNodes().get(0).getName());
+               prContext.getPortalURI() + nodes.iterator().next().getURI());
          }
       }
 
-      private static void createDashboard(String _nodeName, PageNavigation _pageNavigation,
-         UserPortalConfigService _configService)
+      private static void createDashboard(String _nodeName, UIUserToolBarDashboardPortlet toolBarPortlet)
       {
          try
          {
@@ -136,24 +158,29 @@
                logger.debug("Parsed nodeName is null, hence use Tab_0 as default name");
                _nodeName = DEFAULT_TAB_NAME;
             }
+
+            UserPortal userPortal = toolBarPortlet.getUserPortal();
+            UserNavigation userNav = toolBarPortlet.getCurrentUserNavigation();
+            if (userNav == null)
+            {
+               return;
+            }
+            SiteKey siteKey = userNav.getKey();
+
+            UserPortalConfigService _configService = toolBarPortlet.getApplicationComponent(UserPortalConfigService.class);
             Page page =
-               _configService.createPageTemplate(PAGE_TEMPLATE, _pageNavigation.getOwnerType(), _pageNavigation
-                  .getOwnerId());
+               _configService.createPageTemplate(PAGE_TEMPLATE, siteKey.getTypeName(), siteKey.getName());
             page.setTitle(_nodeName);
             page.setName(_nodeName);
+            toolBarPortlet.getApplicationComponent(DataStorage.class).create(page);
 
-            PageNode pageNode = new PageNode();
-            pageNode.setName(_nodeName);
-            pageNode.setLabel(prContext.getApplicationResourceBundle().getString("UIUserToolBarDashboard.page.ClickAndType"));
-            pageNode.setResolvedLabel(prContext.getApplicationResourceBundle());
-            pageNode.setUri(_nodeName);
-            pageNode.setPageReference(page.getPageId());
+            UserNode rootNode = userPortal.getNode(userNav, Scope.CHILDREN, toolBarPortlet.toolbarFilterConfig, null);
+            UserNode tabNode = rootNode.addChild(_nodeName);
+            tabNode.setLabel(_nodeName);            
+            tabNode.setPageRef(page.getPageId());
 
-            _pageNavigation.addNode(pageNode);
-            _configService.create(page);
-            _configService.update(_pageNavigation);
-
-            prContext.getResponse().sendRedirect(prContext.getPortalURI() + _nodeName);
+            userPortal.saveNode(rootNode, null);
+            prContext.getResponse().sendRedirect(prContext.getPortalURI() + tabNode.getURI());
          }
          catch (Exception ex)
          {
@@ -161,4 +188,4 @@
          }
       }
    }
-}
\ No newline at end of file
+}

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIUserToolBarGroupPortlet.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIUserToolBarGroupPortlet.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIUserToolBarGroupPortlet.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,16 +19,21 @@
 
 package org.exoplatform.toolbar.webui.component;
 
-import org.exoplatform.portal.config.model.PageNode;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PortalConfig;
-import org.exoplatform.portal.webui.navigation.PageNavigationUtils;
-import org.exoplatform.portal.webui.util.Util;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.SiteType;
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.mop.user.UserNodeFilterConfig;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.webui.config.annotation.ComponentConfig;
-import org.exoplatform.webui.core.UIPortletApplication;
+import org.exoplatform.webui.config.annotation.EventConfig;
 import org.exoplatform.webui.core.lifecycle.UIApplicationLifecycle;
+import org.exoplatform.webui.event.Event;
+import org.exoplatform.webui.event.EventListener;
+import org.gatein.common.util.ParameterValidation;
 
-import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
 
 /**
@@ -37,32 +42,87 @@
  *          thanhtungty at gmail.com
  * May 26, 2009  
  */
- at ComponentConfig(lifecycle = UIApplicationLifecycle.class, template = "app:/groovy/admintoolbar/webui/component/UIUserToolBarGroupPortlet.gtmpl")
-public class UIUserToolBarGroupPortlet extends UIPortletApplication
+ at ComponentConfig(lifecycle = UIApplicationLifecycle.class, template = "app:/groovy/admintoolbar/webui/component/UIUserToolBarGroupPortlet.gtmpl",
+   events = {
+      @EventConfig(listeners = UIUserToolBarGroupPortlet.NavigationChangeActionListener.class)
+   }
+)
+public class UIUserToolBarGroupPortlet extends BasePartialUpdateToolbar
 {
 
+   private static final String SPLITTER_STRING = "::";
+
    public UIUserToolBarGroupPortlet() throws Exception
+   {                  
+      UserNodeFilterConfig.Builder builder = UserNodeFilterConfig.builder();
+      builder.withAuthorizationCheck().withVisibility(Visibility.DISPLAYED, Visibility.TEMPORAL);
+      builder.withTemporalCheck();
+      toolbarFilterConfig = builder.build();
+   }
+
+   public List<UserNavigation> getGroupNavigations() throws Exception
    {
+      UserPortal userPortal = getUserPortal();
+      List<UserNavigation> allNavs = userPortal.getNavigations();
+
+      List<UserNavigation> groupNav = new LinkedList<UserNavigation>();
+      for (UserNavigation nav : allNavs)
+      {
+         if (nav.getKey().getType().equals(SiteType.GROUP))
+         {
+            groupNav.add(nav);
+         }
+      }
+      return groupNav;
+   }   
+
+   @Override
+   protected String getResourceIdFromNode(UserNode node, String navId) throws Exception
+   {
+      return navId + SPLITTER_STRING + node.getURI();
    }
 
-   public List<PageNavigation> getGroupNavigations() throws Exception
+   @Override
+   protected UserNode getNodeFromResourceID(String resourceId) throws Exception
    {
-      String remoteUser = Util.getPortalRequestContext().getRemoteUser();
-      //List<PageNavigation> allNavigations = Util.getUIPortal().getNavigations();
-      List<PageNavigation> allNavigations = Util.getUIPortalApplication().getNavigations();
-      List<PageNavigation> navigations = new ArrayList<PageNavigation>();
-      for (PageNavigation navigation : allNavigations)
+      String[] parsedId = parseResourceId(resourceId); 
+      if (parsedId == null)
       {
-         if (navigation.getOwnerType().equals(PortalConfig.GROUP_TYPE))
+         throw new IllegalArgumentException("resourceId " + resourceId + " is invalid");
+      }
+      String groupId = parsedId[0];
+      String nodeURI = parsedId[1];
+                                   
+      UserNavigation grpNav = getNavigation(SiteKey.group(groupId));
+      if (grpNav == null) return null;
+      
+      UserNode node = getUserPortal().resolvePath(grpNav, toolbarFilterConfig, nodeURI);
+      if (node != null && node.getURI().equals(nodeURI))
+      {
+         return node;
+      }
+      return null;
+   }   
+   
+   private String[] parseResourceId(String resourceId)
+   {
+      if (!ParameterValidation.isNullOrEmpty(resourceId)) 
+      {
+         String[] parsedId = resourceId.split(SPLITTER_STRING);
+         if (parsedId.length == 2) 
          {
-            navigations.add(PageNavigationUtils.filterNavigation(navigation, remoteUser, false, true));
+            return parsedId;
          }
       }
-      return navigations;
+      return null;
    }
 
-   public PageNode getSelectedPageNode() throws Exception
+   public static class NavigationChangeActionListener extends EventListener<UIUserToolBarGroupPortlet>
    {
-      return Util.getUIPortal().getSelectedNode();
+      @Override
+      public void execute(Event<UIUserToolBarGroupPortlet> event) throws Exception
+      {
+         // This event is only a trick for updating the Toolbar group portlet
+      }
    }
 }
\ No newline at end of file

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIUserToolBarSitePortlet.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIUserToolBarSitePortlet.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/java/org/exoplatform/toolbar/webui/component/UIUserToolBarSitePortlet.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,33 +19,37 @@
 
 package org.exoplatform.toolbar.webui.component;
 
+import java.util.List;
+
 import org.exoplatform.portal.config.DataStorage;
 import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
 import org.exoplatform.portal.config.model.PortalConfig;
-import org.exoplatform.portal.webui.navigation.PageNavigationUtils;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.mop.user.UserNodeFilterConfig;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.portal.webui.util.Util;
 import org.exoplatform.webui.config.annotation.ComponentConfig;
-import org.exoplatform.webui.core.UIPortletApplication;
 import org.exoplatform.webui.core.lifecycle.UIApplicationLifecycle;
 
-import java.util.List;
-
 /**
  * Created by The eXo Platform SAS
  * Author : Pham Thanh Tung
  *          thanhtungty at gmail.com
  * May 26, 2009  
  */
- at ComponentConfig(lifecycle = UIApplicationLifecycle.class, template = "app:/groovy/admintoolbar/webui/component/UIUserToolBarSitePortlet.gtmpl"
-
-)
-public class UIUserToolBarSitePortlet extends UIPortletApplication
+ at ComponentConfig(lifecycle = UIApplicationLifecycle.class, template = "app:/groovy/admintoolbar/webui/component/UIUserToolBarSitePortlet.gtmpl")
+public class UIUserToolBarSitePortlet extends BasePartialUpdateToolbar
 {
 
    public UIUserToolBarSitePortlet() throws Exception
    {
+      UserNodeFilterConfig.Builder builder = UserNodeFilterConfig.builder();
+      builder.withAuthorizationCheck().withVisibility(Visibility.DISPLAYED, Visibility.TEMPORAL);
+      builder.withTemporalCheck();
+      toolbarFilterConfig = builder.build();
    }
 
    public List<String> getAllPortalNames() throws Exception
@@ -76,29 +80,30 @@
    {
       String currentPortalURI = Util.getPortalRequestContext().getPortalURI();
       return currentPortalURI.substring(0, currentPortalURI.lastIndexOf(getCurrentPortal())) + portalName + "/";
-   }
+   } 
 
-   public PageNavigation getCurrentPortalNavigation() throws Exception
-   {
-      PageNavigation navi = getPageNavigation(PortalConfig.PORTAL_TYPE + "::" + getCurrentPortal());
-      String remoteUser = Util.getPortalRequestContext().getRemoteUser();
-      return PageNavigationUtils.filterNavigation(navi, remoteUser, false, true);
-   }
-
-   private PageNavigation getPageNavigation(String owner) throws Exception
-   {
-      //List<PageNavigation> allNavigations = Util.getUIPortal().getNavigations();
-      List<PageNavigation> allNavigations = Util.getUIPortalApplication().getUserPortalConfig().getNavigations();
-      for (PageNavigation nav : allNavigations)
+   @Override
+   protected UserNode getNodeFromResourceID(String resourceId) throws Exception
+   {      
+      UserNavigation currNav = getNavigation(SiteKey.portal(getCurrentPortal()));
+      if (currNav == null) return null;
+    
+      UserPortal userPortal = getUserPortal(); 
+      UserNode node = userPortal.resolvePath(currNav, toolbarFilterConfig, resourceId);
+      if (node != null && node.getURI().equals(resourceId))
       {
-         if (nav.getOwner().equals(owner))
-            return nav;
+         return node;
       }
       return null;
    }
 
-   public PageNode getSelectedPageNode() throws Exception
+   @Override
+   protected String getResourceIdFromNode(UserNode node, String navId) throws Exception
    {
-      return Util.getUIPortal().getSelectedNode();
+      if (node == null) 
+      {
+         throw new IllegalArgumentException("node can't be null");
+      }
+      return node.getURI();      
    }
-}
\ No newline at end of file
+}

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/WEB-INF/portlet.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/WEB-INF/portlet.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/WEB-INF/portlet.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -145,6 +145,9 @@
          <short-title>Group Navigation Portlet</short-title>
          <keywords>Administration</keywords>
       </portlet-info>
+      <supported-publishing-event>
+         <name>NavigationChange</name>
+      </supported-publishing-event>
    </portlet>
 
    <portlet>
@@ -198,7 +201,7 @@
          <keywords>Administration</keywords>
       </portlet-info>
       <supported-publishing-event>
-         <name>UserPageNodeDeleted</name>
+         <name>NavigationChange</name>
       </supported-publishing-event>
    </portlet>
 
@@ -315,8 +318,13 @@
          <title>User Toolbar Site Portlet</title>
          <short-title>UserToolbarSite</short-title>
          <keywords>gatein_internal</keywords>
-      </portlet-info>
-
+      </portlet-info>		      
+      <portlet-preferences>
+        <preference>
+	      <name>level</name>
+	      <value>2</value>
+        </preference>
+      </portlet-preferences>
       <security-role-ref>
          <role-name>admin</role-name>
          <role-link>admin</role-link>
@@ -346,14 +354,19 @@
          <short-title>UserToolbarDashboard</short-title>
          <keywords>gatein_internal</keywords>
       </portlet-info>
-
+      <portlet-preferences>
+        <preference>
+	      <name>level</name>
+	      <value>2</value>
+        </preference>
+      </portlet-preferences>
       <security-role-ref>
          <role-name>admin</role-name>
          <role-link>admin</role-link>
       </security-role-ref>
-      <supported-processing-event>
-         <name>UserPageNodeDeleted</name>
-      </supported-processing-event>
+      <supported-publishing-event>
+         <name>NavigationChange</name>
+      </supported-publishing-event>
    </portlet>
 
    <portlet>
@@ -379,11 +392,19 @@
          <short-title>UserToolbarGroup</short-title>
          <keywords>gatein_internal</keywords>
       </portlet-info>
-
+      <portlet-preferences>
+        <preference>
+	      <name>level</name>
+	      <value>2</value>
+        </preference>
+      </portlet-preferences>
       <security-role-ref>
          <role-name>admin</role-name>
          <role-link>admin</role-link>
       </security-role-ref>
+      <supported-processing-event>
+         <name>NavigationChange</name>
+      </supported-processing-event>
    </portlet>
    <portlet>
       <description xml:lang="EN">Star Toolbar Portlet</description>
@@ -414,6 +435,6 @@
       <name>NewAccountAdded</name>
    </event-definition>
    <event-definition>
-      <name>UserPageNodeDeleted</name>
+      <name>NavigationChange</name>
    </event-definition>
 </portlet-app>

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIAdminToolbarPortlet.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIAdminToolbarPortlet.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIAdminToolbarPortlet.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,13 +1,12 @@
-<%	
-	import org.exoplatform.toolbar.webui.component.UIAdminToolbarPortlet;
+<%	
 	import org.exoplatform.web.application.JavascriptManager;
-	import org.exoplatform.portal.config.model.PageNavigation;
-	import org.exoplatform.services.organization.User;
-	import org.exoplatform.services.security.ConversationState;
-	import org.exoplatform.web.CacheUserProfileFilter;
-		
+	import org.exoplatform.portal.webui.util.Util;
+	import org.exoplatform.portal.webui.workspace.UIPortalApplication;
+	import org.exoplatform.portal.webui.page.UIPage;
+	import org.exoplatform.portal.mop.user.UserNavigation;
+
 	def rcontext = _ctx.getRequestContext();
-	
+	 
 	JavascriptManager jsmanager = rcontext.getJavascriptManager();
 	jsmanager.importJavascript('eXo.portal.UIPortalNavigation');
 	jsmanager.importJavascript('eXo.portal.UIAdminToolbar');
@@ -24,9 +23,9 @@
 	boolean userCouldEditPage = uicomponent.hasEditPermissionOnPage();
 	boolean userCouldEditPortal = uicomponent.hasEditPermissionOnPortal();
 	
-	PageNavigation selectedNav = uicomponent.getSelectedNavigation();
+	UserNavigation selectedNav = uicomponent.getSelectedNavigation();
 	if (selectedNav != null) {
-		editorLabel = _ctx.appRes("UIAdminToolbarPortlet.action." + selectedNav.getOwnerType() + ".Editor");
+		editorLabel = _ctx.appRes("UIAdminToolbarPortlet.action." + selectedNav.getKey().getTypeName() + ".Editor");
 	}
 	String accountSetting = "javascript:if(document.getElementById('UIMaskWorkspace')) ajaxGet(eXo.env.server.createPortalURL('UIPortal', 'AccountSettings', true));"
 %>
@@ -51,7 +50,7 @@
 							</div>
 						<% } %>
 						
-						<% if(userCouldEditPortal){ %>
+						<% if(userCouldEditPortal){ %>
 							<div class="MenuItem">	
 								<a href="javascript:ajaxGet(eXo.env.server.createPortalURL('UIWorkingWorkspace', 'EditInline', true))" title="" class="ItemIcon EditSiteIcon">$editSiteLayout</a>
 							</div>

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIUserToolBarDashboardPortlet.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIUserToolBarDashboardPortlet.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIUserToolBarDashboardPortlet.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,127 +1,132 @@
-<%
-	import org.exoplatform.portal.config.model.PageNavigation;
-	import org.exoplatform.portal.config.model.PageNode;
-	import org.exoplatform.web.application.JavascriptManager;
-	import org.exoplatform.portal.webui.util.Util ;
-	import org.exoplatform.webui.organization.OrganizationUtils;
-	import org.gatein.common.text.EntityEncoder;
-	
-	def rcontext = _ctx.getRequestContext() ;
-	JavascriptManager jsmanager = rcontext.getJavascriptManager();
-	jsmanager.importJavascript('eXo.portal.UIPortalNavigation');
-	jsmanager.importJavascript('eXo.portal.UIAdminToolbar');
-	jsmanager.addCustomizedOnLoadScript('eXo.portal.UIAdminToolbar.onLoad("' + uicomponent.id + '");');
-	
-	def currentUserNavigation = uicomponent.getCurrentUserNavigation();
-	def portalURI = Util.getPortalRequestContext().getPortalURI();
-	void renderDashboards(){
-		PageNavigation userNavigation = uicomponent.getCurrentUserNavigation();
-		if(userNavigation == null){
-			return;
-		}
-		
-		nodes = userNavigation.getNodes();
-		int size = nodes.size();
-		if(size < 1){
-			return;
-		}
-		String clazz = "";
-		
-		print """
-			<div style="display:none" class="MenuItemContainer">
-				<div class="SubBlock">
-		""";
-					for(int i = 0; i < size; i++) {
-						renderPageNode( nodes.get(i), i%2 == 0);
-					}
-		print """
-				</div>
-			</div>
-		""" ;
-	}
-	
-	void renderPageNode(PageNode node, boolean flag) {
-		PageNode selectedNode = uicomponent.getSelectedPageNode();
-		String tabStyleNavigation = "";
-		if(selectedNode != null && node.getUri() == selectedNode.getUri()) {			 
-				tabStyleNavigation = "SelectedItem";
-		}
-		
-		boolean hasChild = (node.getChildren() != null && node.getChildren().size() > 0);
-		String clazz = "";
-		if(hasChild) clazz = "ArrowIcon";
-		String	href = Util.getPortalRequestContext().getPortalURI() + node.getUri();
-		String icon = node.getIcon();
-		if(icon == null) icon = "DefaultPageIcon";
-		boolean toolong = (node.resolvedLabel.length() > 60);
-		String label = ( toolong ? node.resolvedLabel.substring(0, 57) + "..." : node.resolvedLabel);
-		String title = "";
-		if(toolong) title = "title='$node.resolvedLabel'";
-		else title = "";
-		EntityEncoder entityEncoder = EntityEncoder.FULL;
-                label = entityEncoder.encode(label);
-		print """
-			<div class="MenuItem $tabStyleNavigation">
-				<div class="$clazz">
-		""";
-						if(node.pageReference != null) {
-								print """<a class="ItemIcon $icon" href="$href" $title>$label</a>""";
-						} else {
-								print """<a class="ItemIcon $icon" href="#" $title>$label</a>""";
-						}
-		print """
-				</div>
-		""" ;
-		if(hasChild) {
-			print """
-				<div class="MenuItemContainer">			
-					<div class="SubBlock">
-			""" ;
-				for(int j = 0; j < node.getChildren().size(); j++) {
-					renderPageNode(node.getChildren().get(j), j%2 == 0);
-				}
-			print """
-					</div>
-				</div>
-			""" ;
-			
-		}
-		print """
-			</div>
-		""" ;			
-	}	
-%>
-
-<% 
-	String defaultDashboardPage;				
-	if(currentUserNavigation == null || currentUserNavigation.getNodes() == null || currentUserNavigation.getNodes().size() < 1){ 
-		defaultDashboardPage = org.exoplatform.toolbar.webui.component.UIUserToolBarDashboardPortlet.DEFAULT_TAB_NAME;
-%>
-	<div class="UIUserToolBarDashboardPortlet" id="$uicomponent.id">	
-		<div class="UIHorizontalTabs">
-			<div class="TabsContainer">
-				<div class="UITab NormalToolbarTab">
-					<div class="">
-						<a class="DashboardIcon TBIcon" href="<%= uicomponent.url("AddDefaultDashboard", defaultDashboardPage); %>">Dashboard</a>
-					</div>
-				</div>
-			</div>
-		</div>	
-	</div>	
-<% 
-	}else{
-		defaultDashboardPage = currentUserNavigation.getNodes().get(0).getName();	
-%>
-	<div class="UIUserToolBarDashboardPortlet" id="$uicomponent.id" >	
-		<div class="UIHorizontalTabs">
-			<div class="TabsContainer" >
-				<div class="UITab NormalToolbarTab">
-						<div class="">
-								<a class="DashboardIcon TBIcon" href="<%= portalURI + defaultDashboardPage %>">Dashboard</a>
-						</div>
-						<% renderDashboards(); %>
-				</div>
-			</div>
-		</div>	
-	</div>		
+<%
+	import org.exoplatform.web.application.JavascriptManager;
+	import org.exoplatform.portal.webui.util.Util ;
+	import org.exoplatform.portal.mop.user.UserNode;
+	import java.util.Collection;
+	import javax.portlet.MimeResponse;
+	import javax.portlet.ResourceURL;
+	
+	def rcontext = _ctx.getRequestContext() ;
+	JavascriptManager jsmanager = rcontext.getJavascriptManager();
+	jsmanager.importJavascript('eXo.portal.UIPortalNavigation');
+	jsmanager.importJavascript('eXo.portal.UIAdminToolbar');
+	jsmanager.addCustomizedOnLoadScript('eXo.portal.UIAdminToolbar.onLoad("' + uicomponent.id + '");');
+
+	def portalURI = Util.getPortalRequestContext().getPortalURI();
+	void renderDashboards(Collection nodes) {
+		String clazz = "";
+		
+		print """
+			<div style="display:none" class="MenuItemContainer">
+				<div class="SubBlock">
+		""";
+					int idx = 0;
+					for(UserNode node : nodes) {
+						renderPageNode(node, idx++ % 2 == 0);
+					}
+		print """
+				</div>
+			</div>
+		""" ;
+	}
+	
+	void renderPageNode(UserNode node, boolean flag) {
+		UserNode selectedNode = uicomponent.getSelectedNode();
+		String tabStyleNavigation = "";
+		if(selectedNode != null && node.getURI() == selectedNode.getURI()) {
+				tabStyleNavigation = "SelectedItem";
+		}
+		
+		boolean hasChild = (node.getChildrenCount() > 0);
+		String clazz = "";
+		if(hasChild) clazz = "ArrowIcon";
+		String	href = Util.getPortalRequestContext().getPortalURI() + node.getURI();
+		String icon = node.getIcon();
+		if(icon == null) icon = "DefaultPageIcon";
+		def resolvedLabel = node.getLabel();
+		if ("Tab_Default".equals(node.getName()))
+		{
+				resolvedLabel = _ctx.appRes("UIUserToolBarDashboard.page." + node.getLabel());
+		}
+	
+		boolean toolong = (resolvedLabel.length() > 60);
+		String label = ( toolong ? resolvedLabel.substring(0, 57) + "..." : resolvedLabel);
+		String title = "";
+		if(toolong) title = "title='$resolvedLabel'";
+		else title = "";
+		
+		def getNodeURL = "";
+		if (hasChild) {
+			MimeResponse res = _ctx.getRequestContext().getResponse();
+			ResourceURL resourceURL = res.createResourceURL();
+			resourceURL.setResourceID(res.encodeURL(node.getURI()));	
+			getNodeURL = "exo:getNodeURL='" + resourceURL.toString() + "'";
+		}
+		
+		print """
+			<div class="MenuItem $tabStyleNavigation" $getNodeURL>
+				<div class="$clazz">
+		""";
+						if(node.pageRef != null) {
+								print """<a class="ItemIcon $icon" href="$href" $title>$label</a>""";
+						} else {
+								print """<a class="ItemIcon $icon" href="#" $title>$label</a>""";
+						}
+		print """
+				</div>
+		""" ;
+		if(hasChild) {
+			print """
+				<div class="MenuItemContainer">			
+					<div class="SubBlock">
+			""" ;
+					int idx = 0;
+					for(UserNode child : node.getChildren()) {
+						renderPageNode(child, idx++ % 2 == 0);
+					}
+			print """
+					</div>
+				</div>
+			""" ;
+			
+		}
+		print """
+			</div>
+		""" ;			
+	}	
+%>
+
+<%
+	def userNodes = uicomponent.getNavigationNodes(uicomponent.getCurrentUserNavigation());
+	String defaultDashboardPage;				
+	if(userNodes.size() < 1) {
+		defaultDashboardPage = org.exoplatform.toolbar.webui.component.UIUserToolBarDashboardPortlet.DEFAULT_TAB_NAME;
+%>
+	<div class="UIUserToolBarDashboardPortlet" id="$uicomponent.id">	
+		<div class="UIHorizontalTabs">
+			<div class="TabsContainer">
+				<div class="UITab NormalToolbarTab">
+					<div class="">
+						<a class="DashboardIcon TBIcon" href="<%= uicomponent.url("AddDefaultDashboard", defaultDashboardPage); %>">Dashboard</a>
+					</div>
+				</div>
+			</div>
+		</div>	
+	</div>	
+<% 
+	}else{
+		defaultDashboardPage =userNodes.iterator().next().getName();
+%>
+	<div class="UIUserToolBarDashboardPortlet" id="$uicomponent.id" >	
+		<div class="UIHorizontalTabs">
+			<div class="TabsContainer" >
+				<div class="UITab NormalToolbarTab">
+						<div class="">
+								<a class="DashboardIcon TBIcon" href="<%= portalURI + defaultDashboardPage %>">Dashboard</a>
+						</div>
+						<% renderDashboards(userNodes); %>
+				</div>
+			</div>
+		</div>	
+	</div>		
 <% } %>

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIUserToolBarGroupPortlet.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIUserToolBarGroupPortlet.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIUserToolBarGroupPortlet.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,10 +1,12 @@
 <%	
-	import org.exoplatform.portal.config.model.PageNavigation;
-	import org.exoplatform.portal.config.model.PageNode;
 	import org.exoplatform.web.application.JavascriptManager;
 	import org.exoplatform.portal.webui.util.Util ;
 	import org.exoplatform.webui.organization.OrganizationUtils;
 	import org.gatein.common.text.EntityEncoder;
+	import org.exoplatform.portal.mop.user.UserNode;
+	import org.exoplatform.portal.mop.user.UserNavigation;
+	import javax.portlet.MimeResponse;
+	import javax.portlet.ResourceURL;
 	
 	def rcontext = _ctx.getRequestContext() ;
 	JavascriptManager jsmanager = rcontext.getJavascriptManager();
@@ -14,34 +16,36 @@
 		
 	def groupNavigations = uicomponent.getGroupNavigations();
 	def portalURI = Util.getPortalRequestContext().getPortalURI();
-	void renderGroupPageNavigation(PageNavigation navigation) {
-			nodes = navigation.getNodes() ;
+	void renderGroupPageNavigation(UserNavigation navigation) {
+			def nodes = uicomponent.getNavigationNodes(navigation);
 			if(nodes.size() < 1) return ;
 			String navTitle = _ctx.appRes("UIPageNavigation.label.titleBar") ;
-			navTitle = navTitle.replace("{0}", OrganizationUtils.getGroupLabel(navigation.ownerId));
+			def ownerId = navigation.getKey().getName();
+			navTitle = navTitle.replace("{0}", OrganizationUtils.getGroupLabel(ownerId));
 			print """
-						<div class="TitleBar"><div style="width: 99%" title="$navigation.ownerId">$navTitle</div></div>
+						<div class="TitleBar portlet-menu-description"><div style="width: 99%" title="$ownerId">$navTitle</div></div>
 						<div class="SubBlock">
 							""" ;
-							for(int i = 0; i < nodes.size(); i++) {
-								renderPageNode(nodes.get(i), i%2 == 0 ) ;
+							int idx = 0;
+							for(UserNode node : nodes) {
+								renderPageNode(node, ownerId, idx++ % 2 == 0);
 							}
 							print """
 						</div>
 			""" ;		
 	}
 	
-	void renderPageNode(PageNode node, boolean flag) {
-		PageNode selectedNode = uicomponent.getSelectedPageNode();
+	void renderPageNode(UserNode node, String groupId, boolean flag) {
+		UserNode selectedNode = uicomponent.getSelectedNode();
 		String tabStyleNavigation = "";
-		if(selectedNode != null && node.getUri() == selectedNode.getUri()) {			 
-				tabStyleNavigation = "SelectedItem";
+		if(selectedNode != null && node.getURI() == selectedNode.getURI()) {
+		   tabStyleNavigation = "SelectedItem portlet-menu-item-selected";
 		}
 		
-		boolean hasChild = (node.getChildren() != null && node.getChildren().size() > 0);
+		boolean hasChild = node.getChildrenCount() > 0;
 		String clazz = "";
 		if(hasChild) clazz = "ArrowIcon";
-		String	href = Util.getPortalRequestContext().getPortalURI() + node.getUri();
+		String	href = Util.getPortalRequestContext().getPortalURI() + node.getURI();
 		String icon = node.getIcon();
 		if(icon == null) icon = "DefaultPageIcon";
 		boolean toolong = (node.resolvedLabel.length() > 60);
@@ -51,11 +55,20 @@
 		else title = "";
 		EntityEncoder entityEncoder = EntityEncoder.FULL;
 		label = entityEncoder.encode(label);
+		
+		def getNodeURL = "";
+		if (hasChild) {
+			MimeResponse res = _ctx.getRequestContext().getResponse();
+			ResourceURL resourceURL = res.createResourceURL();
+			resourceURL.setResourceID(res.encodeURL(groupId + "::" + node.getURI()));	
+			getNodeURL = "exo:getNodeURL='" + resourceURL.toString() + "'";
+		}
+		
 		print """
-			<div class="MenuItem $tabStyleNavigation">
+			<div class="MenuItem $tabStyleNavigation portlet-menu-cascade-item" $getNodeURL>
 				<div class="$clazz">
 		""";
-						if(node.pageReference != null) {
+						if(node.pageRef != null) {
 								print """<a class="ItemIcon $icon" href="$href" $title>$label</a>""";
 						} else {
 								print """<a class="ItemIcon $icon" href="#" $title>$label</a>""";
@@ -68,8 +81,9 @@
 				<div class="MenuItemContainer" style="position: absolute; display:none">			
 					<div class="SubBlock">
 			""" ;
-				for(int j = 0; j < node.getChildren().size(); j++) {
-					renderPageNode(node.getChildren().get(j), j%2 == 0);
+				int idx = 0;
+				for(UserNode child : node.getChildren()) {
+					renderPageNode(child, groupId, idx++ % 2 == 0);
 				}
 			print """
 					</div>
@@ -89,7 +103,9 @@
 				<div class="">
 							<a class="GroupIcon TBIcon" href="<%= portalURI + "groupnavigation" %>">Group</a>
 				</div>
-				<% if (!groupNavigations.isEmpty()) { %>
+				<% 
+					if (!groupNavigations.isEmpty()) {					   
+				%>
 				<div style="display:none" class="MenuItemContainer">
 				<% for(navigation in groupNavigations) {
 						renderGroupPageNavigation(navigation);
@@ -99,4 +115,4 @@
 			</div>
 		</div>
 	</div>	
-</div>
\ No newline at end of file
+</div>

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIUserToolBarSitePortlet.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIUserToolBarSitePortlet.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/admintoolbar/webui/component/UIUserToolBarSitePortlet.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,20 +1,24 @@
 <%	
-	import org.exoplatform.portal.config.model.PageNavigation;
-	import org.exoplatform.portal.config.model.PageNode;
 	import org.exoplatform.web.application.JavascriptManager;
 	import org.exoplatform.portal.webui.util.Util ;
 	import org.exoplatform.webui.organization.OrganizationUtils;
 	import org.gatein.common.text.EntityEncoder;
+	import org.exoplatform.portal.mop.user.UserNode;
+	import java.util.Collection;
+	import javax.portlet.MimeResponse;
+	import javax.portlet.ResourceURL;
+	import org.exoplatform.portal.mop.SiteKey;
 	
 	def rcontext = _ctx.getRequestContext() ;
 	JavascriptManager jsmanager = rcontext.getJavascriptManager();
 	jsmanager.importJavascript('eXo.portal.UIPortalNavigation') ;
 	jsmanager.importJavascript('eXo.portal.UIAdminToolbar') ;
 	jsmanager.addCustomizedOnLoadScript('eXo.portal.UIAdminToolbar.onLoad("' + uicomponent.id + '");');
-	
-	def portalURI = Util.getPortalRequestContext().getPortalURI();
+	def portalURI = Util.getPortalRequestContext().getPortalURI();	
+
 	void renderPortalNavigations() {
-			 
+	   		def currentPortal = uicomponent.getCurrentPortal()
+			def nodes = uicomponent.getNavigationNodes(uicomponent.getNavigation(SiteKey.portal(currentPortal)));
 			print """
 					<div style="position: absolute; display:none" class="MenuItemContainer">
 						<div class="SubBlock">
@@ -22,13 +26,10 @@
 			boolean isCurrent = false;
 			String clazz = "";
 			String href = "#";
-			
-			def navigation = uicomponent.getCurrentPortalNavigation();
-			def nodes = navigation.getNodes();
 				
 			for(int i = 0; i < uicomponent.getAllPortalNames().size(); i++) {
 				String portal = uicomponent.getAllPortalNames().get(i);
- 				if(portal.equals(uicomponent.getCurrentPortal())) {
+ 				if(portal.equals(currentPortal)) {
 					isCurrent = true;
 			 	} else isCurrent = false; 				 				
  				
@@ -45,7 +46,7 @@
 						</div>
 				""";
 						if(isCurrent) {
-							renderCurrentPortal();
+							renderCurrentPortal(nodes);
 						}
 				print """
 					</div>
@@ -56,16 +57,15 @@
 				</div>
 			""";
 	}
-	
-	void renderCurrentPortal() {
-		navigation = uicomponent.getCurrentPortalNavigation();
-		nodes = navigation.getNodes();
+
+	void renderCurrentPortal(Collection nodes) {	    
 		print """
 			<div style="position: absolute; display:none" class="MenuItemContainer">
 				<div class="SubBlock">
 		""";
-		for(int i = 0; i < nodes.size(); i++) {
-			renderPageNode(nodes.get(i), i%2 == 0);
+		int idx = 0;
+		for(UserNode node : nodes) {
+			renderPageNode(node, idx++ % 2 == 0);
 		}
 		print """
 				</div>
@@ -73,17 +73,17 @@
 		""";
 	}
 	
-	void renderPageNode(PageNode node, boolean flag) {
-		PageNode selectedNode = uicomponent.getSelectedPageNode();
+	void renderPageNode(UserNode node, boolean flag) {
+		UserNode selectedNode = uicomponent.getSelectedNode();
 		String tabStyleNavigation = "";
-		if(selectedNode != null && node.getUri() == selectedNode.getUri()) {			 
-				tabStyleNavigation = "SelectedItem";
+		if(selectedNode != null && node.getId() == selectedNode.getId()) {			 
+		   tabStyleNavigation = "SelectedItem portlet-menu-cascade-item-selected";
 		}
 		
-		boolean hasChild = (node.getChildren() != null && node.getChildren().size() > 0);
+		boolean hasChild = node.getChildrenCount() > 0;
 		String clazz = "";
 		if(hasChild) clazz = "ArrowIcon";
-		String	href = Util.getPortalRequestContext().getPortalURI() + node.getUri();
+		String	href = Util.getPortalRequestContext().getPortalURI() + node.getURI();
 		String icon = node.getIcon();
 		if(icon == null) icon = "DefaultPageIcon";
 		boolean toolong = (node.resolvedLabel.length() > 60);
@@ -93,11 +93,20 @@
 		else title = "";
         EntityEncoder entityEncoder = EntityEncoder.FULL;
 		label = entityEncoder.encode(label);
+		
+		def getNodeURL = "";
+		if (hasChild) {
+			MimeResponse res = _ctx.getRequestContext().getResponse();
+			ResourceURL resourceURL = res.createResourceURL();
+			resourceURL.setResourceID(res.encodeURL(node.getURI()));	
+			getNodeURL = "exo:getNodeURL='" + resourceURL.toString() + "'";
+		}
+		
 		print """
-			<div class="MenuItem $tabStyleNavigation">
+			<div class="MenuItem $tabStyleNavigation portlet-menu-cascade-item" $getNodeURL>
 				<div class="$clazz">
 		""";
-						if(node.pageReference != null) {
+						if(node.pageRef != null) {
 								print """<a class="ItemIcon $icon" href="$href" $title>$label</a>""";
 						} else {
 								print """<a class="ItemIcon $icon" href="#" $title>$label</a>""";
@@ -110,8 +119,9 @@
 				<div class="MenuItemContainer" style="position: absolute; display:none">			
 					<div class="SubBlock">
 			""" ;
-				for(int j = 0; j < node.getChildren().size(); j++) {
-					renderPageNode(node.getChildren().get(j), j%2 == 0);
+				int idx = 0;
+				for(UserNode child : node.getChildren()) {
+					renderPageNode(child, idx++ % 2 == 0);
 				}
 			print """
 					</div>
@@ -122,7 +132,7 @@
 		print """
 			</div>
 		""" ;			
-	}	
+	}
 %> 
 
 <div class="UIUserToolBarSitePortlet" id="$uicomponent.id" >
@@ -138,4 +148,4 @@
 				</div>
 			</div>
 	</div>		
-</div>	
\ No newline at end of file
+</div>	

Deleted: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/navigation/webui/component/NewUIGroupManagement.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/navigation/webui/component/NewUIGroupManagement.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/navigation/webui/component/NewUIGroupManagement.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,107 +0,0 @@
-
-
-<div class="UIGroupManagement UIManagement">
-	<div class="UIManagementBlock GroupManagement">
-		<div class="Image FloatLeft"><img src="/exoadmin/skin/navigation/webui/component/background/GroupImage.gif"></div>
-		<div class="Label FloatLeft">Administrator</div>
-		<div class="EditLayoutBox FloatLeft"><a href="#" class="EditLayout">Edit Layout</a></div>
-		<div class="EditIcoBox FloatLeft"><a href="#" class="EditIco">Edit Navigation</a></div>
-		<div class="DeleteIcoBox FloatLeft"><a href="#" class="DeleteIco">Delete</a></div>
-		<div class="ClearLeft"><span></span></div>
-	</div>
-	<div class="UIManagementBlock GroupManagement">
-		<div class="Image FloatLeft"><img src="/exoadmin/skin/navigation/webui/component/background/GroupImage.gif"></div>
-		<div class="Label FloatLeft">Administrator</div>
-		<div class="EditLayoutBox FloatLeft"><a href="#" class="EditLayout">Edit Layout</a></div>
-		<div class="EditIcoBox FloatLeft"><a href="#" class="EditIco">Edit Navigation</a></div>
-		<div class="DeleteIcoBox FloatLeft"><a href="#" class="DeleteIco">Delete</a></div>
-		<div class="ClearLeft"><span></span></div>
-	</div>
-	<div class="UIManagementBlock GroupManagement">
-		<div class="Image FloatLeft"><img src="/exoadmin/skin/navigation/webui/component/background/GroupImage.gif"></div>
-		<div class="Label FloatLeft">Administrator</div>
-		<div class="EditLayoutBox FloatLeft"><a href="#" class="EditLayout">Edit Layout</a></div>
-		<div class="EditIcoBox FloatLeft"><a href="#" class="EditIco">Edit Navigation</a></div>
-		<div class="DeleteIcoBox FloatLeft"><a href="#" class="DeleteIco">Delete</a></div>
-		<div class="ClearLeft"><span></span></div>
-	</div>
-
-	<div class="UIAction ManagerButton"> 
-    <table class="ActionContainer">
-	    <tr>
-	    	<td>
-		      <div class="ActionButton AddBtn">
-		        <div class="ButtonLeft">
-		          <div class="ButtonRight">
-		            <div class="ButtonMiddle">
-		              <a href="#">Add Site</a>
-		            </div>
-		          </div>
-		        </div>
-		      </div>
-					<div class="ActionButton CancelBtn">
-		        <div class="ButtonLeft">
-		          <div class="ButtonRight">
-		            <div class="ButtonMiddle">
-		              <a href="#">Cancel</a>
-		            </div>
-		          </div>
-		        </div>
-		      </div>
-		    </td>
-      </tr>
- 	  </table>
-	</div>
-	
-</div>
-
-
-<!-- <div class="NewUIGroupManagement" id="<%=uicomponent.getId();%>">
-	<% 
-	import org.exoplatform.portal.config.model.PageNavigation;
-	navigations = uicomponent.getNavigations();
-	%>
-    
-	<%/*Begin ItemDetailList:*/%>
-      <div style="margin:0px 0px 0px 0px">								      								        								        
-        <div class="ItemDetailContainer" style="border:1px solid #C7C7C7">
-         <% for(navigation in navigations) { 
-		deleteLink = uicomponent.event("DeleteNavigation",String.valueOf(navigation.getId()));
-		editLink = uicomponent.event("EditNavigation",String.valueOf(navigation.getId()));%>
-          <div class="ItemDetail" style="width:100%;border-bottom:1px solid #E9E7E7;height:20px;padding-top:5px">
-	       <div style="float:left;width:70%;padding-left:10px">
-	       	<%= navigation.getOwnerId() %> 
-	       </div>	
-	       <div style="float:right;width:29%">
-	       	<a href="<%=editLink%>">Edit Navigation</a> | <a href="<%=deleteLink%>">Delete Navigation</a>
-		   </div>	
-		   <div style="clear:both"></div>
-          </div>
-        <% } %>	
-       	  	
-        </div>								
-      </div>  
-      <%/*End ItemDetailList*/%>   
-	<div class="UIAction"> 
-    <table class="ActionContainer">
-	    <tr>
-	    	<td>
-		      <div onclick="<%=uicomponent.event("AddNewPortal")%>" class="ActionButton LightBlueStyle">
-		        <div class="ButtonLeft">
-		          <div class="ButtonRight">
-		            <div class="ButtonMiddle">
-		              <a href="javascript:void(0);"><%=_ctx.appRes(uicomponent.getId() + ".action.addNewPortal")%></a>
-		            </div>
-		          </div>
-		        </div>
-		      </div>
-		    </td>
-      </tr>
- 	  </table>
-	</div>
-	%uicomponent.renderChildren();%>			    
-</div>
-
--->
-
-

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/navigation/webui/component/UINavigationGrid.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/navigation/webui/component/UINavigationGrid.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/navigation/webui/component/UINavigationGrid.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,25 +1,27 @@
 <%	
 	import java.util.List;
-	import org.exoplatform.portal.config.model.PageNavigation;
 	import org.exoplatform.webui.organization.OrganizationUtils;
+	import org.exoplatform.portal.mop.SiteKey;
 	
 	def parent = uicomponent.getParent();
-	def navigations = (List<PageNavigation>) uicomponent.getBeans();
+	def navigations = uicomponent.getBeans();
 %>
 
 <div id="$uicomponent.id" class="FeedBox">
 	<% 
 	boolean isEvenRow = true;
-	for(navigation in navigations) {			
-			deleteLink = parent.event("DeleteNavigation",String.valueOf(navigation.getId()));
-			editProperties = parent.event("EditProperties",String.valueOf(navigation.getId()));
-			editLink = parent.event("EditNavigation",String.valueOf(navigation.getId()));%>
+	SiteKey siteKey;
+	for(navigation in navigations) {
+			siteKey = navigation.getKey();
+			deleteLink = parent.event("DeleteNavigation",String.valueOf(siteKey.getName()));
+			editProperties = parent.event("EditProperties",String.valueOf(siteKey.getName()));
+			editLink = parent.event("EditNavigation",String.valueOf(siteKey.getName()));%>
   <table class="ManagementBlock <%=isEvenRow ? "EvenRow":"OddRow"%>" style="table-layout: fixed">
 	  <tr>
 		  <td class="Image"><img src="/exoadmin/skin/navigation/webui/component/background/GroupImage.png" alt="" /></td>
    		<td class="Content">
-   			<div class="Label" title="$navigation.ownerId"><%= OrganizationUtils.getGroupLabel(navigation.ownerId) %></div>
-   			<div><%=_ctx.appRes("UIGroupNavigationManagement.Label.Description")%>: <%= OrganizationUtils.getGroupDescription(navigation.ownerId) %></div>
+   			<div class="Label" title="$siteKey.name"><%= OrganizationUtils.getGroupLabel(siteKey.getName()) %></div>
+   			<div><%=_ctx.appRes("UIGroupNavigationManagement.Label.Description")%>: <%= OrganizationUtils.getGroupDescription(siteKey.getName()) %></div>
    		</td>	
      	<td class="ActionBlock">
      		<a href="<%=editLink%>" class="EditNavIcon"><%=_ctx.appRes("UIGroupNavigationManagement.Label.EditNavigation")%></a> 

Copied: epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/navigation/webui/component/UINavigationManagement.gtmpl (from rev 6783, portal/trunk/portlet/exoadmin/src/main/webapp/groovy/navigation/webui/component/UINavigationManagement.gtmpl)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/navigation/webui/component/UINavigationManagement.gtmpl	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/exoadmin/src/main/webapp/groovy/navigation/webui/component/UINavigationManagement.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,56 @@
+<%  
+  import org.exoplatform.portal.webui.page.UIPageBrowser;
+  import org.exoplatform.navigation.webui.component.UINavigationNodeSelector;
+%>
+<div class="UINavigationManagement" id="$uicomponent.id">
+	<div class="TopTitleBar">
+	  <div class="DecoratorBox">
+	    <div class="BarDecorator">
+	      <div class="TopLeftBar">
+	          <div class="TopCenterBar"><span></span></div>
+	      </div>
+	      <div class="MiddleLeftBar">
+	          <div class="MiddleCenterBar" style="background-image: none;">
+	          	<%= uicomponent.getOwner();%>
+	          </div>
+	      </div>
+	      <div class="BottomLeftBar">
+	          <div class="BottomCenterBar"><span></span></div>
+	      </div>
+	    </div>
+	  </div>
+	</div>	
+  <%
+  	uicomponent.renderChild(UINavigationNodeSelector.class);
+  %>
+  <div class="UIAction"> 
+    <table class="ActionContainer">
+	    <tr>
+
+	    	<td>
+		      <div onclick="<%=uicomponent.event("AddRootNode")%>" class="ActionButton LightBlueStyle">
+		        <div class="ButtonLeft">
+		          <div class="ButtonRight">
+		            <div class="ButtonMiddle">
+		              <a href="javascript:void(0);"><%=_ctx.appRes(uicomponent.getId() + ".action.addNode")%></a>
+		            </div>
+		          </div>
+		        </div>
+		      </div>
+		    </td>
+	    	<td>
+		      <div onclick="<%=uicomponent.event("Save")%>" class="ActionButton LightBlueStyle">
+		        <div class="ButtonLeft">
+		          <div class="ButtonRight">
+		            <div class="ButtonMiddle">
+		              <a href="javascript:void(0);"><%=_ctx.appRes(uicomponent.getId() + ".action.Save")%></a>
+		            </div>
+		          </div>
+		        </div>
+		      </div>
+		    </td>
+
+      </tr>
+ 	  </table>
+	</div>
+</div>

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UIBreadcumbsPortlet.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UIBreadcumbsPortlet.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UIBreadcumbsPortlet.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,7 +19,7 @@
 
 package org.exoplatform.portal.webui.component;
 
-import org.exoplatform.portal.config.model.PageNode;
+import org.exoplatform.portal.mop.user.UserNode;
 import org.exoplatform.portal.webui.portal.PageNodeEvent;
 import org.exoplatform.portal.webui.portal.UIPortal;
 import org.exoplatform.portal.webui.util.Util;
@@ -28,14 +28,14 @@
 import org.exoplatform.webui.config.annotation.ComponentConfig;
 import org.exoplatform.webui.config.annotation.EventConfig;
 import org.exoplatform.webui.core.UIBreadcumbs;
+import org.exoplatform.webui.core.UIBreadcumbs.LocalPath;
 import org.exoplatform.webui.core.UIPortletApplication;
-import org.exoplatform.webui.core.UIBreadcumbs.LocalPath;
-import org.exoplatform.webui.core.UIBreadcumbs.SelectPathActionListener;
 import org.exoplatform.webui.core.lifecycle.UIApplicationLifecycle;
 import org.exoplatform.webui.event.Event;
 import org.exoplatform.webui.event.EventListener;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import javax.portlet.PortletPreferences;
@@ -62,23 +62,27 @@
       uiBreadCumbs.setTemplate(template);
    }
 
-   public void loadSelectedPath()
+   private void loadSelectedPath() throws Exception
    {
-      List<PageNode> nodes = Util.getUIPortal().getSelectedPath();
+      UserNode node = Util.getUIPortal().getSelectedUserNode();
       List<LocalPath> paths = new ArrayList<LocalPath>();
-      for (PageNode node : nodes)
+      
+      do
       {
-         if (node == null)
-            continue;
-         if (node.getPageReference() == null)
+         if (node.getPageRef() == null)
          {
             paths.add(new LocalPath(null, node.getResolvedLabel()));
          }
          else
          {
-            paths.add(new LocalPath(node.getUri(), node.getResolvedLabel()));
+            paths.add(new LocalPath(node.getURI(), node.getResolvedLabel()));
          }
+         node = node.getParent();
       }
+      while (node != null && node.getParent() != null);
+      
+      Collections.reverse(paths);
+      
       UIBreadcumbs uiBreadCumbs = getChild(UIBreadcumbs.class);
       uiBreadCumbs.setPath(paths);
    }   

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UILogoPortlet.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UILogoPortlet.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UILogoPortlet.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,8 +19,9 @@
 
 package org.exoplatform.portal.webui.component;
 
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.SiteType;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
 import org.exoplatform.portal.webui.util.Util;
 import org.exoplatform.services.organization.User;
 import org.exoplatform.services.security.ConversationState;
@@ -54,12 +55,13 @@
 
    public String getNavigationTitle() throws Exception
    {
-      PageNavigation navigation = Util.getUIPortal().getSelectedNavigation();
-      if (navigation.getOwnerType().equals(PortalConfig.GROUP_TYPE))
+      UserNode navPath = Util.getUIPortal().getNavPath();
+      UserNavigation nav = navPath.getNavigation();
+      if (nav.getKey().getType().equals(SiteType.GROUP))
       {
-         return OrganizationUtils.getGroupLabel(navigation.getOwnerId());
+         return OrganizationUtils.getGroupLabel(nav.getKey().getName());
       }
-      else if (navigation.getOwnerType().equals(PortalConfig.USER_TYPE))
+      else if (nav.getKey().getType().equals(SiteType.USER))
       {
          ConversationState state = ConversationState.getCurrent();
          User user = (User)state.getAttribute(CacheUserProfileFilter.USER_PROFILE);

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UINavigationPortlet.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UINavigationPortlet.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UINavigationPortlet.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,7 +19,20 @@
 
 package org.exoplatform.portal.webui.component;
 
+import java.util.Collection;
+
+import javax.portlet.MimeResponse;
+import javax.portlet.PortletPreferences;
+import javax.portlet.PortletRequest;
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceURL;
+
+import org.exoplatform.portal.mop.navigation.GenericScope;
+import org.exoplatform.portal.mop.navigation.Scope;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.portal.webui.navigation.UIPortalNavigation;
+import org.exoplatform.portal.webui.util.Util;
 import org.exoplatform.webui.application.WebuiRequestContext;
 import org.exoplatform.webui.application.portlet.PortletRequestContext;
 import org.exoplatform.webui.config.annotation.ComponentConfig;
@@ -27,15 +40,16 @@
 import org.exoplatform.webui.config.annotation.EventConfig;
 import org.exoplatform.webui.core.UIPortletApplication;
 import org.exoplatform.webui.core.lifecycle.UIApplicationLifecycle;
+import org.json.JSONArray;
+import org.json.JSONObject;
 
-import javax.portlet.PortletPreferences;
-import javax.portlet.PortletRequest;
-
 @ComponentConfigs({
    @ComponentConfig(lifecycle = UIApplicationLifecycle.class),
    @ComponentConfig(type = UIPortalNavigation.class, id = "UIHorizontalNavigation", events = @EventConfig(listeners = UIPortalNavigation.SelectNodeActionListener.class))})
 public class UINavigationPortlet extends UIPortletApplication
 {
+   public static final int DEFAULT_LEVEL = 2;
+   
    public UINavigationPortlet() throws Exception
    {
       PortletRequestContext context = (PortletRequestContext)WebuiRequestContext.getCurrentInstance();
@@ -44,10 +58,122 @@
       String template = prefers.getValue("template", "app:/groovy/portal/webui/component/UIPortalNavigation.gtmpl");
 
       UIPortalNavigation portalNavigation = addChild(UIPortalNavigation.class, "UIHorizontalNavigation", null);
-      portalNavigation.setUseAjax(Boolean.valueOf(prefers.getValue("useAJAX", "true")));
+      portalNavigation.setUseAjax(isUseAjax());
       portalNavigation.setShowUserNavigation(Boolean.valueOf(prefers.getValue("showUserNavigation", "true")));
       portalNavigation.setTemplate(template);
 
       portalNavigation.setCssClassName(prefers.getValue("CSSClassName", ""));
+      
+      int level = DEFAULT_LEVEL; 
+      try 
+      {
+         level = Integer.valueOf(prefers.getValue("level", String.valueOf(DEFAULT_LEVEL)));       
+      }
+      catch (Exception ex) 
+      {
+         log.warn("Preference for navigation level can only be integer");
+      }
+
+      if (level <= 0)
+      {
+         portalNavigation.setScope(Scope.ALL);                     
+      }
+      else
+      {
+         portalNavigation.setScope(new GenericScope(level));
+      }
    }
+
+   @Override
+   public void serveResource(WebuiRequestContext context) throws Exception
+   {
+      super.serveResource(context);
+      
+      ResourceRequest req = context.getRequest();
+      String nodeURI = req.getResourceID();
+            
+      JSONArray jsChilds = getChildrenAsJSON(nodeURI);
+      if (jsChilds == null)
+      {
+         return;
+      }
+      
+      MimeResponse res = context.getResponse(); 
+      res.setContentType("text/json");
+      res.getWriter().write(jsChilds.toString());
+   }      
+   
+
+   public JSONArray getChildrenAsJSON(String nodeURI) throws Exception
+   {
+      WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();          
+      UIPortalNavigation uiPortalNavigation = getChild(UIPortalNavigation.class);
+      
+      Collection<UserNode> childs = null;      
+      UserNode userNode = uiPortalNavigation.resolvePath(nodeURI);
+      if (userNode != null)
+      {
+         childs = userNode.getChildren();
+      }
+      
+      JSONArray jsChilds = new JSONArray();
+      if (childs == null)
+      {
+         return null;
+      }                  
+      MimeResponse res = context.getResponse();
+      for (UserNode child : childs)
+      {
+         jsChilds.put(toJSON(child, res));
+      }
+      return jsChilds;
+   }
+
+   private JSONObject toJSON(UserNode node, MimeResponse res) throws Exception
+   {
+      JSONObject json = new JSONObject();
+      String nodeId = node.getId();
+      
+      json.put("label", node.getEncodedResolvedLabel());      
+      json.put("hasChild", node.getChildrenCount() > 0);            
+      
+      UserNode selectedNode = Util.getUIPortal().getNavPath();
+      json.put("isSelected", nodeId.equals(selectedNode.getId()));
+      json.put("icon", node.getIcon());      
+      
+      ResourceURL rsURL = res.createResourceURL();
+      rsURL.setResourceID(res.encodeURL(node.getURI()));
+      json.put("getNodeURL", rsURL.toString());            
+      
+      String actionLink;
+      if (node.getPageRef() == null)
+      {
+         actionLink = null;
+      } 
+      else if (isUseAjax())
+      {
+         actionLink = event("SelectNode", nodeId);
+      } 
+      else
+      {
+         actionLink = Util.getPortalRequestContext().getPortalURI() + node.getURI();
+      }
+      json.put("actionLink", actionLink);
+      
+      JSONArray childs = new JSONArray();
+      for (UserNode child : node.getChildren())
+      {
+         childs.put(toJSON(child, res));
+      }      
+      json.put("childs", childs);
+      return json;
+   }
+   
+   public boolean isUseAjax()
+   {
+      PortletRequestContext context = (PortletRequestContext)WebuiRequestContext.getCurrentInstance();
+      PortletRequest prequest = context.getRequest();
+      PortletPreferences prefers = prequest.getPreferences();
+      return Boolean.valueOf(prefers.getValue("useAJAX", "true"));
+   }
 }
\ No newline at end of file

Deleted: epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UIPortalNavigationPortlet.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UIPortalNavigationPortlet.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UIPortalNavigationPortlet.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,50 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- * 
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.webui.component;
-
-import org.exoplatform.portal.webui.navigation.UIPortalNavigation2;
-import org.exoplatform.webui.application.WebuiRequestContext;
-import org.exoplatform.webui.application.portlet.PortletRequestContext;
-import org.exoplatform.webui.config.annotation.ComponentConfig;
-import org.exoplatform.webui.config.annotation.ComponentConfigs;
-import org.exoplatform.webui.config.annotation.EventConfig;
-import org.exoplatform.webui.core.UIPortletApplication;
-import org.exoplatform.webui.core.lifecycle.UIApplicationLifecycle;
-
-import javax.portlet.PortletPreferences;
-import javax.portlet.PortletRequest;
-
- at ComponentConfigs({
-   @ComponentConfig(lifecycle = UIApplicationLifecycle.class),
-   @ComponentConfig(type = UIPortalNavigation2.class, id = "UIHorizontalNavigation", events = @EventConfig(listeners = UIPortalNavigation2.SelectNodeActionListener.class))})
-public class UIPortalNavigationPortlet extends UIPortletApplication
-{
-   public UIPortalNavigationPortlet() throws Exception
-   {
-      PortletRequestContext context = (PortletRequestContext)WebuiRequestContext.getCurrentInstance();
-      PortletRequest prequest = context.getRequest();
-      PortletPreferences prefers = prequest.getPreferences();
-      String template = prefers.getValue("template", "app:/groovy/portal/webui/component/UIPortalNavigation2.gtmpl");
-
-      UIPortalNavigation2 portalNavigation = addChild(UIPortalNavigation2.class, "UIHorizontalNavigation", null);
-      portalNavigation.setUseAjax(Boolean.valueOf(prefers.getValue("useAJAX", "true")));
-      portalNavigation.setTemplate(template);
-   }
-}
\ No newline at end of file

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UISitemapPortlet.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UISitemapPortlet.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/java/org/exoplatform/portal/webui/component/UISitemapPortlet.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,7 +19,20 @@
 
 package org.exoplatform.portal.webui.component;
 
+import java.util.List;
+
+import javax.portlet.MimeResponse;
+import javax.portlet.PortletPreferences;
+import javax.portlet.PortletRequest;
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceURL;
+
+import org.exoplatform.portal.mop.navigation.GenericScope;
+import org.exoplatform.portal.mop.navigation.Scope;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.webui.navigation.TreeNode;
 import org.exoplatform.portal.webui.navigation.UIPortalNavigation;
+import org.exoplatform.portal.webui.util.Util;
 import org.exoplatform.webui.application.WebuiRequestContext;
 import org.exoplatform.webui.application.portlet.PortletRequestContext;
 import org.exoplatform.webui.config.annotation.ComponentConfig;
@@ -27,10 +40,9 @@
 import org.exoplatform.webui.config.annotation.EventConfig;
 import org.exoplatform.webui.core.UIPortletApplication;
 import org.exoplatform.webui.core.lifecycle.UIApplicationLifecycle;
+import org.json.JSONArray;
+import org.json.JSONObject;
 
-import javax.portlet.PortletPreferences;
-import javax.portlet.PortletRequest;
-
 /**
  * Created by The eXo Platform SARL
  * Author : Dang Van Minh
@@ -38,16 +50,18 @@
  * Jul 3, 2006  
  */
 @ComponentConfigs({
-   @ComponentConfig(lifecycle = UIApplicationLifecycle.class, template = "system:/groovy/webui/core/UISitemap2.gtmpl"),
+   @ComponentConfig(lifecycle = UIApplicationLifecycle.class, template = "system:/groovy/webui/core/UISitemap.gtmpl"),
    @ComponentConfig(type = UIPortalNavigation.class, id = "UISiteMap", events = {
       @EventConfig(listeners = UIPortalNavigation.SelectNodeActionListener.class),
-      @EventConfig(listeners = UIPortalNavigation.ExpandAllNodeActionListener.class),
+//      @EventConfig(listeners = UIPortalNavigation.ExpandAllNodeActionListener.class),
       @EventConfig(listeners = UIPortalNavigation.CollapseAllNodeActionListener.class),
-      @EventConfig(listeners = UIPortalNavigation.CollapseNodeActionListener.class),
-      @EventConfig(listeners = UIPortalNavigation.ExpandNodeActionListener.class)})})
+      @EventConfig(listeners = UIPortalNavigation.CollapseNodeActionListener.class)})})
+//      @EventConfig(listeners = UIPortalNavigation.ExpandNodeActionListener.class)
 public class UISitemapPortlet extends UIPortletApplication
 {
 
+   public static final int DEFAULT_LEVEL = 2;
+   
    public UISitemapPortlet() throws Exception
    {
 
@@ -57,10 +71,119 @@
       String template = prefers.getValue("template", "system:/groovy/webui/core/UISitemapTree.gtmpl");
 
       UIPortalNavigation uiPortalNavigation = addChild(UIPortalNavigation.class, "UISiteMap", null);
-      uiPortalNavigation.loadTreeNodes();
       uiPortalNavigation.setTemplate(template);
+      uiPortalNavigation.setUseAjax(isUseAjax());
+      
+      int level = DEFAULT_LEVEL; 
+      try 
+      {
+         level = Integer.valueOf(prefers.getValue("level", String.valueOf(DEFAULT_LEVEL)));       
+      }
+      catch (Exception ex) 
+      {
+         log.warn("Preference for navigation level can only be integer");
+      }
+      
+      if (level <= 0)
+      {
+         uiPortalNavigation.setScope(Scope.ALL);                     
+      }
+      else
+      {
+         uiPortalNavigation.setScope(new GenericScope(level));
+      }
    }
 
+   @Override
+   public void serveResource(WebuiRequestContext context) throws Exception
+   {
+      super.serveResource(context);
+      
+      ResourceRequest req = context.getRequest();
+      String nodeID = req.getResourceID();
+            
+      JSONArray jsChilds = getChildrenAsJSON(nodeID);
+      if (jsChilds == null)
+      {
+         return;
+      }
+      
+      MimeResponse res = context.getResponse(); 
+      res.setContentType("text/json");
+      res.getWriter().write(jsChilds.toString());
+   }
+
+   private JSONArray getChildrenAsJSON(String nodeID) throws Exception
+   {            
+      WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();   
+      List<TreeNode> childs = null;
+      
+      UIPortalNavigation uiPortalNavigation = getChild(UIPortalNavigation.class);
+      TreeNode tnode = uiPortalNavigation.getTreeNodes().findNodes(nodeID);              
+      if (tnode != null) 
+      {
+         UserNode userNode = uiPortalNavigation.updateNode(tnode.getNode());
+         if (userNode != null)
+         {
+            tnode.setExpanded(true);     
+            tnode.setChildren(userNode.getChildren());          
+            childs = tnode.getChildren();
+         }
+      }
+      
+      JSONArray jsChilds = new JSONArray();
+      if (childs == null)
+      {
+         return null;
+      }                  
+      MimeResponse res = context.getResponse();
+      for (TreeNode child : childs)
+      {
+         jsChilds.put(toJSON(child, res));
+      }
+      return jsChilds;
+   }
+
+   private JSONObject toJSON(TreeNode tnode, MimeResponse res) throws Exception
+   {
+      UIPortalNavigation uiPortalNavigation = getChild(UIPortalNavigation.class);
+      JSONObject json = new JSONObject();
+      UserNode node = tnode.getNode();
+      String nodeId = node.getId();
+      
+      json.put("label", node.getEncodedResolvedLabel());      
+      json.put("hasChild", tnode.hasChild());            
+      json.put("isExpanded", tnode.isExpanded());
+      json.put("collapseURL", uiPortalNavigation.url("CollapseNode", nodeId));  
+      
+      ResourceURL rsURL = res.createResourceURL();
+      rsURL.setResourceID(nodeId);
+      json.put("getNodeURL", rsURL.toString());            
+      
+      String actionLink;
+      if (node.getPageRef() == null)
+      {
+         actionLink = null;
+      } 
+      else if (isUseAjax())
+      {
+         actionLink = uiPortalNavigation.event("SelectNode", nodeId);
+      } 
+      else
+      {
+         actionLink = Util.getPortalRequestContext().getPortalURI() + node.getURI();
+      }
+      json.put("actionLink", actionLink);
+      
+      JSONArray childs = new JSONArray();
+      for (TreeNode child : tnode.getChildren())
+      {
+         childs.put(toJSON(child, res));
+      }      
+      json.put("childs", childs);
+      return json;
+   }   
+   
    public boolean isUseAjax()
    {
       PortletRequestContext context = (PortletRequestContext)WebuiRequestContext.getCurrentInstance();

Deleted: epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/WEB-INF/conf/portlet/web/PortalNavigationPortlet/webui/configuration.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/WEB-INF/conf/portlet/web/PortalNavigationPortlet/webui/configuration.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/WEB-INF/conf/portlet/web/PortalNavigationPortlet/webui/configuration.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,29 +0,0 @@
-<!--
-
-    Copyright (C) 2009 eXo Platform SAS.
-    
-    This is free software; you can redistribute it and/or modify it
-    under the terms of the GNU Lesser General Public License as
-    published by the Free Software Foundation; either version 2.1 of
-    the License, or (at your option) any later version.
-    
-    This software is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-    Lesser General Public License for more details.
-    
-    You should have received a copy of the GNU Lesser General Public
-    License along with this software; if not, write to the Free
-    Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-    02110-1301 USA, or see the FSF site: http://www.fsf.org.
-
--->
-
-<webui-configuration>  
-  <application>     
-    <ui-component-root>org.exoplatform.portal.webui.component.UIPortalNavigationPortlet</ui-component-root>    
-    <state-manager>org.exoplatform.webui.application.portlet.ParentAppStateManager</state-manager>
-    <application-lifecycle-listeners>       
-    </application-lifecycle-listeners>
-  </application>   
-</webui-configuration>

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/WEB-INF/gatein-resources.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/WEB-INF/gatein-resources.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/WEB-INF/gatein-resources.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -80,5 +80,12 @@
 		<skin-name>Default</skin-name>
 		<css-path>/skin/portal/webui/component/UIIFramePortlet/DefaultStylesheet.css</css-path>
 	</portlet-skin>
+	
+	<javascript>
+		<param>
+			<js-module>eXo.webui.UISiteMap</js-module>
+			<js-path>/javascript/eXo/webui/UISiteMap.js</js-path>
+		</param>
+	</javascript>
 </gatein-resources>
 

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/WEB-INF/portlet.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/WEB-INF/portlet.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/WEB-INF/portlet.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -197,6 +197,10 @@
         <value>false</value>
         <read-only>false</read-only>
       </preference>
+      <preference>
+        <name>level</name>
+        <value>2</value>
+      </preference>
     </portlet-preferences>
   </portlet>
   
@@ -235,7 +239,11 @@
 	        <name>template</name>
 	        <value>system:/groovy/webui/core/UISitemapTree.gtmpl</value>
 	        <read-only>false</read-only>
-      </preference>
+        </preference>
+        <preference>
+          <name>level</name>
+          <value>2</value>
+        </preference>
     </portlet-preferences>
   </portlet>
 

Modified: epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/groovy/portal/webui/component/UIPortalNavigation.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/groovy/portal/webui/component/UIPortalNavigation.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/groovy/portal/webui/component/UIPortalNavigation.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,9 +1,10 @@
 <% 
-	import org.exoplatform.portal.config.model.PageNode;
-	import org.exoplatform.portal.config.model.PageNavigation;
+  	import org.exoplatform.portal.mop.user.UserNode;
 	import org.exoplatform.web.application.JavascriptManager;
 	import org.exoplatform.portal.webui.util.Util;
 	import org.gatein.common.text.EntityEncoder;
+	import javax.portlet.MimeResponse;
+	import javax.portlet.ResourceURL;
 	
 	def rcontext = _ctx.getRequestContext();
 	JavascriptManager jsmanager = rcontext.getJavascriptManager();
@@ -12,55 +13,58 @@
 	jsmanager.addOnLoadJavascript('eXo.portal.UIPortalNavigation.onLoad');
 	
 	jsmanager.addOnLoadJavascript('eXo.portal.UIPortalNavigation.loadScroll');
-	//jsmanager.addOnResizeJavascript('eXo.portal.UIPortalNavigation.initScroll');
+	//jsmanager.addOnResizeJavascript('eXo.portal.UIPortalNavigation.initScroll');	
 
-	navigations = uicomponent.getNavigations();
-
-	public void renderChildrenContainer(PageNavigation nav, PageNode node) {
-		print """
-			<div class="MenuItemContainer" style="display: none;">
-				<div class="MenuItemDecorator">
-					<div class="LeftTopMenuDecorator">
-						<div class="RightTopMenuDecorator">
-							<div class="CenterTopMenuDecorator"><span></span></div>
-						</div>
-					</div>					
-					<div class="LeftMiddleMenuDecorator">
-						<div class="RightMiddleMenuDecorator">
-							<div class="CenterMiddleMenuDecorator">
-		""";
-								for(child in node.getChildren()) {
-							 		renderChildNode(nav, child);
-								}
-		print """
-							</div>
-						</div>
-					</div>
-					<div class="LeftBottomMenuDecorator">
-						<div class="RightBottomMenuDecorator">
-							<div class="CenterBottomMenuDecorator"><span></span></div>
-						</div>
-					</div>					
-				</div>
-			</div>
-		""";
-	}	
-	public void renderChildNode(PageNavigation nav, PageNode node) {
-		PageNode selectedNode = uicomponent.getSelectedPageNode();
-		PageNavigation selectedNav = uicomponent.getSelectedNavigation();
+	public void renderChildrenContainer(UserNode node) {
+	   print """
+	   <div class="MenuItemContainer" style="display: none;">
+          <div class="MenuItemDecorator">
+                  <div class="LeftTopMenuDecorator">
+                          <div class="RightTopMenuDecorator">
+                                  <div class="CenterTopMenuDecorator"><span></span></div>
+                          </div>
+                  </div>                                  
+                  <div class="LeftMiddleMenuDecorator">
+                          <div class="RightMiddleMenuDecorator">
+                                  <div class="CenterMiddleMenuDecorator">
+        """;
+                                    for(child in node.getChildren()) {
+                                            renderChildNode(child);
+                                    }
+        print """
+                                   </div>
+                           </div>
+                   </div>
+                   <div class="LeftBottomMenuDecorator">
+                           <div class="RightBottomMenuDecorator">
+                                   <div class="CenterBottomMenuDecorator"><span></span></div>
+                           </div>
+                   </div>                                  
+           </div>
+        </div>
+        """;
+	}  
+	
+	public void renderChildNode(UserNode node) {
+		UserNode selectedNode = uicomponent.getSelectedNode();
 		String tabStyleNavigation = "NormalItem"; // OverItem
-		if(selectedNode != null &&	selectedNav != null &&
-			 selectedNav.getId () == nav.getId() &&
-			 node.getUri() == selectedNode.getUri()) {			 
+		if(selectedNode != null && node.getId() == selectedNode.getId()) {			 
 				tabStyleNavigation = "SelectedItem";
-		}
+		}				
 		
 		String icon = node.getIcon();
 		if(icon == null) icon = "DefaultPageIcon";
 		String arrowIcon = "";
-		if (node.getChildren() != null && node.getChildren().size() > 0) arrowIcon = "ArrowIcon";
+		String getNodeURL = "";
+		if (node.getChildrenCount() > 0) {
+		   arrowIcon = "ArrowIcon";
+		   MimeResponse res = _ctx.getRequestContext().getResponse();
+		   ResourceURL resourceURL = res.createResourceURL();
+		   resourceURL.setResourceID(res.encodeURL(node.getURI()));
+		   getNodeURL = "exo:getNodeURL='" + resourceURL.toString() + "'";
+		}
 
-		String label = node.resolvedLabel;
+		String label = node.getResolvedLabel();
 		String title = "";
 		if(label.length() > 40) {
 			title = label;
@@ -68,12 +72,12 @@
 		}
 		EntityEncoder entityEncoder = EntityEncoder.FULL;
 		label = entityEncoder.encode(label);
-		String pageURI = Util.getPortalRequestContext().getPortalURI() + node.getUri();
-		if(node.pageReference != null) {
+		String pageURI = Util.getPortalRequestContext().getPortalURI() + node.getURI();
+		if(node.getPageRef() != null) {
 			if(uicomponent.isUseAjax()) {
-				String onclickEvt = uicomponent.event("SelectNode",	nav.getId() + "::" + node.getUri()) + ";return false;" ;
+				String onclickEvt = uicomponent.event("SelectNode",	node.getId()) + ";return false;" ;
 				print """
-						<div class="MenuItem $tabStyleNavigation">
+						<div class="MenuItem $tabStyleNavigation" $getNodeURL>
 							<div class="$arrowIcon" title="$title">
 								<div class="ItemIcon $icon">
 									<a href="$pageURI" onclick="$onclickEvt">$label</a>
@@ -82,7 +86,7 @@
 				""";
 			} else {
 				print """
-						<div class="MenuItem $tabStyleNavigation">
+						<div class="MenuItem $tabStyleNavigation" $getNodeURL>
 							<div class="$arrowIcon" title="$title">
 								<div class="ItemIcon $icon">
 									<a href="$pageURI">$label</a>
@@ -92,7 +96,7 @@
 			}
 		} else {
 			print """
-					<div class="MenuItem $tabStyleNavigation">
+					<div class="MenuItem $tabStyleNavigation" $getNodeURL>
 						<div class="$arrowIcon" title="$title">
 							<div class="ItemIcon $icon">
 								<a href="#">$label</a>
@@ -101,13 +105,13 @@
 			""";
 		}
 		
-		if (node.getChildren() != null && node.getChildren().size() > 0) {
-			renderChildrenContainer(nav, node);
+		if (node.getChildren().size() > 0) {
+			renderChildrenContainer(node);
 		}		
 		print "</div>";					
 	}
 %>
-	
+
 <div class="UINavigationBar <%=uicomponent.getCssClassName()%>">
 	<div class="LeftNavigationBar">
 		<div class="RightNavigationBar">
@@ -115,24 +119,29 @@
 				<div class="UIHorizontalTabs">
 					<div class="TabsContainer">
 						<%
-							PageNavigation selectedNav = uicomponent.getSelectedNavigation();
-							PageNode selectedNode = uicomponent.getSelectedPageNode();
-							if(navigations != null) {
-								for(nav in navigations) {
+							MimeResponse res = _ctx.getRequestContext().getResponse();
+							
+							def rootNodes = uicomponent.getNavigations();
+							UserNode selectedNode = uicomponent.getSelectedNode();
+							if(rootNodes != null) {
+								for(nav in rootNodes) {
 									
-									def pageNodes = nav.getNodes();
-									for(PageNode node in pageNodes) {
+									def childs = nav.getChildren();
+                  
+									for(Node node in childs) {
 										String tabStyleNavigation = "NormalNavigationTab";
-										if(selectedNode != null && selectedNav != null &&
-											 selectedNav.getId() == nav.getId() &&
-											 node.getUri() == selectedNode.getUri()) {
+										if(selectedNode != null && node.getId() == selectedNode.getId()) {
 												tabStyleNavigation = "SelectedNavigationTab";
 										}
-										String icon = node.getIcon();
-										if(icon == null) icon = "DefaultPageIcon";
-						%>			
-						
+										
+										if (node.getChildrenCount() > 0) {
+										   	ResourceURL resourceURL = res.createResourceURL();
+											resourceURL.setResourceID(res.encodeURL(node.getURI()));										
+						%>									
+										<div class="UITab" exo:getNodeURL="<%=resourceURL.toString() %>">
+									<%	} else { %>
 										<div class="UITab">
+									<%  } %>																				
 											<div class="$tabStyleNavigation">
 												<div class="LeftTab">
 													<div class="RightTab">
@@ -140,7 +149,7 @@
 															<div class="TabIcon">
 																<%
 																	String arrowIcon = "";
-																	if (node.getChildren() != null && node.getChildren().size() > 0) {
+																	if (node.getChildrenCount() > 0) {
 																		arrowIcon = "DropDownArrowIcon";
 																	}
 																	String iconType = node.getIcon();
@@ -148,14 +157,14 @@
 																%>
 															 	<div class="$arrowIcon">
 															 		<%
-															 			String pageURI = Util.getPortalRequestContext().getPortalURI() + node.getUri();
-															 			String label = node.resolvedLabel;
+															 			String pageURI = Util.getPortalRequestContext().getPortalURI() + node.getURI();
+															 			String label = node.getResolvedLabel();
 															 			if(label.length() > 30) label = label.substring(0,29) + "...";
 																		EntityEncoder entityEncoder = EntityEncoder.FULL;
 																		label=entityEncoder.encode(label);
-															 			if(node.pageReference != null) {
+															 			if(node.getPageRef() != null) {
 															 				if(uicomponent.isUseAjax()) {
-															 					String onclickEvt = uicomponent.event("SelectNode",	nav.getId() + "::" + node.getUri()) + ";return false;";
+															 					String onclickEvt = uicomponent.event("SelectNode",	node.getId()) + ";return false;";
 															 		%>
 																	 			<a class="TabLabel ${iconType}" onclick="$onclickEvt" href="$pageURI">$label</a>
 																	<%
@@ -173,11 +182,11 @@
 												</div>											 
 											</div>
 											<%
-												/*Render Popup Menu*/
-												if (node.getChildren() != null && node.getChildren().size() > 0) {
-													renderChildrenContainer(nav, node);
-												}
-											%>
+                                               /*Render Popup Menu*/
+                                               if (node.getChildren().size() > 0) {
+                                                       renderChildrenContainer(node);
+                                               }
+                                             %>											
 										</div>									
 						<%
 									}

Deleted: epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/groovy/portal/webui/component/UIPortalNavigation2.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/groovy/portal/webui/component/UIPortalNavigation2.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/groovy/portal/webui/component/UIPortalNavigation2.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,237 +0,0 @@
-<% 
-	import org.exoplatform.portal.config.model.PageNode;
-	import org.exoplatform.portal.config.model.PageNavigation;
-	import org.exoplatform.web.application.JavascriptManager;
-	import org.exoplatform.portal.webui.util.Util;
-	
-	def rcontext = _ctx.getRequestContext();
-	JavascriptManager jsmanager = rcontext.getJavascriptManager();
-	jsmanager.importJavascript('eXo.webui.UIHorizontalTabs');
-	jsmanager.importJavascript('eXo.portal.UIPortalNavigation2');
-	jsmanager.addOnLoadJavascript('eXo.portal.UIPortalNavigation2.onLoad');
-	
-	jsmanager.addOnLoadJavascript('eXo.portal.UIPortalNavigation2.loadScroll');
-	//jsmanager.addOnResizeJavascript('eXo.portal.UIPortalNavigation2.initScroll');
-
-	navigations = uicomponent.getNavigations();
-	PageNode mySiteRoot = createRootNode(_ctx.appRes("UIPortalNavigation.Root.MySite"));
-	PageNode mySpaceRoot = createRootNode(_ctx.appRes("UIPortalNavigation.Root.MySpace"));	
-	
-	for(nav in navigations) {
-		String ownerType = nav.getOwnerType();
-		if (ownerType.equals("portal")) {
-			addNodesToRoot(mySiteRoot, nav.getNodes());
-		} else if (ownerType.equals("group")) {
-			addNodesToRoot(mySpaceRoot, nav.getNodes());
-		}
-	}
-	
-	public PageNode createRootNode(String name) {			
-		PageNode node = new PageNode();
-		node.setShowPublicationDate(false);
-		node.setVisible(true) ;
-		node.setModifiable(false);
-		node.setLabel(name);		
-		node.setName(name);			
-		return node;
-	}
-
-	public void addNodesToRoot(PageNode root, ArrayList<PageNode> nodes) {
-		for(PageNode ele : nodes) {
-			root.getChildren().add(ele);
-		}
-	}
-	 
-	public void renderChildrenContainer(PageNavigation nav, PageNode node) {
-		print """
-			<div class="MenuItemContainer" style="display: none;">
-				<div class="MenuItemDecorator">
-					<div class="LeftTopMenuDecorator">
-						<div class="RightTopMenuDecorator">
-							<div class="CenterTopMenuDecorator"><span></span></div>
-						</div>
-					</div>
-					
-					<div class="LeftMiddleMenuDecorator">
-						<div class="RightMiddleMenuDecorator">
-							<div class="CenterMiddleMenuDecorator">
-		""";
-								for(child in node.getChildren()) {
-							 		renderChildNode(nav, child);
-								}
-		print """
-							</div>
-						</div>
-					</div>
-					<div class="LeftBottomMenuDecorator">
-						<div class="RightBottomMenuDecorator">
-							<div class="CenterBottomMenuDecorator"><span></span></div>
-						</div>
-					</div>					
-				</div>
-			</div>
-		""";
-	}
-	
-	public void renderChildNode(PageNavigation nav, PageNode node) {
-		PageNode selectedNode = uicomponent.getSelectedPageNode();
-		PageNavigation selectedNav = uicomponent.getSelectedNavigation();
-		String tabStyleNavigation = "NormalItem"; // OverItem
-		if(selectedNode != null &&	selectedNav != null &&
-			 selectedNav.getId () == nav.getId() &&
-			 node.getUri() == selectedNode.getUri()) {			 
-				tabStyleNavigation = "SelectedItem";
-			}
-		
-		String icon = node.getIcon();
-		if(icon == null) icon = "DefaultPageIcon";
-		String arrowIcon = "";
-		if (node.getChildren() != null && node.getChildren().size() > 0) arrowIcon = "ArrowIcon";
-
-		String label = node.resolvedLabel;
-		String title = "";
-		if(label.length() > 40) {
-			title = label;
-			label = label.substring(0,37) + "...";
-		}
-		
-		String pageURI = Util.getPortalRequestContext().getPortalURI() + node.getUri();
-		if(node.pageReference != null) {
-			if(uicomponent.isUseAjax()) {
-				String onclickEvt = uicomponent.event("SelectNode",	nav.getId() + "::" + node.getUri()) + ";return false;";
-				print """
-						<div class="MenuItem $tabStyleNavigation">
-							<div class="$arrowIcon" title="$title">
-								<div class="ItemIcon $icon">
-									<a href="$pageURI" onclick="$onclickEvt">$label</a>
-								</div>
-							</div>
-				""";
-			} else {
-				print """
-						<div class="MenuItem $tabStyleNavigation">
-							<div class="$arrowIcon" title="$title">
-								<div class="ItemIcon $icon">
-									<a href="$pageURI">$label</a>
-								</div>
-							</div>
-				""";
-			}
-		} else {
-			print """
-					<div class="MenuItem $tabStyleNavigation">
-						<div class="$arrowIcon" title="$title">
-							<div class="ItemIcon $icon">
-								<a href="$pageURI">$label</a>
-							</div>
-						</div>
-			""";
-		}
-		
-		if (node.getChildren() != null && node.getChildren().size() > 0) {
-			renderChildrenContainer(nav, node);
-		}
-		
-		print "</div>";					
-	}
-%>
-	
-<div class="UINavigationBar">
-	<div class="LeftNavigationBar">
-		<div class="RightNavigationBar">
-			<div class="MiddleNavigationBar">
-				<div class="UIHorizontalTabs">
-					<div class="TabsContainer">
-						<%
-						PageNavigation selectedNav = uicomponent.getSelectedNavigation();
-							PageNode selectedNode = uicomponent.getSelectedPageNode();
-							if(navigations != null) {
-								Hashtable<String, Boolean> usedNavs = new Hashtable<String, Boolean>();
-								for(nav in navigations) {
-									ArrayList<PageNode> pageNodes = new ArrayList<PageNode>();
-										String navOwnerType = nav.getOwnerType();
-										if (usedNavs.get(navOwnerType)) {
-											continue;
-										} else if (navOwnerType.equals("portal")) {
-											pageNodes.add(mySiteRoot);
-											usedNavs.put(navOwnerType, true);
-										} else if (navOwnerType.equals("group")) {
-											pageNodes.add(mySpaceRoot);
-											usedNavs.put(navOwnerType, true);
-										} else {
-											pageNodes = nav.getNodes();
-										}
-																											
-									for(PageNode node in pageNodes) {
-										String tabStyleNavigation = "NormalNavigationTab";
-										if(selectedNode != null && selectedNav != null &&
-											 selectedNav.getId() == nav.getId() &&
-											 node.getUri() == selectedNode.getUri()) {
-												tabStyleNavigation = "SelectedNavigationTab";
-											}
-										String icon = node.getIcon();
-										if(icon == null) icon = "DefaultPageIcon";
-						%>			
-						
-										<div class="UITab">
-											<div class="$tabStyleNavigation">
-												<div class="LeftTab">
-													<div class="RightTab">
-														<div class="MiddleTab">
-															<div class="TabIcon">
-																<%
-											String arrowIcon = "";
-											if (node.getChildren() != null && node.getChildren().size() > 0) {
-												arrowIcon = "DropDownArrowIcon";
-											}
-											String iconType = node.getIcon();
-											if(iconType == null) iconType = "DefaultPageIcon";
-										%>
-															 	<div class="$arrowIcon">
-															 		<%
-															 			String pageURI = Util.getPortalRequestContext().getPortalURI() + node.getUri() ;
-															 			String label = node.resolvedLabel ;
-															 			if(label.length() > 30) label = label.substring(0,29) + "..." ;
-															 			if(node.pageReference != null) {
-															 				if(uicomponent.isUseAjax()) {
-															 					String onclickEvt = uicomponent.event("SelectNode",	nav.getId() + "::" + node.getUri()) + ";return false;" ;															 					
-															 		%>
-																	 			<a class="TabLabel ${iconType}" onclick="$onclickEvt" href="$pageURI">$label</a>
-																	<%
-																			} else {
-																	%>
-																				<a class="TabLabel ${iconType}" href="$pageURI">$label</a>
-																	<%	}
-																		} else {%>
-																			<a class="TabLabel ${iconType}">$label</a>
-																	<%}%>
-															 	</div>
-															</div>
-														</div>
-													</div>
-												</div>											 
-											</div>
-											<%
-												/*Render Popup Menu*/
-												if (node.getChildren() != null && node.getChildren().size() > 0) {
-													renderChildrenContainer(nav, node);
-												}
-											%>
-										</div>
-									
-						<%
-									}
-								}
-							}
-						%>
-						<div class="ScrollButtons">
-							<div class="ScrollLeftButton" title="<%= _ctx.appRes("UIPortalNavigation.Label.Previous") %>">
-								<div class="ScrollRightButton" title="<%= _ctx.appRes("UIPortalNavigation.Label.Next") %>"><span></span></div>
-							</div>
-						</div>
-					</div>
-				</div>
-			</div>
-		</div>
-	</div>	
-</div>
\ No newline at end of file

Deleted: epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/javascript/eXo/webui/UISiteMap.js
===================================================================
--- portal/trunk/portlet/web/src/main/webapp/javascript/eXo/webui/UISiteMap.js	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/javascript/eXo/webui/UISiteMap.js	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-function UISiteMap() {};
-
-UISiteMap.prototype.updateTreeNode = function (nodeToUpdate, getNodeURL) {
-	if (!nodeToUpdate || ! getNodeURL) return;
-	
-	var subGroup = eXo.core.DOMUtil.findFirstChildByClass(nodeToUpdate.parentNode, "div", "ChildrenContainer") ;
-	if (!subGroup || subGroup.innerHTML.trim() !== "") return;	
-		
-	var jsChilds = ajaxAsyncGetRequest(getNodeURL, false);	
-	try {
-		var data = eXo.core.JSON.parse(jsChilds);				
-	} catch (e) {		
-	}	
-	if (data && data.length) {
-		eXo.webui.UISiteMap.generateHtml(data, nodeToUpdate, subGroup);			
-		return;
-	}
-	eXo.core.DOMUtil.removeClass(nodeToUpdate, "CollapseIcon");
-	eXo.core.DOMUtil.addClass(nodeToUpdate, "NullItem");
-};
-
-UISiteMap.prototype.generateHtml = function(data, nodeToUpdate, subGroup) {						
-	function toHtml(node, isLast) {
-		if (!node) return;
-		var lastNode = isLast ? "LastNode" : "";
-		var actionLink = node.actionLink ? node.actionLink : "javascript:void(0);";
-		
-		var actionExpand = 'eXo.webui.UISiteMap.updateTreeNode(this, "' + node.getNodeURL + '")';
-		var actionCollapse = 'ajaxAsyncGetRequest("' + node.collapseURL + '", true)'; 		 
-			
-		var str = "";			
-		if (node.hasChild) {
-			str += "<div class='" + lastNode + " Node'>";			
-			if (node.isExpanded) {
-				str += "<div class='CollapseIcon ClearFix' onclick='eXo.portal.UIPortal.collapseExpand(this); " + actionCollapse + "'>";
-				str += "<a class='NodeIcon DefaultPageIcon' href='" + actionLink + "'>" + node.label + "</a>";
-				str += "</div><div class='ChildrenContainer' style='display: block'>";
-				for (var idx = 0; idx < node.childs.length; idx++) {
-					str += toHtml(node.childs[idx], idx == node.childs.length - 1);
-				}				
-			} else {
-				str += "<div class='ExpandIcon ClearFix' onclick='eXo.portal.UIPortal.collapseExpand(this); " + actionExpand + "'>";
-				str += "<a class='NodeIcon DefaultPageIcon' href='" + actionLink + "'>" + node.label + "</a>";
-				str += "</div><div class='ChildrenContainer' style='display: none'>";
-				for (var idx = 0; idx < node.childs.length; idx++) {
-					str += toHtml(node.childs[idx], idx == node.childs.length - 1);
-				}	
-			}
-			str += "</div></div>";
-		} else {
-			str += "<div class='" + lastNode + " Node ClearFix'><div class='NullItem'><div class='ClearFix'>";
-			str += "<a class='NodeIcon DefaultPageIcon' href='" + actionLink + "'>" + node.label + "</a></div></div></div>";			
-		}
-		return str;
-	}
-	
-	var htmlFrags = "";	
-	for (var i = 0; i < data.length; i++) {
-		htmlFrags += toHtml(data[i], i == data.length - 1);
-	}
-	
-	subGroup.innerHTML = htmlFrags;
-	subGroup.style.display = "block";
-};
-
-eXo.webui.UISiteMap = new UISiteMap();

Copied: epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/javascript/eXo/webui/UISiteMap.js (from rev 6783, portal/trunk/portlet/web/src/main/webapp/javascript/eXo/webui/UISiteMap.js)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/javascript/eXo/webui/UISiteMap.js	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/portlet/web/src/main/webapp/javascript/eXo/webui/UISiteMap.js	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+function UISiteMap() {};
+
+UISiteMap.prototype.updateTreeNode = function (nodeToUpdate, getNodeURL) {
+	if (!nodeToUpdate || ! getNodeURL) return;
+	
+	var subGroup = eXo.core.DOMUtil.findFirstChildByClass(nodeToUpdate.parentNode, "div", "ChildrenContainer") ;
+	if (!subGroup || subGroup.innerHTML.trim() !== "") return;	
+		
+	var jsChilds = ajaxAsyncGetRequest(getNodeURL, false);	
+	try {
+		var data = eXo.core.JSON.parse(jsChilds);				
+	} catch (e) {		
+	}	
+	if (data && data.length) {
+		eXo.webui.UISiteMap.generateHtml(data, nodeToUpdate, subGroup);			
+		return;
+	}
+	eXo.core.DOMUtil.removeClass(nodeToUpdate, "CollapseIcon");
+	eXo.core.DOMUtil.addClass(nodeToUpdate, "NullItem");
+};
+
+UISiteMap.prototype.generateHtml = function(data, nodeToUpdate, subGroup) {						
+	function toHtml(node, isLast) {
+		if (!node) return;
+		var lastNode = isLast ? "LastNode" : "";
+		var actionLink = node.actionLink ? node.actionLink : "javascript:void(0);";
+		
+		var actionExpand = 'eXo.webui.UISiteMap.updateTreeNode(this, "' + node.getNodeURL + '")';
+		var actionCollapse = 'ajaxAsyncGetRequest("' + node.collapseURL + '", true)'; 		 
+			
+		var str = "";			
+		if (node.hasChild) {
+			str += "<div class='" + lastNode + " Node'>";			
+			if (node.isExpanded) {
+				str += "<div class='CollapseIcon ClearFix' onclick='eXo.portal.UIPortal.collapseExpand(this); " + actionCollapse + "'>";
+				str += "<a class='NodeIcon DefaultPageIcon' href='" + actionLink + "'>" + node.label + "</a>";
+				str += "</div><div class='ChildrenContainer' style='display: block'>";
+				for (var idx = 0; idx < node.childs.length; idx++) {
+					str += toHtml(node.childs[idx], idx == node.childs.length - 1);
+				}				
+			} else {
+				str += "<div class='ExpandIcon ClearFix' onclick='eXo.portal.UIPortal.collapseExpand(this); " + actionExpand + "'>";
+				str += "<a class='NodeIcon DefaultPageIcon' href='" + actionLink + "'>" + node.label + "</a>";
+				str += "</div><div class='ChildrenContainer' style='display: none'>";
+				for (var idx = 0; idx < node.childs.length; idx++) {
+					str += toHtml(node.childs[idx], idx == node.childs.length - 1);
+				}	
+			}
+			str += "</div></div>";
+		} else {
+			str += "<div class='" + lastNode + " Node ClearFix'><div class='NullItem'><div class='ClearFix'>";
+			str += "<a class='NodeIcon DefaultPageIcon' href='" + actionLink + "'>" + node.label + "</a></div></div></div>";			
+		}
+		return str;
+	}
+	
+	var htmlFrags = "";	
+	for (var i = 0; i < data.length; i++) {
+		htmlFrags += toHtml(data[i], i == data.length - 1);
+	}
+	
+	subGroup.innerHTML = htmlFrags;
+	subGroup.style.display = "block";
+};
+
+eXo.webui.UISiteMap = new UISiteMap();

Modified: epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/portal/UIPortal.js
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/portal/UIPortal.js	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/portal/UIPortal.js	2011-07-18 22:48:36 UTC (rev 6885)
@@ -654,6 +654,7 @@
 	var requestStr = eXo.env.server.createPortalURL(portalComposer.id, "Toggle", true);
 	ajaxAsyncGetRequest(requestStr);
 };
+
 /**
  * Clollapse or expand an element (all its children) of tree
  * @param {Object} element object to collapse or expand
@@ -661,17 +662,16 @@
 UIPortal.prototype.collapseExpand = function(element) {
 	var subGroup = eXo.core.DOMUtil.findFirstChildByClass(element.parentNode, "div", "ChildrenContainer") ;
 	var className = element.className;
-	if(!subGroup) return false;
+	if(!subGroup) return;
 	if(subGroup.style.display == "none") {
-		if (className.indexOf("ExpandIcon") == 0) 	element.className = "CollapseIcon ClearFix" ;
+		if (className.indexOf("ExpandIcon") == 0) element.className = "CollapseIcon ClearFix" ;
 		subGroup.style.display = "block" ;
 	} else {
 		if (className.indexOf("CollapseIcon") == 0) element.className = "ExpandIcon ClearFix" ;
 		subGroup.style.display = "none" ;
 	}
-	return true;
 };
-	
+
 /*
 * This method will start the creation of a new javascript application such as a widget
 *

Modified: epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/portal/UIPortalControl.js
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/portal/UIPortalControl.js	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/portal/UIPortalControl.js	2011-07-18 22:48:36 UTC (rev 6885)
@@ -41,20 +41,8 @@
   
   var parentNode = DOMUtil.findAncestorByClass(selectedElement, "Node");  
   var childrenContainer = DOMUtil.findFirstDescendantByClass(parentNode, "div", "ChildrenContainer");
-  
-  if (eXo.core.Browser.browserType != "ie") {
-  	var expandIcon = document.createElement('a');
-	  expandIcon.href = childrenContainer.getAttribute("actionLink") ;
-	  expandIcon.className = "ExpandIcon" ;
-	  expandIcon.innerHTML = selectedElement.innerHTML ;
-	  parentNode.removeChild(childrenContainer);
-	  parentNode.insertBefore(expandIcon, selectedElement);
-	  parentNode.removeChild(selectedElement);
-  } else {
-  	// Fix for GTNPORTAL-379 IE7: Can't hide sub-group  	
-  	var newHTML = "<div onclick=\"" + childrenContainer.getAttribute("actionLink") + "\" class=\"ExpandIcon\">" + selectedElement.innerHTML +  "</div>";  	
-  	parentNode.innerHTML = newHTML;
-  }  
+  var newHTML = "<div onclick=\"" + childrenContainer.getAttribute("actionLink") + "\" class=\"ExpandIcon\">" + selectedElement.innerHTML +  "</div>";  	
+  parentNode.innerHTML = newHTML;
 };
 
 /**

Modified: epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/portal/UIPortalNavigation.js
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/portal/UIPortalNavigation.js	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/portal/UIPortalNavigation.js	2011-07-18 22:48:36 UTC (rev 6885)
@@ -23,7 +23,7 @@
 function UIPortalNavigation() {
   this.currentOpenedMenu = null;
   this.scrollMgr = null;
-  this.scrollManagerLoaded = false;
+  this.scrollManagerLoaded = false;   
 };
 /**
  * Sets some parameters :
@@ -54,7 +54,7 @@
  		eXo.portal.UIPortalNavigation.init(uiNavPortlets[0], mainContainer, 0, 0);
 		for (var i = 1; i < uiNavPortlets.length; ++i) {
 				uiNavPortlets[i].style.display = "none";
-		}
+		}		
   }
 };
 /**
@@ -83,32 +83,34 @@
       item.onmousemove = eXo.portal.UIPortalNavigation.tabOnMouseMove ;
     }
     item.style.width = item.offsetWidth + "px";
-    /**
-     * TODO: fix IE7;
-     */
-    var container = DOMUtil.findFirstDescendantByClass(item, "div", this.containerStyleClass);
-    if (container) {
-      if (eXo.core.Browser.isIE6()) {
-        container.style.width = item.offsetWidth + "px";
-      } else {
-        container.style.minWidth = item.offsetWidth + "px";
-      }
-    }
   }
   
-	var itemConts = DOMUtil.findDescendantsByClass(topContainer, "div", this.containerStyleClass);
-	for (var i = 0; i < itemConts.length; i++) {
-		var cont = itemConts[i];
-		if(!cont.id) cont.id = DOMUtil.generateId("PortalNavigationContainer");
-		cont.resized = false;
-		
-		var items = DOMUtil.findDescendantsByClass(cont, "div", this.tabStyleClass);
-		if(items.length == 0) cont.parentNode.removeChild(cont);
-		for(var j = 0; j < items.length; j ++) {
-			items[j].onmouseover = eXo.portal.UIPortalNavigation.onMenuItemOver;
-    	items[j].onmouseout = eXo.portal.UIPortalNavigation.onMenuItemOut;
-		}
-	}
+  /**
+   * TODO: fix IE7;
+   */
+  var container = DOMUtil.findFirstDescendantByClass(item, "div", this.containerStyleClass);
+  if (container) {
+	  if (eXo.core.Browser.isIE6()) {
+		  container.style.width = item.offsetWidth + "px";
+	  } else {
+		  container.style.minWidth = item.offsetWidth + "px";
+	  }
+  }
+
+  var itemConts = DOMUtil.findDescendantsByClass(topContainer, "div", this.containerStyleClass);
+  for (var i = 0; i < itemConts.length; i++) {
+	  var cont = itemConts[i];
+	  if(!cont.id) cont.id = DOMUtil.generateId("PortalNavigationContainer");
+	  cont.resized = false;
+
+	  var items = DOMUtil.findDescendantsByClass(cont, "div", this.tabStyleClass);
+	  if(items.length == 0) cont.parentNode.removeChild(cont);
+	  for(var j = 0; j < items.length; j ++) {
+		  items[j].onmouseover = eXo.portal.UIPortalNavigation.onMenuItemOver;
+		  items[j].onmouseout = eXo.portal.UIPortalNavigation.onMenuItemOut;
+	  }
+  }
+
 };
 /**
  * Sets the tab style on mouse over and mouse out
@@ -129,16 +131,62 @@
 //  }
 //}
 
+UIPortalNavigation.prototype.generateContainer = function(data) {		
+	var htmlFrags = "<div class='" + this.containerStyleClass + "' style='display: none;' id='"; 
+	htmlFrags += eXo.core.DOMUtil.generateId("PortalNavigationContainer") + "' resized='false'>";	
+	htmlFrags += "<div class='MenuItemDecorator'>";
+	htmlFrags += "<div class='LeftTopMenuDecorator'><div class='RightTopMenuDecorator'>";
+	htmlFrags += "<div class='CenterTopMenuDecorator'><span></span></div></div></div>";
+	htmlFrags += "<div class='LeftMiddleMenuDecorator'><div class='RightMiddleMenuDecorator'>";
+	htmlFrags += "<div class='CenterMiddleMenuDecorator'>";	
+	for (var i = 0; i < data.length; i++) {
+		var node = data[i];
+		var actionLink = node.actionLink ? node.actionLink : "javascript:void(0);";
+				
+		htmlFrags += ("<div class='MenuItem " + (node.isSelected ? "SelectedItem'" : "NormalItem'")); 
+		htmlFrags += (node.hasChild ? (" exo:getNodeURL='" + node.getNodeURL + "' ") : "" ); 
+		htmlFrags += ("onmouseover='eXo.portal.UIPortalNavigation.onMenuItemOver(this)' onmouseout='eXo.portal.UIPortalNavigation.onMenuItemOut(this)'>");
+		htmlFrags += ("<div class='" + (node.hasChild ? "ArrowIcon" : "") + "' title='" + node.label + "'>");
+		htmlFrags += ("<div class='ItemIcon " + (node.icon ? node.icon : "DefaultPageIcon") + "'>");
+		htmlFrags += ("<a href='" + actionLink + "'>" + (node.label.length > 40 ? node.label.substring(0,37) + "..." : node.label) + "</a>");
+		htmlFrags += ("</div></div>");
+		if (node.childs.length) {
+			htmlFrags += eXo.portal.UIPortalNavigation.generateContainer(node.childs);			
+		}
+		htmlFrags += "</div>";
+	}
+	htmlFrags += "</div></div></div><div class='LeftBottomMenuDecorator'><div class='RightBottomMenuDecorator'>";
+	htmlFrags += "<div class='CenterBottomMenuDecorator'><span></span></div></div></div></div></div>";
+	return htmlFrags;
+};
+
 UIPortalNavigation.prototype.setTabStyleOnMouseOver = function(e) {
   var tab = this ;
   if (eXo.portal.UIPortalNavigation.previousMenuItem != tab) {
     eXo.portal.UIPortalNavigation.hideMenu() ;
   }
-	eXo.portal.UIPortalNavigation.setTabStyleOnMouseOut(e, tab) ;
-  eXo.portal.UIPortalNavigation.previousMenuItem = tab ;
-  if (!eXo.portal.UIPortalNavigation.menuVisible) {
-    var menuItemContainer = eXo.core.DOMUtil.findFirstDescendantByClass(tab, "div", eXo.portal.UIPortalNavigation.containerStyleClass);
+  eXo.portal.UIPortalNavigation.setTabStyleOnMouseOut(e, tab) ;
+  eXo.portal.UIPortalNavigation.previousMenuItem = tab ;    
+  
+  var getNodeURL = tab.getAttribute("exo:getNodeURL");
+  var menuItemContainer = eXo.core.DOMUtil.findFirstDescendantByClass(tab, "div", eXo.portal.UIPortalNavigation.containerStyleClass);
+  if (getNodeURL && !menuItemContainer) {
+	  var jsChilds = ajaxAsyncGetRequest(getNodeURL,false)
+	  try {
+		  var data = eXo.core.JSON.parse(jsChilds);		  
+	  } catch (e) {
+	  }				  
+	  if (!data || !data.length) {
+		  return;
+	  }
+	  var temp = document.createElement("div");
+	  temp.innerHTML = eXo.portal.UIPortalNavigation.generateContainer(data); 		  
+	  tab.appendChild(eXo.core.DOMUtil.findFirstChildByClass(temp, "div", eXo.portal.UIPortalNavigation.containerStyleClass));
+  }
+  
+  if (!eXo.portal.UIPortalNavigation.menuVisible) {    
     var hideSubmenu = tab.getAttribute('hideSubmenu') ;
+    menuItemContainer = eXo.core.DOMUtil.findFirstDescendantByClass(tab, "div", eXo.portal.UIPortalNavigation.containerStyleClass);
     if (menuItemContainer && !hideSubmenu) {
       var DOMUtil = eXo.core.DOMUtil ;
 		  if(eXo.core.Browser.browserType == "ie") {
@@ -157,8 +205,10 @@
 		  }
       eXo.portal.UIPortalNavigation.toggleSubMenu(e, tab, menuItemContainer) ;
     }
-  }
-  eXo.portal.UIPortalNavigation.menuVisible = true ;  
+  }  
+  
+  eXo.portal.UIPortalNavigation.cancelHideMenuContainer() ;
+  eXo.portal.UIPortalNavigation.menuVisible = true ;
 } ;
 
 UIPortalNavigation.prototype.setTabStyleOnMouseOut = function(e, src) {
@@ -281,7 +331,7 @@
     eXo.portal.UIPortalNavigation.superClass.popVisibleContainer();
     eXo.portal.UIPortalNavigation.superClass.setCloseTimeout();
     eXo.portal.UIPortalNavigation.superClass.hide(menuItemContainer);
-    eXo.portal.UIPortalNavigation.currentOpenedMenu = null;
+    eXo.portal.UIPortalNavigation.currentOpenedMenu = null;    
   }
   this.previousMenuItem = false ;
   eXo.portal.UIPortalNavigation.menuVisible = false ;
@@ -308,17 +358,37 @@
       	tabsContainer.style.position = "relative" ;
       }
     }
-  }
+  }  
 };
 /**
  * When the mouse goes over a menu item (in the main nav menu)
  * Check if this menu item has a sub menu, if yes, opens it
  * Changes the style of the button
  */
-UIPortalNavigation.prototype.onMenuItemOver = function(e) {
-  var menuItem = this;
+UIPortalNavigation.prototype.onMenuItemOver = function(menuItem) {  
+  if (!menuItem || !menuItem.nodeName) menuItem = this;
   var DOMUtil = eXo.core.DOMUtil;
+  
+  var getNodeURL = menuItem.getAttribute("exo:getNodeURL");
   var subContainer = DOMUtil.findFirstDescendantByClass(menuItem, "div", eXo.portal.UIPortalNavigation.containerStyleClass);
+  if (getNodeURL && !subContainer) {
+	  var jsChilds = ajaxAsyncGetRequest(getNodeURL,false)
+	  try {
+		  var data = eXo.core.JSON.parse(jsChilds);		  		  
+	  } catch (e) {
+	  }	
+	  if (!data || !data.length) {
+		  var arrow = DOMUtil.findFirstChildByClass(menuItem, "div", "ArrowIcon");
+		  DOMUtil.removeClass(arrow, "ArrowIcon");
+		  menuItem.removeAttribute("exo:getNodeURL");
+		  return;
+	  }
+	  var temp = document.createElement("div");
+	  temp.innerHTML = eXo.portal.UIPortalNavigation.generateContainer(data); 		  
+	  menuItem.appendChild(eXo.core.DOMUtil.findFirstChildByClass(temp, "div", eXo.portal.UIPortalNavigation.containerStyleClass));
+  }
+    
+  subContainer = DOMUtil.findFirstDescendantByClass(menuItem, "div", eXo.portal.UIPortalNavigation.containerStyleClass);
   if (subContainer) {
     eXo.portal.UIPortalNavigation.superClass.pushVisibleContainer(subContainer.id);
     eXo.portal.UIPortalNavigation.showMenuItemContainer(menuItem, subContainer) ;
@@ -347,8 +417,9 @@
  * When the mouse goes out a menu item from the main nav menu
  * Checks if this item has a sub menu, if yes calls methods from superClass to hide it
  */
-UIPortalNavigation.prototype.onMenuItemOut = function(e) {
-  var menuItem = this;
+UIPortalNavigation.prototype.onMenuItemOut = function(menuItem) {
+  if (!menuItem || !menuItem.nodeName) menuItem = this;
+  
   var subContainer = eXo.core.DOMUtil.findFirstDescendantByClass(menuItem, "div", eXo.portal.UIPortalNavigation.containerStyleClass);
   if (subContainer) {
     eXo.portal.UIPortalNavigation.superClass.pushHiddenContainer(subContainer.id);

Modified: epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/webui/UITabbedDashboard.js
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/webui/UITabbedDashboard.js	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/webui/UITabbedDashboard.js	2011-07-18 22:48:36 UTC (rev 6885)
@@ -37,7 +37,7 @@
 			var DOMUtil = eXo.core.DOMUtil;
 			var portletFrag = DOMUtil.findAncestorByClass(inputElement, "PORTLET-FRAGMENT");
 			var compId = portletFrag.parentNode.id;
-			var nodeIndex = inputElement.id;
+			var nodeName = inputElement.id;
 			
 			//Send request to server to change node name
 			var href = eXo.env.server.portalBaseURL + "?portal:componentId=" + compId;
@@ -45,7 +45,7 @@
 			href += "&portal:isSecure=false";
 			href += "&uicomponent=UITabPaneDashboard";
 			href += "&op=RenameTabLabel";
-			href += "&objectId=" + nodeIndex;
+			href += "&objectId=" + nodeName;
 			href += "&newTabLabel=" + encodeURIComponent(newTabLabel);
 			window.location = href;
 		}
@@ -59,7 +59,7 @@
 		}
 	},
 
-	showEditLabelInput : function(selectedElement, nodeIndex, currentContent){
+	showEditLabelInput : function(selectedElement, nodeName, currentContent){
 		eXo.webui.UITabbedDashboard.backupElement = selectedElement;
 		var prNode = selectedElement.parentNode;
 		var tabContainer = eXo.core.DOMUtil.findAncestorByClass(prNode, "TabsContainer");
@@ -67,7 +67,7 @@
 		
 		var inputElement = document.createElement("input");
 		inputElement.type = "text";
-		inputElement.id = nodeIndex;
+		inputElement.id = nodeName;
 		inputElement.name = currentContent; // To store old value
 		inputElement.value = currentContent;
 		inputElement.style.border = "1px solid #b7b7b7";

Modified: epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/webui/UIVirtualList.js
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/webui/UIVirtualList.js	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/javascript/eXo/webui/UIVirtualList.js	2011-07-18 22:48:36 UTC (rev 6885)
@@ -29,7 +29,7 @@
   	childrenHeight += children[i].offsetHeight;  	
   }
   
-  if (!uiVirtualList.isFinished && childrenHeight <= uiVirtualList.offsetHeight) {
+  if (!uiVirtualList.isFinished && childrenHeight <= uiVirtualList.offsetHeight && childrenHeight != 0) {
 		uiVirtualList.onscroll();
   } else {  	
   	uiVirtualList.isInitiated = true;
@@ -50,7 +50,7 @@
 UIVirtualList.prototype.scrollMove = function(uiVirtualList, url) {
 	if (uiVirtualList.isFinished || uiVirtualList.isLocked) return;
 	var DOMUtil = eXo.core.DOMUtil;	
-var componentHeight = uiVirtualList.offsetHeight;
+	var componentHeight = uiVirtualList.offsetHeight;
 	var scrollPosition = uiVirtualList.scrollTop;
 	var scrollerHeight = uiVirtualList.scrollHeight;	
 	var scrollable_gap = scrollerHeight - (scrollPosition + componentHeight);	

Modified: epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/skin/DefaultSkin/webui/component/Stylesheet.css
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/skin/DefaultSkin/webui/component/Stylesheet.css	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/skin/DefaultSkin/webui/component/Stylesheet.css	2011-07-18 22:48:36 UTC (rev 6885)
@@ -24,4 +24,5 @@
 @import url(UIDropDownControl/Stylesheet.css);
 @import url(UIGroupInfoContainer/Stylesheet.css);
 
- at import url(UINotification/Stylesheet.css);
+ at import url(UINotification/Stylesheet.css);
+ at import url(UIPageSearch/Stylesheet.css);

Deleted: epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/skin/DefaultSkin/webui/component/UIPageSearch/Stylesheet.css
===================================================================
--- portal/trunk/web/eXoResources/src/main/webapp/skin/DefaultSkin/webui/component/UIPageSearch/Stylesheet.css	2011-07-01 06:44:15 UTC (rev 6783)
+++ epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/skin/DefaultSkin/webui/component/UIPageSearch/Stylesheet.css	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,85 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- * 
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-.UIPageSearchForm {
-	height: 39px;
-	line-height: 39px;
-	padding-bottom: 2px;
-}
-
-.UIPageSearchForm .UISearchContainer {
-	height: 38px; line-height: 38px;
-}
-
-.UIPageSearchForm .UISearchContainer .QuickSet {
-	overflow: hidden;
-	width: 100%;
-	padding-top: 9px;
-}
-
-.UIPageSearchForm .UISearchContainer .QuickSet .SearchLabel {
-	float: left; /* orientation=lt */
-	float: right; /* orientation=rt */
-	font-weight: bold;
-	height: 20px;
-	line-height: 20px;
-	padding-left: 10px; /* orientation=lt */
-	padding-right: 10px; /* orientation=rt */
-}
-
-.UIPageSearchForm .UISearchContainer .QuickSet .SearchIcon {
-	margin-left: 10px; /* orientation=lt */
-	margin-right: 10px; /* orientation=rt */
-	width: 24px;	
-	height: 24px;
-	background: url('/eXoResources/skin/DefaultSkin/skinIcons/24x24/icons/QuickSearch.gif') no-repeat;		 /* orientation=lt */
-	background: url('/eXoResources/skin/DefaultSkin/skinIcons/24x24/icons/QuickSearch-rt.gif') no-repeat; /* orientation=rt */
-	float: left; /* orientation=lt */
-	float: right; /* orientation=rt */
-}
-
-.UIPageSearchForm .UISearchContainer .QuickSet a:hover{
-	color: blue;
-}
-
-.UIPageSearchForm .UISearchContainer .QuickSet .UIForm {
-	background-color: transparent;
-	border: none;
-}
-
-.UIPageSearchForm .UISearchContainer .QuickSet select {
-	float: left;	 /* orientation=lt */
-	float: right; /* orientation=rt */
-	width: 115px; 
-	padding: 1px;
-	border: solid 1px gray;
-	font-size: 12px;
-	margin: 0 5px 0 10px;
-}
-
-.UIPageSearchForm .UISearchContainer .QuickSet input {
-	float: left; /* orientation=lt */
-	float: right; /* orientation=rt */
-	margin: 0px 5px 0px 10px; /* orientation=lt */ 
-	margin: 0px 10px 0px 5px; /* orientation=rt */
-	padding-left: 4px; /* orientation=lt */
-	padding-right: 4px; /* orientation=rt */
-	border: 1px solid gray;
-	width: 160px; height: 16px;
-}
\ No newline at end of file

Copied: epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/skin/DefaultSkin/webui/component/UIPageSearch/Stylesheet.css (from rev 6783, portal/trunk/web/eXoResources/src/main/webapp/skin/DefaultSkin/webui/component/UIPageSearch/Stylesheet.css)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/skin/DefaultSkin/webui/component/UIPageSearch/Stylesheet.css	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/web/eXoResources/src/main/webapp/skin/DefaultSkin/webui/component/UIPageSearch/Stylesheet.css	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,85 @@
+/**
+ * Copyright (C) 2009 eXo Platform SAS.
+ * 
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+.UIPageSearchForm {
+	height: 39px;
+	line-height: 39px;
+	padding-bottom: 2px;
+}
+
+.UIPageSearchForm .UISearchContainer {
+	height: 38px; line-height: 38px;
+}
+
+.UIPageSearchForm .UISearchContainer .QuickSet {
+	overflow: hidden;
+	width: 100%;
+	padding-top: 9px;
+}
+
+.UIPageSearchForm .UISearchContainer .QuickSet .SearchLabel {
+	float: left; /* orientation=lt */
+	float: right; /* orientation=rt */
+	font-weight: bold;
+	height: 20px;
+	line-height: 20px;
+	padding-left: 10px; /* orientation=lt */
+	padding-right: 10px; /* orientation=rt */
+}
+
+.UIPageSearchForm .UISearchContainer .QuickSet .SearchIcon {
+	margin-left: 10px; /* orientation=lt */
+	margin-right: 10px; /* orientation=rt */
+	width: 24px;	
+	height: 24px;
+	background: url('/eXoResources/skin/DefaultSkin/skinIcons/24x24/icons/QuickSearch.gif') no-repeat;		 /* orientation=lt */
+	background: url('/eXoResources/skin/DefaultSkin/skinIcons/24x24/icons/QuickSearch-rt.gif') no-repeat; /* orientation=rt */
+	float: left; /* orientation=lt */
+	float: right; /* orientation=rt */
+}
+
+.UIPageSearchForm .UISearchContainer .QuickSet a:hover{
+	color: blue;
+}
+
+.UIPageSearchForm .UISearchContainer .QuickSet .UIForm {
+	background-color: transparent;
+	border: none;
+}
+
+.UIPageSearchForm .UISearchContainer .QuickSet select {
+	float: left;	 /* orientation=lt */
+	float: right; /* orientation=rt */
+	width: 115px; 
+	padding: 1px;
+	border: solid 1px gray;
+	font-size: 12px;
+	margin: 0 5px 0 10px;
+}
+
+.UIPageSearchForm .UISearchContainer .QuickSet input {
+	float: left; /* orientation=lt */
+	float: right; /* orientation=rt */
+	margin: 0px 5px 0px 10px; /* orientation=lt */ 
+	margin: 0px 10px 0px 5px; /* orientation=rt */
+	padding-left: 4px; /* orientation=lt */
+	padding-right: 4px; /* orientation=rt */
+	border: 1px solid gray;
+	width: 160px; height: 16px;
+}
\ No newline at end of file

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ar.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ar.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ar.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -836,7 +836,7 @@
 		# org.exoplatform.portal.component.customization.UIPageSelector#
 		#############################################################################
 	-->
-	<UIPageSelector2>
+	<UIPageSelector>
 		<header>
 			<name> اسم</name>
 			<id> صفحة رقم</id>
@@ -853,7 +853,7 @@
 			<name> #{word.name}</name>
 			<accessGroups> مجموعات الوصول</accessGroups>
 		</label>
-	</UIPageSelector2>
+	</UIPageSelector>
 	<UIPageBrowser>
 		<msg>
 			<NoPermission> لا يوجد لديك إذن لدخول هذه الصفحة.</NoPermission>
@@ -1052,7 +1052,7 @@
 			<label>
 				<PageNodeSetting>عقدة إعداد الصفحة </PageNodeSetting>
 				<Icon>#{word.icon} </Icon>
-				<UIPageSelector2>تحديد الصفحة  </UIPageSelector2>
+				<UIPageSelector>تحديد الصفحة  </UIPageSelector>
 			</label>
 		</tab>
 		<action>

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_de.properties
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_de.properties	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_de.properties	2011-07-18 22:48:36 UTC (rev 6885)
@@ -392,18 +392,18 @@
   #              org.exoplatform.portal.component.customization.UIPageSelector#
   #############################################################################
   
-UIPageSelector2.header.name=Name
-UIPageSelector2.header.id=Seiten-ID
-UIPageSelector2.header.accessGroups=Gruppen
-UIPageSelector2.header.title=#{word.title}
-UIPageSelector2.header.action=#{word.action}
-UIPageSelector2.label.clearPage=Seiten leeren
-UIPageSelector2.label.createPage=Seite erstellen
-UIPageSelector2.label.searchandSelectPage=Seite suchen und  ausw\u00e4hlen
-UIPageSelector2.label.currentSelectedPage=Ausgew\u00e4hlte Seite
-UIPageSelector2.label.title=Titel
-UIPageSelector2.label.name=#{word.name}
-UIPageSelector2.label.accessGroups=Gruppen
+UIPageSelector.header.name=Name
+UIPageSelector.header.id=Seiten-ID
+UIPageSelector.header.accessGroups=Gruppen
+UIPageSelector.header.title=#{word.title}
+UIPageSelector.header.action=#{word.action}
+UIPageSelector.label.clearPage=Seiten leeren
+UIPageSelector.label.createPage=Seite erstellen
+UIPageSelector.label.searchandSelectPage=Seite suchen und  ausw\u00e4hlen
+UIPageSelector.label.currentSelectedPage=Ausgew\u00e4hlte Seite
+UIPageSelector.label.title=Titel
+UIPageSelector.label.name=#{word.name}
+UIPageSelector.label.accessGroups=Gruppen
 UIPageBrowser.msg.NoPermission=Sie haben keine Zugriffsberechtigung f\u00fcr diese Seite.
 UIPageBrowser.msg.PageNotExist=Die Seite existiert nicht.
 UIPageBrowser.msg.UserNotPermission=Sie haben keine Zugriffsberechtigung f\u00fcr die Seite dieses Knotens.
@@ -514,7 +514,7 @@
 UIPageNodeForm.Icon.title.SetDefault=Standardeinstellung
 UIPageNodeForm.tab.label.PageNodeSetting=Seitenknoten-Eigenschaften
 UIPageNodeForm.tab.label.Icon=#{word.icon}
-UIPageNodeForm.tab.label.UIPageSelector2=Seiten-Auswahl
+UIPageNodeForm.tab.label.UIPageSelector=Seiten-Auswahl
 
 
   #############################################################################

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_en.properties
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_en.properties	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_en.properties	2011-07-18 22:48:36 UTC (rev 6885)
@@ -410,18 +410,18 @@
   #              org.exoplatform.portal.component.customization.UIPageSelector#
   #############################################################################
   
-UIPageSelector2.header.name=Name
-UIPageSelector2.header.id=Page Id
-UIPageSelector2.header.accessGroups=Access groups
-UIPageSelector2.header.title=#{word.title}
-UIPageSelector2.header.action=#{word.action}
-UIPageSelector2.label.clearPage=Clear Page
-UIPageSelector2.label.createPage=Create Page
-UIPageSelector2.label.searchandSelectPage=Search and Select Page
-UIPageSelector2.label.currentSelectedPage=Selected Page Info
-UIPageSelector2.label.title=Title
-UIPageSelector2.label.name=#{word.name}
-UIPageSelector2.label.accessGroups=Access groups
+UIPageSelector.header.name=Name
+UIPageSelector.header.id=Page Id
+UIPageSelector.header.accessGroups=Access groups
+UIPageSelector.header.title=#{word.title}
+UIPageSelector.header.action=#{word.action}
+UIPageSelector.label.clearPage=Clear Page
+UIPageSelector.label.createPage=Create Page
+UIPageSelector.label.searchandSelectPage=Search and Select Page
+UIPageSelector.label.currentSelectedPage=Selected Page Info
+UIPageSelector.label.title=Title
+UIPageSelector.label.name=#{word.name}
+UIPageSelector.label.accessGroups=Access groups
 UIPageBrowser.msg.NoPermission=You have no permission to access this page.
 UIPageBrowser.msg.PageNotExist=Page doesn't exist.
 UIPageBrowser.msg.UserNotPermission=You have no permission to access the node's page.
@@ -545,7 +545,7 @@
 UIPageNodeForm.Icon.title.SetDefault=Get Default
 UIPageNodeForm.tab.label.PageNodeSetting=Page Node Setting
 UIPageNodeForm.tab.label.Icon=#{word.icon}
-UIPageNodeForm.tab.label.UIPageSelector2=Page Selector
+UIPageNodeForm.tab.label.UIPageSelector=Page Selector
 UIPageNodeForm.action.Save=#{word.save}
 UIPageNodeForm.action.Back=#{word.back}
 
@@ -555,10 +555,16 @@
   #############################################################################
   
 UIPageBrowse.deletePage=Do you want to delete this page?
-UIPageSearch.label.option.ownerType=Owner type
-UIPageSearch.label.option.ownerId=Owner id
-UIPageSearch.label.option.name=Name
-UIPageSearch.label.option.title=#{word.title}
+UIPageSearchForm.label.QuickSearch=Quick Search
+UIPageSearchForm.label.siteName=Site Name
+UIPageSearchForm.label.pageTitle=Title
+UIPageSearchForm.label.searchOption=Type
+UIPageSearchForm.label.option.ownerType=Owner type
+UIPageSearchForm.label.option.ownerId=Owner id
+UIPageSearchForm.label.option.name=Name
+UIPageSearchForm.label.option.title=#{word.title}
+UIPageSearchForm.label.option.portal=portal
+UIPageSearchForm.label.option.group=group
 
   #############################################################################
   #    org.exoplatform.portal.component.customization.UIPageNavigationForm    #
@@ -687,6 +693,11 @@
 UIPageCreationWizard.msg.NameNotSame=This name already exists.
 UIPageCreationWizard.msg.notSelectedPageNavigation=You have to select a navigation.
 UIPageCreationWizard.msg.StepByStep=At first you must go through step by step.
+UIPageCreationWizard.msg.concurrent.error=Concurrent modification error :
+UIPageCreationWizard.msg.ADD_CONCURRENTLY_REMOVED_PARENT_NODE=#{UIPageCreationWizard.msg.concurrent.error} Can't add a node to deleted node
+UIPageCreationWizard.msg.ADD_CONCURRENTLY_ADDED_NODE=#{UIPageCreationWizard.msg.concurrent.error} Duplicated node name
+UIPageCreationWizard.msg.ADD_CONCURRENTLY_REMOVED_PREVIOUS_NODE=#{UIPageCreationWizard.msg.concurrent.error} Node order has been changed
+UIPageCreationWizard.msg.UPDATE_CONCURRENTLY_REMOVED_NODE=#{UIPageCreationWizard.msg.concurrent.error} Navigation has been deleted
 UIPageNodeWizardPreview.action.Finish=Save and Finish
 UIPageNodeWizardPreview.label.nodeName=Node Name
 UIPageNodeWizardPreview.label.nodeLabel=Node Label
@@ -735,6 +746,8 @@
 UIWizardPageSetInfo.label.endPublicationDate=End Publication Date
 UIWizardPageSetInfo.action.Save=#{word.save}
 UIWizardPageSetInfo.msg.null=No page not found.
+UIWizardPageSetInfo.msg.node.deleted=Concurrent modification error : The node you select has been deleted
+UIWizardPageSetInfo.msg.navigation.deleted=Concurrent modification error : Navigation's been deleted, wizard must be closed now
 
   #############################################################################
   #  org.exoplatform.portal.component.customization.UIPageNodeWizardPreview   #
@@ -758,6 +771,8 @@
 UIPortalManagement.msg.Invalid-EditLayout-Permission=You have no right to edit this layout.
 UIPortalManagement.msg.Invalid-EditPage-Permission=You have no right to edit this page.
 UIPortalManagement.msg.Invalid-CreatePage-Permission=You have no right to create new page.
+UIPortalManagement.msg.navigation.deleted=Can't open wizard. Navigation has been deleted
+UIPortalManagement.msg.node.deleted=Can't open wizard. Current node has been deleted
 UIPortalManagement.title.EDIT=Edit current Portal
 UIPortalManagement.title.BROWSE=Manage Portals
 
@@ -1037,8 +1052,25 @@
   ###############################################################################
 UINavigationNodeSelector.msg.systemnode-delete=Cannot delete a system node
 UINavigationNodeSelector.msg.systemnode-move=Cannot cut a system node
-  
+UINavigationNodeSelector.msg.copiedNode.deleted=Bufferred node has been deleted
+UINavigationNodeSelector.msg.staleData=Node has been deleted by other session
+UINavigationNodeSelector.msg.concurrentError=Concurrent modification error :
+UINavigationNodeSelector.msg.reset=Your editor will be reseted now
 
+UINavigationNodeSelector.msg.MOVE_CONCURRENTLY_REMOVED_SRC_NODE=#{UINavigationNodeSelector.msg.concurrentError} Can't move node from removed parent node. #{UINavigationNodeSelector.msg.reset}
+UINavigationNodeSelector.msg.MOVE_CONCURRENTLY_REMOVED_DST_NODE=#{UINavigationNodeSelector.msg.concurrentError} Can't move node to removed node. #{UINavigationNodeSelector.msg.reset}
+UINavigationNodeSelector.msg.MOVE_CONCURRENTLY_REMOVED_MOVED_NODE=#{UINavigationNodeSelector.msg.concurrentError} Can't move removed node. #{UINavigationNodeSelector.msg.reset}
+UINavigationNodeSelector.msg.MOVE_CONCURRENTLY_CHANGED_SRC_NODE=#{UINavigationNodeSelector.msg.concurrentError} Node has been moved before, can't move it now. #{UINavigationNodeSelector.msg.reset} 
+UINavigationNodeSelector.msg.MOVE_CONCURRENTLY_REMOVED_PREVIOUS_NODE=#{UINavigationNodeSelector.msg.concurrentError} Node's order has been changed, can't move node. #{UINavigationNodeSelector.msg.reset}
+UINavigationNodeSelector.msg.MOVE_CONCURRENTLY_DUPLICATE_NAME=#{UINavigationNodeSelector.msg.concurrentError} Duplicate name, can't move node. #{UINavigationNodeSelector.msg.reset}
+UINavigationNodeSelector.msg.ADD_CONCURRENTLY_REMOVED_PARENT_NODE=#{UINavigationNodeSelector.msg.concurrentError} Can't add node to deleted node. #{UINavigationNodeSelector.msg.reset}
+UINavigationNodeSelector.msg.ADD_CONCURRENTLY_ADDED_NODE=#{UINavigationNodeSelector.msg.concurrentError} Duplicate node, can't add node. #{UINavigationNodeSelector.msg.reset}
+UINavigationNodeSelector.msg.ADD_CONCURRENTLY_REMOVED_PREVIOUS_NODE=#{UINavigationNodeSelector.msg.concurrentError} Node's order has been changed, can't add node. #{UINavigationNodeSelector.msg.reset}
+UINavigationNodeSelector.msg.UPDATE_CONCURRENTLY_REMOVED_NODE=#{UINavigationNodeSelector.msg.concurrentError} Can't update deleted node. #{UINavigationNodeSelector.msg.reset}
+UINavigationNodeSelector.msg.RENAME_CONCURRENTLY_REMOVED_NODE=#{UINavigationNodeSelector.msg.concurrentError} Can't rename deleted node. #{UINavigationNodeSelector.msg.reset}
+UINavigationNodeSelector.msg.RENAME_CONCURRENTLY_DUPLICATE_NAME=#{UINavigationNodeSelector.msg.concurrentError} Duplicate name, can't rename node. #{UINavigationNodeSelector.msg.reset}
+UINavigationNodeSelector.msg.NAVIGATION_NO_SITE=This navigation has been deleted by other session. The editor must be closed now
+
   ###############################################################################
   #  org.exoplatform.portal.webui.component.customization.UIEditCurentPage      #
   ###############################################################################
@@ -1264,6 +1296,7 @@
   
 UIPortalNavigation.Label.Next=Next
 UIPortalNavigation.Label.Previous=Previous
+UIPortalNavigation.msg.staleData=Node may be deleted
 
   #############################################################################
   #    org.exoplatform.portal.component.customization.UIDropDownConfigs #

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_es.properties
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_es.properties	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_es.properties	2011-07-18 22:48:36 UTC (rev 6885)
@@ -390,18 +390,18 @@
   #              org.exoplatform.portal.component.customization.UIPageSelector#
   #############################################################################
   
-UIPageSelector2.header.name=Nombre
-UIPageSelector2.header.id=Id de P\u00e1gina
-UIPageSelector2.header.accessGroups=Grupos de Acceso
-UIPageSelector2.header.title=#{word.title}
-UIPageSelector2.header.action=#{word.action}
-UIPageSelector2.label.clearPage=Limpiar P\u00e1gina
-UIPageSelector2.label.createPage=Crear P\u00e1gina
-UIPageSelector2.label.searchandSelectPage=Buscar y Seleccionar P\u00e1gina
-UIPageSelector2.label.currentSelectedPage=Informaci\u00f3n de la P\u00e1gina Seleccionada
-UIPageSelector2.label.title=T\u00edtulo
-UIPageSelector2.label.name=#{word.name}
-UIPageSelector2.label.accessGroups=Grupos de Acceso
+UIPageSelector.header.name=Nombre
+UIPageSelector.header.id=Id de P\u00e1gina
+UIPageSelector.header.accessGroups=Grupos de Acceso
+UIPageSelector.header.title=#{word.title}
+UIPageSelector.header.action=#{word.action}
+UIPageSelector.label.clearPage=Limpiar P\u00e1gina
+UIPageSelector.label.createPage=Crear P\u00e1gina
+UIPageSelector.label.searchandSelectPage=Buscar y Seleccionar P\u00e1gina
+UIPageSelector.label.currentSelectedPage=Informaci\u00f3n de la P\u00e1gina Seleccionada
+UIPageSelector.label.title=T\u00edtulo
+UIPageSelector.label.name=#{word.name}
+UIPageSelector.label.accessGroups=Grupos de Acceso
 UIPageBrowser.msg.NoPermission=No tienes permisos para acceder a esta p\u00e1gina.
 UIPageBrowser.msg.PageNotExist=La p\u00e1gina no existe.
 UIPageBrowser.msg.UserNotPermission=No tienes permisos para acceder a la p\u00e1gina del nodo.
@@ -512,7 +512,7 @@
 UIPageNodeForm.Icon.title.SetDefault=Obtener el por Defecto
 UIPageNodeForm.tab.label.PageNodeSetting=Ajustes de Nodo de P\u00e1gina
 UIPageNodeForm.tab.label.Icon=#{word.icon}
-UIPageNodeForm.tab.label.UIPageSelector2=Selector P\u00e1gina
+UIPageNodeForm.tab.label.UIPageSelector=Selector P\u00e1gina
 
 
   #############################################################################

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_fr.properties
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_fr.properties	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_fr.properties	2011-07-18 22:48:36 UTC (rev 6885)
@@ -381,18 +381,18 @@
   #              org.exoplatform.portal.component.customization.UIPageSelector#
   #############################################################################
   
-UIPageSelector2.header.name=Nom
-UIPageSelector2.header.id=Id Page
-UIPageSelector2.header.accessGroups=Groupe d'accès
-UIPageSelector2.header.title=#{word.title}
-UIPageSelector2.header.action=#{word.action}
-UIPageSelector2.label.searchandSelectPage=Recherche et Sélection d'une Page
-UIPageSelector2.label.currentSelectedPage=Information sur la page sélectionnée
-UIPageSelector2.label.title=Titre
-UIPageSelector2.label.name=#{word.name}
-UIPageSelector2.label.accessGroups=Groupes
-UIPageSelector2.label.createPage=Créer Page
-UIPageSelector2.label.clearPage=Clear Page
+UIPageSelector.header.name=Nom
+UIPageSelector.header.id=Id Page
+UIPageSelector.header.accessGroups=Groupe d'accès
+UIPageSelector.header.title=#{word.title}
+UIPageSelector.header.action=#{word.action}
+UIPageSelector.label.searchandSelectPage=Recherche et Sélection d'une Page
+UIPageSelector.label.currentSelectedPage=Information sur la page sélectionnée
+UIPageSelector.label.title=Titre
+UIPageSelector.label.name=#{word.name}
+UIPageSelector.label.accessGroups=Groupes
+UIPageSelector.label.createPage=Créer Page
+UIPageSelector.label.clearPage=Clear Page
 UIPageBrowser.msg.NoPermission=Vous n'avez pas les droits d'accès à cette page!
 UIPageBrowser.msg.PageNotExist=La page n'existe pas
 UIPageBrowser.msg.UserNotPermission=Vous n'avez pas les droits d'accès à ce noeud de page!
@@ -501,7 +501,7 @@
 UIPageNodeForm.Icon.title.SetDefault=Valeur par défaut
 UIPageNodeForm.tab.label.PageNodeSetting=Configuration du noeud
 UIPageNodeForm.tab.label.Icon=#{word.icon}
-UIPageNodeForm.tab.label.UIPageSelector2=Sélecteur de page
+UIPageNodeForm.tab.label.UIPageSelector=Sélecteur de page
 
 
   #############################################################################
@@ -509,10 +509,16 @@
   #############################################################################
   
 UIPageBrowse.deletePage=Confirmez-vous la suppression de cette page ?
-UIPageSearch.label.option.ownerType=Type de propriétaire
-UIPageSearch.label.option.ownerId=Propriétaire
-UIPageSearch.label.option.name=Nom
-UIPageSearch.label.option.title=#{word.title}
+UIPageSearchForm.label.QuickSearch=Rechercher
+UIPageSearchForm.label.siteName=Nom du site
+UIPageSearchForm.label.pageTitle=Titre
+UIPageSearchForm.label.searchOption=Type
+UIPageSearchForm.label.option.ownerType=Type de propriétaire
+UIPageSearchForm.label.option.ownerId=Propriétaire
+UIPageSearchForm.label.option.name=Nom
+UIPageSearchForm.label.option.title=#{word.title}
+UIPageSearchForm.label.option.portal=portail
+UIPageSearchForm.label.option.group=groupe
 
   #############################################################################
   #    org.exoplatform.portal.component.customization.UIPageNavigationForm    #

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_it.properties
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_it.properties	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_it.properties	2011-07-18 22:48:36 UTC (rev 6885)
@@ -408,18 +408,18 @@
   #              org.exoplatform.portal.component.customization.UIPageSelector#
   #############################################################################
   
-UIPageSelector2.header.name=Nome
-UIPageSelector2.header.id=Id della Pagina
-UIPageSelector2.header.accessGroups=Accesso ai Gruppi
-UIPageSelector2.header.title=#{word.title}
-UIPageSelector2.header.action=#{word.action}
-UIPageSelector2.label.clearPage=Azzera la pagina
-UIPageSelector2.label.createPage=Crea la Pagina
-UIPageSelector2.label.searchandSelectPage=Ricerca e seleziona la Pagina
-UIPageSelector2.label.currentSelectedPage=Info sulla Pagina selezionata
-UIPageSelector2.label.title=Titolo
-UIPageSelector2.label.name=#{word.name}
-UIPageSelector2.label.accessGroups=Accesso ai Gruppi
+UIPageSelector.header.name=Nome
+UIPageSelector.header.id=Id della Pagina
+UIPageSelector.header.accessGroups=Accesso ai Gruppi
+UIPageSelector.header.title=#{word.title}
+UIPageSelector.header.action=#{word.action}
+UIPageSelector.label.clearPage=Azzera la pagina
+UIPageSelector.label.createPage=Crea la Pagina
+UIPageSelector.label.searchandSelectPage=Ricerca e seleziona la Pagina
+UIPageSelector.label.currentSelectedPage=Info sulla Pagina selezionata
+UIPageSelector.label.title=Titolo
+UIPageSelector.label.name=#{word.name}
+UIPageSelector.label.accessGroups=Accesso ai Gruppi
 UIPageBrowser.msg.NoPermission=Non hai i permessi per accedere alla pagina.
 UIPageBrowser.msg.PageNotExist=La pagina non esiste.
 UIPageBrowser.msg.UserNotPermission=Non hai i permessi per accedere al nodo della pagina.
@@ -542,7 +542,7 @@
 UIPageNodeForm.Icon.title.SetDefault=Ottieno il Default
 UIPageNodeForm.tab.label.PageNodeSetting=Preferenze del Nodo della Pagina
 UIPageNodeForm.tab.label.Icon=#{word.icon}
-UIPageNodeForm.tab.label.UIPageSelector2=Selettore della Pagina
+UIPageNodeForm.tab.label.UIPageSelector=Selettore della Pagina
 UIPageNodeForm.action.Save=#{word.save}
 UIPageNodeForm.action.Back=#{word.back}
 

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ja.properties
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ja.properties	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ja.properties	2011-07-18 22:48:36 UTC (rev 6885)
@@ -393,18 +393,18 @@
   #              org.exoplatform.portal.component.customization.UIPageSelector#
   #############################################################################
   
-UIPageSelector2.header.name=\u540d\u524d
-UIPageSelector2.header.id=\u30da\u30fc\u30b8ID
-UIPageSelector2.header.accessGroups=\u30b0\u30eb\u30fc\u30d7\u306b\u30a2\u30af\u30bb\u30b9
-UIPageSelector2.header.title=#{word.title}
-UIPageSelector2.header.action=#{word.action}
-UIPageSelector2.label.clearPage=\u30da\u30fc\u30b8\u3092\u30af\u30ea\u30a2
-UIPageSelector2.label.createPage=\u30da\u30fc\u30b8\u3092\u4f5c\u6210 
-UIPageSelector2.label.searchandSelectPage=\u30da\u30fc\u30b8\u3092\u691c\u7d22\u3057\u5909\u66f4
-UIPageSelector2.label.currentSelectedPage=\u9078\u629e\u3057\u305f\u30da\u30fc\u30b8\u60c5\u5831
-UIPageSelector2.label.title=\u30bf\u30a4\u30c8\u30eb
-UIPageSelector2.label.name=#{word.name}
-UIPageSelector2.label.accessGroups=\u30b0\u30eb\u30fc\u30d7\u306b\u30a2\u30af\u30bb\u30b9
+UIPageSelector.header.name=\u540d\u524d
+UIPageSelector.header.id=\u30da\u30fc\u30b8ID
+UIPageSelector.header.accessGroups=\u30b0\u30eb\u30fc\u30d7\u306b\u30a2\u30af\u30bb\u30b9
+UIPageSelector.header.title=#{word.title}
+UIPageSelector.header.action=#{word.action}
+UIPageSelector.label.clearPage=\u30da\u30fc\u30b8\u3092\u30af\u30ea\u30a2
+UIPageSelector.label.createPage=\u30da\u30fc\u30b8\u3092\u4f5c\u6210 
+UIPageSelector.label.searchandSelectPage=\u30da\u30fc\u30b8\u3092\u691c\u7d22\u3057\u5909\u66f4
+UIPageSelector.label.currentSelectedPage=\u9078\u629e\u3057\u305f\u30da\u30fc\u30b8\u60c5\u5831
+UIPageSelector.label.title=\u30bf\u30a4\u30c8\u30eb
+UIPageSelector.label.name=#{word.name}
+UIPageSelector.label.accessGroups=\u30b0\u30eb\u30fc\u30d7\u306b\u30a2\u30af\u30bb\u30b9
 UIPageBrowser.msg.NoPermission=\u3053\u306e\u30da\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u304c\u3042\u308a\u307e\u305b\u3093\u3002
 UIPageBrowser.msg.PageNotExist=\u30da\u30fc\u30b8 \u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002
 UIPageBrowser.msg.UserNotPermission=\u305d\u306e\u30ce\u30fc\u30c9\u306e\u30da\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u304c\u3042\u308a\u307e\u305b\u3093\u3002
@@ -515,7 +515,7 @@
 UIPageNodeForm.Icon.title.SetDefault=\u30c7\u30d5\u30a9\u30eb\u30c8
 UIPageNodeForm.tab.label.PageNodeSetting=\u30da\u30fc\u30b8\u30ce\u30fc\u30c9\u8a2d\u5b9a
 UIPageNodeForm.tab.label.Icon=#{word.icon}
-UIPageNodeForm.tab.label.UIPageSelector2=\u30da\u30fc\u30b8\u9078\u629e
+UIPageNodeForm.tab.label.UIPageSelector=\u30da\u30fc\u30b8\u9078\u629e
 
 
   #############################################################################

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ko.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ko.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ko.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -614,7 +614,7 @@
          <done>완료</done>
       </action>
    </UIGroupSelector>
-   <UIPageSelector2>
+   <UIPageSelector>
       <header>
          <name>이름</name>
          <id>페이지 아이디</id>
@@ -631,7 +631,7 @@
          <name>#{word.name}</name>
          <accessGroups>액세스 그룹</accessGroups>
       </label>
-   </UIPageSelector2>
+   </UIPageSelector>
    <UIPageBrowser>
       <msg>
          <NoPermission>이 페이지의 액세스 권한이 없습니다.</NoPermission>
@@ -814,7 +814,7 @@
          <label>
             <PageNodeSetting>페이지 노드 설정</PageNodeSetting>
             <Icon>#{word.icon}</Icon>
-            <UIPageSelector2>페이지 선택기</UIPageSelector2>
+            <UIPageSelector>페이지 선택기</UIPageSelector>
          </label>
       </tab>
    </UIPageNodeForm>

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ne.properties
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ne.properties	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ne.properties	2011-07-18 22:48:36 UTC (rev 6885)
@@ -392,18 +392,18 @@
   #              org.exoplatform.portal.component.customization.UIPageSelector#
   #############################################################################
   
-UIPageSelector2.header.name=\u0928\u093e\u092e 
-UIPageSelector2.header.id=\u092a\u0947\u091c Id
-UIPageSelector2.header.accessGroups=\u0905\u0928\u0941\u092e\u0924\u0940 \u092a\u093e\u0909\u0928\u0947 \u0938\u092e\u0941\u0939\u0939\u0930\u0941 
-UIPageSelector2.header.title=#{word.title}
-UIPageSelector2.header.action=#{word.action}
-UIPageSelector2.label.clearPage=\u092a\u0947\u091c \u0916\u093e\u0932\u0940 \u0917\u0930\u094d\u0928\u0941\u0939\u094b\u0938\u094d 
-UIPageSelector2.label.createPage=\u092a\u0947\u091c \u092c\u0928\u093e\u0909\u0928\u0941\u0939\u094b\u0938\u094d 
-UIPageSelector2.label.searchandSelectPage=\u0916\u094b\u091c\u0947\u0930 \u092a\u0947\u091c \u091b\u0928\u094c\u091f \u0917\u0930\u094d\u0928\u0941\u0939\u094b\u0938\u094d 
-UIPageSelector2.label.currentSelectedPage=\u091b\u0928\u094c\u091f \u0917\u0930\u093f\u090f\u0915\u094b \u092a\u0947\u091c\u0915\u094b \u092a\u0930\u093f\u091a\u092f 
-UIPageSelector2.label.title=\u0936\u093f\u0930\u094d\u0937\u0915
-UIPageSelector2.label.name=#{word.name}
-UIPageSelector2.label.accessGroups=\u0905\u0928\u0941\u092e\u0924\u0940 \u092a\u093e\u0909\u0928\u0947 \u0938\u092e\u0941\u0939\u0939\u0930\u0941 
+UIPageSelector.header.name=\u0928\u093e\u092e 
+UIPageSelector.header.id=\u092a\u0947\u091c Id
+UIPageSelector.header.accessGroups=\u0905\u0928\u0941\u092e\u0924\u0940 \u092a\u093e\u0909\u0928\u0947 \u0938\u092e\u0941\u0939\u0939\u0930\u0941 
+UIPageSelector.header.title=#{word.title}
+UIPageSelector.header.action=#{word.action}
+UIPageSelector.label.clearPage=\u092a\u0947\u091c \u0916\u093e\u0932\u0940 \u0917\u0930\u094d\u0928\u0941\u0939\u094b\u0938\u094d 
+UIPageSelector.label.createPage=\u092a\u0947\u091c \u092c\u0928\u093e\u0909\u0928\u0941\u0939\u094b\u0938\u094d 
+UIPageSelector.label.searchandSelectPage=\u0916\u094b\u091c\u0947\u0930 \u092a\u0947\u091c \u091b\u0928\u094c\u091f \u0917\u0930\u094d\u0928\u0941\u0939\u094b\u0938\u094d 
+UIPageSelector.label.currentSelectedPage=\u091b\u0928\u094c\u091f \u0917\u0930\u093f\u090f\u0915\u094b \u092a\u0947\u091c\u0915\u094b \u092a\u0930\u093f\u091a\u092f 
+UIPageSelector.label.title=\u0936\u093f\u0930\u094d\u0937\u0915
+UIPageSelector.label.name=#{word.name}
+UIPageSelector.label.accessGroups=\u0905\u0928\u0941\u092e\u0924\u0940 \u092a\u093e\u0909\u0928\u0947 \u0938\u092e\u0941\u0939\u0939\u0930\u0941 
 UIPageBrowser.msg.NoPermission=\u0924\u092a\u093e\u0908\u0902\u0932\u093e\u0908 \u092f\u094b \u092a\u0947\u091c \u0939\u0947\u0930\u094d\u0928\u0947 \u0905\u0928\u0941\u092e\u0924\u0940 \u091b\u0948\u0928\u0964
 UIPageBrowser.msg.PageNotExist=\u092a\u0947\u091c \u0909\u092a\u0932\u092c\u094d\u0927 \u091b\u0948\u0928\u0964 
 UIPageBrowser.msg.UserNotPermission=\u0924\u092a\u093e\u0908\u0902\u0932\u093e\u0908 \u092f\u094b \u0928\u094b\u0921\u0915\u094b \u092a\u0947\u091c \u0939\u0947\u0930\u094d\u0928\u0947 \u0905\u0928\u0941\u092e\u0924\u0940 \u091b\u0948\u0928\u0964 
@@ -514,7 +514,7 @@
 UIPageNodeForm.Icon.title.SetDefault=\u0921\u093f\u092b\u094c\u0932\u094d\u091f \u092a\u093e\u0909\u0928\u0941\u0939\u094b\u0938\u094d 
 UIPageNodeForm.tab.label.PageNodeSetting=\u092a\u0947\u091c \u0928\u094b\u0921 \u0935\u094d\u092f\u0935\u0938\u094d\u0925\u093e\u092a\u0928
 UIPageNodeForm.tab.label.Icon=#{word.icon}
-UIPageNodeForm.tab.label.UIPageSelector2=\u092a\u0947\u091c\u0915\u094b \u091b\u0928\u094c\u091f\u094d\u0915\u0930\u094d\u0924\u093e 
+UIPageNodeForm.tab.label.UIPageSelector=\u092a\u0947\u091c\u0915\u094b \u091b\u0928\u094c\u091f\u094d\u0915\u0930\u094d\u0924\u093e 
 
   #############################################################################
   #              org.exoplatform.portal.component.customization.UIPageBrowser #

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_nl.properties
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_nl.properties	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_nl.properties	2011-07-18 22:48:36 UTC (rev 6885)
@@ -392,18 +392,18 @@
 #              org.exoplatform.portal.component.customization.UIPageSelector#
 #############################################################################
 
-UIPageSelector2.header.name=#{word.name}:
-UIPageSelector2.header.id=Page Id
-UIPageSelector2.header.accessGroups=Toegang groepen
-UIPageSelector2.header.title=#{word.title}
-UIPageSelector2.header.action=#{word.action}
-UIPageSelector2.label.clearPage=Wis pagina
-UIPageSelector2.label.createPage=Cre\u00EBer pagina
-UIPageSelector2.label.searchandSelectPage=Zoek en selecteer pagina
-UIPageSelector2.label.currentSelectedPage=Geselecteerde pagina informatie
-UIPageSelector2.label.title=#{word.title}
-UIPageSelector2.label.name=#{word.name}
-UIPageSelector2.label.accessGroups=Toegang groepen
+UIPageSelector.header.name=#{word.name}:
+UIPageSelector.header.id=Page Id
+UIPageSelector.header.accessGroups=Toegang groepen
+UIPageSelector.header.title=#{word.title}
+UIPageSelector.header.action=#{word.action}
+UIPageSelector.label.clearPage=Wis pagina
+UIPageSelector.label.createPage=Cre\u00EBer pagina
+UIPageSelector.label.searchandSelectPage=Zoek en selecteer pagina
+UIPageSelector.label.currentSelectedPage=Geselecteerde pagina informatie
+UIPageSelector.label.title=#{word.title}
+UIPageSelector.label.name=#{word.name}
+UIPageSelector.label.accessGroups=Toegang groepen
 UIPageBrowser.msg.NoPermission=U heeft geen permissies om deze pagina te bezoeken.
 UIPageBrowser.msg.PageNotExist=Pagina bestaat niet.
 UIPageBrowser.msg.UserNotPermission=U heeft geen permissie op deze node van de pagina.
@@ -514,7 +514,7 @@
 UIPageNodeForm.Icon.title.SetDefault=Standaard
 UIPageNodeForm.tab.label.PageNodeSetting=Pagina node instellingen
 UIPageNodeForm.tab.label.Icon=#{word.icon}
-UIPageNodeForm.tab.label.UIPageSelector2=Pagina selecteur
+UIPageNodeForm.tab.label.UIPageSelector=Pagina selecteur
 
 
 #############################################################################

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_pt_BR.properties
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_pt_BR.properties	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_pt_BR.properties	2011-07-18 22:48:36 UTC (rev 6885)
@@ -388,18 +388,18 @@
   #              org.exoplatform.portal.component.customization.UIPageSelector#
   #############################################################################
   
-UIPageSelector2.header.name=Nome
-UIPageSelector2.header.id=Id de Página
-UIPageSelector2.header.accessGroups=Grupos de Acesso
-UIPageSelector2.header.title=#{word.title}
-UIPageSelector2.header.action=#{word.action}
-UIPageSelector2.label.clearPage=Limpar Página
-UIPageSelector2.label.createPage=Criar Página
-UIPageSelector2.label.searchandSelectPage=Selecionar Página
-UIPageSelector2.label.currentSelectedPage=Informações da Página
-UIPageSelector2.label.title=Título
-UIPageSelector2.label.name=#{word.name}
-UIPageSelector2.label.accessGroups=Grupos de Acesso
+UIPageSelector.header.name=Nome
+UIPageSelector.header.id=Id de Página
+UIPageSelector.header.accessGroups=Grupos de Acesso
+UIPageSelector.header.title=#{word.title}
+UIPageSelector.header.action=#{word.action}
+UIPageSelector.label.clearPage=Limpar Página
+UIPageSelector.label.createPage=Criar Página
+UIPageSelector.label.searchandSelectPage=Selecionar Página
+UIPageSelector.label.currentSelectedPage=Informações da Página
+UIPageSelector.label.title=Título
+UIPageSelector.label.name=#{word.name}
+UIPageSelector.label.accessGroups=Grupos de Acesso
 UIPageBrowser.msg.NoPermission=Usuário sem permissão para acessar essa página.
 UIPageBrowser.msg.PageNotExist=Página não existente.
 UIPageBrowser.msg.UserNotPermission=Usuário sem permissão para acessar o nodo dessa página.
@@ -510,7 +510,7 @@
 UIPageNodeForm.Icon.title.SetDefault=Usar padrão
 UIPageNodeForm.tab.label.PageNodeSetting=Configurações de Nodo
 UIPageNodeForm.tab.label.Icon=#{word.icon}
-UIPageNodeForm.tab.label.UIPageSelector2=Seletor de Página
+UIPageNodeForm.tab.label.UIPageSelector=Seletor de Página
 
 
   #############################################################################

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ru.properties
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ru.properties	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_ru.properties	2011-07-18 22:48:36 UTC (rev 6885)
@@ -376,18 +376,18 @@
   #              org.exoplatform.portal.component.customization.UIPageSelector#
   #############################################################################
   
-UIPageSelector2.header.name=Название
-UIPageSelector2.header.id=Идентификатор страницы
-UIPageSelector2.header.accessGroups=Группы доступа
-UIPageSelector2.header.title=#{word.title}
-UIPageSelector2.header.action=#{word.action}
-UIPageSelector2.label.clearPage=Очистить страницу
-UIPageSelector2.label.createPage=Создать страницу
-UIPageSelector2.label.searchandSelectPage=Поиск и выбор страницы
-UIPageSelector2.label.currentSelectedPage=Информация о выбранной странице
-UIPageSelector2.label.title=Заголовок
-UIPageSelector2.label.name=#{word.name}
-UIPageSelector2.label.accessGroups=Группы доступа
+UIPageSelector.header.name=Название
+UIPageSelector.header.id=Идентификатор страницы
+UIPageSelector.header.accessGroups=Группы доступа
+UIPageSelector.header.title=#{word.title}
+UIPageSelector.header.action=#{word.action}
+UIPageSelector.label.clearPage=Очистить страницу
+UIPageSelector.label.createPage=Создать страницу
+UIPageSelector.label.searchandSelectPage=Поиск и выбор страницы
+UIPageSelector.label.currentSelectedPage=Информация о выбранной странице
+UIPageSelector.label.title=Заголовок
+UIPageSelector.label.name=#{word.name}
+UIPageSelector.label.accessGroups=Группы доступа
 UIPageBrowser.msg.NoPermission=У Вас нету прав доступа к этой странице.
 UIPageBrowser.msg.PageNotExist=Страница не существует.
 UIPageBrowser.msg.UserNotPermission=У Вас нету прав для доступа к страницам узла.
@@ -498,7 +498,7 @@
 UIPageNodeForm.Icon.title.SetDefault=По умолчанию
 UIPageNodeForm.tab.label.PageNodeSetting=Настройки узла страницы
 UIPageNodeForm.tab.label.Icon=#{word.icon}
-UIPageNodeForm.tab.label.UIPageSelector2=Страницы
+UIPageNodeForm.tab.label.UIPageSelector=Страницы
 
 
   #############################################################################

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_uk.properties
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_uk.properties	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_uk.properties	2011-07-18 22:48:36 UTC (rev 6885)
@@ -367,18 +367,18 @@
   #              org.exoplatform.portal.component.customization.UIPageSelector#
   #############################################################################
   
-UIPageSelector2.header.name=Назва
-UIPageSelector2.header.id=Id сторінки
-UIPageSelector2.header.accessGroups=Привілейовані групи
-UIPageSelector2.header.title=#{word.title}
-UIPageSelector2.header.action=#{word.action}
-UIPageSelector2.label.clearPage=Почистити сторінку
-UIPageSelector2.label.createPage=Створити сторінку
-UIPageSelector2.label.searchandSelectPage=Пошук і вибір сторінки
-UIPageSelector2.label.currentSelectedPage=Інформація вибраної сторінки
-UIPageSelector2.label.title=Назва
-UIPageSelector2.label.name=#{word.name}
-UIPageSelector2.label.accessGroups=Привілейовані групи
+UIPageSelector.header.name=Назва
+UIPageSelector.header.id=Id сторінки
+UIPageSelector.header.accessGroups=Привілейовані групи
+UIPageSelector.header.title=#{word.title}
+UIPageSelector.header.action=#{word.action}
+UIPageSelector.label.clearPage=Почистити сторінку
+UIPageSelector.label.createPage=Створити сторінку
+UIPageSelector.label.searchandSelectPage=Пошук і вибір сторінки
+UIPageSelector.label.currentSelectedPage=Інформація вибраної сторінки
+UIPageSelector.label.title=Назва
+UIPageSelector.label.name=#{word.name}
+UIPageSelector.label.accessGroups=Привілейовані групи
 UIPageBrowser.msg.NoPermission=У Вас недостатньо прав для доступу на цю сторінку.
 UIPageBrowser.msg.PageNotExist=Сторінка не існує.
 UIPageBrowser.msg.UserNotPermission=У Вас недостатньо прав для доступу на вузлову сторінку.
@@ -489,7 +489,7 @@
 UIPageNodeForm.Icon.title.SetDefault=Взяти за замовчуванням
 UIPageNodeForm.tab.label.PageNodeSetting=Встановлення вузлової сторінки
 UIPageNodeForm.tab.label.Icon=#{word.icon}
-UIPageNodeForm.tab.label.UIPageSelector2=Селектор сторінок
+UIPageNodeForm.tab.label.UIPageSelector=Селектор сторінок
 
 
   #############################################################################

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_vi.properties
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_vi.properties	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_vi.properties	2011-07-18 22:48:36 UTC (rev 6885)
@@ -377,18 +377,18 @@
   #              org.exoplatform.portal.component.customization.UIPageSelector#
   #############################################################################
   
-UIPageSelector2.header.name=Tên trang
-UIPageSelector2.header.id=Mã trang
-UIPageSelector2.header.accessGroups=Các nhóm truy nhập
-UIPageSelector2.header.title=#{word.title}
-UIPageSelector2.header.action=#{word.action}
-UIPageSelector2.label.clearPage=Xóa trang
-UIPageSelector2.label.createPage=Tạo trang
-UIPageSelector2.label.searchandSelectPage=Tìm kiếm và chọn trang
-UIPageSelector2.label.currentSelectedPage=Thông tin về trang bạn vừa chọn
-UIPageSelector2.label.title=Tiêu đề trang
-UIPageSelector2.label.name=#{word.name}
-UIPageSelector2.label.accessGroups=Các nhóm truy nhập
+UIPageSelector.header.name=Tên trang
+UIPageSelector.header.id=Mã trang
+UIPageSelector.header.accessGroups=Các nhóm truy nhập
+UIPageSelector.header.title=#{word.title}
+UIPageSelector.header.action=#{word.action}
+UIPageSelector.label.clearPage=Xóa trang
+UIPageSelector.label.createPage=Tạo trang
+UIPageSelector.label.searchandSelectPage=Tìm kiếm và chọn trang
+UIPageSelector.label.currentSelectedPage=Thông tin về trang bạn vừa chọn
+UIPageSelector.label.title=Tiêu đề trang
+UIPageSelector.label.name=#{word.name}
+UIPageSelector.label.accessGroups=Các nhóm truy nhập
 UIPageBrowser.msg.NoPermission=Trang này không tồn tại hoặc bạn không được phân quyền để truy cập!
 UIPageBrowser.msg.PageNotExist=Trang này không tồn tại!
 UIPageBrowser.msg.UserNotPermission=Bạn không được phép truy cập vào trang này!
@@ -504,7 +504,7 @@
 UIPageNodeForm.Icon.title.SetDefault=Lấy mặc định
 UIPageNodeForm.tab.label.PageNodeSetting=Cấu hình node
 UIPageNodeForm.tab.label.Icon=#{word.icon}
-UIPageNodeForm.tab.label.UIPageSelector2=Tùy chọn trang
+UIPageNodeForm.tab.label.UIPageSelector=Tùy chọn trang
 UIPageNodeForm.action.Save=#{word.save}
 UIPageNodeForm.action.Back=#{word.back}
 
@@ -514,10 +514,16 @@
   #############################################################################
   
 UIPageBrowse.deletePage=Bạn có muốn xóa trang này không?
-UIPageSearch.label.option.ownerType=Kiểu người sở hữu
-UIPageSearch.label.option.ownerId=Mã người sở hữu
-UIPageSearch.label.option.name=Tên
-UIPageSearch.label.option.title=#{word.title}
+UIPageSearchForm.label.QuickSearch=Tìm kiếm
+UIPageSearchForm.label.siteName=Tên Site
+UIPageSearchForm.label.pageTitle=Tiêu đề trang
+UIPageSearchForm.label.searchOption=Loại
+UIPageSearchForm.label.option.ownerType=Kiểu người sở hữu
+UIPageSearchForm.label.option.ownerId=Mã người sở hữu
+UIPageSearchForm.label.option.name=Tên
+UIPageSearchForm.label.option.title=#{word.title}
+UIPageSearchForm.label.option.portal=portal
+UIPageSearchForm.label.option.group=group
 
   #############################################################################
   #    org.exoplatform.portal.component.customization.UIPageNavigationForm    #

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_zh.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_zh.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_zh.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -575,7 +575,7 @@
          <done>完成</done>
       </action>
    </UIGroupSelector>
-   <UIPageSelector2>
+   <UIPageSelector>
       <header>
          <name>名称</name>
          <id>页面Id</id>
@@ -592,7 +592,7 @@
          <name>#{word.name}</name>
          <accessGroups>访问组</accessGroups>
       </label>
-   </UIPageSelector2>
+   </UIPageSelector>
    <UIPageBrowser>
       <msg>
          <NoPermission>您无权访问这个页面。</NoPermission>
@@ -770,7 +770,7 @@
          <label>
             <PageNodeSetting>页面节点设置</PageNodeSetting>
             <Icon>#{word.icon}</Icon>
-            <UIPageSelector2>页面选择器</UIPageSelector2>
+            <UIPageSelector>页面选择器</UIPageSelector>
          </label>
       </tab>
    </UIPageNodeForm>

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_zh_TW.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_zh_TW.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/classes/locale/portal/webui_zh_TW.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -719,7 +719,7 @@
          <done>完成</done>
       </action>
    </UIGroupSelector>
-   <UIPageSelector2>
+   <UIPageSelector>
       <header>
          <name>名稱</name>
          <id>頁面Id</id>
@@ -736,7 +736,7 @@
          <name>#{word.name}</name>
          <accessGroups>使用群組</accessGroups>
       </label>
-   </UIPageSelector2>
+   </UIPageSelector>
    <UIPageBrowser>
       <msg>
          <NoPermission>您無權使用這個頁面。</NoPermission>
@@ -915,7 +915,7 @@
          <label>
             <PageNodeSetting>頁面節點設定</PageNodeSetting>
             <Icon>#{word.icon}</Icon>
-            <UIPageSelector2>頁面選擇器</UIPageSelector2>
+            <UIPageSelector>頁面選擇器</UIPageSelector>
          </label>
       </tab>
    </UIPageNodeForm>

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/conf/portal/portal/classic/navigation.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/conf/portal/portal/classic/navigation.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/conf/portal/portal/classic/navigation.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -27,34 +27,29 @@
   <priority>1</priority>
   <page-nodes>
 	  <node>
-	    <uri>home</uri>
 	    <name>home</name>
 	    <label>#{portal.classic.home}</label>
 	    <page-reference>portal::classic::homepage</page-reference>	    
 	  </node>   
     <node>
-      <uri>sitemap</uri>
       <name>sitemap</name>
       <label>#{portal.classic.sitemap}</label>
       <visibility>DISPLAYED</visibility>
       <page-reference>portal::classic::sitemap</page-reference>
     </node>
 	  <node>
-	    <uri>groupnavigation</uri>
 	    <name>groupnavigation</name>
 	    <label>#{portal.classic.groupnavigation}</label>
       <visibility>SYSTEM</visibility>
 	    <page-reference>portal::classic::groupnavigation</page-reference>
 	  </node>
 	  <node>
-	    <uri>portalnavigation</uri>
 	    <name>portalnavigation</name>
 	    <label>#{portal.classic.portalnavigation}</label>
       <visibility>SYSTEM</visibility>
 	    <page-reference>portal::classic::portalnavigation</page-reference>
 	  </node>
 	  <node>
-	    <uri>register</uri>
 	    <name>register</name>
 	    <label>#{portal.classic.register}</label>
       <visibility>SYSTEM</visibility>
@@ -63,7 +58,6 @@
 	  
 	  <!-- NOT FOUND node -->
 	  <node>
-	    <uri>notfound</uri>
 	    <name>notfound</name>
 	    <label>NotFound</label>
       <visibility>SYSTEM</visibility>

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/conf/portal/portal-configuration.xml
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/conf/portal/portal-configuration.xml	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/WEB-INF/conf/portal/portal-configuration.xml	2011-07-18 22:48:36 UTC (rev 6885)
@@ -94,6 +94,11 @@
   </component>
   
   <component>
+    <key>org.exoplatform.portal.mop.navigation.NavigationService</key>
+    <type>org.exoplatform.portal.mop.navigation.NavigationServiceWrapper</type>
+  </component>
+
+  <component>
     <key>org.exoplatform.portal.config.UserPortalConfigService</key>
     <type>org.exoplatform.portal.config.UserPortalConfigService</type>
     <component-plugins>           
@@ -331,6 +336,55 @@
         </object-param>
       </init-params>
     </component-plugin>
+    <component-plugin>
+      <name>addExoCacheConfig</name>
+      <set-method>addExoCacheConfig</set-method>
+      <type>org.exoplatform.services.cache.ExoCacheConfigPlugin</type>
+      <description>add Exo Cache Config</description>
+      <init-params>
+        <object-param>
+          <name>cache.config.NavigationService</name>
+          <description>The JBoss Cache configuration for the navigation service</description>
+          <object type="org.exoplatform.services.cache.ExoCacheConfig">
+            <field name="name">
+              <string>NavigationService</string>
+            </field>
+            <field name="maxSize">
+              <int>5000</int>
+            </field>
+            <field name="liveTime">
+              <long>600</long>
+            </field>
+          </object>
+        </object-param>
+      </init-params>
+    </component-plugin>
+    <component-plugin profiles="cluster">
+      <name>addExoCacheConfig</name>
+      <set-method>addExoCacheConfig</set-method>
+      <type>org.exoplatform.services.cache.ExoCacheConfigPlugin</type>
+      <description>add Exo Cache Config</description>
+      <init-params>
+        <object-param>
+          <name>cache.config.NavigationService</name>
+          <description>The JBoss Cache configuration for the navigation service</description>
+          <object type="org.exoplatform.services.cache.impl.jboss.ea.EAExoCacheConfig">
+            <field name="name">
+              <string>NavigationService</string>
+            </field>
+            <field name="expirationTimeout">
+              <long>600000</long>
+            </field>
+            <field name="maxNodes">
+             <int>5000</int>
+            </field>
+            <field name="distributed">
+              <boolean>true</boolean>
+            </field>
+          </object>
+        </object-param>
+      </init-params>
+    </component-plugin>
   </external-component-plugins>
 
 </configuration>

Deleted: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/navigation/UINavigationManagement.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/navigation/UINavigationManagement.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/navigation/UINavigationManagement.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,56 +0,0 @@
-<%  
-  import  org.exoplatform.portal.webui.page.UIPageBrowser;
-  import org.exoplatform.portal.webui.navigation.UINavigationNodeSelector;
-%>
-<div class="UINavigationManagement" id="$uicomponent.id">
-	<div class="TopTitleBar">
-	  <div class="DecoratorBox">
-	    <div class="BarDecorator">
-	      <div class="TopLeftBar">
-	          <div class="TopCenterBar"><span></span></div>
-	      </div>
-	      <div class="MiddleLeftBar">
-	          <div class="MiddleCenterBar" style="background-image: none;">
-	          	<%= uicomponent.getOwner();%>
-	          </div>
-	      </div>
-	      <div class="BottomLeftBar">
-	          <div class="BottomCenterBar"><span></span></div>
-	      </div>
-	    </div>
-	  </div>
-	</div>	
-  <%
-  	uicomponent.renderChild(UINavigationNodeSelector.class);
-  %>
-  <div class="UIAction"> 
-    <table class="ActionContainer">
-	    <tr>
-
-	    	<td>
-		      <div onclick="<%=uicomponent.event("AddRootNode")%>" class="ActionButton LightBlueStyle">
-		        <div class="ButtonLeft">
-		          <div class="ButtonRight">
-		            <div class="ButtonMiddle">
-		              <a href="javascript:void(0);"><%=_ctx.appRes(uicomponent.getId() + ".action.addNode")%></a>
-		            </div>
-		          </div>
-		        </div>
-		      </div>
-		    </td>
-	    	<td>
-		      <div onclick="<%=uicomponent.event("Save")%>" class="ActionButton LightBlueStyle">
-		        <div class="ButtonLeft">
-		          <div class="ButtonRight">
-		            <div class="ButtonMiddle">
-		              <a href="javascript:void(0);"><%=_ctx.appRes(uicomponent.getId() + ".action.Save")%></a>
-		            </div>
-		          </div>
-		        </div>
-		      </div>
-		    </td>
-
-      </tr>
- 	  </table>
-	</div>
-</div>

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/navigation/UINavigationNodeSelector.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/navigation/UINavigationNodeSelector.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/navigation/UINavigationNodeSelector.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -14,10 +14,11 @@
   	
   	JavascriptManager jsmanager = _ctx.getRequestContext().getJavascriptManager();
   	jsmanager.importJavascript('eXo.webui.UIRightClickPopupMenu') ;
+  	def objId = uicomponent.getChild(UITree.class).getParentSelected().getId();
     if(uicomponent.getCopyNode()!= null) {
-      popupMenu = uiPopupMenu.getJSOnclickShowPopup("", "AddNode,PasteNode,EditNavigation,SaveNavigation,DeleteNavigation");
+      popupMenu = uiPopupMenu.getJSOnclickShowPopup(objId, "AddNode,PasteNode,EditNavigation,SaveNavigation,DeleteNavigation");
     } else {
-      popupMenu = uiPopupMenu.getJSOnclickShowPopup("", "AddNode,EditNavigation,SaveNavigation,DeleteNavigation");
+      popupMenu = uiPopupMenu.getJSOnclickShowPopup(objId, "AddNode,EditNavigation,SaveNavigation,DeleteNavigation");
     }
   	jsmanager.addJavascript("eXo.webui.UIRightClickPopupMenu.disableContextMenu('"+id+"') ;");
     uicomponent.renderUIComponent(uiPopupMenu) ;

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/navigation/UIPageNodeSelector.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/navigation/UIPageNodeSelector.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/navigation/UIPageNodeSelector.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -4,8 +4,6 @@
 	import org.exoplatform.webui.core.UIRightClickPopupMenu;
 	import org.exoplatform.web.application.JavascriptManager;
 
-	def selectedNav =	uicomponent.getSelectedNavigation();
-	
 	UIRightClickPopupMenu uiPopupMenu = uicomponent.getChild(UIRightClickPopupMenu.class);
 	String popupMenu = "";
 %>
@@ -16,11 +14,7 @@
 		
 		JavascriptManager jsmanager = _ctx.getRequestContext().getJavascriptManager();
 		jsmanager.importJavascript('eXo.webui.UIRightClickPopupMenu');
-		if(uicomponent.getCopyNode()!= null) {
-			popupMenu = uiPopupMenu.getJSOnclickShowPopup("", "AddNode,PasteNode,EditNavigation,SaveNavigation,DeleteNavigation");
-		} else {
-			popupMenu = uiPopupMenu.getJSOnclickShowPopup("", "AddNode,EditNavigation,SaveNavigation,DeleteNavigation");
-		}
+    popupMenu = uiPopupMenu.getJSOnclickShowPopup("", "AddNode,EditNavigation,SaveNavigation,DeleteNavigation");
 		jsmanager.addJavascript("eXo.webui.UIRightClickPopupMenu.disableContextMenu('"+id+"');");
 		uicomponent.renderUIComponent(uiPopupMenu);
 	 

Copied: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/page/UIPageSearchForm.gtmpl (from rev 6783, portal/trunk/web/portal/src/main/webapp/groovy/portal/webui/page/UIPageSearchForm.gtmpl)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/page/UIPageSearchForm.gtmpl	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/page/UIPageSearchForm.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,35 @@
+<div class="UIPageSearchForm">	
+	<div class="UIBarStyle">
+		<div class="BarStyle2">
+			<div class="LeftBar">
+				<div class="RightBar">
+					<div class="MiddleBar">
+						<div class="UISearchContainer">
+							<%uiform.begin()%>
+							 <%String quickSearchlink = uicomponent.event("QuickSearch") ;%>
+							    <script type="text/javascript">
+									var executeScript = "<%=quickSearchlink%>";
+								</script>
+						      	<div class="QuickSet" onkeypress="eXo.portal.UIPortalControl.onEnterPress(event, executeScript)">
+								
+								<% 
+									QuickSearchInputSet = uiform.getQuickSearchInputSet();
+									for(field in QuickSearchInputSet.getChildren()) {
+								%>
+										<div class="SearchLabel"><%=uiform.getLabel(field.getId())%> </div>
+								<%
+										uiform.renderField(field)
+									}
+								%>
+								<a class="SearchIcon" href="$quickSearchlink" title="<%= _ctx.appRes("UIPageSearchForm.label.QuickSearch") %>">
+									<span></span>
+								</a>
+							  </div>	
+							<%uiform.end()%>	 
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>				
+</div>

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/page/UIPageSelector.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/page/UIPageSelector.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/page/UIPageSelector.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -2,6 +2,7 @@
 	import org.exoplatform.portal.config.model.Page; 
 	import org.exoplatform.webui.core.UIPopupWindow;
 	import org.exoplatform.webui.form.UIForm; 
+	import org.exoplatform.webui.form.UIFormInputSet;
 
 
 	Page page	= uicomponent.getPage();		
@@ -23,8 +24,10 @@
 	
 	def rcontext = _ctx.getRequestContext(); 
 	rcontext.getJavascriptManager().importJavascript('eXo.webui.UIPopupWindow');
+	
+	UIFormInputSet uiform = uicomponent.getChild(UIFormInputSet.class); 
 %>
-<div class="UIPageSelector" id="<%=uicomponent.getId();%>" >
+<div class="UIPageSelector" id="<%=uicomponent.getId();%>">
 	<div class="PageSelectorTitle">
 		<div class="Icon BlueInfoBox16x16Icon"><span></span></div>
 		<div class="Title"><%=_ctx.appRes(uicomponent.getId()+".label.currentSelectedPage")%></div>
@@ -32,21 +35,37 @@
 	</div>
 	<div class="UIFormInfo">
 		<div class="FormInfoBG">
-			<div class="FormInfoIcon">
-				<div class="UIPropertyInfo">
-					<div class="OverflowContainer">
-						<div class="PropertyName"><%=_ctx.appRes(uicomponent.getId()+".header.id")%>:</div>
-						<div class="PropertyValue">$pageId</div>
-					</div>
-					<div class="OverflowContainer">
-						<div class="PropertyName"><%=_ctx.appRes(uicomponent.getId()+".label.name")%>:</div>
-						<div class="PropertyValue">$name</div>
-					</div>
-					<div class="OverflowContainer">
-						<div class="PropertyName"><%=_ctx.appRes(uicomponent.getId()+".label.title")%>:</div>
-						<div class="PropertyValue">$title</div>
-					</div>
-				</div>
+			<div class="FormInfoIcon UIForm">
+				<table class="UIPropertyInfo UIFormGrid">
+					<tr>
+						<td class="FieldLabel"><%=_ctx.appRes(uicomponent.getId()+".header.id")%>:</td>
+						<td class="FieldComponent">
+							<% if(page != null) { %>
+							$pageId
+							<% } %>
+						</td>
+					</tr>
+					<tr>
+						<td class="FieldLabel"><%=_ctx.appRes(uicomponent.getId()+".label.name")%>:</td>
+						<td class="FieldComponent">
+							<% if(page == null) { %>
+							<% uiform.renderChild("pageName");%>
+							<% } else { %>
+							$name
+							<% } %>
+						</td>
+					</tr>
+					<tr>
+						<td class="FieldLabel"><%=_ctx.appRes(uicomponent.getId()+".label.title")%>:</td>
+						<td class="FieldComponent">
+							<% if(page == null) { %>
+							<% uiform.renderChild("pageTitle");%>
+							<% } else { %>
+							$title
+							<% } %>
+						</td>
+					</tr>
+				</table>
 			</div>
 		</div>
 	</div>
@@ -55,9 +74,10 @@
 			<tr>
 				<td>
 				 <%
-					String clearPageEvent = "#"; 
+					String clearPageEvent = "javascript:void(0);"; 
 					String css = "FloatBlockHidden ActionButton SimpleStyle"; 
-					def uiForm = uicomponent.getAncestorOfType(UIForm.class); 
+					def uiForm = uicomponent.getAncestorOfType(UIForm.class);
+					createPageEvent = uiForm.event("CreatePage"); 
 					if(page != null) {
 						clearPageEvent = uiForm.event("ClearPage"); 
 						css = "ActionButton SimpleStyle"; 
@@ -73,8 +93,22 @@
 							 	</div>
 							</div>
 						</div>					
+					</div>
+					<% if(page == null) { %>		
+					<div onclick="<%=createPageEvent%>" class="ActionButton SimpleStyle">
+						<div class="ButtonLeft">
+							<div class="ButtonRight">
+								<div class="ButtonMiddle">
+									<div class="GreenPlusPage16x16Icon Icon" title="<%=_ctx.appRes(uicomponent.getId()+".label.createPage")%>">
+										<a href="javascript:void(0);"><%=_ctx.appRes(uicomponent.getId() + ".label.createPage")%></a>
+									</div>
+							 	</div>
+							</div>
+						</div>					
 					</div> 
-					<div class="ActionButton SimpleStyle" onclick="javascript: eXo.webui.UIPopupWindow.show('<%=uicomponent.getChild(UIPopupWindow.class).getId();%>');">
+					<% } %>
+					
+					<div class="ActionButton SimpleStyle" onclick="<%=uicomponent.event("OpenSelectPagePopUp")%>">
 						<div class="ButtonLeft">
 							<div class="ButtonRight">
 								<div class="ButtonMiddle">
@@ -85,6 +119,7 @@
 							</div>
 						</div>
 					</div>
+					
 				</td>
 			</tr>
 		</table>

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/page/UIWizardPageSetInfo.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/page/UIWizardPageSetInfo.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/page/UIWizardPageSetInfo.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,22 +1,21 @@
 <%	
 	import org.exoplatform.portal.webui.navigation.UIPageNodeSelector;
-	import org.exoplatform.portal.config.model.PageNode;
 	import org.exoplatform.webui.core.UIComponent;
-%>
-<%	
-	PageNode pageNode = uicomponent.getSelectedPageNode();
-	String nodeName = ""; 	
-	if(pageNode!=null ) nodeName = "/"+pageNode.getResolvedLabel();
+
+	String nodeName = "/"; 	
 	boolean isNoSelecter = !uicomponent.getChild(UIPageNodeSelector.class).isRendered();
 %>
 <div class="UIWizardPageSetInfo">
 	<%uiform.begin()%>
 	<div class="<%=isNoSelecter ? "NoPageSelecter" : ""%>">
-		<%if(!isNoSelecter) {%>
+  <%if(!isNoSelecter) {
+   	def pageNode = uicomponent.getSelectedPageNode();
+   	if( pageNode!=null && pageNode.getResolvedLabel() != null ) nodeName += pageNode.getResolvedLabel();
+  %>
 		<div class="PageNodeContainer">
 			<% uicomponent.renderChild(UIPageNodeSelector.class); %>
 		</div>
-		<%}%>
+	<%}%>
 		<div class="SelectedPageInfo">
 			<div class="PageInfoContainer">
 				<div class="PageNodeInfo">

Deleted: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/portal/NewUIGroupManagement.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/portal/NewUIGroupManagement.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/portal/webui/portal/NewUIGroupManagement.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,45 +0,0 @@
-<div class="NewUIGroupManagement" id="<%=uicomponent.getId();%>">	
-	<% 
-	import org.exoplatform.portal.config.model.PageNavigation;
-	navigations = uicomponent.getNavigations(); 
-	%>
-		
-	<%/*Begin ItemDetailList:*/%>
-	<div style="margin:0px 0px 0px 0px">																																			
-		<div class="ItemDetailContainer" style="border:1px solid #C7C7C7">
-		<% for(navigation in navigations) { 
-deleteLink = uicomponent.event("DeleteNavigation",String.valueOf(navigation.getId()));
-editLink = uicomponent.event("EditNavigation",String.valueOf(navigation.getId()));%>
-			<div class="ItemDetail" style="width:100%;border-bottom:1px solid #E9E7E7;height:20px;padding-top:5px">
-				<div style="float:left;width:70%;padding-left:10px">
-		 			<%= navigation.getOwnerId() %> 
-				</div>	
-				<div style="float:right;width:29%">
-		 			<a href="<%=editLink%>">Edit Navigation</a> | <a href="<%=deleteLink%>">Delete Navigation</a>
-	 			</div>	
-	 			<div style="clear:both"></div>
-			</div>
-		<% } %>	
-	 			
-		</div>								
-	</div>	
-	<%/*End ItemDetailList*/%>	 
-	<div class="UIAction"> 
-		<table class="ActionContainer">
-			<tr>
-				<td>
-					<div onclick="<%=uicomponent.event("AddNewPortal")%>" class="ActionButton LightBlueStyle">
-						<div class="ButtonLeft">
-							<div class="ButtonRight">
-								<div class="ButtonMiddle">
-									<a href="javascript:void(0);"><%=_ctx.appRes(uicomponent.getId() + ".action.addNewPortal")%></a>
-								</div>
-							</div>
-						</div>
-					</div>
-				</td>
-			</tr>
- 		</table>
-	</div>
-
-</div>
\ No newline at end of file

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/webui/core/UISitemap.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/webui/core/UISitemap.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/webui/core/UISitemap.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,236 +1,7 @@
-<div class="UISitemap">
-	<div class="ClearFix">
-		<div class="CollapseAll FloatLeft">Collapse All</div> 
-		<div class="ExpandAll FloatLeft">Expand All</div>
-	</div>
-	<div class="SitemapContent">
-		<div class="UISiteTree">
-			
-			<div class="Node ClearFix">
-				<div class="ExpandIcon FloatLeft">
-						<a class="NodeIcon DefaultPageIcon" href="#">Home</a>
-				</div>
-			</div>
-			
-			<div class="Node ClearFix">
-				<div class="ExpandIcon FloatLeft">
-						<a class="NodeIcon DefaultPageIcon" href="#">Web Explorer</a>
-				</div>
-			</div>
-			
-			<div class="Node ClearFix">
-				<div class="CollapseIcon FloatLeft">
-						<a class="NodeIcon DefaultPageIcon" href="#">My Link</a>
-				</div>
-												
-				<div class="ChildrenContainer FloatLeft">
-					<div class="Node ClearFix">
-						<div class="ExpandIcon FloatLeft">
-								<a class="NodeIcon DefaultPageIcon" href="#">Blog</a>
-						</div>
-					</div>
-			 		<div class="LastNode Node ClearFix">
-						<div class="CollapseIcon FloatLeft">
-								<a class="NodeIcon DefaultPageIcon" href="#">Facebook</a>
-						</div>
-						
-						<div class="ChildrenContainer FloatLeft">
-							<div class="Node ClearFix">
-								<div class="NullItem">
-									<div class="">
-										<a class="NodeIcon DefaultPageIcon" href="#">Samples link</a>
-									</div>
-								</div>
-							</div>
-							<div class="LastNode Node ClearFix">
-								<div class="NullItem"><a class="NodeIcon DefaultPageIcon" href="#">Samples link</a></div>
-							</div>
-						</div>
-						
-					</div>
-				</div><!--end ChildrenContainer-->
-										
-			</div><!--end Node-->
-			
-			<div class="Node ClearFix">
-				<div class="ExpandIcon FloatLeft"><a class="NodeIcon DefaultPageIcon" href="#">Register</a></div>											
-			</div>
-			
-			<div class="LastNode Node ClearFix">
-				<div class="ExpandIcon"><a class="NodeIcon DefaultPageIcon" href="#">Link</a></div>											
-			</div>
-			
-		</div>
-	</div>
-</div>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<!--
-<%
-	import org.exoplatform.webui.core.UIPortletApplication;
-	import org.exoplatform.portal.config.model.PageNode;
-	import org.exoplatform.portal.application.PortalRequestContext;
-	import org.exoplatform.portal.webui.util.Util;
-%>	
-<%
-	def navigations = uicomponent.getNavigations();
-	PortalRequestContext pcontext = Util.getPortalRequestContext();	
-	def String portalURI = pcontext.getPortalURI();
-	
-	UIPortletApplication siteMapPortlet = uicomponent.getParent();
-	def useAJAX = siteMapPortlet.isUseAjax();
-	
-	public void renderNextLevelNode(nav, children, int intLevel, String portalUri, boolean useAjax) {
-		if(intLevel > 4) return;
-		
-		for(PageNode node in children) {
-			String actionLink;
-			if(useAjax){
-				actionLink = uicomponent.event("SelectNode", nav.getId() + "::" + node.getUri());
-			}else{	
-				actionLink = portalUri + node.getUri();
-			}	
-			String iconType = node.getIcon();
-			if(iconType == null) {
-				iconType = "DefaultPageIcon";
-			}
-			
-			if(intLevel == 4) {
-				println """
-					<div class="Item">
-						<div class="Level$intLevel">
-							<div class="OverflowContainer">
-									<a class="IconItem ${iconType}" href="javascript: void(0);">...</a>
-							</div>
-						</div>
-					</div>
-				""";
-			 	break;
-			}
-			
-			String label = node.resolvedLabel;
-			String title = label;
-			if(label.length() > 38) {
-				label = label.substring(0,35) + "...";								
-			}
-							
-			println """
-				<div class="Item">
-					<div class="Level$intLevel">
-						<div class="OverflowContainer">
-		 	""";
-			 				if(node.pageReference != null) {
-								print """<a class="IconItem ${iconType}" href="$actionLink" title="$title">$label</a>""";
-							} else {
-								print """<a class="IconItem ${iconType}" title="$title">$label</a>""";
-							}
-		 	println """
-						</div>
-					</div>
-				</div>
-			""";
-			if (node.getChildren() != null) {
-				renderNextLevelNode(nav, node.getChildren(), intLevel + 1, portalUri, useAjax);
-			}
-		}
-	}
-%>
-<div class="UISitemap">
-	<div class="SitemapContainer">
-		<div class="SitemapBackground">
-			<%
-					boolean even = true;
-					String cssfloat = "left";
-					for(nav in navigations) { 
-						for(node in nav.getNodes()) { 
-							String iconType = node.getIcon();
-							if(iconType == null) {
-								iconType = "DefaultPageIcon";
-							}
-							if(even)cssfloat = "left";
-							else cssfloat = "right";
-							String blockFloat = "LeftBlock";
-							if(useAJAX){
-								actionLink = uicomponent.event("SelectNode", nav.getId() + "::" + node.getUri());
-							}else{
-								actionLink = portalURI + node.getUri();
-							}	
-							
-							String label = node.resolvedLabel;
-							String title = "";
-							if(label.length() > 35) {
-								title = label;
-								label = label.substring(0,32) + "...";								
-							}
-			%>
-			<div class="SitemapItemBox" style="float:${cssfloat};">
-				<div class="SitemapItemContainer">
-					<div class="TitleBar">
-						<%if(node.pageReference != null) {%>
-							<a href="<%=actionLink%>" class="Icon ${iconType}" title="$title">$label</a>
-						<%} else {%>
-							<a class="Icon ${iconType}" title="$title">$label</a>
-						<%}%>
-					</div>
-					<%if(node.getChildren() == null || node.getChildren().size() < 1) { %>
-							<div class="NestedSitemapItemBox">
-								<div class="SitemapItemBoxSelector BorderBox">											
-									<div class="Item">
-										<div class="SubItem">
-											<div class="Icon BlueInfoBox16x16Icon">
-												<%=_ctx.appRes("UISitemap.label.message")%>
-											</div>
-										</div>
-									</div>
-								</div>
-							</div> 
-					<%} else { %>
-							<div class="NestedSitemapItemBox">
-								<div class="SitemapItemBoxSelector">
-									<div class="ItemContainer">
-									 <% renderNextLevelNode(nav, node.getChildren(), 1, portalURI, useAJAX); %>
-									</div>
-								</div>
-							</div> 													
-						<%}%>
-				</div>
-			</div>
-			<% 
-						if(!even) {
-			%>
-						<div class="ClearBoth"><span></span></div>				
-			<%
-						}
-						even = !even;
-					}
-				}
-				if(!even){
-			%>
-			<div class="ClearBoth"><span></span></div> 
-			<% } %>
-		</div>			 
-	</div>
-</div>
--->
\ No newline at end of file
+<%	
+		import org.exoplatform.portal.webui.navigation.UIPortalNavigation;
+					
+		def uiPortalNavigation = uicomponent.getChild(UIPortalNavigation.class); 
+		uiPortalNavigation.loadTreeNodes();
+		uicomponent.renderChildren();
+%>
\ No newline at end of file

Deleted: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/webui/core/UISitemap2.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/webui/core/UISitemap2.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/webui/core/UISitemap2.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,7 +0,0 @@
-<%	
-		import org.exoplatform.portal.webui.navigation.UIPortalNavigation;
-					
-		def uiPortalNavigation = uicomponent.getChild(UIPortalNavigation.class); 
-		uiPortalNavigation.loadTreeNodes();
-		uicomponent.renderChildren();
-%>
\ No newline at end of file

Modified: epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/webui/core/UISitemapTree.gtmpl
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/webui/core/UISitemapTree.gtmpl	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/web/portal/src/main/webapp/groovy/webui/core/UISitemapTree.gtmpl	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,80 +1,89 @@
 <%
+	import org.exoplatform.web.application.JavascriptManager;
 	import org.exoplatform.webui.core.UIPortletApplication;
-	import org.exoplatform.portal.config.model.PageNode;
+	import org.exoplatform.portal.mop.user.UserNode;
 	import org.exoplatform.portal.application.PortalRequestContext;
 	import org.exoplatform.portal.webui.util.Util;
 	import org.exoplatform.portal.webui.navigation.TreeNode;
-%>	
+	import org.exoplatform.portal.mop.SiteKey;
+	import javax.portlet.MimeResponse;
+	import javax.portlet.ResourceURL;
+%>
 <%
-	def navigations = uicomponent.getNavigations();
+	PortalRequestContext pcontext = Util.getPortalRequestContext();		
+	JavascriptManager jsmanager = pcontext.getJavascriptManager();
+	jsmanager.importJavascript('eXo.webui.UISiteMap') ;
+	
+	def portalURI = pcontext.getPortalURI();
 
-	PortalRequestContext pcontext = Util.getPortalRequestContext();	
-	def String portalURI = pcontext.getPortalURI();
-	
 	UIPortletApplication siteMapPortlet = uicomponent.getParent();
-	
 	def useAJAX = siteMapPortlet.isUseAjax();
-	
+
 	def actionExpandAll = uicomponent.event("ExpandAllNode");
 	def actionCollapseAll = uicomponent.event("CollapseAllNode");
-							
+
 	public void renderNodes(TreeNode rootTree, String portalUri, boolean useAjax) {
-		List childrenNodes=rootTree.getChildren();
-		int childrenSize = childrenNodes.size() ;  
-		int size = 0;	
-		for(treeNode in childrenNodes) {	
-		
+		def childrenNodes=rootTree.getChildren();
+		int childrenSize = childrenNodes.size() ;
+		int size = 0;
+		for(treeNode in childrenNodes) {
+
 			// count size;
 			size++;
-			
-			node = treeNode.getNode();
-			nav = treeNode.getNavigation();
-			String label = node.encodedResolvedLabel;	
-			actionExpand = uicomponent.event("ExpandNode", nav.getId() + "::" + node.getUri());				
-			def actionCollapse = "ajaxAsyncGetRequest('" + uicomponent.url("CollapseNode",nav.getId() + "::" + node.getUri()) + "', true)";	
-			
+
+			def node = treeNode.getNode();
+			def treePath = node.getId();			
+			String label = node.getEncodedResolvedLabel();											
 			if(useAjax){
-				actionLink = uicomponent.event("SelectNode", nav.getId() + "::" + node.getUri());
-			}else{	
-				actionLink = portalUri + node.getUri();
-			}	
-			
+				actionLink = uicomponent.event("SelectNode", treePath);
+			}else{
+				actionLink = portalUri + node.getURI();
+			}
+
 			lastNode = '';
-			
 			if (size == childrenSize) {
 				lastNode = 'LastNode';
 			}
 			// if node have child
-			
-			if(treeNode.isHasChild()) {
+
+			if(treeNode.hasChild()) {
 				if (treeNode.isExpanded()) {
+				    def actionCollapse = "ajaxAsyncGetRequest('" + uicomponent.url("CollapseNode", treePath) + "', true)";
 					println """
 						<div class="$lastNode Node">
-							<div class="CollapseIcon ClearFix" onclick="eXo.portal.UIPortal.collapseExpand(this);$actionCollapse">
+							<div class="CollapseIcon ClearFix" onclick="eXo.portal.UIPortal.collapseExpand(this); $actionCollapse">
 					""";
-					      if(treeNode.getNode().getPageReference() == null) println "<a class='NodeIcon DefaultPageIcon' href='javascript:void(0);'>$label</a>";
+					      if(treeNode.getNode().getPageRef() == null) println "<a class='NodeIcon DefaultPageIcon' href='javascript:void(0);'>$label</a>";
 					      else println "<a class='NodeIcon DefaultPageIcon' href='$actionLink'>$label</a>";
 					println """
 							</div>
 							<div class="ChildrenContainer" style="display: block">
 					""";
-					
+
 					renderNodes(treeNode, portalUri, useAjax);
+
+				} else {
+				    MimeResponse res = _ctx.getRequestContext().getResponse();
+					ResourceURL resourceURL = res.createResourceURL();
+					resourceURL.setResourceID(treePath);			
 					
-				} else {
+					def actionExpand = "eXo.webui.UISiteMap.updateTreeNode(this, '" + resourceURL.toString() + "')";	
+					
 					println """
 						<div class="$lastNode Node">
-							<div class="ExpandIcon ClearFix" onclick="if(eXo.portal.UIPortal.collapseExpand(this)){$actionExpand}">
+							<div class="ExpandIcon ClearFix" onclick="eXo.portal.UIPortal.collapseExpand(this); $actionExpand">
 					""";
-					      if(treeNode.getNode().getPageReference() == null) println "<a class='NodeIcon DefaultPageIcon' href='javascript:void(0);'>$label</a>";
+					      if(treeNode.getNode().getPageRef() == null) println "<a class='NodeIcon DefaultPageIcon' href='javascript:void(0);'>$label</a>";
 					      else println "<a class='NodeIcon DefaultPageIcon' href='$actionLink'>$label</a>";
 					println """
 							</div>
 							<div class="ChildrenContainer" style="display: none">
 					""";
+					
+				    renderNodes(treeNode, portalUri, useAjax);
 				}
-				
-				
+
+
 				println """
 						</div>
 					</div>
@@ -89,24 +98,24 @@
 							</div>
 						</div>
 					</div>
-					
+
 				""";
-				
+
 			}
 
-		}		
-	  }  
+		}
+	  }
 %>
 
 <div id="UISiteMap" class="UISitemap" >
 	<div class="ClearFix">
-		<div class="CollapseAll FloatLeft" onclick="eXo.portal.UIPortal.collapseExpand(this);$actionCollapseAll">
+		<div class="CollapseAll FloatLeft" onclick="$actionCollapseAll">
 			<%=_ctx.appRes(siteMapPortlet.getName() + ".label.CollapseAll")%>
-		</div> 
-		<div class="ExpandAll FloatLeft" onclick="{$actionExpandAll}">
-			<%=_ctx.appRes(siteMapPortlet.getName() + ".label.ExpandAll")%>
 		</div>
+  <div class="ExpandAll FloatLeft" onclick="{$actionExpandAll}">
+			<%//_ctx.appRes(siteMapPortlet.getName() + ".label.ExpandAll")%>
 	</div>
+	</div>
 	<div class="SitemapContent">
 		<div class="UISiteTree">
 			<% TreeNode treeNodeRoot = uicomponent.getTreeNodes() ;%>

Modified: epp/portal/branches/EPP_5_2_Branch/webui/core/src/main/java/org/exoplatform/webui/core/UITree.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/core/src/main/java/org/exoplatform/webui/core/UITree.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/core/src/main/java/org/exoplatform/webui/core/UITree.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,10 +19,9 @@
 
 package org.exoplatform.webui.core;
 
-import org.exoplatform.portal.config.model.PageNode;
+import org.exoplatform.commons.serialization.api.annotations.Serialized;
 import org.exoplatform.util.ReflectionUtil;
 import org.exoplatform.webui.application.WebuiRequestContext;
-import org.exoplatform.commons.serialization.api.annotations.Serialized;
 import org.exoplatform.webui.config.annotation.ComponentConfig;
 import org.exoplatform.webui.config.annotation.EventConfig;
 import org.exoplatform.webui.event.Event;
@@ -30,6 +29,7 @@
 import org.exoplatform.webui.form.UIForm;
 
 import java.lang.reflect.Method;
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -73,6 +73,12 @@
    private String beanIdField_;
 
    /**
+    * The bean field that holds the count number of the children
+    * This help to express the node have childs or not
+    */
+   private String beanChildCountField_;
+
+   /**
     * The bean field that holds the label of the bean
     */
    private String beanLabelField_;
@@ -90,12 +96,12 @@
    /**
     * A list of sibling nodes
     */
-   private List<?> sibbling;
+   private Collection<?> sibbling;
 
    /**
     * A list of children nodes
     */
-   private List<?> children;
+   private Collection<?> children;
 
    /**
     * The selected node
@@ -107,8 +113,6 @@
     */
    private Object parentSelected;
 
-   private NodeMetaDataManager nodeMetadataManager;
-   
    /**
     * A right click popup menu
     */
@@ -135,6 +139,11 @@
       this.beanLabelField_ = beanLabelField_;
    }
 
+   public void setBeanChildCountField(String beanChildCountField)
+   {
+      this.beanChildCountField_ = beanChildCountField;
+   }
+
    public Object getId(Object object) throws Exception
    {
       return getFieldValue(object, beanIdField_);
@@ -197,12 +206,12 @@
       this.selectedIcon = selectedIcon;
    }
 
-   public List<?> getChildren()
+   public Collection<?> getChildren()
    {
       return children;
    }
 
-   public void setChildren(List<?> children)
+   public void setChildren(Collection<?> children)
    {
       this.children = children;
    }
@@ -229,12 +238,12 @@
       this.parentSelected = parentSelected;
    }
 
-   public List<?> getSibbling()
+   public Collection<?> getSibbling()
    {
       return sibbling;
    }
 
-   public void setSibbling(List<?> sibbling)
+   public void setSibbling(Collection<?> sibbling)
    {
       this.sibbling = sibbling;
    }
@@ -271,9 +280,16 @@
          iconGroup = selectedIcon;
          note = " NodeSelected";
       }
-      if(obj instanceof PageNode && ((PageNode)obj).getChildren().size() == 0) {
-         nodeIcon = nullItemIcon;
+
+      if(getBeanChildCountField() != null) {
+         Object childCount = getFieldValue(obj, getBeanChildCountField());         
+         if (childCount != null && childCount.getClass().isAssignableFrom(Integer.class) &&
+            (Integer)childCount == 0)
+         {
+            nodeIcon = nullItemIcon;  
+         }
       }
+
       if (beanIconField_ != null && beanIconField_.length() > 0)
       {
          if (getFieldValue(obj, beanIconField_) != null)
@@ -363,6 +379,11 @@
       return beanIdField_;
    }
 
+   public String getBeanChildCountField()
+   {
+      return beanChildCountField_;
+   }
+
    public String getBeanLabelField()
    {
       return beanLabelField_;
@@ -397,34 +418,4 @@
    {
       this.colapseIcon = colapseIcon;
    }
-   
-   public String getNodeMetaData(Object nodeObject, WebuiRequestContext context)
-   {
-      if (nodeMetadataManager == null)
-      {
-         return null;
-      }
-      else
-      {
-         return nodeMetadataManager.getNodeMetaData(nodeObject, context);
-      }
-   }
-   
-   public void setNodeMetaDataManager(NodeMetaDataManager _nodeMetadataManager)
-   {
-      this.nodeMetadataManager = _nodeMetadataManager;
-   }
-   
-   /**
-    * A node metadata manager. Node 's metadata is used for action informing/warning.
-    * 
-    * @author <a href="mailto:hoang281283 at gmail.com">Minh Hoang TO</a>
-    * @version $Id$
-    *
-    */
-   public static interface NodeMetaDataManager
-   {
-      public String getNodeMetaData(Object nodeObject, WebuiRequestContext context);
-   }
-
 }

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestContext.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestContext.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestContext.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -24,15 +24,19 @@
 import org.exoplatform.commons.utils.PortalPrinter;
 import org.exoplatform.commons.xml.DOMSerializer;
 import org.exoplatform.container.ExoContainer;
+import org.exoplatform.container.ExoContainerContext;
 import org.exoplatform.portal.config.UserPortalConfigService;
 import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNode;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.mop.user.UserPortalContext;
 import org.exoplatform.portal.webui.portal.UIPortal;
 import org.exoplatform.portal.webui.util.Util;
 import org.exoplatform.portal.webui.workspace.UIPortalApplication;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
 import org.exoplatform.services.resources.Orientation;
+import org.exoplatform.services.resources.ResourceBundleManager;
 import org.exoplatform.web.application.JavascriptManager;
 import org.exoplatform.web.application.URLBuilder;
 import org.exoplatform.webui.application.WebuiApplication;
@@ -52,6 +56,7 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.ResourceBundle;
 import java.util.Set;
 
 import javax.servlet.http.HttpServletRequest;
@@ -208,13 +213,13 @@
          UIPortal uiportal = Util.getUIPortal();
 
          //
-         PageNode node = uiportal.getSelectedNode();
+         UserNode node = uiportal.getSelectedUserNode();
          if (node != null)
          {
             ExoContainer container = getApplication().getApplicationServiceContainer();
             container.getComponentInstanceOfType(UserPortalConfigService.class);
             UserPortalConfigService configService = (UserPortalConfigService)container.getComponentInstanceOfType(UserPortalConfigService.class);
-            Page page = configService.getPage(node.getPageReference(), getRemoteUser());
+            Page page = configService.getPage(node.getPageRef(), getRemoteUser());
 
             //
             if (page != null)
@@ -480,5 +485,19 @@
 	  this.extraMarkupHeaders.add(element);
    }
 
+   final public static UserPortalContext USER_PORTAL_CONTEXT = new UserPortalContext()
+   {
+      public ResourceBundle getBundle(UserNavigation navigation)
+      {
+         ExoContainer container = ExoContainerContext.getCurrentContainer();
+         ResourceBundleManager rbMgr = (ResourceBundleManager)container.getComponentInstanceOfType(ResourceBundleManager.class);
+         Locale locale = Util.getPortalRequestContext().getLocale();
+         return rbMgr.getNavigationResourceBundle(
+            locale.getLanguage(),
+            navigation.getKey().getTypeName(),
+            navigation.getKey().getName());
+      }
+   };
 
+
 }

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/PortalStateManager.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/PortalStateManager.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/PortalStateManager.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -147,7 +147,7 @@
       UserPortalConfigService service_ = (UserPortalConfigService)appContainer.getComponentInstanceOfType(UserPortalConfigService.class);
       String remoteUser = context.getRemoteUser();
       String ownerUser = context.getPortalOwner();
-      return service_.getUserPortalConfig(ownerUser, remoteUser);
+      return service_.getUserPortalConfig(ownerUser, remoteUser, PortalRequestContext.USER_PORTAL_CONTEXT);
    }
 
    private String getKey(WebuiRequestContext webuiRC)

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationLifecycle.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationLifecycle.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationLifecycle.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -41,12 +41,7 @@
 import org.exoplatform.web.application.Phase;
 import org.exoplatform.web.application.RequestFailure;
 import org.exoplatform.webui.application.WebuiRequestContext;
-import org.exoplatform.webui.core.UIApplication;
 
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -54,6 +49,11 @@
 import java.util.Locale;
 import java.util.Set;
 
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
 /**
  * This class takes care of loading / initializing / saving the current Locale.
  * Current Locale is used to create properly localized response to current request.
@@ -205,10 +205,7 @@
 
          if (refreshNeeded)
          {
-            UIApplication uiapp = context.getUIApplication();
-            // we presume PortalRequestContext, and UIPortalApplication
             resetOrientation(reqCtx, loc);
-            ((UIPortalApplication) uiapp).localizeNavigations();
          }
 
          savePreviousLocale(reqCtx, loc);

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/state/PublicPropertiesPlugin.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/state/PublicPropertiesPlugin.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/application/state/PublicPropertiesPlugin.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -18,17 +18,17 @@
  */
 package org.exoplatform.portal.application.state;
 
-import java.util.Map;
-
-import javax.xml.namespace.QName;
-
 import org.exoplatform.container.xml.InitParams;
-import org.exoplatform.portal.config.model.PageNode;
+import org.exoplatform.portal.mop.user.UserNode;
 import org.exoplatform.portal.webui.application.UIPortlet;
 import org.exoplatform.portal.webui.page.UIPage;
 import org.exoplatform.portal.webui.portal.UIPortal;
 import org.exoplatform.portal.webui.util.Util;
 
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
 /**
  * This plugin setup properties that are publicly supported, hence this is part of a public API
  * and once published its contract must not change whatsoever.
@@ -79,13 +79,13 @@
       try
       {
          UIPortal currentSite = Util.getUIPortalApplication().getShowedUIPortal();
-         PageNode currentNode = currentSite.getSelectedNode();
+         UserNode currentNode = currentSite.getSelectedUserNode();
          
          // Navigation related properties
-         addProperty(properties, navigationURIQName, currentNode.getUri());
+         addProperty(properties, navigationURIQName, currentNode.getURI());
 
          // Page related properties
-         UIPage currentPage = currentSite.getUIPage(currentNode.getPageReference());
+         UIPage currentPage = currentSite.getUIPage(currentNode.getPageRef());
          if(currentPage != null)
          {
             addProperty(properties, pageNameQName, currentPage.getTitle());

Deleted: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/PageNavigationUtils.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/PageNavigationUtils.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/PageNavigationUtils.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,485 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- * 
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.webui.navigation;
-
-import org.exoplatform.container.ExoContainer;
-import org.exoplatform.portal.config.UserACL;
-import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
-import org.exoplatform.portal.config.model.PortalConfig;
-import org.exoplatform.portal.mop.Visibility;
-import org.exoplatform.services.resources.ResourceBundleManager;
-import org.exoplatform.webui.application.WebuiRequestContext;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-/**
- * Created by The eXo Platform SARL
- * Author : Nhu Dinh Thuan
- *          nhudinhthuan at exoplatform.com
- * Jun 27, 2007  
- */
-public class PageNavigationUtils
-{
-
-   public static void removeNode(List<PageNode> list, String uri)
-   {
-      if (list == null)
-         return;
-      for (PageNode pageNode : list)
-      {
-         if (pageNode.getUri().equalsIgnoreCase(uri))
-         {
-            list.remove(pageNode);
-            return;
-         }
-      }
-   }
-
-   /**
-    *  This method returns a pair of PageNode, one is the PageNode specified by the uri, 
-    * another is its parent. Value return is 2-element array
-    * 
-    * 1. The element indexed 1 is the page node specified by the uri
-    * 
-    * 2. The element indexed 0 is its parent
-    * 
-    * @deprecated Returning 2-element array would makes it difficult to understand, handle the code. 
-    * Method searchParentChildPairByUri should be used instead.
-    * 
-    * @param node
-    * @param uri
-    * @return
-    */
-   @Deprecated
-   public static PageNode[] searchPageNodesByUri(PageNode node, String uri)
-   {
-      if (node.getUri().equals(uri))
-         return new PageNode[]{null, node};
-      if (node.getChildren() == null)
-         return null;
-      List<PageNode> children = node.getChildren();
-      for (PageNode ele : children)
-      {
-         PageNode[] returnNodes = searchPageNodesByUri(ele, uri);
-         if (returnNodes != null)
-         {
-            if (returnNodes[0] == null)
-               returnNodes[0] = node;
-            return returnNodes;
-         }
-      }
-      return null;
-   }
-
-   @Deprecated
-   public static PageNode[] searchPageNodesByUri(PageNavigation nav, String uri)
-   {
-      if (nav.getNodes() == null)
-         return null;
-      List<PageNode> nodes = nav.getNodes();
-      for (PageNode ele : nodes)
-      {
-         PageNode[] returnNodes = searchPageNodesByUri(ele, uri);
-         if (returnNodes != null)
-            return returnNodes;
-      }
-      return null;
-   }
-   
-   /**
-    * This method returns a pair of a node matching the parsed uri and the parent of this node.
-    * 
-    * @param nav
-    * @param uri
-    * @return
-    */
-   public static ParentChildPair searchParentChildPairByUri(PageNavigation nav, String uri)
-   {
-      List<PageNode> nodes = nav.getNodes();
-      
-      if(nodes == null)
-      {
-         return null;
-      }
-      
-      for(PageNode ele : nodes)
-      {
-         ParentChildPair parentChildPair = searchParentChildPairUnderNode(ele, uri);
-         if(parentChildPair != null)
-         {
-            return parentChildPair;
-         }
-      }
-      
-      return null;
-   }
-   
-   //TODO: Split the uri and use optimzed method <code>searchParentChildPairByPath</code>
-   public static ParentChildPair searchParentChildPairUnderNode(PageNode rootNode, String uri)
-   {
-      if(uri.equals(rootNode.getUri()))
-      {
-         return new ParentChildPair(null, rootNode);
-      }
-      
-      List<PageNode> nodes = rootNode.getNodes();
-      if(nodes == null)
-      {
-         return null;
-      }
-      
-      for(PageNode node : nodes)
-      {
-         ParentChildPair parentChildPair = searchParentChildPairUnderNode(node, uri);
-         if(parentChildPair != null)
-         {
-            if(parentChildPair.getParentNode() == null)
-            {
-               parentChildPair.setParentNode(rootNode);
-            }
-            return parentChildPair;
-         }
-      }
-      
-      return null;
-   }
-   
-   /**
-    * Search a pair of page node (specified by the path) and its parent
-    * 
-    * @param rootNode
-    * @param path
-    * @return
-    */
-   public static ParentChildPair searchParentChildPairByPath(PageNode rootNode, String[] path)
-   {
-      if(path.length == 0)
-      {
-         throw new IllegalArgumentException("The input path must have unzero length");
-      }
-      
-      if(!rootNode.getName().equals(path[0]))
-      {
-         return null;
-      }
-      else
-      {
-         if(path.length == 1)
-         {
-            return new ParentChildPair(null, rootNode);
-         }
-         
-         PageNode tempNode = rootNode;
-         
-         PageNode parentNode = null;
-         PageNode childNode = null;
-         for(int i = 1; i< path.length; i++)
-         {
-            childNode = tempNode.getChild(path[i]);
-            if(childNode == null)
-            {
-               return null;
-            }
-            else
-            {
-               parentNode = tempNode;
-            }
-         }
-         
-         return new ParentChildPair(parentNode, childNode);
-      }
-   }
-   
-   public static PageNode searchPageNodeByUri(PageNode node, String uri)
-   {
-      if (node.getUri().equals(uri))
-         return node;
-      if (node.getChildren() == null)
-         return null;
-      List<PageNode> children = node.getChildren();
-      for (PageNode ele : children)
-      {
-         PageNode returnNode = searchPageNodeByUri(ele, uri);
-         if (returnNode != null)
-            return returnNode;
-      }
-      return null;
-   }
-
-   public static PageNode searchPageNodeByUri(PageNavigation nav, String uri)
-   {
-      if (nav.getNodes() == null)
-         return null;
-      List<PageNode> nodes = nav.getNodes();
-      for (PageNode ele : nodes)
-      {
-         PageNode returnNode = searchPageNodeByUri(ele, uri);
-         if (returnNode != null)
-            return returnNode;
-      }
-      return null;
-   }
-
-   public static Object searchParentNode(PageNavigation nav, String uri)
-   {
-      if (nav.getNodes() == null)
-         return null;
-      int last = uri.lastIndexOf("/");
-      String parentUri = "";
-      if (last > -1)
-         parentUri = uri.substring(0, uri.lastIndexOf("/"));
-      for (PageNode ele : nav.getNodes())
-      {
-         if (ele.getUri().equals(uri))
-            return nav;
-      }
-      if (parentUri.equals(""))
-         return null;
-      return searchPageNodeByUri(nav, parentUri);
-   }
-
-   // Still keep this method to have compatibility with legacy code
-   public static PageNavigation filter(PageNavigation nav, String userName) throws Exception
-   {
-      return filterNavigation(nav, userName, false, false);
-   }
-
-   /**
-    * 
-    * @param nav
-    * @param userName
-    * @param acceptNonDisplayedNode
-    * @param acceptNodeWithoutPage
-    * @return
-    * @throws Exception
-    */
-   public static PageNavigation filterNavigation(PageNavigation nav, String userName, boolean acceptNonDisplayedNode, boolean acceptNodeWithoutPage) throws Exception
-   {
-      PageNavigation filter = nav.clone();
-      filter.setNodes(new ArrayList<PageNode>());
-      
-      WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
-      ExoContainer container = context.getApplication().getApplicationServiceContainer();
-      UserPortalConfigService userService =
-         (UserPortalConfigService)container.getComponentInstanceOfType(UserPortalConfigService.class);
-      UserACL userACL = (UserACL)container.getComponentInstanceOfType(UserACL.class);
-
-      for (PageNode node : nav.getNodes())
-      {
-         PageNode newNode = filterNodeNavigation(node, userName, acceptNonDisplayedNode, acceptNodeWithoutPage, userService, userACL);
-         if (newNode != null)
-            filter.addNode(newNode);
-      }
-      return filter;
-   }
-   
-   /**
-    * use {@link #filterNavigation(PageNavigation, String, boolean, boolean)}
-    * 
-    * @param nav
-    * @param userName
-    * @param acceptNonDisplayedNode
-    * @return
-    * @throws Exception
-    */
-   @Deprecated
-   public static PageNavigation filterNavigation(PageNavigation nav, String userName, boolean acceptNonDisplayedNode) throws Exception
-   {
-	   return filterNavigation(nav, userName, acceptNonDisplayedNode, true);
-   }
-   
-   /**
-    * Use {@link #filterNodeNavigation(PageNode, String, boolean, boolean, UserPortalConfigService, UserACL)}
-    * @param startNode
-    * @param userName
-    * @param acceptNonDisplayedNode
-    * @param userService
-    * @param userACL
-    * @return
-    * @throws Exception
-    */
-   @Deprecated
-   private static PageNode filterNodeNavigation(PageNode startNode, String userName, boolean acceptNonDisplayedNode,
-		      UserPortalConfigService userService, UserACL userACL) throws Exception {
-	   PageNode cloneStartNode = filterNodeNavigation(startNode, userName, acceptNonDisplayedNode, false, userService, userACL);
-	   return cloneStartNode;
-   }
-
-   /**
-    * PageNode won't be processed in following cases:
-    * 
-    * Case 1: Node 's visibility is SYSTEM and the user is not superuser or he is superuser but acceptNonDisplayNode = false
-    * 
-    * Case 2: Node 's visibility is not SYSTEM but the node is not display and the acceptNonDisplayedNode = false
-    * 
-    * Case 3: Node has non null pageReference but the associated Page does not exist and not accept this node is without page
-    * 
-    * 
-    * @param startNode
-    * @param userName
-    * @param acceptNonDisplayedNode
-    * @param acceptNodeWithoutPage
-    * @param userService
-    * @param userACL
-    * @return
-    * @throws Exception
-    */
-   private static PageNode filterNodeNavigation(PageNode startNode, String userName, boolean acceptNonDisplayedNode, boolean acceptNodeWithoutPage,
-      UserPortalConfigService userService, UserACL userACL) throws Exception
-   {
-    
-      Visibility nodeVisibility = startNode.getVisibility();
-      String pageReference = startNode.getPageReference();
-
-      boolean doNothingCase_1 = nodeVisibility == Visibility.SYSTEM && (!userACL.getSuperUser().equals(userName) || !acceptNonDisplayedNode);
-      boolean doNothingCase_2 = nodeVisibility != Visibility.SYSTEM && !startNode.isDisplay() && !acceptNonDisplayedNode;
-      boolean doNothingCase_3 = (pageReference != null) && (userService.getPage(pageReference, userName) == null) && !acceptNodeWithoutPage;
-
-      
-      
-      if (doNothingCase_1 || doNothingCase_2 || doNothingCase_3)
-      {
-         return null;
-      }
-
-      PageNode cloneStartNode = startNode.clone();
-
-      // Check if page reference isn't existing, page reference value of node is setted null too.
-      if (pageReference != null && userService.getPage(pageReference) == null)
-      {
-         cloneStartNode.setPageReference(null);         
-      }
-      ArrayList<PageNode> filteredChildren = new ArrayList<PageNode>();
-
-      List<PageNode> children = startNode.getChildren();
-
-      if (children != null)
-      {
-         for (PageNode child : children)
-         {
-            PageNode filteredChildNode = filterNodeNavigation(child, userName, acceptNonDisplayedNode, acceptNodeWithoutPage, userService, userACL);
-            if (filteredChildNode != null)
-            {
-               filteredChildren.add(filteredChildNode);
-            }
-         }
-      }
-
-      //If are only accepting displayed nodes and If the node has no child and it does not point to any Page, then null is return
-      if (!acceptNonDisplayedNode && filteredChildren.size() == 0 && cloneStartNode.getPageReference() == null)
-      {
-         return null;
-      }
-      cloneStartNode.setChildren(filteredChildren);
-      return cloneStartNode;
-   }
-
-   public static PageNode filter(PageNode node, String userName, boolean acceptNonDisplayedNode) throws Exception
-   {
-      WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
-      ExoContainer container = context.getApplication().getApplicationServiceContainer();
-      UserPortalConfigService userService =
-         (UserPortalConfigService)container.getComponentInstanceOfType(UserPortalConfigService.class);
-      UserACL userACL = (UserACL)container.getComponentInstanceOfType(UserACL.class);
-
-      return filterNodeNavigation(node, userName, acceptNonDisplayedNode, userService, userACL);
-   }
-
-   public static void localizePageNavigation(PageNavigation nav, Locale locale, ResourceBundleManager i18nManager)
-   {
-      if (nav.getOwnerType().equals(PortalConfig.USER_TYPE))
-         return;
-      String localeLanguage = (locale.getCountry().length() > 0) ? locale.getLanguage() + "_" + locale.getCountry() : locale.getLanguage();
-      ResourceBundle res =
-         i18nManager.getNavigationResourceBundle(localeLanguage, nav.getOwnerType(), nav.getOwnerId());
-      for (PageNode node : nav.getNodes())
-      {
-         resolveLabel(res, node);
-      }
-   }
-
-   private static void resolveLabel(ResourceBundle res, PageNode node)
-   {
-      node.setResolvedLabel(res);
-      if (node.getChildren() == null)
-         return;
-      for (PageNode childNode : node.getChildren())
-      {
-         resolveLabel(res, childNode);
-      }
-   }
-
-   public static PageNavigation findNavigationByID(List<PageNavigation> all_Navigations, int id)
-   {
-      for (PageNavigation nav : all_Navigations)
-      {
-         if (nav.getId() == id)
-         {
-            return nav;
-         }
-      }
-      return null;
-   }
-   
-   public static void sortPageNavigation(List<PageNavigation> navigations)
-   {
-      Collections.sort(navigations, new PageNavigationComparator());
-   }
-   
-   /**
-    * 
-    * @author <a href="mailto:hoang281283 at gmail.com">Minh Hoang TO</a>
-    * @version $Id$
-    *
-    */
-   public static class PageNavigationComparator implements Comparator<PageNavigation>
-   {
-      public int compare(PageNavigation firstNav, PageNavigation secondNav)
-      {
-         int firstNavPriority = firstNav.getPriority();
-         int secondNavPriority = secondNav.getPriority();
-
-         if (firstNavPriority == secondNavPriority)
-         {
-            String firstNavId = firstNav.getOwnerId();
-            String secondNavId = secondNav.getOwnerId();
-            return firstNavId.compareTo(secondNavId);
-         }
-         else
-         {
-            if (firstNavPriority < secondNavPriority)
-            {
-               return -1;
-            }
-            else
-            {
-               return 1;
-            }
-         }
-      }
-   }   
-}

Deleted: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/ParentChildPair.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/ParentChildPair.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/ParentChildPair.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.exoplatform.portal.webui.navigation;
-
-import org.exoplatform.portal.config.model.PageNode;
-
-/**
- * This class wrappes a pair of PageNode and its parent.
- * 
- * @author <a href="mailto:hoang281283 at gmail.com">Minh Hoang TO</a>
- * @version $Id$
- *
- */
-public class ParentChildPair
-{
-   private PageNode parentNode;
-   
-   private PageNode childNode;
-   
-   public ParentChildPair(PageNode _parentNode, PageNode _childNode)
-   {
-      this.parentNode = _parentNode;
-      this.childNode = _childNode;
-   }
-   
-   public PageNode getParentNode()
-   {
-      return parentNode;
-   }
-   
-   public PageNode getChildNode()
-   {
-      return childNode;
-   }
-   
-   public void setParentNode(PageNode _parentNode)
-   {
-      this.parentNode = _parentNode;
-   }
-   
-   public void setChildNode(PageNode _childNode)
-   {
-      this.childNode = _childNode;
-   }
-}

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/TreeNode.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/TreeNode.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/TreeNode.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,13 +19,14 @@
 
 package org.exoplatform.portal.webui.navigation;
 
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
-
-import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
-import javax.jcr.RepositoryException;
+import org.exoplatform.portal.mop.user.UserNode;
 
 /**
  * Created by The eXo Platform SARL
@@ -36,31 +37,28 @@
  */
 public class TreeNode
 {
-   //TODO Need use this class for BC TreeNode
    private boolean isExpanded_;
 
-   private boolean hasChild_;
+   private UserNode node_;
 
-   private String path_;
+   private List<TreeNode> children_ = Collections.emptyList();
 
-   private PageNode node_;
+   private Map<String, TreeNode> cachedTreeNodes_;
 
-   private PageNavigation navigation_;
+   private TreeNode rootNode;
 
-   private List<TreeNode> children_ = new ArrayList<TreeNode>();
-
-   public TreeNode(PageNode node, PageNavigation nav, boolean hasChild)
+   public TreeNode()
    {
-      this(node, node.getUri(), nav, hasChild);
+      cachedTreeNodes_ = new HashMap<String, TreeNode>();
+      rootNode = this;
    }
 
-   private TreeNode(PageNode node, String path, PageNavigation nav, boolean hasChild)
+   private TreeNode(UserNode node, TreeNode rootNode) throws Exception
    {
       node_ = node;
-      navigation_ = nav;
       isExpanded_ = false;
-      path_ = path;
-      hasChild_ = hasChild;
+      this.rootNode = rootNode; 
+      setChildren(node.getChildren());
    }
 
    public boolean isExpanded()
@@ -73,31 +71,11 @@
       isExpanded_ = isExpanded;
    }
 
-   public String getName() throws RepositoryException
-   {
-      return node_.getName();
-   }
-
-   public String getPath()
-   {
-      return path_;
-   }
-
-   public String getNodePath() throws RepositoryException
-   {
-      return node_.getUri();
-   }
-
-   public PageNode getNode()
-   {
+   public UserNode getNode()
+   {               
       return node_;
    }
 
-   public void setNode(PageNode node)
-   {
-      node_ = node;
-   }
-
    public List<TreeNode> getChildren()
    {
       return children_;
@@ -108,61 +86,32 @@
       return children_.size();
    }
 
-   public TreeNode getChildByPath(String path, TreeNode treeNode)
+   public void setChildren(Collection<UserNode> children) throws Exception
    {
-      TreeNode returnVal = null;
-
-      for (TreeNode child : treeNode.getChildren())
+      if (children == null)
+         return;
+                                   
+      children_ = new LinkedList<TreeNode>();      
+      for (UserNode child : children)
       {
-
-         if (returnVal != null)
-            continue;
-
-         if (child.getPath().equals(path))
-         {
-            returnVal = child;
-         }
-         else if (child.getChildren() != null)
-         {
-            returnVal = child.getChildByPath(path, child);
-         }
+         TreeNode node = new TreeNode(child, rootNode);
+         children_.add(node);
+         rootNode.cachedTreeNodes_.put(child.getId(), node);         
       }
-
-      return returnVal;
    }
 
-   public void setChildren(List<PageNode> children, PageNavigation nav) throws Exception
+   public boolean hasChild()
    {
-      setExpanded(true);
-      for (PageNode child : children)
-      {
-         boolean isHasChild = (child.getChildren().size() > 0);
-         children_.add(new TreeNode(child, nav.getId() + "::" + child.getUri(), nav, isHasChild));
-      }
+      return node_.getChildrenCount() > 0;
    }
 
-   public void addChildren(TreeNode treeNode)
+   /**
+    * Help to find nodes on the whole tree, not only in the childrens of this node
+     * @param nodeId - id of the UserNode
+    * @return null if not found
+    */
+   public TreeNode findNodes(String nodeId)
    {
-      children_.add(treeNode);
+      return rootNode.cachedTreeNodes_.get(nodeId);
    }
-
-   public void setNavigation(PageNavigation navigation_)
-   {
-      this.navigation_ = navigation_;
-   }
-
-   public PageNavigation getNavigation()
-   {
-      return navigation_;
-   }
-
-   public void setHasChild(boolean hasChild)
-   {
-      this.hasChild_ = hasChild;
-   }
-
-   public boolean isHasChild()
-   {
-      return hasChild_;
-   }
 }
\ No newline at end of file

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIAddGroupNavigation.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIAddGroupNavigation.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIAddGroupNavigation.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,15 +19,20 @@
 
 package org.exoplatform.portal.webui.navigation;
 
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
 import org.exoplatform.commons.utils.ObjectPageList;
 import org.exoplatform.portal.application.PortalRequestContext;
 import org.exoplatform.portal.config.DataStorage;
 import org.exoplatform.portal.config.UserACL;
-import org.exoplatform.portal.config.UserPortalConfig;
 import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PortalConfig;
-import org.exoplatform.portal.webui.portal.UIPortal;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.navigation.NavigationContext;
+import org.exoplatform.portal.mop.navigation.NavigationService;
+import org.exoplatform.portal.mop.navigation.NavigationState;
 import org.exoplatform.portal.webui.util.Util;
 import org.exoplatform.portal.webui.workspace.UIMaskWorkspace;
 import org.exoplatform.portal.webui.workspace.UIPortalApplication;
@@ -46,12 +51,6 @@
 import org.exoplatform.webui.event.Event;
 import org.exoplatform.webui.event.EventListener;
 
-import java.net.URLDecoder;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
 /*
  * Created by The eXo Platform SAS
  * Author : tam.nguyen
@@ -108,9 +107,18 @@
          listGroup = new ArrayList<String>();
       }
 
-      UserPortalConfigService configService = getApplicationComponent(UserPortalConfigService.class);
-      Set<String> groupIdsHavingNavigation = configService.findGroupHavingNavigation();
-      listGroup.removeAll(groupIdsHavingNavigation);
+      //Filter all groups having navigation
+      NavigationService navigationService = getApplicationComponent(NavigationService.class);
+      List<String> groupsHavingNavigation = new ArrayList<String>();
+      for(String groupName : listGroup)
+      {
+         NavigationContext navigation = navigationService.loadNavigation(SiteKey.group(groupName));
+         if(navigation != null && navigation.getState() != null)
+         {
+            groupsHavingNavigation.add(groupName);
+         }
+      }
+      listGroup.removeAll(groupsHavingNavigation);
 
       UIVirtualList virtualList = getChild(UIVirtualList.class);
       virtualList.dataBind(new ObjectPageList<String>(listGroup, listGroup.size()));
@@ -127,40 +135,35 @@
          String ownerId = event.getRequestContext().getRequestParameter(OBJECTID);
          ownerId = URLDecoder.decode(ownerId);
 
-         //Add navigation
-         PageNavigation pageNav = new PageNavigation();
-
-         // set properties for navigation
-         pageNav.setPriority(1);
-         pageNav.setModifiable(true);
-         pageNav.setOwnerId(ownerId);
-         pageNav.setOwnerType(PortalConfig.GROUP_TYPE);
-         //UIPortalApplication uiPortalApp = uiForm.getAncestorOfType(UIPortalApplication.class);      
          UIPortalApplication uiPortalApp = Util.getUIPortal().getAncestorOfType(UIPortalApplication.class);
 
-         // ensure this navigation is not exist
-         DataStorage dataService = uicomp.getApplicationComponent(DataStorage.class);
-         if (dataService.getPageNavigation(pageNav.getOwnerType(), pageNav.getOwnerId()) != null)
+         // ensure this navigation does not exist
+         NavigationService navigationService = uicomp.getApplicationComponent(NavigationService.class);
+         NavigationContext navigation = navigationService.loadNavigation(SiteKey.group(ownerId));
+         if (navigation != null && navigation.getState() != null)
          {
             uiPortalApp.addMessage(new ApplicationMessage("UIPageNavigationForm.msg.existPageNavigation",
-               new String[]{pageNav.getOwnerId()}));
-            return;
+               new String[]{ownerId}));
          }
+         else
+         {
+            // Create portal config of the group when it does not exist
+            DataStorage dataService = uicomp.getApplicationComponent(DataStorage.class);
+            if (dataService.getPortalConfig("group", ownerId) == null)
+            {
+               UserPortalConfigService configService = uicomp.getApplicationComponent(UserPortalConfigService.class);
+               configService.createGroupSite(ownerId);
+            }
 
-         // Create group when it does not exist
-         if (dataService.getPortalConfig("group", ownerId) == null)
-         {
-            UserPortalConfigService configService = uicomp.getApplicationComponent(UserPortalConfigService.class);
-            configService.createGroupSite(ownerId);
+            // create navigation for group
+            SiteKey key = SiteKey.group(ownerId);
+            NavigationContext existing  = navigationService.loadNavigation(key);
+            if (existing == null)
+            {
+               navigationService.saveNavigation(new NavigationContext(key, new NavigationState(0)));
+            }
          }
 
-         // create navigation for group
-         dataService.create(pageNav);
-
-         uiPortalApp.getUserPortalConfig().getNavigations().add(0, pageNav);
-         uiPortalApp.getNavigations().add(0, pageNav);
-         uiPortalApp.localizeNavigations();
-         
          //Update group navigation list
          ctx.addUIComponentToUpdateByAjax(uicomp);
 

Deleted: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UINavigationManagement.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UINavigationManagement.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UINavigationManagement.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,208 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- * 
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.webui.navigation;
-
-import org.exoplatform.portal.application.PortalRequestContext;
-import org.exoplatform.portal.config.DataStorage;
-import org.exoplatform.portal.config.UserPortalConfig;
-import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PortalConfig;
-import org.exoplatform.portal.webui.page.UIPageNodeForm;
-import org.exoplatform.portal.webui.portal.UIPortal;
-import org.exoplatform.portal.webui.util.Util;
-import org.exoplatform.portal.webui.workspace.UIPortalApplication;
-import org.exoplatform.portal.webui.workspace.UIWorkingWorkspace;
-import org.exoplatform.web.application.ApplicationMessage;
-import org.exoplatform.webui.config.annotation.ComponentConfig;
-import org.exoplatform.webui.config.annotation.EventConfig;
-import org.exoplatform.webui.core.UIApplication;
-import org.exoplatform.webui.core.UIComponent;
-import org.exoplatform.webui.core.UIContainer;
-import org.exoplatform.webui.core.UIPopupWindow;
-import org.exoplatform.webui.core.UITree;
-import org.exoplatform.webui.event.Event;
-import org.exoplatform.webui.event.EventListener;
-
-import java.util.List;
-
- at ComponentConfig(template = "system:/groovy/portal/webui/navigation/UINavigationManagement.gtmpl", events = {
-   @EventConfig(listeners = UINavigationManagement.SaveActionListener.class),
-   @EventConfig(listeners = UINavigationManagement.AddRootNodeActionListener.class)})
-public class UINavigationManagement extends UIContainer
-{
-
-   private String owner;
-
-   private String ownerType;
-
-   @SuppressWarnings("unused")
-   public UINavigationManagement() throws Exception
-   {
-      addChild(UINavigationNodeSelector.class, null, null);
-   }
-
-   public void setOwner(String owner)
-   {
-      this.owner = owner;
-   }
-
-   public String getOwner()
-   {
-      return this.owner;
-   }
-
-   public <T extends UIComponent> T setRendered(boolean b)
-   {
-      return super.<T> setRendered(b);
-   }
-
-   public void loadView(Event<? extends UIComponent> event) throws Exception
-   {
-      UINavigationNodeSelector uiNodeSelector = getChild(UINavigationNodeSelector.class);
-      UITree uiTree = uiNodeSelector.getChild(UITree.class);
-      uiTree.createEvent("ChangeNode", event.getExecutionPhase(), event.getRequestContext()).broadcast();
-   }
-
-   public void setOwnerType(String ownerType)
-   {
-      this.ownerType = ownerType;
-   }
-
-   public String getOwnerType()
-   {
-      return this.ownerType;
-   }
-
-   static public class SaveActionListener extends EventListener<UINavigationManagement>
-   {
-
-      public void execute(Event<UINavigationManagement> event) throws Exception
-      {
-         PortalRequestContext prContext = Util.getPortalRequestContext();
-         UINavigationManagement uiManagement = event.getSource();
-         UINavigationNodeSelector uiNodeSelector = uiManagement.getChild(UINavigationNodeSelector.class);
-         DataStorage dataService = uiManagement.getApplicationComponent(DataStorage.class);
-         UserPortalConfigService portalConfigService = uiManagement.getApplicationComponent(UserPortalConfigService.class);
-         
-         PageNavigation navigation = uiNodeSelector.getEdittedNavigation();
-         String editedOwnerType = navigation.getOwnerType();
-         String editedOwnerId = navigation.getOwnerId();
-         // Check existed
-         PageNavigation persistNavigation =  dataService.getPageNavigation(editedOwnerType, editedOwnerId);
-         if (persistNavigation == null)
-         {
-            UIApplication uiApp = Util.getPortalRequestContext().getUIApplication();
-            uiApp.addMessage(new ApplicationMessage("UINavigationManagement.msg.NavigationNotExistAnymore", null));
-            UIPopupWindow uiPopup = uiManagement.getParent();
-            uiPopup.setShow(false);
-            UIPortalApplication uiPortalApp = (UIPortalApplication)prContext.getUIApplication();
-            UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
-            prContext.addUIComponentToUpdateByAjax(uiWorkingWS);
-            prContext.ignoreAJAXUpdateOnPortlets(true);
-            return;
-         }
-         
-         if(PortalConfig.PORTAL_TYPE.equals(navigation.getOwnerType()))
-         {
-            UserPortalConfig portalConfig = portalConfigService.getUserPortalConfig(navigation.getOwnerId(), prContext.getRemoteUser());
-            if(portalConfig != null)
-            {
-               dataService.save(navigation);
-            }
-            else
-            {
-               UIApplication uiApp = Util.getPortalRequestContext().getUIApplication();
-               uiApp.addMessage(new ApplicationMessage("UIPortalForm.msg.notExistAnymore", null));
-               UIPopupWindow uiPopup = uiManagement.getParent();
-               uiPopup.setShow(false);
-               UIPortalApplication uiPortalApp = (UIPortalApplication)prContext.getUIApplication();
-               UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
-               prContext.addUIComponentToUpdateByAjax(uiWorkingWS);
-               prContext.ignoreAJAXUpdateOnPortlets(true);
-               return;
-            }
-         }
-         else
-         {
-            dataService.save(navigation);
-         }
-
-         // Reload navigation here as some navigation could exist in the back end such as system navigations
-         // that would not be in the current edited UI navigation
-         navigation = dataService.getPageNavigation(navigation.getOwnerType(), navigation.getOwnerId());
-
-         UIPortalApplication uiPortalApp = Util.getUIPortalApplication();
-         setNavigation(uiPortalApp.getNavigations(), navigation);
-
-         // Need to relocalize as it was loaded from storage
-         uiPortalApp.localizeNavigations();
-         
-         //Update UIPortal corredponding to edited navigation
-         UIPortal targetedUIPortal = uiPortalApp.getCachedUIPortal(editedOwnerType, editedOwnerId);
-         if(targetedUIPortal != null)
-         {
-            targetedUIPortal.setNavigation(navigation);
-         }
-         
-         UIPopupWindow uiPopup = uiManagement.getParent();
-         uiPopup.setShow(false);
-         UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
-         prContext.addUIComponentToUpdateByAjax(uiWorkingWS);
-         prContext.ignoreAJAXUpdateOnPortlets(true);
-      }
-
-      private void setNavigation(List<PageNavigation> navs, PageNavigation nav)
-      {
-         for (int i = 0; i < navs.size(); i++)
-         {
-            if (navs.get(i).getId() == nav.getId())
-            {
-               navs.set(i, nav);
-               return;
-            }
-         }
-      }
-
-   }
-
-   static public class AddRootNodeActionListener extends EventListener<UINavigationManagement>
-   {
-
-      @Override
-      public void execute(Event<UINavigationManagement> event) throws Exception
-      {
-         UINavigationManagement uiManagement = event.getSource();
-         UINavigationNodeSelector uiNodeSelector = uiManagement.getChild(UINavigationNodeSelector.class);
-         UIPopupWindow uiManagementPopup = uiNodeSelector.getAncestorOfType(UIPopupWindow.class);
-         UIPageNodeForm uiNodeForm = uiManagementPopup.createUIComponent(UIPageNodeForm.class, null, null);
-         uiNodeForm.setValues(null);
-         uiManagementPopup.setUIComponent(uiNodeForm);
-         PageNavigation nav = uiNodeSelector.getEdittedNavigation();
-         uiNodeForm.setSelectedParent(nav);
-
-         uiNodeForm.setContextPageNavigation(nav);
-
-         uiManagementPopup.setWindowSize(800, 500);
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiManagementPopup.getParent());
-      }
-
-   }
-}
\ No newline at end of file

Deleted: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UINavigationNodeSelector.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UINavigationNodeSelector.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UINavigationNodeSelector.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,949 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.webui.navigation;
-
-import org.exoplatform.portal.config.UserACL;
-import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
-import org.exoplatform.portal.config.model.PortalConfig;
-import org.exoplatform.portal.mop.Visibility;
-import org.exoplatform.portal.webui.page.UIPage;
-import org.exoplatform.portal.webui.page.UIPageNodeForm;
-import org.exoplatform.portal.webui.portal.UIPortalComposer;
-import org.exoplatform.portal.webui.util.PortalDataMapper;
-import org.exoplatform.portal.webui.util.Util;
-import org.exoplatform.portal.webui.workspace.UIEditInlineWorkspace;
-import org.exoplatform.portal.webui.workspace.UIPortalApplication;
-import org.exoplatform.portal.webui.workspace.UIPortalToolPanel;
-import org.exoplatform.portal.webui.workspace.UIWorkingWorkspace;
-import org.exoplatform.services.resources.LocaleConfig;
-import org.exoplatform.services.resources.LocaleConfigService;
-import org.exoplatform.web.application.ApplicationMessage;
-import org.exoplatform.webui.application.WebuiRequestContext;
-import org.exoplatform.webui.config.annotation.ComponentConfig;
-import org.exoplatform.webui.config.annotation.ComponentConfigs;
-import org.exoplatform.webui.config.annotation.EventConfig;
-import org.exoplatform.webui.core.UIApplication;
-import org.exoplatform.webui.core.UIComponent;
-import org.exoplatform.webui.core.UIContainer;
-import org.exoplatform.webui.core.UIFilterableTree;
-import org.exoplatform.webui.core.UIPopupWindow;
-import org.exoplatform.webui.core.UIRightClickPopupMenu;
-import org.exoplatform.webui.core.UITree;
-import org.exoplatform.webui.event.Event;
-import org.exoplatform.webui.event.EventListener;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-/** Copied by The eXo Platform SARL Author May 28, 2009 3:07:15 PM */
- at ComponentConfigs({
-   @ComponentConfig(template = "system:/groovy/portal/webui/navigation/UINavigationNodeSelector.gtmpl", events = {@EventConfig(listeners = UINavigationNodeSelector.ChangeNodeActionListener.class)}),
-   @ComponentConfig(id = "NavigationNodePopupMenu", type = UIRightClickPopupMenu.class, template = "system:/groovy/webui/core/UIRightClickPopupMenu.gtmpl", events = {
-      @EventConfig(listeners = UINavigationNodeSelector.AddNodeActionListener.class),
-      @EventConfig(listeners = UINavigationNodeSelector.EditPageNodeActionListener.class),
-      @EventConfig(listeners = UINavigationNodeSelector.EditSelectedNodeActionListener.class),
-      @EventConfig(listeners = UINavigationNodeSelector.CopyNodeActionListener.class),
-      @EventConfig(listeners = UINavigationNodeSelector.CutNodeActionListener.class),
-      @EventConfig(listeners = UINavigationNodeSelector.CloneNodeActionListener.class),
-      @EventConfig(listeners = UINavigationNodeSelector.PasteNodeActionListener.class),
-      @EventConfig(listeners = UINavigationNodeSelector.MoveUpActionListener.class),
-      @EventConfig(listeners = UINavigationNodeSelector.MoveDownActionListener.class),
-      @EventConfig(listeners = UINavigationNodeSelector.DeleteNodeActionListener.class, confirm = "UIPageNodeSelector.deleteNavigation")}),
-   @ComponentConfig(id = "UINavigationNodeSelectorPopupMenu", type = UIRightClickPopupMenu.class, template = "system:/groovy/webui/core/UIRightClickPopupMenu.gtmpl", events = {
-      @EventConfig(listeners = UINavigationNodeSelector.AddNodeActionListener.class),
-      @EventConfig(listeners = UINavigationNodeSelector.PasteNodeActionListener.class)})})
-public class UINavigationNodeSelector extends UIContainer
-{
-
-   //private List<PageNavigation> navigations;
-   
-   private PageNavigation edittedNavigation;
-   
-   private TreeNodeData edittedTreeNodeData;
-
-   /** This field holds transient copy of edittedTreeNodeData, which is used when user pastes the content to a new tree node */
-   private TreeNodeData copyOfTreeNodeData;
-
-   private List<PageNavigation> deleteNavigations = new ArrayList<PageNavigation>();
-
-   public UINavigationNodeSelector() throws Exception
-   {
-      UIRightClickPopupMenu rightClickPopup =
-         addChild(UIRightClickPopupMenu.class, "UINavigationNodeSelectorPopupMenu", null).setRendered(true);
-      rightClickPopup.setActions(new String[]{"AddNode", "PasteNode"});
-
-      UIFilterableTree uiTree = addChild(UIFilterableTree.class, null, "TreeNodeSelector");
-      uiTree.setIcon("DefaultPageIcon");
-      uiTree.setSelectedIcon("DefaultPageIcon");
-      uiTree.setBeanIdField("uri");
-      uiTree.setBeanLabelField("encodedResolvedLabel");
-      uiTree.setBeanIconField("icon");
-      
-      UIRightClickPopupMenu uiPopupMenu =
-         createUIComponent(UIRightClickPopupMenu.class, "NavigationNodePopupMenu", null);
-      uiPopupMenu.setActions(new String[]{"AddNode", "EditPageNode", "EditSelectedNode", "CopyNode", "CloneNode",
-         "CutNode", "DeleteNode", "MoveUp", "MoveDown"});
-      uiTree.setUIRightClickPopupMenu(uiPopupMenu);
-      setupTreeFilter();
-   }
-   
-   /**
-    * Setup a filter on the tree node. In this case, SYSTEM node is not displayed if user is not super user
-    *
-    */
-   private void setupTreeFilter()
-   {
-      UIFilterableTree.TreeNodeFilter nodeFilter = new UIFilterableTree.TreeNodeFilter()
-      {
-         public boolean filterThisNode(Object nodeObject, WebuiRequestContext context)
-         {
-            boolean isSystemNode = (((PageNode)nodeObject).getVisibility() == Visibility.SYSTEM );
-            if(!isSystemNode)
-            {
-               return false;
-            }else
-            {
-               UserACL userACL = context.getUIApplication().getApplicationComponent(UserACL.class);
-               return !userACL.getSuperUser().equals(context.getRemoteUser());
-            }
-            
-         }
-      };
-      this.getChild(UIFilterableTree.class).setTreeNodeFilter(nodeFilter);
-   }
-
-   public void setEdittedNavigation(PageNavigation _filteredEdittedNavigation) throws Exception
-   {
-      this.edittedNavigation = _filteredEdittedNavigation;
-   }
-   
-   public PageNavigation getEdittedNavigation()
-   {
-      return this.edittedNavigation;
-   }
-      
-   /**
-    * Init the UITree wrapped in UINavigationNodeSelector and localize the label
-    * @throws Exception
-    */
-   public void initTreeData() throws Exception
-   {
-      WebuiRequestContext requestContext = WebuiRequestContext.getCurrentInstance();
-      localizeNavigation(requestContext.getLocale());
-      
-      initEdittedTreeNodeData();
-   }
-
-   /**
-    * Init the edited node as well as its parent, navigation
-    *
-    */
-   private void initEdittedTreeNodeData()
-   {
-      if(edittedNavigation == null)
-      {
-         return;
-      }
-      if (edittedTreeNodeData == null)
-      {
-         edittedTreeNodeData = new TreeNodeData(edittedNavigation);
-         if(edittedTreeNodeData.getNode() != null)
-         {
-            selectPageNodeByUri(edittedTreeNodeData.getNode().getUri());
-         }
-      }
-      
-      UITree tree = getChild(UITree.class);
-      tree.setSibbling(edittedNavigation.getNodes());
-   }
-   
-
-   private void localizeNavigation(Locale locale)
-   {
-      String localeLanguage = (locale.getCountry().length() > 0) ? locale.getLanguage() + "_" + locale.getCountry() : locale.getLanguage();
-      LocaleConfig localeConfig =
-         getApplicationComponent(LocaleConfigService.class).getLocaleConfig(localeLanguage);
-      String ownerType = edittedNavigation.getOwnerType();
-      if (!PortalConfig.USER_TYPE.equals(ownerType))
-      {
-         String ownerId = edittedNavigation.getOwnerId();
-         if (PortalConfig.GROUP_TYPE.equals(ownerType))
-         {
-            // Remove the trailing '/' for a group
-            ownerId = ownerId.substring(1);
-         }
-         ResourceBundle res = localeConfig.getNavigationResourceBundle(ownerType, ownerId);
-         for (PageNode node : edittedNavigation.getNodes())
-         {
-            resolveLabel(res, node);
-         }
-      }
-   }
-
-   private void resolveLabel(ResourceBundle res, PageNode node)
-   {
-      node.setResolvedLabel(res);
-      if (node.getChildren() == null)
-      {
-         return;
-      }
-      for (PageNode childNode : node.getChildren())
-      {
-         resolveLabel(res, childNode);
-      }
-   }
-
-   public void selectPageNodeByUri(String uri)
-   {
-      if (edittedTreeNodeData == null)
-      {
-         return;
-      }
-      UITree tree = getChild(UITree.class);
-      List<?> sibbling = tree.getSibbling();
-      tree.setSibbling(null);
-      tree.setParentSelected(null);
-      edittedTreeNodeData.setNode(searchPageNodeByUri(edittedTreeNodeData.getPageNavigation(), uri));
-      if (edittedTreeNodeData.getNode() != null)
-      {
-         tree.setSelected(edittedTreeNodeData.getNode());
-         tree.setChildren(edittedTreeNodeData.getNode().getChildren());
-         return;
-      }
-      tree.setSelected(null);
-      tree.setChildren(null);
-      tree.setSibbling(sibbling);
-   }
-
-   public PageNode searchPageNodeByUri(PageNavigation pageNav, String uri)
-   {
-      if (pageNav == null || uri == null)
-      {
-         return null;
-      }
-      List<PageNode> pageNodes = pageNav.getNodes();
-      UITree uiTree = getChild(UITree.class);
-      for (PageNode ele : pageNodes)
-      {
-         PageNode returnPageNode = searchPageNodeByUri(ele, uri, uiTree);
-         if (returnPageNode == null)
-         {
-            continue;
-         }
-         if (uiTree.getSibbling() == null)
-         {
-            uiTree.setSibbling(pageNodes);
-         }
-         return returnPageNode;
-      }
-      return null;
-   }
-
-   private PageNode searchPageNodeByUri(PageNode pageNode, String uri, UITree tree)
-   {
-      if (pageNode.getUri().equals(uri))
-      {
-         return pageNode;
-      }
-      List<PageNode> children = pageNode.getChildren();
-      if (children == null)
-      {
-         return null;
-      }
-      for (PageNode ele : children)
-      {
-         PageNode returnPageNode = searchPageNodeByUri(ele, uri, tree);
-         if (returnPageNode == null)
-         {
-            continue;
-         }
-         if (tree.getSibbling() == null)
-         {
-            tree.setSibbling(children);
-         }
-         if (tree.getParentSelected() == null)
-         {
-            tree.setParentSelected(pageNode);
-         }
-         edittedTreeNodeData.setParentNode(pageNode);
-         return returnPageNode;
-      }
-      return null;
-   }
-
-   public void processRender(WebuiRequestContext context) throws Exception
-   {
-      UIRightClickPopupMenu uiPopupMenu = getChild(UIRightClickPopupMenu.class);
-      if (uiPopupMenu != null)
-      {
-         if (edittedNavigation == null)
-         {
-            uiPopupMenu.setRendered(false);
-         }
-         else
-         {
-            uiPopupMenu.setRendered(true);
-         }
-      }
-      super.processRender(context);
-   }
-
-   public TreeNodeData getCopyNode()
-   {
-      return copyOfTreeNodeData;
-   }
-
-   public void setCopyNode(TreeNodeData copyNode)
-   {
-      this.copyOfTreeNodeData = copyNode;
-   }
-
-   static public class ChangeNodeActionListener extends EventListener<UITree>
-   {
-      public void execute(Event<UITree> event) throws Exception
-      {
-         String uri = event.getRequestContext().getRequestParameter(OBJECTID);
-         UINavigationNodeSelector uiNodeSelector = event.getSource().getParent();
-         uiNodeSelector.selectPageNodeByUri(uri);
-
-         UINavigationManagement nodeManager = uiNodeSelector.getParent();
-         event.getRequestContext().addUIComponentToUpdateByAjax(nodeManager);
-
-         UIContainer uiParent = uiNodeSelector.getParent();
-         Class<?>[] childrenToRender = {UINavigationNodeSelector.class};
-         uiParent.setRenderedChildrenOfTypes(childrenToRender);
-      }
-   }
-
-   static public class AddNodeActionListener extends EventListener<UIRightClickPopupMenu>
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         String uri = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-         UIRightClickPopupMenu uiPopupMenu = event.getSource();
-
-         UINavigationNodeSelector uiNodeSelector = uiPopupMenu.getAncestorOfType(UINavigationNodeSelector.class);
-         UIPopupWindow uiManagementPopup = uiNodeSelector.getAncestorOfType(UIPopupWindow.class);
-         UIPageNodeForm uiNodeForm = uiManagementPopup.createUIComponent(UIPageNodeForm.class, null, null);
-         uiNodeForm.setValues(null);
-         uiManagementPopup.setUIComponent(uiNodeForm);
-
-         Object parent = null;
-         PageNavigation edittedNavigation = uiNodeSelector.getEdittedNavigation();
-         List<PageNode> pageNodes = edittedNavigation.getNodes();
-         if (uri != null && uri.trim().length() > 0)
-         {
-            for (PageNode pageNode : pageNodes)
-            {
-               parent = PageNavigationUtils.searchPageNodeByUri(pageNode, uri);
-               if (parent != null)
-               {
-                  break;
-               }
-            }
-         }
-         if (parent == null)
-         {
-            parent = edittedNavigation;
-         }
-         
-         uiNodeForm.setSelectedParent(parent);
-
-         uiNodeForm.setContextPageNavigation(edittedNavigation);
-         uiManagementPopup.setWindowSize(800, 500);
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiManagementPopup.getParent());
-      }
-   }
-
-   static public class EditPageNodeActionListener extends EventListener<UIRightClickPopupMenu>
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         // get URI
-         String uri = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-
-         // get UINavigationNodeSelector
-         UIRightClickPopupMenu uiPopupMenu = event.getSource();
-
-         UINavigationNodeSelector uiNodeSelector = uiPopupMenu.getAncestorOfType(UINavigationNodeSelector.class);
-
-         // get Selected PageNode
-         PageNode selectedPageNode = null;
-         List<PageNode> pageNodes = uiNodeSelector.getEdittedNavigation().getNodes();
-         if (uri != null && uri.trim().length() > 0)
-         {
-            for (PageNode pageNode : pageNodes)
-            {
-               selectedPageNode = PageNavigationUtils.searchPageNodeByUri(pageNode, uri);
-               if (selectedPageNode != null)
-               {
-                  break;
-               }
-            }
-         }
-
-         UIPortalApplication uiApp = Util.getUIPortalApplication();
-
-         if (selectedPageNode.getPageReference() == null)
-         {
-            uiApp.addMessage(new ApplicationMessage("UIPageNodeSelector.msg.notAvailable", null));
-            return;
-         }
-
-         UIWorkingWorkspace uiWorkingWS = uiApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
-         UIPortalToolPanel uiToolPanel =
-            uiWorkingWS.findFirstComponentOfType(UIPortalToolPanel.class).setRendered(true);
-         UserPortalConfigService userService = uiToolPanel.getApplicationComponent(UserPortalConfigService.class);
-
-         // get selected page
-         String pageId = selectedPageNode.getPageReference();
-         Page selectPage = (pageId != null) ? userService.getPage(pageId) : null;
-         if (selectPage != null)
-         {
-            UserACL userACL = uiApp.getApplicationComponent(UserACL.class);
-            if (!userACL.hasEditPermission(selectPage))
-            {
-               uiApp.addMessage(new ApplicationMessage("UIPageBrowser.msg.UserNotPermission", new String[]{pageId}, 1));
-               return;
-            }
-
-            uiApp.setModeState(UIPortalApplication.APP_BLOCK_EDIT_MODE);
-            //uiWorkingWS.setRenderedChild(UIPortalToolPanel.class);
-            //uiWorkingWS.addChild(UIPortalComposer.class, "UIPageEditor", null);
-
-            uiWorkingWS.setRenderedChild(UIEditInlineWorkspace.class);
-
-            UIPortalComposer portalComposer =
-               uiWorkingWS.findFirstComponentOfType(UIPortalComposer.class).setRendered(true);
-            portalComposer.setShowControl(true);
-            portalComposer.setEditted(false);
-            portalComposer.setCollapse(false);
-            portalComposer.setId("UIPageEditor");
-            portalComposer.setComponentConfig(UIPortalComposer.class, "UIPageEditor");
-
-            uiToolPanel.setShowMaskLayer(false);
-            uiToolPanel.setWorkingComponent(UIPage.class, null);
-            UIPage uiPage = (UIPage)uiToolPanel.getUIComponent();
-
-            if(selectPage.getTitle() == null)
-               selectPage.setTitle(selectedPageNode.getLabel());
-
-            // convert Page to UIPage
-            PortalDataMapper.toUIPage(uiPage, selectPage);
-            Util.getPortalRequestContext().addUIComponentToUpdateByAjax(uiWorkingWS);
-            Util.getPortalRequestContext().ignoreAJAXUpdateOnPortlets(true);
-         }
-         else
-         {
-            uiApp.addMessage(new ApplicationMessage("UIPageNodeSelector.msg.notAvailable", null));
-            return;
-         }
-      }
-   }
-
-   static public class EditSelectedNodeActionListener extends EventListener<UIRightClickPopupMenu>
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         WebuiRequestContext ctx = event.getRequestContext();
-         UIRightClickPopupMenu popupMenu = event.getSource();
-         UIApplication uiApp = ctx.getUIApplication();
-         String uri = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-         UINavigationNodeSelector uiNodeSelector = popupMenu.getAncestorOfType(UINavigationNodeSelector.class);
-         PageNavigation edittedNav = uiNodeSelector.getEdittedNavigation();
-         Object obj = PageNavigationUtils.searchParentNode(edittedNav, uri);
-         PageNode selectedNode = PageNavigationUtils.searchPageNodeByUri(edittedNav, uri);
-         String pageId = selectedNode.getPageReference();
-
-         UserPortalConfigService service = uiApp.getApplicationComponent(UserPortalConfigService.class);
-         Page node = (pageId != null) ? service.getPage(pageId) : null;
-         if (node != null)
-         {
-            UserACL userACL = uiApp.getApplicationComponent(UserACL.class);
-            if (!userACL.hasPermission(node))
-            {
-               uiApp.addMessage(new ApplicationMessage("UIPageBrowser.msg.UserNotPermission", new String[]{pageId}, 1));;
-               return;
-            }
-         }
-         UIPopupWindow uiManagementPopup = uiNodeSelector.getAncestorOfType(UIPopupWindow.class);
-         UIPageNodeForm uiNodeForm = uiApp.createUIComponent(UIPageNodeForm.class, null, null);
-         uiManagementPopup.setUIComponent(uiNodeForm);
-
-         uiNodeForm.setContextPageNavigation(edittedNav);
-         uiNodeForm.setValues(selectedNode);
-         uiNodeForm.setSelectedParent(obj);
-         uiManagementPopup.setWindowSize(800, 500);
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiManagementPopup.getParent());
-      }
-   }
-
-   static public class CopyNodeActionListener extends EventListener<UIRightClickPopupMenu>
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         String uri = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-         UINavigationNodeSelector uiNodeSelector = event.getSource().getAncestorOfType(UINavigationNodeSelector.class);
-         UINavigationManagement uiManagement = uiNodeSelector.getParent();
-         Class<?>[] childrenToRender = new Class<?>[]{UINavigationNodeSelector.class};
-         uiManagement.setRenderedChildrenOfTypes(childrenToRender);
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiManagement);
-
-         PageNavigation nav = uiNodeSelector.getEdittedNavigation();
-         if (nav == null)
-         {
-            return;
-         }
-         PageNode[] pageNodes = PageNavigationUtils.searchPageNodesByUri(nav, uri);
-         if (pageNodes == null)
-         {
-            return;
-         }
-         TreeNodeData selectedNode = new TreeNodeData(nav, pageNodes[0], pageNodes[1]);
-         selectedNode.setDeleteNode(false);
-         uiNodeSelector.setCopyNode(selectedNode);
-         event.getSource().setActions(
-            new String[]{"AddNode", "EditPageNode", "EditSelectedNode", "CopyNode", "CloneNode", "CutNode",
-               "PasteNode", "DeleteNode", "MoveUp", "MoveDown"});
-      }
-   }
-
-   static public class CutNodeActionListener extends UINavigationNodeSelector.CopyNodeActionListener
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         String uri = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-         WebuiRequestContext pcontext = event.getRequestContext();
-         UIApplication uiApp = pcontext.getUIApplication();
-         UINavigationNodeSelector uiNodeSelector = event.getSource().getAncestorOfType(UINavigationNodeSelector.class);
-         UINavigationManagement uiManagement = uiNodeSelector.getParent();
-         Class<?>[] childrenToRender = new Class<?>[]{UINavigationNodeSelector.class};
-         uiManagement.setRenderedChildrenOfTypes(childrenToRender);
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiManagement);
-
-         PageNavigation nav = uiNodeSelector.getEdittedNavigation();
-         if (nav == null)
-         {
-            return;
-         }
-
-         ParentChildPair parentChildPair = PageNavigationUtils.searchParentChildPairByUri(nav, uri);
-         if (parentChildPair == null)
-         {
-            return;
-         }
-
-         PageNode parentNode = parentChildPair.getParentNode();
-         PageNode childNode = parentChildPair.getChildNode();
-
-         if (childNode != null && childNode.isSystem())
-         {
-            uiApp.addMessage(new ApplicationMessage("UINavigationNodeSelector.msg.systemnode-move", null));
-            return;
-         }
-
-         TreeNodeData selectedNode = new TreeNodeData(nav, parentNode, childNode);
-         selectedNode.setDeleteNode(false);
-         uiNodeSelector.setCopyNode(selectedNode);
-         event.getSource().setActions(
-            new String[]{"AddNode", "EditPageNode", "EditSelectedNode", "CopyNode", "CloneNode", "CutNode",
-               "PasteNode", "DeleteNode", "MoveUp", "MoveDown"});
-
-         if (uiNodeSelector.getCopyNode() == null)
-         {
-            return;
-         }
-         uiNodeSelector.getCopyNode().setDeleteNode(true);
-      }
-   }
-
-   static public class CloneNodeActionListener extends UINavigationNodeSelector.CopyNodeActionListener
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         super.execute(event);
-         UINavigationNodeSelector uiNodeSelector = event.getSource().getAncestorOfType(UINavigationNodeSelector.class);
-         uiNodeSelector.getCopyNode().setCloneNode(true);
-      }
-   }
-
-   static public class PasteNodeActionListener extends EventListener<UIRightClickPopupMenu>
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         String targetUri = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-         UIRightClickPopupMenu uiPopupMenu = event.getSource();
-         UINavigationNodeSelector uiNodeSelector = uiPopupMenu.getAncestorOfType(UINavigationNodeSelector.class);
-         UINavigationManagement uiManagement = uiNodeSelector.getParent();
-         Class<?>[] childrenToRender = new Class<?>[]{UINavigationNodeSelector.class};
-         uiManagement.setRenderedChildrenOfTypes(childrenToRender);
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiManagement);
-         TreeNodeData selectedNode = uiNodeSelector.getCopyNode();
-         if (selectedNode == null)
-         {
-            return;
-         }
-
-         PageNode newNode = selectedNode.getNode().clone();
-         PageNavigation targetNav = uiNodeSelector.getEdittedNavigation();
-         PageNode targetNode = PageNavigationUtils.searchPageNodeByUri(targetNav, targetUri);
-
-         if (targetNode != null && newNode.getUri().equals(targetNode.getUri()))
-         {
-            UIApplication uiApp = Util.getPortalRequestContext().getUIApplication();
-            uiApp.addMessage(new ApplicationMessage("UIPageNodeSelector.msg.paste.sameSrcAndDes", null));
-            return;
-         }
-
-         if (isExistChild(targetNode, newNode) || (targetNode == null && isExitChild(targetNav, newNode)))
-         {
-            UIApplication uiApp = Util.getPortalRequestContext().getUIApplication();
-            uiApp.addMessage(new ApplicationMessage("UIPageNodeSelector.msg.paste.sameName", null));
-            return;
-         }
-         if (selectedNode.isDeleteNode())
-         {
-            if (selectedNode.getParentNode() != null)
-            {
-               selectedNode.getParentNode().getChildren().remove(selectedNode.getNode());
-            }
-            else
-            {
-               selectedNode.getPageNavigation().getNodes().remove(selectedNode.getNode());
-            }
-         }
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiNodeSelector);
-         uiNodeSelector.setCopyNode(null);
-         UITree uitree = uiNodeSelector.getChild(UITree.class);
-         UIRightClickPopupMenu popup = uitree.getUIRightClickPopupMenu();
-         popup.setActions(new String[]{"AddNode", "EditPageNode", "EditSelectedNode", "CopyNode", "CutNode",
-            "CloneNode", "DeleteNode", "MoveUp", "MoveDown"});
-
-         UserPortalConfigService service = uiPopupMenu.getApplicationComponent(UserPortalConfigService.class);
-         if (targetNode == null)
-         {
-            newNode.setUri(newNode.getName());
-            targetNav.addNode(newNode);
-            if (selectedNode.isCloneNode())
-            {
-               clonePageFromNode(newNode, targetNav.getOwnerType(), targetNav.getOwnerId(), service);
-            }
-            return;
-         }
-         setNewUri(targetNode, newNode);
-         targetNode.getChildren().add(newNode);
-         if (selectedNode.isCloneNode())
-         {
-            clonePageFromNode(newNode, targetNav.getOwnerType(), targetNav.getOwnerId(), service);
-         }
-         uiNodeSelector.selectPageNodeByUri(targetNode.getUri());
-      }
-
-      private void clonePageFromNode(PageNode node, String ownerType, String ownerId, UserPortalConfigService service)
-         throws Exception
-      {
-         String pageId = node.getPageReference();
-         if (pageId != null)
-         {
-            Page page = service.getPage(pageId);
-            if (page != null)
-            {
-               String newName = "page" + node.hashCode();
-               page = service.renewPage(pageId, newName, ownerType, ownerId);
-               node.setPageReference(page.getPageId());
-            }
-         }
-         List<PageNode> children = node.getChildren();
-         if (children == null || children.size() < 1)
-         {
-            return;
-         }
-         for (PageNode ele : children)
-         {
-            clonePageFromNode(ele, ownerType, ownerId, service);
-         }
-      }
-
-      private void setNewUri(PageNode parent, PageNode child)
-      {
-         String newUri = (parent != null) ? parent.getUri() + "/" + child.getName() : child.getName();
-         child.setUri(newUri);
-         List<PageNode> children = child.getChildren();
-         if (children != null)
-         {
-            for (PageNode node : children)
-            {
-               setNewUri(child, node);
-            }
-         }
-      }
-
-      private boolean isExistChild(PageNode parent, PageNode child)
-      {
-         if (parent == null)
-         {
-            return false;
-         }
-         List<PageNode> nodes = parent.getChildren();
-         if (nodes == null)
-         {
-            parent.setChildren(new ArrayList<PageNode>());
-            return false;
-         }
-         for (PageNode node : nodes)
-         {
-            if (node.getName().equals(child.getName()))
-            {
-               return true;
-            }
-         }
-         return false;
-      }
-
-      private boolean isExitChild(PageNavigation nav, PageNode child)
-      {
-         List<PageNode> nodes = nav.getNodes();
-         if (nodes.size() == 0)
-         {
-            return false;
-         }
-         for (PageNode node : nodes)
-         {
-            if (node.getName().equals(child.getName()))
-            {
-               return true;
-            }
-         }
-         return false;
-      }
-   }
-
-   static public class MoveUpActionListener extends EventListener<UIRightClickPopupMenu>
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         moveNode(event, -1);
-      }
-
-      protected void moveNode(Event<UIRightClickPopupMenu> event, int i)
-      {
-         String uri = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-         UINavigationNodeSelector uiNodeSelector = event.getSource().getAncestorOfType(UINavigationNodeSelector.class);
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiNodeSelector.getParent());
-         PageNavigation nav = uiNodeSelector.getEdittedNavigation();
-         PageNode targetNode = PageNavigationUtils.searchPageNodeByUri(nav, uri);
-         Object parentNode = PageNavigationUtils.searchParentNode(nav, uri);
-         List<PageNode> children = new ArrayList<PageNode>();
-         if (parentNode instanceof PageNavigation)
-         {
-            children = ((PageNavigation)parentNode).getNodes();
-         }
-         else if (parentNode instanceof PageNode)
-         {
-            children = ((PageNode)parentNode).getChildren();
-         }
-         int k = children.indexOf(targetNode);
-         if (k < 0)
-         {
-            return;
-         }
-         if (k == 0 && i == -1)
-         {
-            return;
-         }
-         if (k == children.size() - 1 && i == 1)
-         {
-            return;
-         }
-         children.remove(k);
-         children.add(k + i, targetNode);
-      }
-   }
-
-   static public class MoveDownActionListener extends UINavigationNodeSelector.MoveUpActionListener
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         super.moveNode(event, 1);
-      }
-   }
-
-   static public class DeleteNodeActionListener extends EventListener<UIRightClickPopupMenu>
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         String uri = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-         WebuiRequestContext pcontext = event.getRequestContext();
-         UIApplication uiApp = pcontext.getUIApplication();
-         UINavigationNodeSelector uiNodeSelector = event.getSource().getAncestorOfType(UINavigationNodeSelector.class);
-         pcontext.addUIComponentToUpdateByAjax(uiNodeSelector);
-
-         PageNavigation nav = uiNodeSelector.getEdittedNavigation();
-         if (nav == null)
-         {
-            return;
-         }
-
-         ParentChildPair parentChildPair = PageNavigationUtils.searchParentChildPairByUri(nav, uri);
-         if (parentChildPair == null)
-         {
-            return;
-         }
-
-         PageNode parentNode = parentChildPair.getParentNode();
-         PageNode childNode = parentChildPair.getChildNode();
-         
-         if(childNode.isSystem()) {
-        		uiApp.addMessage(new ApplicationMessage("UINavigationNodeSelector.msg.systemnode-delete", null));
-        		return;
-        	}
-        	
-         if(parentNode == null)
-         {
-            nav.getNodes().remove(childNode);
-         }
-         else
-         {
-            parentNode.getNodes().remove(childNode);
-            uiNodeSelector.selectPageNodeByUri(parentNode.getUri());
-         }
-      }
-   }
-
-   public TreeNodeData getSelectedNode()
-   {
-      return edittedTreeNodeData;
-   }
-
-   public PageNavigation getSelectedNavigation()
-   {
-      return edittedTreeNodeData == null ? null : edittedTreeNodeData.getPageNavigation();
-   }
-
-   public PageNode getSelectedPageNode()
-   {
-      return edittedTreeNodeData == null ? null : edittedTreeNodeData.getNode();
-   }
-
-   public String getUpLevelUri()
-   {
-      return edittedTreeNodeData.getParentNode().getUri();
-   }
-
-   public List<PageNavigation> getDeleteNavigations()
-   {
-      return deleteNavigations;
-   }
-
-   /**
-    *   This class encapsulate data bound to an editted tree node. It consists of a page node (to be added,
-    * removed, moved) its parent node and its navigation
-    * 
-    * @author <a href="mailto:hoang281283 at gmail.com">Minh Hoang TO</a>
-    * @version $Id$
-    *
-    */
-   public static class TreeNodeData
-   {
-
-      private PageNavigation nav;
-
-      private PageNode parentNode;
-
-      private PageNode node;
-
-      private boolean deleteNode = false;
-
-      private boolean cloneNode = false;
-
-      public TreeNodeData(PageNavigation nav, PageNode parentNode, PageNode node)
-      {
-         this.nav = nav;
-         this.parentNode = parentNode;
-         this.node = node;
-      }
-      
-      public TreeNodeData(PageNavigation nav)
-      {
-         this.nav = nav;
-         List<PageNode> children = nav.getNodes();
-         if(children != null && children.size() > 0)
-         {
-            this.node = children.get(0);
-         }
-      }
-
-      public PageNavigation getPageNavigation()
-      {
-         return nav;
-      }
-
-      public void setPageNavigation(PageNavigation nav)
-      {
-         this.nav = nav;
-      }
-
-      public PageNode getParentNode()
-      {
-         return parentNode;
-      }
-
-      public void setParentNode(PageNode parentNode)
-      {
-         this.parentNode = parentNode;
-      }
-
-      public PageNode getNode()
-      {
-         return node;
-      }
-
-      public void setNode(PageNode node)
-      {
-         this.node = node;
-      }
-
-      public boolean isDeleteNode()
-      {
-         return deleteNode;
-      }
-
-      public void setDeleteNode(boolean deleteNode)
-      {
-         this.deleteNode = deleteNode;
-      }
-
-      public boolean isCloneNode()
-      {
-         return cloneNode;
-      }
-
-      public void setCloneNode(boolean b)
-      {
-         cloneNode = b;
-      }
-   }
-
-}

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPageNavigationForm.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPageNavigationForm.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPageNavigationForm.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,16 +1,16 @@
 /**
  * Copyright (C) 2009 eXo Platform SAS.
- * 
+ *
  * This is free software; you can redistribute it and/or modify it
  * under the terms of the GNU Lesser General Public License as
  * published by the Free Software Foundation; either version 2.1 of
  * the License, or (at your option) any later version.
- * 
+ *
  * This software is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this software; if not, write to the Free
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
@@ -20,8 +20,11 @@
 package org.exoplatform.portal.webui.navigation;
 
 import org.exoplatform.portal.application.PortalRequestContext;
-import org.exoplatform.portal.config.DataStorage;
-import org.exoplatform.portal.config.model.PageNavigation;
+import org.exoplatform.portal.mop.navigation.NavigationContext;
+import org.exoplatform.portal.mop.navigation.NavigationService;
+import org.exoplatform.portal.mop.navigation.NavigationState;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.portal.webui.util.Util;
 import org.exoplatform.portal.webui.workspace.UIPortalApplication;
 import org.exoplatform.portal.webui.workspace.UIWorkingWorkspace;
@@ -29,28 +32,27 @@
 import org.exoplatform.webui.application.WebuiRequestContext;
 import org.exoplatform.webui.config.annotation.ComponentConfig;
 import org.exoplatform.webui.config.annotation.EventConfig;
-import org.exoplatform.webui.core.UIApplication;
 import org.exoplatform.webui.core.UIComponent;
 import org.exoplatform.webui.core.UIPopupWindow;
 import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
 import org.exoplatform.webui.core.model.SelectItemOption;
 import org.exoplatform.webui.event.Event;
-import org.exoplatform.webui.event.EventListener;
 import org.exoplatform.webui.event.Event.Phase;
+import org.exoplatform.webui.event.EventListener;
 import org.exoplatform.webui.form.UIForm;
 import org.exoplatform.webui.form.UIFormSelectBox;
 import org.exoplatform.webui.form.UIFormStringInput;
-
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 
+import javax.portlet.ActionResponse;
+import javax.xml.namespace.QName;
+
 /*
  * Created by The eXo Platform SAS
  * Author : tam.nguyen
  *          tamndrok at gmail.com
- * June 11, 2009  
+ * June 11, 2009
  */
 @ComponentConfig(lifecycle = UIFormLifecycle.class, template = "system:/groovy/webui/form/UIFormWithTitle.gtmpl", events = {
    @EventConfig(listeners = UIPageNavigationForm.SaveActionListener.class),
@@ -58,7 +60,7 @@
 public class UIPageNavigationForm extends UIForm
 {
 
-   private PageNavigation pageNav_;
+   private UserNavigation userNav;
 
    private String ownerId;
 
@@ -83,17 +85,17 @@
             new UIFormSelectBox("priority", null, priorties).setValue(getPriority()));
    }
 
-   public void setValues(PageNavigation pageNavigation) throws Exception
+   public void setValues(UserNavigation userNavigation) throws Exception
    {
-      setPageNav(pageNavigation);
-      invokeGetBindingBean(pageNavigation);
-      removeChildById("ownerId");      
-      UIFormStringInput ownerId = new UIFormStringInput("ownerId", "ownerId", pageNavigation.getOwnerId());
+      setUserNav(userNavigation);
+      invokeGetBindingBean(userNavigation);
+      removeChildById("ownerId");
+      UIFormStringInput ownerId = new UIFormStringInput("ownerId", "ownerId", userNavigation.getKey().getName());
       ownerId.setEditable(false);
       ownerId.setParent(this);
       getChildren().add(1, ownerId);
       UIFormSelectBox uiSelectBox = findComponentById("priority");
-      uiSelectBox.setValue(String.valueOf(pageNavigation.getPriority()));
+      uiSelectBox.setValue(String.valueOf(userNavigation.getPriority()));
    }
 
    public void setOwnerId(String ownerId)
@@ -126,14 +128,14 @@
       return priority;
    }
 
-   public void setPageNav(PageNavigation pageNav_)
+   public void setUserNav(UserNavigation pageNav_)
    {
-      this.pageNav_ = pageNav_;
+      this.userNav = pageNav_;
    }
 
-   public PageNavigation getPageNav()
+   public UserNavigation getUserNav()
    {
-      return pageNav_;
+      return userNav;
    }
 
    static public class SaveActionListener extends EventListener<UIPageNavigationForm>
@@ -141,68 +143,45 @@
       public void execute(Event<UIPageNavigationForm> event) throws Exception
       {
          UIPageNavigationForm uiForm = event.getSource();
-         PageNavigation pageNav = uiForm.getPageNav();
+         UserNavigation userNav = uiForm.getUserNav();
 
          // Check existed
          PortalRequestContext prContext = Util.getPortalRequestContext();
-         DataStorage dataService = uiForm.getApplicationComponent(DataStorage.class);
-         PageNavigation persistNavigation = dataService.getPageNavigation(pageNav.getOwnerType(), pageNav.getOwnerId());
-         if (persistNavigation == null)
+         UserPortal userPortal = Util.getUIPortalApplication().getUserPortalConfig().getUserPortal();
+
+         userNav = userPortal.getNavigation(userNav.getKey());
+
+         if (userNav == null)
          {
-            UIApplication uiApp = Util.getPortalRequestContext().getUIApplication();
-            uiApp.addMessage(new ApplicationMessage("UINavigationManagement.msg.NavigationNotExistAnymore", null));
             UIPortalApplication uiPortalApp = (UIPortalApplication)prContext.getUIApplication();
+            uiPortalApp.addMessage(new ApplicationMessage("UINavigationManagement.msg.NavigationNotExistAnymore", null));
             UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
-            UIPopupWindow uiPopup = uiForm.getParent();
-            uiPopup.setShow(false);
             prContext.addUIComponentToUpdateByAjax(uiWorkingWS);
+            prContext.setFullRender(true);
+            UIPopupWindow uiPopup = uiForm.getParent();
+            uiPopup.setShow(false);            
             return;
          }
 
-         WebuiRequestContext pcontext = event.getRequestContext();
-         uiForm.invokeSetBindingBean(pageNav);
          UIFormSelectBox uiSelectBox = uiForm.findComponentById("priority");
          int priority = Integer.parseInt(uiSelectBox.getValue());
-         pageNav.setPriority(priority);
 
          // update navigation
-         dataService.save(pageNav);
+         NavigationService service = uiForm.getApplicationComponent(NavigationService.class);
+         NavigationContext ctx = service.loadNavigation(userNav.getKey());
+         ctx.setState(new NavigationState(priority));
+         service.saveNavigation(ctx);
 
-         pageNav = dataService.getPageNavigation(pageNav.getOwnerType(), pageNav.getOwnerId());
-
-         UIPortalApplication uiPortalApp = Util.getUIPortalApplication();
-         updateNavPriority(uiPortalApp.getNavigations(), pageNav);
-
-         uiPortalApp.localizeNavigations();
-
          UIPopupWindow uiPopup = uiForm.getParent();
          uiPopup.setShow(false);
          UIComponent opener = uiPopup.getParent();
-         UIWorkingWorkspace uiWorkingWS =
-            Util.getUIPortal().getAncestorOfType(UIPortalApplication.class).getChild(UIWorkingWorkspace.class);
-         uiWorkingWS.updatePortletsByName("UserToolbarGroupPortlet");
+         
+         ActionResponse response = event.getRequestContext().getResponse();
+         response.setEvent(new QName("NavigationChange"), null);     
+
+         WebuiRequestContext pcontext = event.getRequestContext();
          pcontext.addUIComponentToUpdateByAjax(opener);
       }
-      
-      private void updateNavPriority(List<PageNavigation> navs, PageNavigation nav)
-      {
-         for (int i = 0; i < navs.size(); i++)
-         {
-            if (navs.get(i).getId() == nav.getId())
-            {
-               navs.set(i, nav);
-               break;
-            }
-         }
-
-         Collections.sort(navs, new Comparator<PageNavigation>()
-         {
-            public int compare(PageNavigation nav1, PageNavigation nav2)
-            {
-               return nav1.getPriority() - nav2.getPriority();
-            }
-         });
-      }
    }
 
    static public class CloseActionListener extends EventListener<UIPageNavigationForm>

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPageNodeSelector.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPageNodeSelector.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPageNodeSelector.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,172 +19,147 @@
 
 package org.exoplatform.portal.webui.navigation;
 
-import org.exoplatform.portal.application.PortalRequestContext;
-import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
-import org.exoplatform.portal.webui.page.UIPage;
-import org.exoplatform.portal.webui.page.UIPageBody;
+import java.util.Iterator;
+
+import org.exoplatform.portal.mop.navigation.NodeChange;
+import org.exoplatform.portal.mop.navigation.NodeChangeQueue;
+import org.exoplatform.portal.mop.navigation.Scope;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.portal.webui.util.Util;
-import org.exoplatform.portal.webui.workspace.UIPortalApplication;
-import org.exoplatform.portal.webui.workspace.UIPortalToolPanel;
-import org.exoplatform.portal.webui.workspace.UIWorkingWorkspace;
 import org.exoplatform.webui.application.WebuiRequestContext;
 import org.exoplatform.webui.config.annotation.ComponentConfig;
-import org.exoplatform.webui.config.annotation.EventConfig;
 import org.exoplatform.webui.core.UIContainer;
 import org.exoplatform.webui.core.UIRightClickPopupMenu;
 import org.exoplatform.webui.core.UITree;
-import org.exoplatform.webui.event.Event;
-import org.exoplatform.webui.event.EventListener;
 
-import java.util.List;
-
-/** Created by The eXo Platform SARL Author : chungnv nguyenchung136 at yahoo.com Jun 23, 2006 10:07:15 AM */
- at ComponentConfig(template = "system:/groovy/portal/webui/navigation/UIPageNodeSelector.gtmpl", events = {@EventConfig(listeners = UIPageNodeSelector.ChangeNodeActionListener.class)})
+ at ComponentConfig(
+   template = "system:/groovy/portal/webui/navigation/UIPageNodeSelector.gtmpl"
+)
 public class UIPageNodeSelector extends UIContainer
 {
+   private UserNode rootNode;
+   
+   private UserNode selectedNode;
+   
+   private UserPortal userPortal;
 
-   //  private List<PageNavigation> navigations;
-   private PageNavigation selectedNavigation;
-
-   private SelectedNode selectedNode;
-
-   private SelectedNode copyNode;
-
    public UIPageNodeSelector() throws Exception
    {
       UITree uiTree = addChild(UITree.class, null, "TreePageSelector");
       uiTree.setIcon("DefaultPageIcon");
       uiTree.setSelectedIcon("DefaultPageIcon");
-      uiTree.setBeanIdField("uri");
+      uiTree.setBeanIdField("URI");
       uiTree.setBeanLabelField("encodedResolvedLabel");
       uiTree.setBeanIconField("icon");
+      uiTree.setBeanChildCountField("childrenCount");
 
-      loadNavigations();
-   }
-
-   private void loadNavigations() throws Exception
+      userPortal = Util.getUIPortalApplication().getUserPortalConfig().getUserPortal();      
+   }  
+   
+   public void configure(UserNode node) throws Exception
    {
-      PageNavigation portalSelectedNav = Util.getUIPortal().getSelectedNavigation();
-      if (portalSelectedNav != null)
+      if (node == null)
       {
-         selectNavigation(portalSelectedNav);
-         PageNode portalSelectedNode = Util.getUIPortal().getSelectedNode();
-         if (portalSelectedNode != null)
-         {
-            selectPageNodeByUri(portalSelectedNode.getUri());
-         }
-         return;
+         throw new IllegalArgumentException("node can't be null");
       }
-      selectNavigation();
-   }
-
-   private void selectNavigation()
-   {
-      if (selectedNavigation == null)
+      
+      this.rootNode = node;
+      while (rootNode.getParent() != null)
       {
-         return;
+         this.rootNode = rootNode.getParent();
       }
-      if (selectedNode == null || selectedNavigation.getId() != selectedNode.getPageNavigation().getId())
-      {
-         selectedNode = new SelectedNode(selectedNavigation, null, null);
-         if (selectedNavigation.getNodes().size() > 0)
-         {
-            selectedNode.setNode(selectedNavigation.getNodes().get(0));
-         }
-      }
-      selectNavigation(selectedNode.getPageNavigation());
-      if (selectedNode.getNode() != null)
-      {
-         selectPageNodeByUri(selectedNode.getNode().getUri());
-      }
+      setSelectedNode(node);
    }
-
-   public void selectNavigation(PageNavigation pageNav)
+   
+   private void setSelectedNode(UserNode node) throws Exception
    {
-      selectedNavigation = pageNav;
-      selectedNode = new SelectedNode(pageNav, null, null);
-      selectPageNodeByUri(null);
-      UITree uiTree = getChild(UITree.class);
-      uiTree.setSibbling(pageNav.getNodes());
-   }
-
-   public void selectPageNodeByUri(String uri)
-   {
-      if (selectedNode == null || (selectedNavigation.getId() != selectedNode.getPageNavigation().getId()))
+      //If node is root node, and it's been deleted --> throw NavigationServiceException
+      node = updateNode(node);
+      
+      //If node has been deleted --> select root node
+      if(node == null)
       {
-         return;
+         node = getRootNode();
       }
+      
       UITree tree = getChild(UITree.class);
-      List<?> sibbling = tree.getSibbling();
-      tree.setSibbling(null);
-      tree.setParentSelected(null);
-      selectedNode.setNode(searchPageNodeByUri(selectedNode.getPageNavigation(), uri));
-      if (selectedNode.getNode() != null)
+      tree.setSelected(node);
+      UserNode parent = node.getParent();
+      if (parent != null)
+      {        
+         tree.setChildren(node.getChildren());
+         tree.setSibbling(parent.getChildren());
+         tree.setParentSelected(parent);
+      }
+      else
       {
-         tree.setSelected(selectedNode.getNode());
-         tree.setChildren(selectedNode.getNode().getChildren());
-         return;
+         tree.setChildren(null);
+         tree.setSibbling(node.getChildren());
+         tree.setParentSelected(node);
       }
-      tree.setSelected(null);
-      tree.setChildren(null);
-      tree.setSibbling(sibbling);
+      selectedNode = node;
    }
-
-   public PageNode searchPageNodeByUri(PageNavigation pageNav, String uri)
+   
+   private UserNode updateNode(UserNode node) throws Exception
    {
-      if (pageNav == null || uri == null)
+      if (node == null) 
       {
          return null;
       }
-      List<PageNode> pageNodes = pageNav.getNodes();
-      UITree uiTree = getChild(UITree.class);
-      for (PageNode ele : pageNodes)
+      
+      NodeChangeQueue<UserNode> queue = new NodeChangeQueue<UserNode>();
+      userPortal.updateNode(node, Scope.GRANDCHILDREN, queue);
+      for (NodeChange<UserNode> change : queue)
       {
-         PageNode returnPageNode = searchPageNodeByUri(ele, uri, uiTree);
-         if (returnPageNode == null)
+         if (change instanceof NodeChange.Removed)
          {
-            continue;
+            UserNode deletedNode = ((NodeChange.Removed<UserNode>)change).getTarget();
+            if (findUserNodeByURI(deletedNode, node.getURI()) != null)
+            {
+               return null;
+            }
          }
-         if (uiTree.getSibbling() == null)
-         {
-            uiTree.setSibbling(pageNodes);
-         }
-         return returnPageNode;
       }
-      return null;
+      return node;
    }
-
-   private PageNode searchPageNodeByUri(PageNode pageNode, String uri, UITree tree)
+   
+   public void setSelectedURI(String uri) throws Exception
    {
-      if (pageNode.getUri().equals(uri))
+      if (selectedNode == null)
       {
-         return pageNode;
+         throw new IllegalStateException("selectedNode is null, configure method must be called first");
       }
-      List<PageNode> children = pageNode.getChildren();
-      if (children == null)
+      
+      UserNode node;
+      if (selectedNode.getParent() != null)
       {
-         return null;
+         node = findUserNodeByURI(selectedNode.getParent(), uri);
       }
-      for (PageNode ele : children)
+      else
       {
-         PageNode returnPageNode = searchPageNodeByUri(ele, uri, tree);
-         if (returnPageNode == null)
+         node = findUserNodeByURI(selectedNode, uri);
+      }
+      setSelectedNode(node);
+   }
+   
+   private UserNode findUserNodeByURI(UserNode rootNode, String uri)
+   {
+      if (rootNode.getURI().equals(uri))
+      {
+         return rootNode;
+      }
+      Iterator<UserNode> iterator = rootNode.getChildren().iterator();
+      while (iterator.hasNext())
+      {
+         UserNode next = iterator.next();
+         UserNode node = findUserNodeByURI(next, uri);
+         if (node == null)
          {
             continue;
          }
-         if (tree.getSibbling() == null)
-         {
-            tree.setSibbling(children);
-         }
-         if (tree.getParentSelected() == null)
-         {
-            tree.setParentSelected(pageNode);
-         }
-         selectedNode.setParentNode(pageNode);
-         return returnPageNode;
+         return node;
       }
       return null;
    }
@@ -198,173 +173,19 @@
       }
       super.processRender(context);
    }
-
-   public SelectedNode getCopyNode()
+   
+   private UserNode getRootNode()
    {
-      return copyNode;
+      return this.rootNode;
    }
-
-   public void setCopyNode(SelectedNode copyNode)
+   
+   public UserNode getSelectedNode()
    {
-      this.copyNode = copyNode;
-   }
-
-   public SelectedNode getSelectedNode()
-   {
       return selectedNode;
    }
 
-   public PageNavigation getSelectedNavigation()
+   public UserNavigation getNavigation()
    {
-      return selectedNavigation;
-   }
-
-   public PageNode getSelectedPageNode()
-   {
-      return selectedNode == null ? null : selectedNode.getNode();
-   }
-
-   public String getUpLevelUri()
-   {
-      return selectedNode.getParentNode().getUri();
-   }
-
-   //  private List<PageNavigation> getExistedNavigation(List<PageNavigation> navis) throws Exception {
-   //    Iterator<PageNavigation> itr = navis.iterator() ;
-   //    UserPortalConfigService configService = getApplicationComponent(UserPortalConfigService.class);
-   //    while(itr.hasNext()) {
-   //      PageNavigation nav = itr.next() ;
-   //      if(configService.getPageNavigation(nav.getOwnerType(), nav.getOwnerId()) == null) itr.remove() ;
-   //    }
-   //    return navis ;
-   //  }
-
-   static public class ChangeNodeActionListener extends EventListener<UITree>
-   {
-      public void execute(Event<UITree> event) throws Exception
-      {
-         String uri = event.getRequestContext().getRequestParameter(OBJECTID);
-         UIPageNodeSelector uiPageNodeSelector = event.getSource().getParent();
-         uiPageNodeSelector.selectPageNodeByUri(uri);
-
-         PortalRequestContext pcontext = (PortalRequestContext)event.getRequestContext();
-         UIPortalApplication uiPortalApp = uiPageNodeSelector.getAncestorOfType(UIPortalApplication.class);
-         UIPortalToolPanel uiToolPanel = Util.getUIPortalToolPanel();
-         uiToolPanel.setRenderSibling(UIPortalToolPanel.class);
-         uiToolPanel.setShowMaskLayer(true);
-         UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
-         pcontext.addUIComponentToUpdateByAjax(uiWorkingWS);
-         pcontext.ignoreAJAXUpdateOnPortlets(true);
-
-         UIContainer uiParent = uiPageNodeSelector.getParent();
-         PageNode node = null;
-         if (uiPageNodeSelector.getSelectedNode() == null)
-         {
-            node = Util.getUIPortal().getSelectedNode();
-         }
-         else
-         {
-            node = uiPageNodeSelector.getSelectedNode().getNode();
-         }
-         if (node == null)
-         {
-            uiPageNodeSelector.selectNavigation(uiPageNodeSelector.getSelectedNavigation());
-            uiToolPanel.setUIComponent(null);
-            return;
-         }
-
-         UserPortalConfigService configService = uiParent.getApplicationComponent(UserPortalConfigService.class);
-         Page page = null;
-         if (node.getPageReference() != null)
-         {
-            page = configService.getPage(node.getPageReference(), event.getRequestContext().getRemoteUser());
-         }
-
-         if (page == null)
-         {
-            uiToolPanel.setUIComponent(null);
-            return;
-         }
-
-         UIPage uiPage = Util.toUIPage(node, uiToolPanel);
-         UIPageBody uiPageBody = uiPortalApp.findFirstComponentOfType(UIPageBody.class);
-         if (uiPageBody.getUIComponent() != null)
-         {
-            uiPageBody.setUIComponent(null);
-         }
-         uiToolPanel.setUIComponent(uiPage);
-      }
-   }
-
-   public static class SelectedNode
-   {
-
-      private PageNavigation nav;
-
-      private PageNode parentNode;
-
-      private PageNode node;
-
-      private boolean deleteNode = false;
-
-      private boolean cloneNode = false;
-
-      public SelectedNode(PageNavigation nav, PageNode parentNode, PageNode node)
-      {
-         this.nav = nav;
-         this.parentNode = parentNode;
-         this.node = node;
-      }
-
-      public PageNavigation getPageNavigation()
-      {
-         return nav;
-      }
-
-      public void setPageNavigation(PageNavigation nav)
-      {
-         this.nav = nav;
-      }
-
-      public PageNode getParentNode()
-      {
-         return parentNode;
-      }
-
-      public void setParentNode(PageNode parentNode)
-      {
-         this.parentNode = parentNode;
-      }
-
-      public PageNode getNode()
-      {
-         return node;
-      }
-
-      public void setNode(PageNode node)
-      {
-         this.node = node;
-      }
-
-      public boolean isDeleteNode()
-      {
-         return deleteNode;
-      }
-
-      public void setDeleteNode(boolean deleteNode)
-      {
-         this.deleteNode = deleteNode;
-      }
-
-      public boolean isCloneNode()
-      {
-         return cloneNode;
-      }
-
-      public void setCloneNode(boolean b)
-      {
-         cloneNode = b;
-      }
-   }
-
+      return selectedNode.getNavigation();
+   }   
 }

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPortalNavigation.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPortalNavigation.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPortalNavigation.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,21 +19,30 @@
 
 package org.exoplatform.portal.webui.navigation;
 
-import org.exoplatform.portal.application.PortalRequestContext;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.SiteType;
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.mop.navigation.NodeChange;
+import org.exoplatform.portal.mop.navigation.NodeChangeQueue;
+import org.exoplatform.portal.mop.navigation.Scope;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.mop.user.UserNodeFilterConfig;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.portal.webui.portal.PageNodeEvent;
 import org.exoplatform.portal.webui.portal.UIPortal;
 import org.exoplatform.portal.webui.util.Util;
-import org.exoplatform.web.application.JavascriptManager;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
 import org.exoplatform.webui.application.WebuiRequestContext;
 import org.exoplatform.webui.core.UIComponent;
 import org.exoplatform.webui.event.Event;
 import org.exoplatform.webui.event.EventListener;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * Created by The eXo Platform SARL Author : Dang Van Minh minhdv81 at yahoo.com
  * Jul 12, 2006
@@ -44,22 +53,26 @@
 
    private boolean showUserNavigation = true;
 
-   protected PageNode selectedNode_;
-
-   protected Object selectedParent_;
-
    private TreeNode treeNode_;
 
    private String cssClassName = "";
 
    private String template;
+
+   private final UserNodeFilterConfig NAVIGATION_FILTER_CONFIG;
    
-   private final static String PORTAL_NAV = "portal";
+   private Scope navigationScope;
    
-   private final static String GROUP_NAV = "group";
-   
-   private final static String USER_NAV = "user";
+   private Log log = ExoLogger.getExoLogger(UIPortalNavigation.class);
 
+   public UIPortalNavigation()
+   {
+      UserNodeFilterConfig.Builder filterConfigBuilder = UserNodeFilterConfig.builder();
+      filterConfigBuilder.withAuthorizationCheck().withVisibility(Visibility.DISPLAYED, Visibility.TEMPORAL);
+      filterConfigBuilder.withTemporalCheck();
+      NAVIGATION_FILTER_CONFIG = filterConfigBuilder.build();
+   }
+
    @Override
    public String getTemplate()
    {
@@ -106,69 +119,157 @@
       return cssClassName;
    }
 
-   public List<PageNavigation> getNavigations() throws Exception
+   public List<UserNode> getNavigations() throws Exception
    {
       WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
-      List<PageNavigation> result = new ArrayList<PageNavigation>();
-
+      List<UserNode> nodes = new ArrayList<UserNode>();
       if (context.getRemoteUser() != null)
       {
-         result.add(PageNavigationUtils.filterNavigation(getSelectedNavigation(), context.getRemoteUser(), false, true));
+         UserNode currRootNode = getCurrentNavigation();
+         if (currRootNode != null)
+         {
+            nodes.add(currRootNode);  
+         }
       }
       else
       {
-         for (PageNavigation nav : Util.getUIPortalApplication().getNavigations())
+         UserPortal userPortal = Util.getUIPortalApplication().getUserPortalConfig().getUserPortal();
+         List<UserNavigation> navigations = userPortal.getNavigations();
+         for (UserNavigation userNav : navigations)
          {
-            if (!showUserNavigation && nav.getOwnerType().equals("user"))
+            if (!showUserNavigation && userNav.getKey().getType().equals(SiteType.USER))
+            {
                continue;
-            result.add(PageNavigationUtils.filterNavigation(nav, null, false, true));
+            }
+
+            UserNode rootNode = userPortal.getNode(userNav, navigationScope, NAVIGATION_FILTER_CONFIG, null);
+            if (rootNode != null)
+            {
+               nodes.add(rootNode);
+            }
          }
       }
-      return result;
+      return nodes;
    }
 
    public void loadTreeNodes() throws Exception
    {
+      treeNode_ = new TreeNode();
+
+      UserPortal userPortal = Util.getUIPortalApplication().getUserPortalConfig().getUserPortal();
+      List<UserNavigation> listNavigations = userPortal.getNavigations();
+
+      List<UserNode> childNodes = new LinkedList<UserNode>();
+      for (UserNavigation nav : rearrangeNavigations(listNavigations))
+      {
+         if (!showUserNavigation && nav.getKey().getTypeName().equals(PortalConfig.USER_TYPE))
+         {
+            continue;
+         }
+         try 
+         {
+            UserNode rootNode = userPortal.getNode(nav, navigationScope, NAVIGATION_FILTER_CONFIG, null);
+            if (rootNode != null)
+            {
+               childNodes.addAll(rootNode.getChildren());
+            }            
+         }
+         catch (Exception ex)
+         {            
+            log.error(ex.getMessage(), ex);
+         }
+      }
+      treeNode_.setChildren(childNodes);
+   }
+   
+   public UserNode resolvePath(String path) throws Exception
+   {
       WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
-      treeNode_ = new TreeNode(new PageNode(), new PageNavigation(), true);
-      List<PageNavigation> listNavigations = Util.getUIPortalApplication().getNavigations();
+      UserPortal userPortal = Util.getUIPortalApplication().getUserPortalConfig().getUserPortal();
       
-      for (PageNavigation nav : rearrangeNavigations(listNavigations))
+      UserNode node;
+      if (context.getRemoteUser() != null)
       {
-         if (!showUserNavigation && nav.getOwnerType().equals("user"))
+         node = userPortal.resolvePath(Util.getUIPortal().getUserNavigation(), NAVIGATION_FILTER_CONFIG, path);
+      }
+      else
+      {
+         node = userPortal.resolvePath(NAVIGATION_FILTER_CONFIG, path);
+      }
+      
+      if (node != null && !node.getURI().equals(path))
+      {
+         //Node has been deleted
+         return null;
+      }
+      return updateNode(node);
+   }
+   
+   public UserNode updateNode(UserNode node) throws Exception
+   {
+      if (node == null)
+      {
+         return null;
+      }
+      UserPortal userPortal = Util.getUIPortalApplication().getUserPortalConfig().getUserPortal();
+      NodeChangeQueue<UserNode> queue = new NodeChangeQueue<UserNode>();
+      userPortal.updateNode(node, navigationScope, queue);
+      for (NodeChange<UserNode> change : queue)
+      {
+         if (change instanceof NodeChange.Removed)
          {
-            continue;
+            UserNode deletedNode = ((NodeChange.Removed<UserNode>)change).getTarget();
+            if (hasRelationship(deletedNode, node))
+            {
+               //Node has been deleted
+               return null;
+            }
          }
-         PageNavigation filterNav = PageNavigationUtils.filter(nav, context.getRemoteUser());
-         treeNode_.setChildren(filterNav.getNodes(), filterNav);
       }
+      return node;      
    }
+      
+   private boolean hasRelationship(UserNode parent, UserNode userNode)
+   {
+      if (parent.getId().equals(userNode.getId()))
+      {
+         return true;
+      }
+      for (UserNode child : parent.getChildren())
+      {
+         if (hasRelationship(child, userNode))
+         {
+            return true;
+         }
+      }
+      return false;
+   }
    
    /**
     * 
     * @param listNavigation
     * @return
     */
-   private List<PageNavigation> rearrangeNavigations(List<PageNavigation> listNavigation)
+   private List<UserNavigation> rearrangeNavigations(List<UserNavigation> listNavigation)
    {
-      List<PageNavigation> returnNavs = new ArrayList<PageNavigation>();
+      List<UserNavigation> returnNavs = new ArrayList<UserNavigation>();
 
-      List<PageNavigation> portalNavs = new ArrayList<PageNavigation>();
-      List<PageNavigation> groupNavs = new ArrayList<PageNavigation>();
-      List<PageNavigation> userNavs = new ArrayList<PageNavigation>();
+      List<UserNavigation> portalNavs = new ArrayList<UserNavigation>();
+      List<UserNavigation> groupNavs = new ArrayList<UserNavigation>();
+      List<UserNavigation> userNavs = new ArrayList<UserNavigation>();
 
-      for (PageNavigation nav : listNavigation)
+      for (UserNavigation nav : listNavigation)
       {
-         String ownerType = nav.getOwnerType();
-         if (PORTAL_NAV.equals(ownerType))
+         String ownerType = nav.getKey().getTypeName();
+         if (PortalConfig.PORTAL_TYPE.equals(ownerType))
          {
             portalNavs.add(nav);
          }
-         else if (GROUP_NAV.equals(ownerType))
+         else if (PortalConfig.GROUP_TYPE.equals(ownerType))
          {
             groupNavs.add(nav);
          }
-         else if (USER_NAV.equals(ownerType))
+         else if (PortalConfig.USER_TYPE.equals(ownerType))
          {
             userNavs.add(nav);
          }
@@ -186,190 +287,114 @@
       return treeNode_;
    }
 
-   public PageNavigation getSelectedNavigation() throws Exception
+   public UserNode getSelectedNode() throws Exception
    {
-      PageNavigation nav = Util.getUIPortal().getSelectedNavigation();
-      if (nav != null)
-         return nav;
-      if (Util.getUIPortal().getNavigations().size() < 1)
-         return null;
-      return Util.getUIPortal().getNavigations().get(0);
-   }
-
-   public Object getSelectedParent()
-   {
-      return selectedParent_;
-   }
-
-   public PageNode getSelectedPageNode() throws Exception
-   {
-      if (selectedNode_ != null)
-         return selectedNode_;
-      selectedNode_ = Util.getUIPortal().getSelectedNode();
-      return selectedNode_;
-   }
-
-   public boolean isSelectedNode(PageNode node)
-   {
-      if (selectedNode_ != null && node.getUri().equals(selectedNode_.getUri()))
-         return true;
-      if (selectedParent_ == null || selectedParent_ instanceof PageNavigation)
-         return false;
-      PageNode pageNode = (PageNode)selectedParent_;
-      return node.getUri().equals(pageNode.getUri());
-   }
-
-   public void processRender(WebuiRequestContext context) throws Exception
-   {
       UIPortal uiPortal = Util.getUIPortal();
-      if ((uiPortal.getSelectedNode() != null) && (uiPortal.getSelectedNode() != selectedNode_))
+      if (uiPortal != null)
       {
-         setSelectedPageNode(uiPortal.getSelectedNode());
+         return uiPortal.getSelectedUserNode();
       }
-      super.processRender(context);
+      return null;
    }
 
-   private void setSelectedPageNode(PageNode selectedNode) throws Exception
+   private UserNode getCurrentNavigation() throws Exception
    {
-      selectedNode_ = selectedNode;
-      selectedParent_ = null;
-      String seletctUri = selectedNode.getUri();
-      int index = seletctUri.lastIndexOf("/");
-      String parentUri = null;
-      if (index > 0)
-         parentUri = seletctUri.substring(0, seletctUri.lastIndexOf("/"));
-      List<PageNavigation> pageNavs = getNavigations();
-      for (PageNavigation pageNav : pageNavs)
+      UserPortal userPortal = Util.getUIPortalApplication().getUserPortalConfig().getUserPortal();
+      UserNavigation userNavigation = Util.getUIPortal().getUserNavigation();
+      try 
       {
-         if (PageNavigationUtils.searchPageNodeByUri(pageNav, selectedNode.getUri()) != null)
-         {
-            if (parentUri == null || parentUri.length() < 1)
-               selectedParent_ = pageNav;
-            else
-               selectedParent_ = PageNavigationUtils.searchPageNodeByUri(pageNav, parentUri);
-            break;
-         }
+         UserNode rootNode = userPortal.getNode(userNavigation, navigationScope, NAVIGATION_FILTER_CONFIG, null);      
+         return rootNode;
+      } 
+      catch (Exception ex)
+      {
+         log.error("Navigation has been deleted");
       }
+      return null;
    }
-
+   
+   public void setScope(Scope scope)
+   {
+      this.navigationScope = scope;
+   }   
+   
    static public class SelectNodeActionListener extends EventListener<UIPortalNavigation>
    {
       public void execute(Event<UIPortalNavigation> event) throws Exception
       {
-         UIPortalNavigation uiNavigation = event.getSource();
          UIPortal uiPortal = Util.getUIPortal();
-         String uri = event.getRequestContext().getRequestParameter(OBJECTID);
-         int index = uri.lastIndexOf("::");
-         String id = uri.substring(index + 2);
-         PageNavigation selectNav = null;
-         if (index <= 0)
+         String treePath = event.getRequestContext().getRequestParameter(OBJECTID);
+
+         TreeNode selectedNode = event.getSource().getTreeNodes().findNodes(treePath);
+         //There're may be interuption between browser and server
+         if (selectedNode == null)
          {
-            selectNav = uiPortal.getSelectedNavigation();
+            event.getRequestContext().addUIComponentToUpdateByAjax(event.getSource());
+            return;
          }
-         else
-         {
-            String navId = uri.substring(0, index);
-            //selectNav = uiPortal.getPageNavigation(Integer.parseInt(navId));
-            selectNav = uiPortal.getSelectedNavigation();
-         }
-         PageNode selectNode = PageNavigationUtils.searchPageNodeByUri(selectNav, id);
-         uiNavigation.selectedNode_ = selectNode;
-         String parentUri = null;
-         index = uri.lastIndexOf("/");
-         if (index > 0)
-            parentUri = uri.substring(0, index);
-         if (parentUri == null || parentUri.length() < 1)
-            uiNavigation.selectedParent_ = selectNav;
-         else
-            uiNavigation.selectedParent_ = PageNavigationUtils.searchPageNodeByUri(selectNav, parentUri);
-
+         
          PageNodeEvent<UIPortal> pnevent;
-         pnevent = new PageNodeEvent<UIPortal>(uiPortal, PageNodeEvent.CHANGE_PAGE_NODE, uri);
+         pnevent = new PageNodeEvent<UIPortal>(uiPortal, PageNodeEvent.CHANGE_PAGE_NODE, selectedNode.getNode().getURI());
          uiPortal.broadcast(pnevent, Event.Phase.PROCESS);
       }
    }
 
+   //Now we use serveSource method to expand a node
+/*   
    static public class ExpandNodeActionListener extends EventListener<UIPortalNavigation>
    {
       public void execute(Event<UIPortalNavigation> event) throws Exception
       {
-         UIPortalNavigation uiNavigation = event.getSource();
-
-         TreeNode treeNode = uiNavigation.getTreeNodes();
-         List<PageNavigation> all_Navigations = Util.getUIPortalApplication().getNavigations();
-         
-         // get URI
-         String uri = event.getRequestContext().getRequestParameter(OBJECTID);
-         int index = uri.lastIndexOf("::");
-         String id = uri.substring(index + 2);
-
-         // get PageNavigation by uri
-         PageNavigation selectNav = null;
-
-         String navId = uri.substring(0, index);
-         selectNav = PageNavigationUtils.findNavigationByID(all_Navigations, Integer.parseInt(navId));
-         if(selectNav == null)
+         String treePath = event.getRequestContext().getRequestParameter(OBJECTID);
+                                                        
+         TreeNode treeNode = event.getSource().getTreeNodes();
+         TreeNode expandTree = treeNode.findNodes(treePath);
+         //There're may be interuption between browser and server
+         if (expandTree == null)
          {
+            event.getRequestContext().addUIComponentToUpdateByAjax(event.getSource());
             return;
          }
-         
-         // get PageNode by uri
-         PageNode expandNode = PageNavigationUtils.searchPageNodeByUri(selectNav, id);
 
-         TreeNode expandTree = null;
-         if (treeNode.getChildren() != null)
+         UserPortal userPortal = Util.getUIPortalApplication().getUserPortalConfig().getUserPortal();
+
+         UserNode node = expandTree.getNode();
+         userPortal.updateNode(node, event.getSource().navigationScope, null);
+         if (node == null)
          {
-            expandTree = treeNode.getChildByPath(uri, treeNode);
+            event.getSource().loadTreeNodes();
+            event.getRequestContext().getUIApplication().addMessage(new
+               ApplicationMessage("UIPortalNavigation.msg.staleData", null, ApplicationMessage.WARNING));
          }
-
-         if(expandTree != null)
+         else
          {
-            expandTree.setChildren(expandNode.getChildren(), selectNav);
+            node.filter(event.getSource().NAVIGATION_FILTER_CONFIG);
+            expandTree.setChildren(node.getChildren());
+            expandTree.setExpanded(true);
          }
-         
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiNavigation);
+                               
+         event.getRequestContext().addUIComponentToUpdateByAjax(event.getSource());
       }
    }
-
+*/
+   
    static public class CollapseNodeActionListener extends EventListener<UIPortalNavigation>
    {
       public void execute(Event<UIPortalNavigation> event) throws Exception
       {
-         UIPortalNavigation uiNavigation = event.getSource();
-
-         TreeNode treeNode = uiNavigation.getTreeNodes();
-         UIPortal uiPortal = Util.getUIPortal();
-
          // get URI
-         String uri = event.getRequestContext().getRequestParameter(OBJECTID);
+         String treePath = event.getRequestContext().getRequestParameter(OBJECTID);
 
-         int index = uri.lastIndexOf("::");
-         String id = uri.substring(index + 2);
-
-         // get PageNavigation by uri
-         PageNavigation selectNav = null;
-
-         String navId = uri.substring(0, index);
+         UIPortalNavigation uiNavigation = event.getSource();
+         TreeNode rootNode = uiNavigation.getTreeNodes();
          
-         //TODO: Minh Hoang TO
-         //selectNav = uiPortal.getPageNavigation(Integer.parseInt(navId));
-         selectNav = uiPortal.getSelectedNavigation();
-         
-         // get PageNode by uri
-         PageNode expandNode = PageNavigationUtils.searchPageNodeByUri(selectNav, id);
-
-         TreeNode expandTree = null;
-         if (treeNode.getChildren() != null)
+         TreeNode collapseTree = rootNode.findNodes(treePath);
+         if (collapseTree != null)
          {
-            expandTree = treeNode.getChildByPath(uri, treeNode);
-         }
+            collapseTree.setExpanded(false);
+         }         
          
-         if(expandTree != null) 
-         {
-            expandTree.setExpanded(false);
-         }
-         
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiNavigation);
+         Util.getPortalRequestContext().setResponseComplete(true);
       }
    }
 
@@ -377,20 +402,19 @@
    {
       public void execute(Event<UIPortalNavigation> event) throws Exception
       {
-         PortalRequestContext prContext = Util.getPortalRequestContext();
          UIPortalNavigation uiNavigation = event.getSource();
-
          uiNavigation.loadTreeNodes();
 
          event.getRequestContext().addUIComponentToUpdateByAjax(uiNavigation);
       }
    }
 
+   //Expand all will not be allowed - The nodes are lazy loaded now
+/*   
    static public class ExpandAllNodeActionListener extends EventListener<UIPortalNavigation>
    {
       public void execute(Event<UIPortalNavigation> event) throws Exception
       {
-         PortalRequestContext prContext = Util.getPortalRequestContext();
          UIPortalNavigation uiNavigation = event.getSource();
          // reload TreeNodes
          uiNavigation.loadTreeNodes();
@@ -408,19 +432,21 @@
          {
             for (TreeNode child : treeNode.getChildren())
             {
-               PageNode expandNode = child.getNode();
-               PageNavigation selectNav = child.getNavigation();
+//               PageNode expandNode = child.getNode();
+//               PageNavigation selectNav = child.getNavigation();
+//
+//               // set node to child tree
+//               if (expandNode.getChildren().size() > 0)
+//               {
+//                  child.setChildren(expandNode.getChildren(), selectNav);
+//               }
 
-               // set node to child tree
-               if (expandNode.getChildren().size() > 0)
-               {
-                  child.setChildren(expandNode.getChildren(), selectNav);
-               }
-
                // expand child tree
                expandAllNode(child);
             }
          }
       }
    }
+*/
+
 }

Deleted: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPortalNavigation2.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPortalNavigation2.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPortalNavigation2.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,187 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- * 
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.webui.navigation;
-
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
-import org.exoplatform.portal.webui.portal.PageNodeEvent;
-import org.exoplatform.portal.webui.portal.UIPortal;
-import org.exoplatform.portal.webui.util.Util;
-import org.exoplatform.webui.application.WebuiRequestContext;
-import org.exoplatform.webui.core.UIComponent;
-import org.exoplatform.webui.event.Event;
-import org.exoplatform.webui.event.EventListener;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class UIPortalNavigation2 extends UIComponent
-{
-   private boolean useAJAX = true;
-
-   protected PageNode selectedNode_;
-
-   protected Object selectedParent_;
-
-   private String template;
-
-   @Override
-   public String getTemplate()
-   {
-      return template != null ? template : super.getTemplate();
-   }
-
-   public void setTemplate(String template)
-   {
-      this.template = template;
-   }
-
-   public UIComponent getViewModeUIComponent()
-   {
-      return null;
-   }
-
-   public void setUseAjax(boolean bl)
-   {
-      useAJAX = bl;
-   }
-
-   public boolean isUseAjax()
-   {
-      return useAJAX;
-   }
-
-   public List<PageNavigation> getNavigations() throws Exception
-   {
-      WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
-      List<PageNavigation> result = new ArrayList<PageNavigation>();
-      for (PageNavigation nav : Util.getUIPortal().getNavigations())
-      {
-         result.add(PageNavigationUtils.filter(nav, context.getRemoteUser()));
-      }
-      return result;
-   }
-
-   public PageNavigation getSelectedNavigation() throws Exception
-   {
-      PageNavigation nav = Util.getUIPortal().getSelectedNavigation();
-      if (nav != null)
-         return nav;
-      if (Util.getUIPortal().getNavigations().size() < 1)
-         return null;
-      return Util.getUIPortal().getNavigations().get(0);
-   }
-
-   public Object getSelectedParent()
-   {
-      return selectedParent_;
-   }
-
-   public PageNode getSelectedPageNode() throws Exception
-   {
-      if (selectedNode_ != null)
-         return selectedNode_;
-      selectedNode_ = Util.getUIPortal().getSelectedNode();
-      return selectedNode_;
-   }
-
-   public boolean isSelectedNode(PageNode node)
-   {
-      if (selectedNode_ != null && node.getUri().equals(selectedNode_.getUri()))
-         return true;
-      if (selectedParent_ == null || selectedParent_ instanceof PageNavigation)
-         return false;
-      PageNode pageNode = (PageNode)selectedParent_;
-      return node.getUri().equals(pageNode.getUri());
-   }
-
-   public void processRender(WebuiRequestContext context) throws Exception
-   {
-      UIPortal uiPortal = Util.getUIPortal();
-      if ((uiPortal.getSelectedNode() != null) && (uiPortal.getSelectedNode() != selectedNode_))
-      {
-         setSelectedPageNode(uiPortal.getSelectedNode());
-      }
-      super.processRender(context);
-   }
-
-   private void setSelectedPageNode(PageNode selectedNode) throws Exception
-   {
-      selectedNode_ = selectedNode;
-      selectedParent_ = null;
-      String seletctUri = selectedNode.getUri();
-      int index = seletctUri.lastIndexOf("/");
-      String parentUri = null;
-      if (index > 0)
-         parentUri = seletctUri.substring(0, seletctUri.lastIndexOf("/"));
-      List<PageNavigation> pageNavs = getNavigations();
-      for (PageNavigation pageNav : pageNavs)
-      {
-         if (PageNavigationUtils.searchPageNodeByUri(pageNav, selectedNode.getUri()) != null)
-         {
-            if (parentUri == null || parentUri.length() < 1)
-               selectedParent_ = pageNav;
-            else
-               selectedParent_ = PageNavigationUtils.searchPageNodeByUri(pageNav, parentUri);
-            break;
-         }
-      }
-   }
-
-   static public class SelectNodeActionListener extends EventListener<UIPortalNavigation2>
-   {
-      public void execute(Event<UIPortalNavigation2> event) throws Exception
-      {
-         UIPortalNavigation2 uiNavigation = event.getSource();
-         UIPortal uiPortal = Util.getUIPortal();
-         String uri = event.getRequestContext().getRequestParameter(OBJECTID);
-         int index = uri.lastIndexOf("::");
-         String id = uri.substring(index + 2);
-         PageNavigation selectNav = null;
-         if (index <= 0)
-         {
-            selectNav = uiPortal.getSelectedNavigation();
-         }
-         else
-         {
-            String navId = uri.substring(0, index);
-            
-            //TODO: Minh Hoang TO
-            //selectNav = uiPortal.getPageNavigation(Integer.parseInt(navId));
-            selectNav = uiPortal.getSelectedNavigation();
-         }
-         PageNode selectNode = PageNavigationUtils.searchPageNodeByUri(selectNav, id);
-         uiNavigation.selectedNode_ = selectNode;
-         String parentUri = null;
-         index = uri.lastIndexOf("/");
-         if (index > 0)
-            parentUri = uri.substring(0, index);
-         if (parentUri == null || parentUri.length() < 1)
-            uiNavigation.selectedParent_ = selectNav;
-         else
-            uiNavigation.selectedParent_ = PageNavigationUtils.searchPageNodeByUri(selectNav, parentUri);
-
-         PageNodeEvent<UIPortal> pnevent;
-         pnevent = new PageNodeEvent<UIPortal>(uiPortal, PageNodeEvent.CHANGE_PAGE_NODE, uri);
-         uiPortal.broadcast(pnevent, Event.Phase.PROCESS);
-      }
-   }
-
-}

Deleted: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPortalNodeSelector.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPortalNodeSelector.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/navigation/UIPortalNodeSelector.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,806 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- * 
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.webui.navigation;
-
-import org.exoplatform.portal.application.PortalRequestContext;
-import org.exoplatform.portal.config.UserPortalConfig;
-import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
-import org.exoplatform.portal.webui.util.Util;
-import org.exoplatform.web.application.ApplicationMessage;
-import org.exoplatform.webui.application.WebuiRequestContext;
-import org.exoplatform.webui.config.annotation.ComponentConfig;
-import org.exoplatform.webui.config.annotation.ComponentConfigs;
-import org.exoplatform.webui.config.annotation.EventConfig;
-import org.exoplatform.webui.core.UIApplication;
-import org.exoplatform.webui.core.UIComponent;
-import org.exoplatform.webui.core.UIContainer;
-import org.exoplatform.webui.core.UIRightClickPopupMenu;
-import org.exoplatform.webui.core.UITree;
-import org.exoplatform.webui.core.model.SelectItemOption;
-import org.exoplatform.webui.event.Event;
-import org.exoplatform.webui.event.EventListener;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Created by The eXo Platform SARL Author : chungnv nguyenchung136 at yahoo.com
- * Jun 23, 2006 10:07:15 AM
- */
- at ComponentConfigs({
-   @ComponentConfig(template = "system:/groovy/portal/webui/navigation/UIPortalNodeSelector.gtmpl", events = {@EventConfig(listeners = UIPortalNodeSelector.ChangeNodeActionListener.class)}),
-   @ComponentConfig(id = "PortalNodePopupMenu", type = UIRightClickPopupMenu.class, template = "system:/groovy/webui/core/UIRightClickPopupMenu.gtmpl", events = {
-      @EventConfig(listeners = UIPortalNodeSelector.AddNodeActionListener.class),
-      @EventConfig(listeners = UIPortalNodeSelector.EditPageNodeActionListener.class),
-      @EventConfig(listeners = UIPortalNodeSelector.EditSelectedNodeActionListener.class),
-      @EventConfig(listeners = UIPortalNodeSelector.CopyNodeActionListener.class),
-      @EventConfig(listeners = UIPortalNodeSelector.CutNodeActionListener.class),
-      @EventConfig(listeners = UIPortalNodeSelector.CloneNodeActionListener.class),
-      @EventConfig(listeners = UIPortalNodeSelector.PasteNodeActionListener.class),
-      @EventConfig(listeners = UIPortalNodeSelector.MoveUpActionListener.class),
-      @EventConfig(listeners = UIPortalNodeSelector.MoveDownActionListener.class),
-      @EventConfig(listeners = UIPortalNodeSelector.DeleteNodeActionListener.class, confirm = "UIPageNodeSelector.deleteNavigation")}),
-   @ComponentConfig(id = "UIPortalNodeSelectorPopupMenu", type = UIRightClickPopupMenu.class, template = "system:/groovy/webui/core/UIRightClickPopupMenu.gtmpl", events = {})})
-public class UIPortalNodeSelector extends UIContainer
-{
-
-   private List<PageNavigation> navigations;
-
-   private SelectedNode selectedNode;
-
-   private SelectedNode copyNode;
-
-   private String portalName;
-
-   private List<PageNavigation> deleteNavigations = new ArrayList<PageNavigation>();
-
-   public UIPortalNodeSelector() throws Exception
-   {
-      addChild(UIRightClickPopupMenu.class, "UIPortalNodeSelectorPopupMenu", null).setRendered(false);
-
-      UITree uiTree = addChild(UITree.class, null, "TreeNodeSelector");
-      uiTree.setIcon("DefaultPageIcon");
-      uiTree.setSelectedIcon("DefaultPageIcon");
-      uiTree.setBeanIdField("uri");
-      uiTree.setBeanLabelField("encodedResolvedLabel");
-      uiTree.setBeanIconField("icon");
-
-      UIRightClickPopupMenu uiPopupMenu = createUIComponent(UIRightClickPopupMenu.class, "PortalNodePopupMenu", null);
-      uiPopupMenu.setActions(new String[]{"AddNode", "EditPageNode", "EditSelectedNode", "CopyNode", "CloneNode",
-         "CutNode", "DeleteNode", "MoveUp", "MoveDown"});
-      uiTree.setUIRightClickPopupMenu(uiPopupMenu);
-   }
-
-   public void loadNavigations(String portalName, String ownerType) throws Exception
-   {
-      this.portalName = portalName;
-      navigations = new ArrayList<PageNavigation>();
-      List<PageNavigation> pnavigations = getExistedNavigation(portalName, ownerType);
-      for (PageNavigation nav : pnavigations)
-      {
-         if (nav.isModifiable())
-            navigations.add(nav);
-      }
-
-      updateUI();
-
-      selectNavigation();
-   }
-
-   public void loadNavigationByNavId(Integer navId, List<PageNavigation> navigations) throws Exception
-   {
-      this.navigations = navigations;
-
-      selectNavigation(navId);
-   }
-
-   private void updateUI()
-   {
-      if (navigations == null || navigations.size() < 1)
-      {
-         getChild(UITree.class).setSibbling(null);
-         return;
-      }
-
-      List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>();
-      for (PageNavigation navigation : navigations)
-      { // navigation.getOwnerId()
-         options.add(new SelectItemOption<String>(navigation.getOwnerType() + ":" + navigation.getOwnerId(), String
-            .valueOf(navigation.getId())));
-      }
-   }
-
-   private void selectNavigation()
-   {
-      if (navigations == null || navigations.size() < 1)
-         return;
-      if (selectedNode == null)
-      {
-         PageNavigation navigation = navigations.get(0);
-         selectedNode = new SelectedNode(navigation, null, null);
-         if (navigation.getNodes().size() > 0)
-            selectedNode.setNode(navigation.getNodes().get(0));
-      }
-      selectNavigation(selectedNode.getPageNavigation().getId());
-      if (selectedNode.getNode() != null)
-         selectPageNodeByUri(selectedNode.getNode().getUri());
-   }
-
-   public void selectNavigation(int id)
-   {
-      for (int i = 0; i < navigations.size(); i++)
-      {
-         if (navigations.get(i).getId() != id)
-            continue;
-         selectedNode = new SelectedNode(navigations.get(i), null, null);
-         selectPageNodeByUri(null);
-         UITree uiTree = getChild(UITree.class);
-         uiTree.setSibbling(navigations.get(i).getNodes());
-      }
-   }
-
-   public void selectPageNodeByUri(String uri)
-   {
-      if (selectedNode == null)
-         return;
-      UITree tree = getChild(UITree.class);
-      List<?> sibbling = tree.getSibbling();
-      tree.setSibbling(null);
-      tree.setParentSelected(null);
-      selectedNode.setNode(searchPageNodeByUri(selectedNode.getPageNavigation(), uri));
-      if (selectedNode.getNode() != null)
-      {
-         tree.setSelected(selectedNode.getNode());
-         tree.setChildren(selectedNode.getNode().getChildren());
-         return;
-      }
-      tree.setSelected(null);
-      tree.setChildren(null);
-      tree.setSibbling(sibbling);
-   }
-
-   public PageNode searchPageNodeByUri(PageNavigation pageNav, String uri)
-   {
-      if (pageNav == null || uri == null)
-         return null;
-      List<PageNode> pageNodes = pageNav.getNodes();
-      UITree uiTree = getChild(UITree.class);
-      for (PageNode ele : pageNodes)
-      {
-         PageNode returnPageNode = searchPageNodeByUri(ele, uri, uiTree);
-         if (returnPageNode == null)
-            continue;
-         if (uiTree.getSibbling() == null)
-            uiTree.setSibbling(pageNodes);
-         return returnPageNode;
-      }
-      return null;
-   }
-
-   private PageNode searchPageNodeByUri(PageNode pageNode, String uri, UITree tree)
-   {
-      if (pageNode.getUri().equals(uri))
-         return pageNode;
-      List<PageNode> children = pageNode.getChildren();
-      if (children == null)
-         return null;
-      for (PageNode ele : children)
-      {
-         PageNode returnPageNode = searchPageNodeByUri(ele, uri, tree);
-         if (returnPageNode == null)
-            continue;
-         if (tree.getSibbling() == null)
-            tree.setSibbling(children);
-         if (tree.getParentSelected() == null)
-            tree.setParentSelected(pageNode);
-         selectedNode.setParentNode(pageNode);
-         return returnPageNode;
-      }
-      return null;
-   }
-
-   public List<PageNavigation> getPageNavigations()
-   {
-      if (navigations == null)
-         navigations = new ArrayList<PageNavigation>();
-      return navigations;
-   }
-
-   public void addPageNavigation(PageNavigation navigation)
-   {
-      if (navigations == null)
-         navigations = new ArrayList<PageNavigation>();
-      navigations.add(navigation);
-      updateUI();
-   }
-
-   public void deletePageNavigation(PageNavigation navigation)
-   {
-      if (navigations == null || navigations.size() < 1)
-         return;
-      navigations.remove(navigation);
-      deleteNavigations.add(navigation);
-      selectedNode = null;
-      selectNavigation();
-      updateUI();
-   }
-
-   public PageNavigation getPageNavigation(int id)
-   {
-      for (PageNavigation ele : getPageNavigations())
-      {
-         if (ele.getId() == id)
-            return ele;
-      }
-      return null;
-   }
-
-   public void processRender(WebuiRequestContext context) throws Exception
-   {
-      UIRightClickPopupMenu uiPopupMenu = getChild(UIRightClickPopupMenu.class);
-      if (uiPopupMenu != null)
-      {
-         if (navigations == null || navigations.size() < 1)
-            uiPopupMenu.setRendered(false);
-         else
-            uiPopupMenu.setRendered(true);
-      }
-      super.processRender(context);
-   }
-
-   public SelectedNode getCopyNode()
-   {
-      return copyNode;
-   }
-
-   public void setCopyNode(SelectedNode copyNode)
-   {
-      this.copyNode = copyNode;
-   }
-
-   private List<PageNavigation> getExistedNavigation(String portalName, String ownerType) throws Exception
-   {
-      PortalRequestContext prContext = Util.getPortalRequestContext();
-      UserPortalConfigService configService = getApplicationComponent(UserPortalConfigService.class);
-      UserPortalConfig config = configService.getUserPortalConfig(portalName, prContext.getRemoteUser());
-      List<PageNavigation> navis = config.getNavigations();
-      if (ownerType != null)
-      {
-         Iterator<PageNavigation> itr = navis.iterator();
-         while (itr.hasNext())
-         {
-            PageNavigation nav = itr.next();
-            if (!nav.getOwnerType().equals(ownerType))
-               itr.remove();
-         }
-      }
-
-      return navis;
-   }
-
-   static public class ChangeNodeActionListener extends EventListener<UITree>
-   {
-      public void execute(Event<UITree> event) throws Exception
-      {
-         String uri = event.getRequestContext().getRequestParameter(OBJECTID);
-         UIPortalNodeSelector uiPortalNodeSelector = event.getSource().getParent();
-         uiPortalNodeSelector.selectPageNodeByUri(uri);
-      }
-   }
-
-   static public class AddNodeActionListener extends EventListener<UIRightClickPopupMenu>
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         //      String uri = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-         //      UIRightClickPopupMenu uiPopupMenu = event.getSource();
-         //      UIPortalNodeSelector uiPortalNodeSelector = uiPopupMenu.getAncestorOfType(UIPortalNodeSelector.class);
-         //      if (uiPortalNodeSelector.getSelectedNavigation() == null) {
-         //        UIApplication uiApp = Util.getPortalRequestContext().getUIApplication();
-         //        uiApp.addMessage(new ApplicationMessage("UIPageNodeSelector.msg.NoPageNavigation", null));
-         //
-         //        event.getRequestContext().addUIComponentToUpdateByAjax(uiPortalNodeSelector.getParent());
-         //        return;
-         //      }
-         //
-         //      UIPortalApplication uiApp = uiPortalNodeSelector.getAncestorOfType(UIPortalApplication.class);
-         //      UIMaskWorkspace uiMaskWS = uiApp.getChildById(UIPortalApplication.UI_MASK_WS_ID);
-         //      event.getRequestContext().addUIComponentToUpdateByAjax(uiMaskWS);
-         //      event.getRequestContext().addUIComponentToUpdateByAjax(uiPortalNodeSelector.getParent());
-         //      UIPageNodeForm2 uiNodeForm = uiMaskWS.createUIComponent(UIPageNodeForm2.class, null, null);
-         //      uiNodeForm.setValues(null);
-         //      uiMaskWS.setUIComponent(uiNodeForm);
-         //      uiMaskWS.setShow(true);
-         //
-         //      Object parent = null;
-         //      List<PageNode> pageNodes = uiPortalNodeSelector.getSelectedNavigation().getNodes();
-         //      if (uri != null && uri.trim().length() > 0) {
-         //        for (PageNode pageNode : pageNodes) {
-         //          parent = PageNavigationUtils.searchPageNodeByUri(pageNode, uri);
-         //          if (parent != null)
-         //            break;
-         //        }
-         //      }
-         //      if (parent == null)
-         //        parent = uiPortalNodeSelector.getSelectedNavigation();
-         //      uiNodeForm.setSelectedParent(parent);
-      }
-   }
-
-   static public class EditPageNodeActionListener extends EventListener<UIRightClickPopupMenu>
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         //      UIRightClickPopupMenu uiPopupMenu = event.getSource();
-         //      String uri  = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-         //      PortalRequestContext pcontext  = (PortalRequestContext)event.getRequestContext();
-         //      UIPortalNodeSelector uiPortalNodeSelector = uiPopupMenu.getAncestorOfType(UIPortalNodeSelector.class) ;
-         //      PageNavigation currentNav = uiPortalNodeSelector.getSelectedNavigation();
-         //      PageNode selectNode = PageNavigationUtils.searchPageNodeByUri(currentNav, uri);
-         //      
-         //      uiPortalNodeSelector.selectPageNodeByUri(uri);
-         //      UIPortalApplication uiPortalApp = Util.getUIPortalApplication() ;
-         //      UIPageManagement2 uiManagement = uiPortalNodeSelector.getParent();
-         //            
-         //      UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
-         //      pcontext.addUIComponentToUpdateByAjax(uiWorkingWS) ;
-         //      pcontext.setFullRender(true);
-         //      
-         //      UserPortalConfigService portalConfigService = uiPopupMenu.getApplicationComponent(UserPortalConfigService.class);
-         //      Page page = null;
-         //      if(selectNode.getPageReference() != null) page = portalConfigService.getPage(selectNode.getPageReference(), pcontext.getRemoteUser());
-         //      if(page == null) {
-         //        Class<?> [] childrenToRender = {UIPortalNodeSelector.class, UIPortalNavigationControlBar.class };      
-         //        uiManagement.setRenderedChildrenOfTypes(childrenToRender);
-         //        if(selectNode.getPageReference() != null && portalConfigService.getPage(selectNode.getPageReference()) != null) {
-         //          uiPortalApp.addMessage(new ApplicationMessage("UIPageBrowser.msg.edit.NotEditPage", new String[]{})) ;
-         //        } else {
-         //          uiPortalApp.addMessage(new ApplicationMessage("UIPageBrowser.msg.PageNotExist", new String[]{})) ;
-         //        }
-         //        return;
-         //      }
-         //      
-         //      if(!page.isModifiable()){
-         //        Class<?> [] childrenToRender = {UIPortalNodeSelector.class, UIPortalNavigationControlBar.class};      
-         //        uiManagement.setRenderedChildrenOfTypes(childrenToRender);        
-         //        uiPortalApp.addMessage(new ApplicationMessage("UIPageNodeSelector.msg.Invalid-editPermission", null)) ;        
-         //        return;
-         //      }
-         //      
-         //      UIMaskWorkspace uiMaskWS = uiPortalApp.getChildById(UIPortalApplication.UI_MASK_WS_ID) ;      
-         //      UIPageForm2 uiPageForm =  uiMaskWS.createUIComponent(UIPageForm2.class);
-         //      uiPageForm.removeChild(UIPageTemplateOptions.class);
-         //      
-         //      UIPage uiPage = Util.toUIPage(page, uiMaskWS);
-         //      uiPageForm.setValues(uiPage);
-         //      uiMaskWS.setUIComponent(uiPageForm);
-         //      uiMaskWS.setWindowSize(640, 400);
-         //      uiMaskWS.setShow(true);
-         //      pcontext.addUIComponentToUpdateByAjax(uiMaskWS);
-         //      Class<?> [] childrenToRender = {UIPortalNodeSelector.class, UIPortalNavigationControlBar.class};      
-         //      uiManagement.setRenderedChildrenOfTypes(childrenToRender);
-      }
-   }
-
-   static public class EditSelectedNodeActionListener extends EventListener<UIRightClickPopupMenu>
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         //      UIRightClickPopupMenu popupMenu = event.getSource();
-         //      UIComponent parent = popupMenu.getParent();
-         //      UIPortalNodeSelector uiPortalNodeSelector = parent.getParent();     
-         //      UIPortalApplication uiApp = uiPortalNodeSelector.getAncestorOfType(UIPortalApplication.class);      
-         //      UIMaskWorkspace uiMaskWS = uiApp.getChildById(UIPortalApplication.UI_MASK_WS_ID) ;
-         //      event.getRequestContext().addUIComponentToUpdateByAjax(uiMaskWS);
-         //      event.getRequestContext().addUIComponentToUpdateByAjax(uiPortalNodeSelector.<UIPageManagement2>getParent());
-         //      
-         //      String uri  = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-         //      PageNavigation selectedNav = uiPortalNodeSelector.getSelectedNavigation();
-         //      Object obj = PageNavigationUtils.searchParentNode(selectedNav, uri);
-         //      PageNode selectedNode = PageNavigationUtils.searchPageNodeByUri(selectedNav, uri);
-         //      String pageId = selectedNode.getPageReference();
-         //      UserPortalConfigService service = parent.getApplicationComponent(UserPortalConfigService.class);
-         //      PortalRequestContext pcontext = Util.getPortalRequestContext();
-         //      UIPortalApplication uiPortalApp = parent.getAncestorOfType(UIPortalApplication.class);
-         //      Page node = (pageId != null) ? service.getPage(pageId) : null ;
-         //      if(node != null) {
-         //        UserACL userACL = parent.getApplicationComponent(UserACL.class) ;
-         //        if(!userACL.hasPermission(node, pcontext.getRemoteUser())) {
-         //          uiPortalApp.addMessage(new ApplicationMessage("UIPageBrowser.msg.UserNotPermission", new String[]{pageId}, 1)) ;;
-         //          return;
-         //        }
-         //      } 
-         //      
-         //      UIPageNodeForm2 uiNodeForm = uiMaskWS.createUIComponent(UIPageNodeForm2.class, null, null);
-         //      uiMaskWS.setUIComponent(uiNodeForm);     
-         //      uiNodeForm.setValues(selectedNode);
-         //      uiNodeForm.setSelectedParent(obj);   
-      }
-   }
-
-   static public class CopyNodeActionListener extends EventListener<UIRightClickPopupMenu>
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         String uri = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-         UIPortalNodeSelector uiPortalNodeSelector = event.getSource().getAncestorOfType(UIPortalNodeSelector.class);
-         //UIPageManagement2 uiManagement = uiPortalNodeSelector.getParent();
-         Class<?>[] childrenToRender = new Class<?>[]{UIPortalNodeSelector.class};
-         //uiManagement.setRenderedChildrenOfTypes(childrenToRender);      
-         //event.getRequestContext().addUIComponentToUpdateByAjax(uiManagement);
-
-         PageNavigation nav = uiPortalNodeSelector.getSelectedNavigation();
-         if (nav == null)
-            return;
-         PageNode[] pageNodes = PageNavigationUtils.searchPageNodesByUri(nav, uri);
-         if (pageNodes == null)
-            return;
-         SelectedNode selectedNode = new SelectedNode(nav, pageNodes[0], pageNodes[1]);
-         selectedNode.setDeleteNode(false);
-         uiPortalNodeSelector.setCopyNode(selectedNode);
-         event.getSource().setActions(
-            new String[]{"AddNode", "EditPageNode", "EditSelectedNode", "CopyNode", "CloneNode", "CutNode",
-               "PasteNode", "DeleteNode", "MoveUp", "MoveDown"});
-      }
-   }
-
-   static public class CutNodeActionListener extends UIPortalNodeSelector.CopyNodeActionListener
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         super.execute(event);
-         UIPortalNodeSelector uiPortalNodeSelector = event.getSource().getAncestorOfType(UIPortalNodeSelector.class);
-         if (uiPortalNodeSelector.getCopyNode() == null)
-            return;
-         uiPortalNodeSelector.getCopyNode().setDeleteNode(true);
-      }
-   }
-
-   static public class CloneNodeActionListener extends UIPortalNodeSelector.CopyNodeActionListener
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         super.execute(event);
-         UIPortalNodeSelector uiPortalNodeSelector = event.getSource().getAncestorOfType(UIPortalNodeSelector.class);
-         uiPortalNodeSelector.getCopyNode().setCloneNode(true);
-      }
-   }
-
-   static public class PasteNodeActionListener extends EventListener<UIRightClickPopupMenu>
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         String targetUri = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-         UIRightClickPopupMenu uiPopupMenu = event.getSource();
-         UIPortalNodeSelector uiPortalNodeSelector = uiPopupMenu.getAncestorOfType(UIPortalNodeSelector.class);
-         //UIPageManagement2 uiManagement = uiPortalNodeSelector.getParent();
-         Class<?>[] childrenToRender = new Class<?>[]{UIPortalNodeSelector.class};
-         //uiManagement.setRenderedChildrenOfTypes(childrenToRender);      
-         //event.getRequestContext().addUIComponentToUpdateByAjax(uiManagement);
-         SelectedNode selectedNode = uiPortalNodeSelector.getCopyNode();
-         if (selectedNode == null)
-            return;
-
-         PageNode newNode = selectedNode.getNode().clone();
-         PageNavigation targetNav = uiPortalNodeSelector.getSelectedNavigation();
-         PageNode targetNode = PageNavigationUtils.searchPageNodeByUri(targetNav, targetUri);
-
-         if (targetNode != null && newNode.getUri().equals(targetNode.getUri()))
-         {
-            UIApplication uiApp = Util.getPortalRequestContext().getUIApplication();
-            uiApp.addMessage(new ApplicationMessage("UIPageNodeSelector.msg.paste.sameSrcAndDes", null));
-            return;
-         }
-
-         if (isExistChild(targetNode, newNode) || (targetNode == null && isExitChild(targetNav, newNode)))
-         {
-            UIApplication uiApp = Util.getPortalRequestContext().getUIApplication();
-            uiApp.addMessage(new ApplicationMessage("UIPageNodeSelector.msg.paste.sameName", null));
-            return;
-         }
-         if (selectedNode.isDeleteNode())
-         {
-            if (selectedNode.getParentNode() != null)
-            {
-               selectedNode.getParentNode().getChildren().remove(selectedNode.getNode());
-            }
-            else
-            {
-               selectedNode.getPageNavigation().getNodes().remove(selectedNode.getNode());
-            }
-         }
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiPortalNodeSelector);
-         uiPortalNodeSelector.setCopyNode(null);
-         UITree uitree = uiPortalNodeSelector.getChild(UITree.class);
-         UIRightClickPopupMenu popup = uitree.getUIRightClickPopupMenu();
-         popup.setActions(new String[]{"AddNode", "EditPageNode", "EditSelectedNode", "CopyNode", "CutNode",
-            "CloneNode", "DeleteNode", "MoveUp", "MoveDown"});
-
-         UserPortalConfigService service = uiPopupMenu.getApplicationComponent(UserPortalConfigService.class);
-         if (targetNode == null)
-         {
-            newNode.setUri(newNode.getName());
-            targetNav.addNode(newNode);
-            if (selectedNode.isCloneNode())
-            {
-               clonePageFromNode(newNode, targetNav.getOwnerType(), targetNav.getOwnerId(), service);
-            }
-            return;
-         }
-         setNewUri(targetNode, newNode);
-         targetNode.getChildren().add(newNode);
-         if (selectedNode.isCloneNode())
-         {
-            clonePageFromNode(newNode, targetNav.getOwnerType(), targetNav.getOwnerId(), service);
-         }
-         uiPortalNodeSelector.selectPageNodeByUri(targetNode.getUri());
-      }
-
-      private void clonePageFromNode(PageNode node, String ownerType, String ownerId, UserPortalConfigService service)
-         throws Exception
-      {
-         String pageId = node.getPageReference();
-         if (pageId != null)
-         {
-            Page page = service.getPage(pageId);
-            if (page != null)
-            {
-               String newName = "page" + node.hashCode();
-               page = service.renewPage(pageId, newName, ownerType, ownerId);
-               node.setPageReference(page.getPageId());
-            }
-         }
-         List<PageNode> children = node.getChildren();
-         if (children == null || children.size() < 1)
-            return;
-         for (PageNode ele : children)
-         {
-            clonePageFromNode(ele, ownerType, ownerId, service);
-         }
-      }
-
-      private void setNewUri(PageNode parent, PageNode child)
-      {
-         String newUri = (parent != null) ? parent.getUri() + "/" + child.getName() : child.getName();
-         child.setUri(newUri);
-         List<PageNode> children = child.getChildren();
-         if (children != null)
-            for (PageNode node : children)
-               setNewUri(child, node);
-      }
-
-      private boolean isExistChild(PageNode parent, PageNode child)
-      {
-         if (parent == null)
-            return false;
-         List<PageNode> nodes = parent.getChildren();
-         if (nodes == null)
-         {
-            parent.setChildren(new ArrayList<PageNode>());
-            return false;
-         }
-         for (PageNode node : nodes)
-         {
-            if (node.getName().equals(child.getName()))
-               return true;
-         }
-         return false;
-      }
-
-      private boolean isExitChild(PageNavigation nav, PageNode child)
-      {
-         List<PageNode> nodes = nav.getNodes();
-         if (nodes.size() == 0)
-            return false;
-         for (PageNode node : nodes)
-         {
-            if (node.getName().equals(child.getName()))
-               return true;
-         }
-         return false;
-      }
-   }
-
-   static public class MoveUpActionListener extends EventListener<UIRightClickPopupMenu>
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         moveNode(event, -1);
-      }
-
-      protected void moveNode(Event<UIRightClickPopupMenu> event, int i)
-      {
-         String uri = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-         UIPortalNodeSelector uiPortalNodeSelector = event.getSource().getAncestorOfType(UIPortalNodeSelector.class);
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiPortalNodeSelector.getParent());
-         PageNavigation nav = uiPortalNodeSelector.getSelectedNavigation();
-         PageNode targetNode = PageNavigationUtils.searchPageNodeByUri(nav, uri);
-         Object parentNode = PageNavigationUtils.searchParentNode(nav, uri);
-         List<PageNode> children = new ArrayList<PageNode>();
-         if (parentNode instanceof PageNavigation)
-         {
-            children = ((PageNavigation)parentNode).getNodes();
-         }
-         else if (parentNode instanceof PageNode)
-         {
-            children = ((PageNode)parentNode).getChildren();
-         }
-         int k = children.indexOf(targetNode);
-         if (k < 0)
-            return;
-         if (k == 0 && i == -1)
-            return;
-         if (k == children.size() - 1 && i == 1)
-            return;
-         children.remove(k);
-         children.add(k + i, targetNode);
-      }
-   }
-
-   static public class MoveDownActionListener extends UIPortalNodeSelector.MoveUpActionListener
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         super.moveNode(event, 1);
-      }
-   }
-
-   static public class DeleteNodeActionListener extends EventListener<UIRightClickPopupMenu>
-   {
-      public void execute(Event<UIRightClickPopupMenu> event) throws Exception
-      {
-         //      String uri  = event.getRequestContext().getRequestParameter(UIComponent.OBJECTID);
-         //      PortalRequestContext pcontext = (PortalRequestContext)event.getRequestContext() ;
-         //      UIPortalNodeSelector uiPortalNodeSelector = event.getSource().getAncestorOfType(UIPortalNodeSelector.class);
-         //      UIPageManagement2 uiManagement = uiPortalNodeSelector.getParent();
-         //      Class<?> [] childrenToRender = new Class<?>[]{UIPortalNodeSelector.class, UIPortalNavigationControlBar.class };
-         //      uiManagement.setRenderedChildrenOfTypes(childrenToRender);      
-         //      pcontext.addUIComponentToUpdateByAjax(uiManagement);
-         //      
-         //      PageNavigation nav = uiPortalNodeSelector.getSelectedNavigation();
-         //      if(nav == null) return;
-         //      
-         //      PageNode [] pageNodes = PageNavigationUtils.searchPageNodesByUri(nav, uri);
-         //      if(pageNodes == null) return;
-         //      
-         //      UIPortalApplication uiPortalApp = event.getSource().getAncestorOfType(UIPortalApplication.class);
-         //      UIWorkingWorkspace uiWorkspace = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
-         //      pcontext.setFullRender(true) ;
-         //      pcontext.addUIComponentToUpdateByAjax(uiWorkspace);
-         //      if(pageNodes[0] == null) {
-         //        nav.getNodes().remove(pageNodes[1]);
-         //        return;
-         //      }
-         //      pageNodes[0].getChildren().remove(pageNodes[1]);
-         //      uiPortalNodeSelector.selectPageNodeByUri(pageNodes[0].getUri());
-      }
-   }
-
-   public SelectedNode getSelectedNode()
-   {
-      return selectedNode;
-   }
-
-   public PageNavigation getSelectedNavigation()
-   {
-      return selectedNode == null ? null : selectedNode.getPageNavigation();
-   }
-
-   public PageNode getSelectedPageNode()
-   {
-      return selectedNode == null ? null : selectedNode.getNode();
-   }
-
-   public String getUpLevelUri()
-   {
-      return selectedNode.getParentNode().getUri();
-   }
-
-   public List<PageNavigation> getDeleteNavigations()
-   {
-      return deleteNavigations;
-   }
-
-   public String getPortalName()
-   {
-      return portalName;
-   }
-
-   public void setPortalName(String portalName)
-   {
-      this.portalName = portalName;
-   }
-
-   public static class SelectedNode
-   {
-
-      private PageNavigation nav;
-
-      private PageNode parentNode;
-
-      private PageNode node;
-
-      private boolean deleteNode = false;
-
-      private boolean cloneNode = false;
-
-      public SelectedNode(PageNavigation nav, PageNode parentNode, PageNode node)
-      {
-         this.nav = nav;
-         this.parentNode = parentNode;
-         this.node = node;
-      }
-
-      public PageNavigation getPageNavigation()
-      {
-         return nav;
-      }
-
-      public void setPageNavigation(PageNavigation nav)
-      {
-         this.nav = nav;
-      }
-
-      public PageNode getParentNode()
-      {
-         return parentNode;
-      }
-
-      public void setParentNode(PageNode parentNode)
-      {
-         this.parentNode = parentNode;
-      }
-
-      public PageNode getNode()
-      {
-         return node;
-      }
-
-      public void setNode(PageNode node)
-      {
-         this.node = node;
-      }
-
-      public boolean isDeleteNode()
-      {
-         return deleteNode;
-      }
-
-      public void setDeleteNode(boolean deleteNode)
-      {
-         this.deleteNode = deleteNode;
-      }
-
-      public boolean isCloneNode()
-      {
-         return cloneNode;
-      }
-
-      public void setCloneNode(boolean b)
-      {
-         cloneNode = b;
-      }
-   }
-
-}

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/PageQueryAccessList.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/PageQueryAccessList.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/PageQueryAccessList.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -27,8 +27,6 @@
 import org.exoplatform.portal.config.Query;
 import org.exoplatform.portal.config.model.Page;
 
-import java.util.Comparator;
-
 /**
  * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
  * @version $Revision$
@@ -46,12 +44,6 @@
    {
       ExoContainer container = PortalContainer.getInstance();
       DataStorage service = (DataStorage)container.getComponentInstance(DataStorage.class);
-      return service.find2(state, new Comparator<Page>()
-      {
-         public int compare(Page page1, Page page2)
-         {
-            return page1.getName().compareTo(page2.getName());
-         }
-      });
+      return service.find2(state);
    }
 }

Deleted: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/PageUtils.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/PageUtils.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/PageUtils.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,97 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- * 
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.webui.page;
-
-import org.exoplatform.portal.config.DataStorage;
-import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
-import org.exoplatform.portal.config.model.PortalConfig;
-import org.exoplatform.portal.webui.portal.UIPortal;
-import org.exoplatform.portal.webui.util.Util;
-import org.exoplatform.portal.webui.workspace.UIPortalApplication;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by The eXo Platform SAS
- * Author : Pham Thanh Tung
- *          thanhtungty at gmail.com
- * Feb 19, 2008  
- */
-public class PageUtils
-{
-
-   /**
-    * This method create new Page and PageNode from an existing page and add created PageNode to children of parentNode
-    *
-    */
-   public static void createNodeFromPageTemplate(String nodeName, String nodeLabel, String pageId, PageNode parentNode)
-      throws Exception
-   {
-
-      UIPortalApplication uiPortalApp = Util.getUIPortalApplication();
-      UserPortalConfigService configService = uiPortalApp.getApplicationComponent(UserPortalConfigService.class);
-      String accessUser = Util.getPortalRequestContext().getRemoteUser();
-      PageNode node =
-         configService.createNodeFromPageTemplate(nodeName, nodeLabel, pageId, PortalConfig.USER_TYPE, accessUser);
-      node.setUri(parentNode.getUri() + "/" + node.getName());
-      if (parentNode.getChildren() == null)
-         parentNode.setChildren(new ArrayList<PageNode>());
-      parentNode.getChildren().add(node);
-   }
-
-   /**
-    * This method create new Page and PageNode from an existing page and add created PageNode to user PageNavigation.
-    * It also saves changes to database and UIPortal
-    *
-    */
-   public static void createNodeFromPageTemplate(String nodeName, String nodeLabel, String pageId, PageNavigation navi)
-      throws Exception
-   {
-
-      UIPortal uiPortal = Util.getUIPortal();
-      UserPortalConfigService configService = uiPortal.getApplicationComponent(UserPortalConfigService.class);
-      String accessUser = Util.getPortalRequestContext().getRemoteUser();
-      PageNode node =
-         configService.createNodeFromPageTemplate(nodeName, nodeLabel, pageId, PortalConfig.USER_TYPE, accessUser);
-
-      node.setUri(node.getName());
-      navi.addNode(node);
-      
-      DataStorage dataService = uiPortal.getApplicationComponent(DataStorage.class);
-      dataService.save(navi);
-      setNavigation(uiPortal.getNavigations(), navi);
-   }
-
-   private static void setNavigation(List<PageNavigation> navs, PageNavigation nav)
-   {
-      for (int i = 0; i < navs.size(); i++)
-      {
-         if (navs.get(i).getId() == nav.getId())
-         {
-            navs.set(i, nav);
-            return;
-         }
-      }
-   }
-
-}

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageActionListener.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageActionListener.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageActionListener.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,17 +19,17 @@
 
 package org.exoplatform.portal.webui.page;
 
-import org.exoplatform.container.ExoContainer;
 import org.exoplatform.portal.application.PortalRequestContext;
 import org.exoplatform.portal.config.DataStorage;
 import org.exoplatform.portal.config.UserPortalConfig;
-import org.exoplatform.portal.config.UserPortalConfigService;
 import org.exoplatform.portal.config.model.Container;
 import org.exoplatform.portal.config.model.ModelObject;
 import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
 import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.portal.webui.application.UIGadget;
 import org.exoplatform.portal.webui.portal.PageNodeEvent;
 import org.exoplatform.portal.webui.portal.UIPortal;
@@ -52,331 +52,81 @@
  */
 public class UIPageActionListener
 {
-
    static public class ChangePageNodeActionListener extends EventListener<UIPortal>
    {
-      @Override
       public void execute(Event<UIPortal> event) throws Exception
       {
          UIPortal showedUIPortal = event.getSource();
          UIPortalApplication uiPortalApp = Util.getUIPortalApplication();
          
-         //This code snippet is to make sure that Javascript/Skin is fully loaded at the first request
-         UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
-         PortalRequestContext pcontext = Util.getPortalRequestContext();
-         pcontext.ignoreAJAXUpdateOnPortlets(true);
-         pcontext.addUIComponentToUpdateByAjax(uiWorkingWS);
+         UserPortal userPortal = uiPortalApp.getUserPortalConfig().getUserPortal();
          
-         PageNavigation currentNav = showedUIPortal.getSelectedNavigation();
-         String currentUri = showedUIPortal.getSelectedNode().getUri();
-         if(currentUri.startsWith("/"))
-         {
-            currentUri = currentUri.substring(1);
-         }
+         String uri = ((PageNodeEvent<UIPortal>)event).getTargetNodeUri();
+         UserNode naviPath = userPortal.resolvePath(null, uri);
+         UserNavigation targetNav = naviPath.getNavigation();
          
-         //This if branche is to make sure that the first time user logs in, showedUIPortal has selectedPaths
-         //Otherwise, there will be NPE on BreadcumbsPortlet
-         if(showedUIPortal.getSelectedPath() == null)
-         {
-            List<PageNode> currentSelectedPath = findPath(currentNav, currentUri.split("/"));
-            showedUIPortal.setSelectedPath(currentSelectedPath);
-         }
+         UserNode currentNavPath = showedUIPortal.getNavPath();
          
-         String targetedUri = ((PageNodeEvent<UIPortal>)event).getTargetNodeUri();
-         if(targetedUri.startsWith("/"))
+         if(currentNavPath != null && currentNavPath.getNavigation().getKey().equals(targetNav.getKey()))
          {
-            targetedUri = targetedUri.substring(1);
-         }
-         
-         PageNavigation targetedNav = getTargetedNav(uiPortalApp, targetedUri);
-         
-         if(targetedNav == null)
-         {
-            return;
-         }
-       
-         String formerNavType = currentNav.getOwnerType();
-         String formerNavId = currentNav.getOwnerId();
-         String newNavType = targetedNav.getOwnerType();
-         String newNavId = targetedNav.getOwnerId();
-         
-         String[] targetPath = targetedUri.split("/");
-         PageNode targetPageNode = getTargetedNode(targetedNav, targetPath);
-         List<PageNode> targetedPathNodes = findPath(targetedNav, targetPath);
-         
-         if(formerNavType.equals(newNavType) && formerNavId.equals(newNavId))
-         {
             //Case 1: Both navigation type and id are not changed, but current page node is changed
-            if(!currentUri.equals(targetedUri))
+            if(!currentNavPath.getURI().equals(naviPath.getURI()))
             {
-               showedUIPortal.setSelectedNode(targetPageNode);
-               showedUIPortal.setSelectedPath(targetedPathNodes);
+               showedUIPortal.setNavPath(naviPath);
             }
          }
          else
          {
             // Case 2: Either navigation type or id has been changed
             // First, we try to find a cached UIPortal
+            UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
             uiWorkingWS.setRenderedChild(UIPortalApplication.UI_VIEWING_WS_ID);
             uiPortalApp.setModeState(UIPortalApplication.NORMAL_MODE);
-            showedUIPortal = uiPortalApp.getCachedUIPortal(newNavType, newNavId);
+            showedUIPortal = uiPortalApp.getCachedUIPortal(targetNav.getKey());
             if (showedUIPortal != null)
             {
-               showedUIPortal.setSelectedNode(targetPageNode);
-               showedUIPortal.setSelectedPath(targetedPathNodes);
+               showedUIPortal.setNavPath(naviPath);
                uiPortalApp.setShowedUIPortal(showedUIPortal);
                
                //Temporary solution to fix edit inline error while switching between navigations
                DataStorage storageService = uiPortalApp.getApplicationComponent(DataStorage.class);
-               PortalConfig associatedPortalConfig = storageService.getPortalConfig(newNavType, newNavId);
+               PortalConfig associatedPortalConfig = storageService.getPortalConfig(targetNav.getKey().getTypeName(), targetNav.getKey().getName());
                UserPortalConfig userPortalConfig = uiPortalApp.getUserPortalConfig();
                
                //Update layout-related data on UserPortalConfig
                userPortalConfig.setPortal(associatedPortalConfig);
-
-               //Update selected navigation on UserPortalConfig, that is mandatory as at the moment the PortalConfig
-               //does not hold any navigation data.
-               userPortalConfig.updateSelectedNavigation(newNavType, newNavId);
             }
             else
             {
-               showedUIPortal = buildUIPortal(targetedNav, uiPortalApp, uiPortalApp.getUserPortalConfig());
+               showedUIPortal = buildUIPortal(targetNav.getKey(), uiPortalApp, uiPortalApp.getUserPortalConfig());
                if(showedUIPortal == null)
                {
                   return;
                }
-               showedUIPortal.setSelectedNode(targetPageNode);
-               showedUIPortal.setSelectedPath(targetedPathNodes);
+               showedUIPortal.setNavPath(naviPath);
                uiPortalApp.setShowedUIPortal(showedUIPortal);
                uiPortalApp.putCachedUIPortal(showedUIPortal);
             }
          }
+         
          showedUIPortal.refreshUIPage();
       }
-      
-      /**
-       * Get the targeted <code>PageNavigation</code>
-       * 
-       * @param uiPortalApp
-       * @param targetedUri
-       * @return
-       */
-      private PageNavigation getTargetedNav(UIPortalApplication uiPortalApp, String targetedUri)
-      {
-         List<PageNavigation> allNavs = uiPortalApp.getUserPortalConfig().getNavigations();
-         
-         //That happens when user browses to an empty-nodeUri URL like ../portal/public/classic/
-         //In this case, we returns default navigation
-         if(targetedUri.length() == 0)
-         {
-            return uiPortalApp.getNavigations().get(0);
-         }
-         
-         String[] pathNodes = targetedUri.split("/");
-         
-         return getBestMatchNavigation(allNavs, pathNodes);
-      }
-      
-      /**
-       * Get the navigation containing longest subpath of 'pathNodes'
-       * 
-       * @param listNav
-       * @param pathNodes
-       * @return
-       */
-      private PageNavigation getBestMatchNavigation(List<PageNavigation> listNav, String[] pathNodes)
-      {
-         int temporalMaximalMatching = 0;
-         PageNavigation temporalBestNavigation = listNav.get(0);
-         
-         for(PageNavigation nav : listNav)
-         {
-            int currentNumberOfMatching = countNumberOfMatchedPathNodes(nav, pathNodes);
-            
-            //The whole pathNodes matches current navigation
-            if(currentNumberOfMatching == pathNodes.length)
-            {
-               return nav;
-            }
-            
-            if(currentNumberOfMatching > temporalMaximalMatching)
-            {
-               temporalMaximalMatching = currentNumberOfMatching;
-               temporalBestNavigation = nav;
-            }
-         }
-         return temporalBestNavigation;
-      }
-      
-      /**
-       * Count the maximal number of nodes matching the pathNodes while descending the navigation 'nav'
-       * 
-       * @param nav
-       * @param pathNodes
-       * @return
-       */
-      private int countNumberOfMatchedPathNodes(PageNavigation nav, String[] pathNodes)
-      {
-         if(pathNodes.length == 0)
-         {
-            return 0;
-         }
-         
-         PageNode currentNode = nav.getNode(pathNodes[0]);
-         int numberOfMatch = (currentNode != null)? 1 : 0 ;
-         
-         for(int i = 1; i < pathNodes.length; i++)
-         {
-            if(currentNode == null)
-            {
-               break;
-            }
-            currentNode = currentNode.getChild(pathNodes[i]);
-         }
-         return numberOfMatch;
-      }
-      
-      /**
-       * Fetch the currently selected pageNode under a PageNavigation. It is the last node encountered
-       * while descending the pathNodes
-       * 
-       * This method returns <code>null</code> iff only 'notfound' node remains in the navigation
-       * 
-       * @param targetedNav
-       * @param pathNodes
-       * @return
-       */
-      private PageNode getTargetedNode(PageNavigation targetedNav, String[] pathNodes)
-      {
-         //Case users browses to a URL of the form  */portal/public/classic
-         if(pathNodes.length == 0)
-         {
-           return getDefaultNode(targetedNav);
-         }
-         
-         PageNode currentNode = targetedNav.getNode(pathNodes[0]);
-         if(currentNode == null)
-         {
-            return getDefaultNode(targetedNav);
-         }
-         
-         PageNode tempNode = null;
-         
-         for(int i = 1; i < pathNodes.length; i++)
-         {
-            tempNode = currentNode.getChild(pathNodes[i]);
-            if (tempNode == null)
-            {
-               break;
-            }
-            else
-            {
-               currentNode = tempNode;
-            }
-         }
-         return currentNode;
-      }
-      
-      /**
-       * Default node of a navigation. This method returns
-       * 
-       * 1. The first node in the list of 'nav' 's children if the list contains
-       * at least one child other than 'notfound'
-       * 
-       * 2. <code>null</code> otherwise
-       * 
-       * @param nav
-       * @return
-       */
-      private PageNode getDefaultNode(PageNavigation nav)
-      {
-         PageNode defaultNode = null;
-         try
-         {
-            if (nav != null && nav.getNodes().size() > 0)
-            {
-               WebuiRequestContext context = Util.getPortalRequestContext();
-               ExoContainer appContainer = context.getApplication().getApplicationServiceContainer();
-               UserPortalConfigService userPortalConfigService = (UserPortalConfigService)appContainer.getComponentInstanceOfType(UserPortalConfigService.class);
-               
-               for (PageNode pageNode : nav.getNodes())
-               {
-                  Page page = userPortalConfigService.getPage(pageNode.getPageReference(), context.getRemoteUser());
-                  if (page != null)
-                  {
-                     defaultNode = pageNode;
-                     break;
-                  }
-               }
-            }
-            else
-            {
-               return null;
-            }
-         }
-         catch (Exception e)
-         {
-            e.printStackTrace();
-            return null;
-         }
-         if (defaultNode != null && !("notfound".equals(defaultNode.getName())))
-         {
-            return defaultNode;
-         }
-         else
-         {
-            return null;
-         }
-      }
-      
-      private List<PageNode> findPath(PageNavigation nav, String[] pathNodes)
-      {
-         List<PageNode> nodes = new ArrayList<PageNode>(4);
-         
-         //That happens when user browses to a URL like /portal/public/classic
-         if(pathNodes.length == 0)
-         {
-            nodes.add(getDefaultNode(nav));
-            return nodes;
-         }
-         PageNode startNode = nav.getNode(pathNodes[0]);
-         if (startNode == null)
-         {
-            nodes.add(getDefaultNode(nav));
-            return nodes;
-         }
-         nodes.add(startNode);
 
-         for (int i = 1; i < pathNodes.length; i++)
-         {
-            startNode = startNode.getChild(pathNodes[i]);
-            if(startNode == null)
-            {
-               break;
-            }
-            else
-            {
-               nodes.add(startNode);
-            }
-         }
-         return nodes;
-      }
-
-      private UIPortal buildUIPortal(PageNavigation newPageNav, UIPortalApplication uiPortalApp, UserPortalConfig userPortalConfig) throws Exception
+      private UIPortal buildUIPortal(SiteKey newPageNav, UIPortalApplication uiPortalApp, UserPortalConfig userPortalConfig) throws Exception
       {
          DataStorage storage = uiPortalApp.getApplicationComponent(DataStorage.class);
          if(storage == null){
             return null;
          }
-         PortalConfig portalConfig = storage.getPortalConfig(newPageNav.getOwnerType(), newPageNav.getOwnerId());
+         PortalConfig portalConfig = storage.getPortalConfig(newPageNav.getTypeName(), newPageNav.getName());
          Container layout = portalConfig.getPortalLayout();
          if(layout != null)
          {
             userPortalConfig.setPortal(portalConfig);
          }
          UIPortal uiPortal = uiPortalApp.createUIComponent(UIPortal.class, null, null);
+         
          //Reset selected navigation on userPortalConfig
-         userPortalConfig.setSelectedNavigation(newPageNav);
          PortalDataMapper.toUIPortal(uiPortal, userPortalConfig);
          return uiPortal;
       }

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageBody.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageBody.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageBody.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -23,7 +23,7 @@
 import org.exoplatform.portal.config.UserPortalConfigService;
 import org.exoplatform.portal.config.model.Page;
 import org.exoplatform.portal.config.model.PageBody;
-import org.exoplatform.portal.config.model.PageNode;
+import org.exoplatform.portal.mop.user.UserNode;
 import org.exoplatform.portal.webui.portal.UIPortal;
 import org.exoplatform.portal.webui.portal.UIPortalComponent;
 import org.exoplatform.portal.webui.util.PortalDataMapper;
@@ -69,7 +69,7 @@
       setId("UIPageBody");
    }
 
-   public void setPageBody(PageNode pageNode, UIPortal uiPortal) throws Exception
+   public void setPageBody(UserNode pageNode, UIPortal uiPortal) throws Exception
    {
       WebuiRequestContext context = Util.getPortalRequestContext();
       uiPortal.setMaximizedUIComponent(null);
@@ -110,7 +110,7 @@
     * @param uiPortal
     * @return
     */
-   private UIPage getUIPage(PageNode pageNode, UIPortal uiPortal, WebuiRequestContext context)
+   private UIPage getUIPage(UserNode pageNode, UIPortal uiPortal, WebuiRequestContext context)
       throws Exception
    {
       Page page = null;
@@ -118,7 +118,7 @@
       
       if (pageNode != null)
       {
-         pageReference = pageNode.getPageReference();
+         pageReference = pageNode.getPageRef();
          if (pageReference != null)
          {
             ExoContainer appContainer = context.getApplication().getApplicationServiceContainer();

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageBrowser.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageBrowser.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageBrowser.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -35,9 +35,12 @@
 import org.exoplatform.portal.config.UserPortalConfigService;
 import org.exoplatform.portal.config.model.ModelObject;
 import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
 import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.navigation.Scope;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.portal.webui.application.UIPortlet;
 import org.exoplatform.portal.webui.portal.PageNodeEvent;
 import org.exoplatform.portal.webui.portal.UIPortal;
@@ -54,6 +57,7 @@
 import org.exoplatform.webui.config.annotation.ParamConfig;
 import org.exoplatform.webui.core.UIApplication;
 import org.exoplatform.webui.core.UIComponent;
+import org.exoplatform.webui.core.UIContainer;
 import org.exoplatform.webui.core.UIPopupWindow;
 import org.exoplatform.webui.core.UIRepeater;
 import org.exoplatform.webui.core.UISearch;
@@ -66,6 +70,7 @@
 import org.exoplatform.webui.form.UIForm;
 import org.exoplatform.webui.form.UIFormInputItemSelector;
 import org.exoplatform.webui.form.UIFormInputSet;
+import org.exoplatform.webui.form.UIFormRadioBoxInput;
 import org.exoplatform.webui.form.UIFormSelectBox;
 import org.exoplatform.webui.form.UIFormStringInput;
 import org.exoplatform.webui.form.UISearchForm;
@@ -75,7 +80,6 @@
       @EventConfig(listeners = UIPageBrowser.DeleteActionListener.class, confirm = "UIPageBrowse.deletePage"),
       @EventConfig(listeners = UIPageBrowser.EditInfoActionListener.class),
       @EventConfig(listeners = UIPageBrowser.AddNewActionListener.class)
-   //        @EventConfig(listeners = UIPageBrowser.BackActionListener.class)
    }),
    @ComponentConfig(id = "UIBrowserPageForm", type = UIPageForm.class, lifecycle = UIFormLifecycle.class, template = "system:/groovy/webui/form/UIFormTabPane.gtmpl", events = {
       @EventConfig(listeners = UIPageBrowser.SavePageActionListener.class, name = "Save"),
@@ -85,7 +89,7 @@
       @EventConfig(listeners = UIMaskWorkspace.CloseActionListener.class, phase = Phase.DECODE)}, initParams = @ParamConfig(name = "PageTemplate", value = "system:/WEB-INF/conf/uiconf/portal/webui/page/PageTemplate.groovy")),
    @ComponentConfig(type = UIFormInputSet.class, id = "PermissionSetting", template = "system:/groovy/webui/core/UITabSelector.gtmpl", events = {@EventConfig(listeners = UIFormInputSet.SelectComponentActionListener.class)})})
 @Serialized
-public class UIPageBrowser extends UISearch
+public class UIPageBrowser extends UIContainer
 {
 
    public static final String[] BEAN_FIELD = {"pageId", "title", "accessPermissions", "editPermission"};
@@ -96,27 +100,29 @@
 
    protected String pageSelectedId_;
 
-   private static List<SelectItemOption<String>> OPTIONS = new ArrayList<SelectItemOption<String>>(3);
+   private static List<SelectItemOption<String>> OPTIONS = new ArrayList<SelectItemOption<String>>(2);
 
    static
    {
       WebuiRequestContext contextui = WebuiRequestContext.getCurrentInstance();
       ResourceBundle res = contextui.getApplicationResourceBundle();
-      OPTIONS.add(new SelectItemOption<String>(res.getString("UIPageSearch.label.option.ownerType"), "ownerType"));
-      OPTIONS.add(new SelectItemOption<String>(res.getString("UIPageSearch.label.option.ownerId"), "ownerId"));
-      OPTIONS.add(new SelectItemOption<String>(res.getString("UIPageSearch.label.option.title"), "title"));
+      OPTIONS.add(new SelectItemOption<String>(res.getString("UIPageSearchForm.label.option.portal"), "portal"));
+      OPTIONS.add(new SelectItemOption<String>(res.getString("UIPageSearchForm.label.option.group"), "group"));
    }
 
    private Query<Page> lastQuery_;
 
    public UIPageBrowser() throws Exception
    {
-      super(OPTIONS);
-
-      getChild(UISearchForm.class).setId("UIPageSearch");
+      UIPageSearchForm uiSearchForm = addChild(UIPageSearchForm.class, null, null);
+      uiSearchForm.setOptions(OPTIONS);
+      uiSearchForm.setId("UIPageSearchForm");
       UIRepeater uiRepeater = createUIComponent(UIRepeater.class, null, null);
       uiRepeater.configure("pageId", BEAN_FIELD, ACTIONS);
 
+      lastQuery_ = new Query<Page>(null, null, null, null, Page.class);
+      lastQuery_.setOwnerType(OPTIONS.get(0).getValue());
+      
       UIVirtualList virtualList = addChild(UIVirtualList.class, null, null);
       virtualList.setPageSize(10);
       virtualList.setUIComponent(uiRepeater);
@@ -127,6 +133,27 @@
       return lastQuery_;
    }
 
+   public Query<Page> getQuery(UIFormInputSet searchInputs)
+   {
+      Query<Page> query = new Query<Page>(null, null, null, null, Page.class);
+      UIFormStringInput titleInput = (UIFormStringInput)searchInputs.getChild(0);
+      UIFormStringInput siteNameInput = (UIFormStringInput)searchInputs.getChild(1);
+      UIFormSelectBox select = (UIFormSelectBox)searchInputs.getChild(2);
+      
+      String siteName = siteNameInput.getValue();
+      String title = titleInput.getValue();
+      String ownerType = select.getValue();      
+      if (title != null && title != "")
+         query.setTitle(title);
+      if (siteName != null && siteName != "")
+         query.setOwnerId(siteName);
+
+      query.setOwnerType(ownerType);
+      query.setName(null);
+      
+      return query;
+   }
+   
    /**
     * Update data feed in UIRepeater with a given query.
     * Returns false if no result is found, true other wise
@@ -172,20 +199,7 @@
 
    public void quickSearch(UIFormInputSet quickSearchInput) throws Exception
    {
-      UIFormStringInput input = (UIFormStringInput)quickSearchInput.getChild(0);
-      UIFormSelectBox select = (UIFormSelectBox)quickSearchInput.getChild(1);
-      String value = input.getValue();
-      String selectBoxValue = select.getValue();
-      Query<Page> query = new Query<Page>(null, null, null, null, Page.class);
-      if (selectBoxValue.equals("title"))
-         query.setTitle(value);
-      else if (selectBoxValue.equals("ownerType"))
-         query.setOwnerType(value);
-      else if (selectBoxValue.equals("ownerId"))
-         query.setOwnerId(value);
-      query.setName(null);
-
-      lastQuery_ = query;
+      lastQuery_ = this.getQuery(quickSearchInput);
       boolean dataAvailable = feedDataWithQuery(lastQuery_);
       if (!dataAvailable)
       {
@@ -233,21 +247,6 @@
    {
    }
 
-   /*
-   public void reset() throws Exception
-   {
-      UIVirtualList virtualList = getChild(UIVirtualList.class);
-      UIRepeater repeater = (UIRepeater)virtualList.getDataFeed();
-      LazyPageList datasource = (LazyPageList)repeater.getDataSource();
-      int currentPage = datasource.getCurrentPage();
-      feedDataWithQuery(null);
-      if (currentPage > datasource.getAvailablePage())
-         currentPage = datasource.getAvailablePage();
-      if (currentPage > 0)
-         datasource.getPage(currentPage);
-   }
-   */
-
    static public class DeleteActionListener extends EventListener<UIPageBrowser>
    {
       public void execute(Event<UIPageBrowser> event) throws Exception
@@ -276,7 +275,8 @@
          }
          
          UIPortal uiPortal = Util.getUIPortal();
-         boolean isDeleteCurrentPage = uiPortal.getSelectedNode().getPageReference().equals(page.getPageId());
+         UserNode userNode = uiPortal.getSelectedUserNode();
+         boolean isDeleteCurrentPage = userNode.getPageRef().equals(page.getPageId());
          if (isDeleteCurrentPage && page.getOwnerType().equals(PortalConfig.USER_TYPE))
          {
             ApplicationMessage msg = new ApplicationMessage("UIPageBrowser.msg.delete.DeleteCurrentUserPage", null, ApplicationMessage.WARNING);
@@ -289,6 +289,11 @@
          PageListAccess datasource = (PageListAccess)repeater.getDataSource();
          int currentPage = datasource.getCurrentPage();
 
+         //Update navigation and UserToolbarGroupPortlet if deleted page is dashboard page
+         if(page.getOwnerType().equals(PortalConfig.USER_TYPE)){
+            removePageNode(page, event);
+         }
+
          dataService.remove(page);
          //Minh Hoang TO: The cached UIPage objects corresponding to removed Page should be removed here.
          //As we have multiple UIPortal, which means multiple caches of UIPage. It 's unwise to garbage
@@ -298,8 +303,7 @@
          if (isDeleteCurrentPage)
          {
             PageNodeEvent<UIPortal> pnevent =
-               new PageNodeEvent<UIPortal>(uiPortal, PageNodeEvent.CHANGE_PAGE_NODE, uiPortal.getSelectedNode()
-                  .getUri());
+               new PageNodeEvent<UIPortal>(uiPortal, PageNodeEvent.CHANGE_PAGE_NODE, userNode.getURI());
             uiPortal.broadcast(pnevent, Phase.PROCESS);
          }
          else
@@ -314,17 +318,6 @@
             datasource.getPage(currentPage);
             event.getRequestContext().addUIComponentToUpdateByAjax(uiPageBrowser);
          }
-         
-         //Update navigation and UserToolbarGroupPortlet if deleted page is dashboard page
-         if(page.getOwnerType().equals(PortalConfig.USER_TYPE)){
-            removePageNode(page, event);
-         }
-
-         UIWorkingWorkspace uiWorkingWorkspace = uiPortalApp.getChild(UIWorkingWorkspace.class);
-         uiWorkingWorkspace.updatePortletsByName("UserToolbarSitePortlet");
-         uiWorkingWorkspace.updatePortletsByName("UserToolbarGroupPortlet");
-         uiWorkingWorkspace.updatePortletsByName("UserToolbarDashboardPortlet");
-         uiWorkingWorkspace.updatePortletsByName("NavigationPortlet");
       }
       
       /**
@@ -339,57 +332,39 @@
        */
       private void removePageNode(Page page, Event<UIPageBrowser> event) throws Exception
       {
-         UIPageBrowser uiPageBrowser = event.getSource();
-         DataStorage dataService = uiPageBrowser.getApplicationComponent(DataStorage.class);
-
-         PageNavigation pageNavigation = null;
          UIPortalApplication portalApplication = Util.getUIPortalApplication();
+         UserPortal userPortal = portalApplication.getUserPortalConfig().getUserPortal();
 
-         List<PageNavigation> listPageNavigation = portalApplication.getNavigations();
-
-         for (PageNavigation pageNvg : listPageNavigation)
+         UserNavigation userNav = userPortal.getNavigation(SiteKey.user(event.getRequestContext().getRemoteUser()));
+         UserNode rootNode = userPortal.getNode(userNav, Scope.CHILDREN, null, null);
+         if (rootNode == null)
          {
-            if (pageNvg.getOwnerType().equals(PortalConfig.USER_TYPE))
-            {
-               pageNavigation = pageNvg;
-               break;
-            }
+            return;
          }
-         UIPortal uiPortal = Util.getUIPortal();
 
-         PageNode tobeRemoved = null;
-         List<PageNode> nodes = pageNavigation.getNodes();
-         for (PageNode pageNode : nodes)
+         for (UserNode userNode : rootNode.getChildren())
          {
-            String pageReference = pageNode.getPageReference();
-            String pageId = page.getPageId();
-
-            if (pageReference != null && pageReference.equals(pageId))
+            if (page.getPageId().equals(userNode.getPageRef()))
             {
-               tobeRemoved = pageNode;
-               break;
-            }
-         }
+               // Remove pageNode
+               rootNode.removeChild(userNode.getName());
+               userPortal.saveNode(rootNode, null);
 
-         if (tobeRemoved != null)
-         {
-            // Remove pageNode
-            pageNavigation.getNodes().remove(tobeRemoved);
+               // Update navigation and UserToolbarGroupPortlet
 
-            // Update navigation and UserToolbarGroupPortlet
+               String pageRef = page.getPageId();
+               if (pageRef != null && pageRef.length() > 0)
+               {
+                  // Remove from cache
+                  UIPortal uiPortal = Util.getUIPortal();
+                  uiPortal.clearUIPage(pageRef);
+               }
 
-            String pageRef = tobeRemoved.getPageReference();
-            if (pageRef != null && pageRef.length() > 0)
-            {
-               // Remove from cache
-               uiPortal.clearUIPage(pageRef);
+               //Update UserToolbarDashboardPortlet
+               ActionResponse actResponse = event.getRequestContext().getResponse();
+               actResponse.setEvent(new QName("NavigationChange"), userNode.getName());
+               return;
             }
-
-            dataService.save(pageNavigation);
-
-            //Update UserToolbarDashboardPortlet
-            ActionResponse actResponse = event.getRequestContext().getResponse();
-            actResponse.setEvent(new QName("UserPageNodeDeleted"), tobeRemoved.getName());
          }
       }
    }
@@ -439,23 +414,6 @@
       }
    }
 
-   //  TODO: Tan Pham Dinh: No need back action in portal 2.6
-   //  static public class BackActionListener extends EventListener<UIPageBrowser> {
-   //
-   //    public void execute(Event<UIPageBrowser> event) throws Exception {
-   //      UIPortalApplication uiPortalApp = Util.getUIPortalApplication();
-   //      uiPortalApp.setModeState(UIPortalApplication.NORMAL_MODE);
-   //      UIPortal uiPortal = Util.getUIPortal();
-   //      String uri = uiPortal.getSelectedNavigation().getId() + "::"
-   //          + uiPortal.getSelectedNode().getUri();
-   //      PageNodeEvent<UIPortal> pnevent = new PageNodeEvent<UIPortal>(uiPortal,
-   //                                                                    PageNodeEvent.CHANGE_PAGE_NODE,
-   //                                                                    uri);
-   //      uiPortal.broadcast(pnevent, Event.Phase.PROCESS);
-   //    }
-   //
-   //  }
-
    static public class SavePageActionListener extends UIPageForm.SaveActionListener
    {
       public void execute(Event<UIPageForm> event) throws Exception

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageCreationWizard.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageCreationWizard.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageCreationWizard.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,18 +19,18 @@
 
 package org.exoplatform.portal.webui.page;
 
-import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
-import java.util.List;
 
 import org.exoplatform.portal.application.PortalRequestContext;
 import org.exoplatform.portal.config.DataStorage;
 import org.exoplatform.portal.config.UserACL;
 import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
 import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.navigation.NavigationServiceException;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.portal.webui.navigation.UIPageNodeSelector;
 import org.exoplatform.portal.webui.portal.UIPortal;
 import org.exoplatform.portal.webui.portal.UIPortalComposer;
@@ -46,6 +46,7 @@
 import org.exoplatform.webui.config.annotation.EventConfig;
 import org.exoplatform.webui.event.Event;
 import org.exoplatform.webui.event.EventListener;
+import org.exoplatform.webui.form.UIFormStringInput;
 
 /** Created by The eXo Platform SARL Author : Dang Van Minh minhdv81 at yahoo.com Jun 23, 2006 */
 @ComponentConfigs(@ComponentConfig(template = "system:/groovy/webui/core/UIWizard.gtmpl", events = {
@@ -67,81 +68,44 @@
 
    public UIPageCreationWizard() throws Exception
    {
-      UIWizardPageSetInfo uiPageInfo = addChild(UIWizardPageSetInfo.class, null, null).setRendered(false);
+      addChild(UIWizardPageSetInfo.class, null, null).setRendered(false);
       addChild(UIWizardPageSelectLayoutForm.class, null, null).setRendered(false);
       addChild(UIPagePreview.class, null, null).setRendered(false);
       setNumberSteps(NUMBER_OF_STEPs);
       viewStep(FIRST_STEP);
       setShowWelcomeComponent(false);
-      boolean isUserNav = Util.getUIPortal().getSelectedNavigation().getOwnerType().equals(PortalConfig.USER_TYPE);
-      if (isUserNav)
+   }
+
+   public void configure(UserNode node) throws Exception
+   {            
+      UIPageNodeSelector nodeSelector = findFirstComponentOfType(UIPageNodeSelector.class);
+      nodeSelector.configure(node);      
+      if (node.getNavigation().getKey().getTypeName().equals(PortalConfig.USER_TYPE))
       {
-         uiPageInfo.getChild(UIPageNodeSelector.class).setRendered(false);
+         nodeSelector.setRendered(false);         
       }
    }
-
-   private void saveData() throws Exception
+   
+   private UserNode saveData() throws Exception
    {
       UIPagePreview uiPagePreview = getChild(UIPagePreview.class);
       UIPage uiPage = (UIPage)uiPagePreview.getUIComponent();
-      
 
       UIWizardPageSetInfo uiPageInfo = getChild(UIWizardPageSetInfo.class);
       UIPageNodeSelector uiNodeSelector = uiPageInfo.getChild(UIPageNodeSelector.class);
-      PageNode selectedNode = uiNodeSelector.getSelectedPageNode();
-      PageNavigation pageNav = uiNodeSelector.getSelectedNavigation();
-      
-      // reload page navigation
-      DataStorage dataService = getApplicationComponent(DataStorage.class);
-      pageNav = dataService.getPageNavigation(pageNav.getOwnerType(), pageNav.getOwnerId());
-      UIPortalApplication uiPortalApp = Util.getUIPortalApplication();
-      setNavigation(uiPortalApp.getNavigations(), pageNav);
-      uiPortalApp.localizeNavigations();
-      UIPortal uiPortal = Util.getUIPortal();
-      uiPortal.setNavigation(pageNav);
-      uiNodeSelector.selectNavigation(pageNav);
-      if (selectedNode != null)
-      {
-         uiNodeSelector.selectPageNodeByUri(selectedNode.getUri());
-         selectedNode = uiNodeSelector.getSelectedPageNode();
-      }
-      
-      if (PortalConfig.USER_TYPE.equals(pageNav.getOwnerType()))
-         selectedNode = null;
+      UserNode selectedNode = uiNodeSelector.getSelectedNode();
 
       Page page = (Page)PortalDataMapper.buildModelObject(uiPage);
-      PageNode pageNode = uiPageInfo.getPageNode();
-      pageNode.setPageReference(page.getPageId());
-      if (selectedNode != null)
-      {
-         List<PageNode> children = selectedNode.getChildren();
-         if (children == null)
-         {
-            children = new ArrayList<PageNode>();
-         }
-         children.add(pageNode);
-         selectedNode.setChildren((ArrayList<PageNode>)children);
-      }
-      else
-      {
-         pageNav.addNode(pageNode);
-      }
-      uiNodeSelector.selectPageNodeByUri(pageNode.getUri());
-
+      UserNode createdNode = uiPageInfo.createUserNode(selectedNode);
+      
+      createdNode.setPageRef(page.getPageId());
+      DataStorage dataService = getApplicationComponent(DataStorage.class); 
       dataService.create(page);
-      dataService.save(pageNav);
-   }
 
-   private void setNavigation(List<PageNavigation> navs, PageNavigation nav)
-   {
-      for (int i = 0; i < navs.size(); i++)
-      {
-         if (navs.get(i).getId() == nav.getId())
-         {
-            navs.set(i, nav);
-            return;
-         }
-      }
+      UserPortal userPortal = Util.getUIPortalApplication().getUserPortalConfig().getUserPortal();
+      userPortal.saveNode(selectedNode, null);      
+      return createdNode;
+
    }
 
    /**
@@ -154,29 +118,12 @@
    private boolean isSelectedNodeExist() throws Exception
    {
       UIWizardPageSetInfo uiPageSetInfo = getChild(UIWizardPageSetInfo.class);
-      PageNavigation navigation = uiPageSetInfo.getChild(UIPageNodeSelector.class).getSelectedNavigation();
-      PageNode pageNode = uiPageSetInfo.getPageNode();
-      PageNode selectedPageNode = uiPageSetInfo.getSelectedPageNode();
-      List<PageNode> sibbling = null;
-      if (selectedPageNode != null)
+      String pageName = uiPageSetInfo.getUIStringInput(UIWizardPageSetInfo.PAGE_NAME).getValue();
+      UserNode selectedPageNode = uiPageSetInfo.getSelectedPageNode();
+      if (selectedPageNode.getChild(pageName) != null)
       {
-         sibbling = selectedPageNode.getChildren();
+         return true;
       }
-      else
-      {
-         sibbling = navigation.getNodes();
-      }
-      if (sibbling != null)
-      {
-         for (PageNode ele : sibbling)
-         {
-            if (ele.getUri().equals(pageNode.getUri()))
-            {
-               return true;
-            }
-         }
-      }
-
       return false;
    }
 
@@ -226,7 +173,7 @@
          UIWizardPageSetInfo uiPageSetInfo = uiWizard.getChild(UIWizardPageSetInfo.class);
          UIPageNodeSelector uiNodeSelector = uiPageSetInfo.getChild(UIPageNodeSelector.class);
          uiWizard.updateWizardComponent();
-         PageNavigation navigation = uiNodeSelector.getSelectedNavigation();
+         UserNavigation navigation = uiNodeSelector.getNavigation();
          if (navigation == null)
          {
             uiPortalApp.addMessage(new ApplicationMessage("UIPageCreationWizard.msg.notSelectedPageNavigation",
@@ -329,14 +276,14 @@
          UIWizardPageSetInfo uiPageInfo = uiWizard.getChild(UIWizardPageSetInfo.class);
 
          UIPageNodeSelector uiNodeSelector = uiPageInfo.getChild(UIPageNodeSelector.class);
-         PageNavigation pageNavi = uiNodeSelector.getSelectedNavigation();
-         String ownerType = pageNavi.getOwnerType();
-         String ownerId = pageNavi.getOwnerId();
+         UserNavigation pageNavi = uiNodeSelector.getNavigation();
+         String ownerType = pageNavi.getKey().getTypeName();
+         String ownerId = pageNavi.getKey().getName();
 
-         PageNode pageNode = uiPageInfo.getPageNode();
+         UIFormStringInput pageName = uiPageInfo.getUIStringInput(UIWizardPageSetInfo.PAGE_NAME);
          Page page = uiPageTemplateOptions.createPageFromSelectedOption(ownerType, ownerId);
          page.setName("page" + page.hashCode());
-         String pageId = pageNavi.getOwnerType() + "::" + pageNavi.getOwnerId() + "::" + page.getName();
+         String pageId = ownerType + "::" + ownerId + "::" + page.getName();
          DataStorage storage = uiWizard.getApplicationComponent(DataStorage.class);
          if (storage.getPage(pageId) != null)
          {
@@ -351,7 +298,7 @@
 
          if (page.getTitle() == null || page.getTitle().trim().length() == 0)
          {
-            page.setTitle(pageNode.getName());
+            page.setTitle(pageName.getValue());
          }
 
          UIPagePreview uiPagePreview = uiWizard.getChild(UIPagePreview.class);
@@ -385,16 +332,24 @@
          }
          uiPortalApp.setModeState(UIPortalApplication.NORMAL_MODE);
          uiWorkingWS.setRenderedChild(UIPortalApplication.UI_VIEWING_WS_ID);
-         uiWizard.saveData();
-         UIPortalToolPanel toolPanel = uiWorkingWS.findFirstComponentOfType(UIPortalToolPanel.class);
-         toolPanel.setUIComponent(null);
-         uiWizard.updateUIPortal(event);
-         UIWizardPageSetInfo uiPageInfo = uiWizard.getChild(UIWizardPageSetInfo.class);
-         UIPageNodeSelector uiNodeSelector = uiPageInfo.getChild(UIPageNodeSelector.class);
-         PageNode selectedNode = uiNodeSelector.getSelectedPageNode();
          
          PortalRequestContext pcontext = Util.getPortalRequestContext();
-         String uri = pcontext.getPortalURI() + selectedNode.getUri();
+         String uri = pcontext.getPortalURI();
+
+         try
+         {
+            UserNode newNode = uiWizard.saveData();
+            uri += newNode.getURI();
+         }
+         catch (NavigationServiceException ex)
+         {
+            pcontext.getUIApplication().addMessage(
+               new ApplicationMessage("UIPageCreationWizard.msg." + ex.getError().name(), null));
+         }
+         
+         UIPortalToolPanel toolPanel = uiWorkingWS.findFirstComponentOfType(UIPortalToolPanel.class);
+         toolPanel.setUIComponent(null);
+         uiWizard.updateUIPortal(event);         
          pcontext.getResponse().sendRedirect(uri);
       }
    }

Deleted: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageNodeForm.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageNodeForm.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageNodeForm.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,507 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- * 
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.webui.page;
-
-import org.exoplatform.portal.application.PortalRequestContext;
-import org.exoplatform.portal.config.DataStorage;
-import org.exoplatform.portal.config.UserACL;
-import org.exoplatform.portal.config.model.ModelObject;
-import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
-import org.exoplatform.portal.config.model.PortalConfig;
-import org.exoplatform.portal.mop.Visibility;
-import org.exoplatform.portal.webui.navigation.PageNavigationUtils;
-import org.exoplatform.portal.webui.navigation.ParentChildPair;
-import org.exoplatform.portal.webui.portal.UIPortal;
-import org.exoplatform.portal.webui.util.Util;
-import org.exoplatform.portal.webui.workspace.UIPortalApplication;
-import org.exoplatform.web.application.ApplicationMessage;
-import org.exoplatform.webui.application.WebuiRequestContext;
-import org.exoplatform.webui.core.UIApplication;
-import org.exoplatform.webui.core.UIComponent;
-import org.exoplatform.webui.core.UIPopupWindow;
-import org.exoplatform.webui.event.Event;
-import org.exoplatform.webui.event.EventListener;
-import org.exoplatform.webui.event.Event.Phase;
-import org.exoplatform.webui.exception.MessageException;
-import org.exoplatform.webui.form.UIFormCheckBoxInput;
-import org.exoplatform.webui.form.UIFormDateTimeInput;
-import org.exoplatform.webui.form.UIFormInputBase;
-import org.exoplatform.webui.form.UIFormInputIconSelector;
-import org.exoplatform.webui.form.UIFormInputSet;
-import org.exoplatform.webui.form.UIFormStringInput;
-import org.exoplatform.webui.form.UIFormTabPane;
-import org.exoplatform.webui.form.validator.DateTimeValidator;
-import org.exoplatform.webui.form.validator.IdentifierValidator;
-import org.exoplatform.webui.form.validator.MandatoryValidator;
-import org.exoplatform.webui.form.validator.StringLengthValidator;
-import org.exoplatform.webui.form.validator.Validator;
-
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-
-/**
- * Author : Dang Van Minh, Pham Tuan minhdv81 at yahoo.com Jun 14, 2006
- */
-public class UIPageNodeForm extends UIFormTabPane
-{
-
-   private PageNode pageNode_;
-
-   private String owner_;
-
-   private String ownerType_;
-
-   private Object selectedParent;
-
-   /**
-    * Wrapper of editted PageNode and its parent
-    */
-   private ParentChildPair contextParentChildPair;
-   
-   /**
-    * PageNavigation to which editted PageNode belongs
-    */
-   private PageNavigation contextPageNavigation;
-   
-   final private static String SHOW_PUBLICATION_DATE = "showPublicationDate";
-
-   final private static String START_PUBLICATION_DATE = "startPublicationDate";
-
-   final private static String END_PUBLICATION_DATE = "endPublicationDate";
-   
-   final private static String VISIBLE = "visible";
-
-   public UIPageNodeForm() throws Exception
-   {
-      super("UIPageNodeForm");
-
-      UIFormInputSet uiSettingSet = new UIFormInputSet("PageNodeSetting");
-      UIFormCheckBoxInput<Boolean> uiDateInputCheck =
-         new UIFormCheckBoxInput<Boolean>(SHOW_PUBLICATION_DATE, SHOW_PUBLICATION_DATE, false);
-      UIFormCheckBoxInput<Boolean> uiVisibleCheck = new UIFormCheckBoxInput<Boolean>(VISIBLE, VISIBLE, true);
-      
-      uiDateInputCheck.setOnChange("SwitchPublicationDate");
-      uiVisibleCheck.setOnChange("SwitchVisible");
-      uiSettingSet.addUIFormInput(new UIFormStringInput("uri", "uri", null).setEditable(false))
-      				.addUIFormInput(new UIFormStringInput("name", "name", null).addValidator(MandatoryValidator.class).addValidator(StringLengthValidator.class, 3, 30).addValidator(IdentifierValidator.class))
-      				.addUIFormInput(new UIFormStringInput("label", "label", null).addValidator(StringLengthValidator.class, 3, 120))
-      				.addUIFormInput(uiVisibleCheck.setChecked(true))
-      				.addUIFormInput(uiDateInputCheck)
-      				.addUIFormInput(new UIFormDateTimeInput(START_PUBLICATION_DATE, null, null).addValidator(DateTimeValidator.class))
-      				.addUIFormInput(new UIFormDateTimeInput(END_PUBLICATION_DATE, null, null).addValidator(DateTimeValidator.class));
-      
-      addUIFormInput(uiSettingSet);
-      setSelectedTab(uiSettingSet.getId());
-
-      UIPageSelector2 uiPageSelector = createUIComponent(UIPageSelector2.class, null, null);
-      uiPageSelector.configure("UIPageSelector2", "pageReference");
-      addUIFormInput(uiPageSelector);
-
-      UIFormInputIconSelector uiIconSelector = new UIFormInputIconSelector("Icon", "icon");
-      addUIFormInput(uiIconSelector);
-      setActions(new String[]{"Save", "Back"});
-   }
-
-   public PageNode getPageNode()
-   {
-      return pageNode_;
-   }
-
-   public void setValues(PageNode pageNode) throws Exception
-   {
-      pageNode_ = pageNode;
-      if (pageNode == null)
-      {
-         getUIStringInput("name").setEditable(UIFormStringInput.ENABLE);
-         getChild(UIFormInputIconSelector.class).setSelectedIcon("Default");
-         setShowPublicationDate(false);
-         return;
-      }
-      getUIStringInput("name").setEditable(UIFormStringInput.DISABLE);
-      invokeGetBindingBean(pageNode_);
-   }
-
-   public void invokeGetBindingBean(Object bean) throws Exception
-   {
-      super.invokeGetBindingBean(bean);
-      PageNode pageNode = (PageNode)bean;
-      String icon = pageNode_.getIcon();
-      if (icon == null || icon.length() < 0)
-         icon = "Default";
-      getChild(UIFormInputIconSelector.class).setSelectedIcon(icon);
-      getUIStringInput("label").setValue(pageNode_.getLabel());
-      if(pageNode.getVisibility() == Visibility.SYSTEM)
-      {
-         UIFormInputSet uiSettingSet = getChildById("PageNodeSetting");
-         uiSettingSet.removeChildById(VISIBLE);
-         uiSettingSet.removeChildById(SHOW_PUBLICATION_DATE);
-         uiSettingSet.removeChildById(START_PUBLICATION_DATE);
-         uiSettingSet.removeChildById(END_PUBLICATION_DATE);
-      }
-      else
-      {
-         getUIFormCheckBoxInput(VISIBLE).setChecked(pageNode_.isVisible());
-         getUIFormCheckBoxInput(SHOW_PUBLICATION_DATE).setChecked(pageNode.isShowPublicationDate());
-         setShowCheckPublicationDate(pageNode_.isVisible());
-         Calendar cal = Calendar.getInstance();
-         if (pageNode.getStartPublicationDate() != null)
-         {
-            cal.setTime(pageNode.getStartPublicationDate());
-            getUIFormDateTimeInput(START_PUBLICATION_DATE).setCalendar(cal);
-         }
-         else
-            getUIFormDateTimeInput(START_PUBLICATION_DATE).setValue(null);
-         if (pageNode.getEndPublicationDate() != null)
-         {
-            cal.setTime(pageNode.getEndPublicationDate());
-            getUIFormDateTimeInput(END_PUBLICATION_DATE).setCalendar(cal);
-         }
-         else
-            getUIFormDateTimeInput(END_PUBLICATION_DATE).setValue(null);
-      }
-      
-   }
-
-   public void invokeSetBindingBean(Object bean) throws Exception
-   {
-      super.invokeSetBindingBean(bean);
-      PageNode node = (PageNode) bean;
-      if (node.getVisibility() != Visibility.SYSTEM)
-      {
-         Calendar cal = getUIFormDateTimeInput(START_PUBLICATION_DATE).getCalendar();
-         Date date = (cal != null) ? cal.getTime() : null;
-         node.setStartPublicationDate(date);
-         cal = getUIFormDateTimeInput(END_PUBLICATION_DATE).getCalendar();
-         date = (cal != null) ? cal.getTime() : null;
-         node.setEndPublicationDate(date);
-      }
-   }
-
-   public void setShowCheckPublicationDate(boolean show)
-   {
-   	getUIFormCheckBoxInput(VISIBLE).setChecked(show);
-   	UIFormCheckBoxInput<Boolean> uiForm = getUIFormCheckBoxInput(SHOW_PUBLICATION_DATE);
-   	uiForm.setRendered(show);
-   	setShowPublicationDate(show && uiForm.isChecked());
-   }
-   
-   public void setShowPublicationDate(boolean show)
-   {
-      getUIFormDateTimeInput(START_PUBLICATION_DATE).setRendered(show);
-      getUIFormDateTimeInput(END_PUBLICATION_DATE).setRendered(show);
-   }
-
-   public Object getSelectedParent()
-   {
-      return selectedParent;
-   }
-
-   public void setSelectedParent(Object obj)
-   {
-      this.selectedParent = obj;
-   }
-
-   public void setContextParentChildPair(ParentChildPair _contextParentChildPair)
-   {
-      this.contextParentChildPair = _contextParentChildPair;
-   }
-   
-   public ParentChildPair getContextParentChildPair()
-   {
-      return this.contextParentChildPair;
-   }
-   
-   public void processRender(WebuiRequestContext context) throws Exception
-   {
-      super.processRender(context);
-
-      UIPageSelector2 uiPageSelector = getChild(UIPageSelector2.class);
-      if (uiPageSelector == null)
-         return;
-      UIPopupWindow uiPopupWindowPage = uiPageSelector.getChild(UIPopupWindow.class);
-      if (uiPopupWindowPage == null)
-         return;
-      uiPopupWindowPage.processRender(context);
-   }
-
-   public String getOwner()
-   {
-      return contextPageNavigation.getOwnerId();
-   }
-
-   public String getOwnerType()
-   {
-      return contextPageNavigation.getOwnerType();
-   }
-   
-   public void setContextPageNavigation(PageNavigation _contextPageNav)
-   {
-      this.contextPageNavigation = _contextPageNav;
-   }
-   
-   public PageNavigation getContextPageNavigation()
-   {
-      return this.contextPageNavigation;
-   }
-
-   static public class SaveActionListener extends EventListener<UIPageNodeForm>
-   {
-      public void execute(Event<UIPageNodeForm> event) throws Exception
-      {
-         WebuiRequestContext ctx = event.getRequestContext();
-         UIPageNodeForm uiPageNodeForm = event.getSource();
-         UIApplication uiPortalApp = ctx.getUIApplication();
-         PageNode pageNode = uiPageNodeForm.getPageNode();
-         if (pageNode == null)
-            pageNode = new PageNode();
-         
-         if (pageNode.getVisibility() != Visibility.SYSTEM && uiPageNodeForm.getUIFormCheckBoxInput(SHOW_PUBLICATION_DATE).isChecked())
-         {
-            Calendar currentCalendar = Calendar.getInstance();
-            currentCalendar.set(currentCalendar.get(Calendar.YEAR), currentCalendar.get(Calendar.MONTH), currentCalendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
-            Date currentDate = currentCalendar.getTime();
-            
-            Calendar startCalendar =
-               uiPageNodeForm.getUIFormDateTimeInput(UIWizardPageSetInfo.START_PUBLICATION_DATE).getCalendar();
-            Date startDate = startCalendar != null ? startCalendar.getTime() : currentDate;
-            Calendar endCalendar =
-               uiPageNodeForm.getUIFormDateTimeInput(UIWizardPageSetInfo.END_PUBLICATION_DATE).getCalendar();
-            Date endDate = endCalendar != null ? endCalendar.getTime() : null;
-            
-            // Case 1: current date after start date
-            if (currentDate.after(startDate))
-            {
-               Object[] args = {};
-               uiPortalApp.addMessage(new ApplicationMessage("UIPageNodeForm.msg.currentDateBeforeStartDate", args, ApplicationMessage.WARNING));
-               return;
-            }
-            // Case 2: start date after end date
-            else if ((endCalendar != null) && (startCalendar != null) && (startDate.after(endDate)))
-            {
-               Object[] args = {};
-               uiPortalApp.addMessage(new ApplicationMessage("UIPageNodeForm.msg.startDateBeforeEndDate", args, ApplicationMessage.WARNING));
-               return;
-            }
-            // Case 3: start date is null and current date after end date
-            else if((endCalendar != null) && (currentDate.after(endDate)))
-            {
-               Object[] args = {};
-               uiPortalApp.addMessage(new ApplicationMessage("UIPageNodeForm.msg.currentDateBeforeEndDate", args, ApplicationMessage.WARNING));
-               return;
-            }
-            
-         }
-         
-         uiPageNodeForm.invokeSetBindingBean(pageNode);
-         UIPageSelector2 pageSelector = uiPageNodeForm.getChild(UIPageSelector2.class);
-         if (pageSelector.getPage() == null)
-            pageNode.setPageReference(null);
-         UIFormInputIconSelector uiIconSelector = uiPageNodeForm.getChild(UIFormInputIconSelector.class);
-         if (uiIconSelector.getSelectedIcon().equals("Default"))
-            pageNode.setIcon(null);
-         else
-            pageNode.setIcon(uiIconSelector.getSelectedIcon());
-         if (pageNode.getLabel() == null)
-            pageNode.setLabel(pageNode.getName());
-
-         Object selectedParent = uiPageNodeForm.getSelectedParent();
-         PageNavigation pageNav = null;
-
-         if (selectedParent instanceof PageNavigation)
-         {
-            pageNav = (PageNavigation)selectedParent;
-            pageNode.setUri(pageNode.getName());
-            if (!pageNav.getNodes().contains(pageNode))
-            {
-               if (PageNavigationUtils.searchPageNodeByUri(pageNav, pageNode.getUri()) != null)
-               {
-                  uiPortalApp.addMessage(new ApplicationMessage("UIPageNodeForm.msg.SameName", null));
-                  return;
-               }
-               pageNav.addNode(pageNode);
-            }
-         }
-         else if (selectedParent instanceof PageNode)
-         {
-            PageNode parentNode = (PageNode)selectedParent;
-            List<PageNode> children = parentNode.getChildren();
-            if (children == null)
-            {
-               children = new ArrayList<PageNode>();
-               parentNode.setChildren((ArrayList<PageNode>)children);
-            }
-            pageNode.setUri(parentNode.getUri() + "/" + pageNode.getName());
-            if (!children.contains(pageNode))
-            {
-               if (PageNavigationUtils.searchPageNodeByUri(parentNode, pageNode.getUri()) != null)
-               {
-                  uiPortalApp.addMessage(new ApplicationMessage("UIPageNodeForm.msg.SameName", null));
-                  return;
-               }
-               children.add(pageNode);
-            }
-         }
-         uiPageNodeForm.createEvent("Back", Phase.DECODE, ctx).broadcast();
-      }
-   }
-
-   static public class BackActionListener extends EventListener<UIPageNodeForm>
-   {
-
-      public void execute(Event<UIPageNodeForm> event) throws Exception
-      {
-      }
-
-   }
-
-   static public class SwitchPublicationDateActionListener extends EventListener<UIPageNodeForm>
-   {
-      public void execute(Event<UIPageNodeForm> event) throws Exception
-      {
-         UIPageNodeForm uiForm = event.getSource();
-         boolean isCheck = uiForm.getUIFormCheckBoxInput(SHOW_PUBLICATION_DATE).isChecked();
-         uiForm.setShowPublicationDate(isCheck);
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
-      }
-   }
-   
-   static public class SwitchVisibleActionListener extends EventListener<UIPageNodeForm>
-   {
-		@Override
-		public void execute(Event<UIPageNodeForm> event) throws Exception
-		{
-			UIPageNodeForm uiForm = event.getSource();
-			boolean isCheck = uiForm.getUIFormCheckBoxInput(VISIBLE).isChecked();
-			uiForm.setShowCheckPublicationDate(isCheck);
-			event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
-		}
-   }
-
-   static public class ClearPageActionListener extends EventListener<UIPageNodeForm>
-   {
-      public void execute(Event<UIPageNodeForm> event) throws Exception
-      {
-         UIPageNodeForm uiForm = event.getSource();
-         UIPageSelector2 pageSelector = uiForm.findFirstComponentOfType(UIPageSelector2.class);
-         pageSelector.setPage(null);
-         event.getRequestContext().addUIComponentToUpdateByAjax(pageSelector);
-      }
-   }
-
-   static public class CreatePageActionListener extends EventListener<UIPageNodeForm>
-   {
-      public void execute(Event<UIPageNodeForm> event) throws Exception
-      {
-         UIPageNodeForm uiForm = event.getSource();
-         UIPageSelector2 pageSelector = uiForm.findFirstComponentOfType(UIPageSelector2.class);
-
-         PortalRequestContext pcontext = Util.getPortalRequestContext();
-         UIPortalApplication uiPortalApp = Util.getUIPortalApplication();
-
-         UIFormInputSet uiInputSet = pageSelector.getChild(UIFormInputSet.class);
-         List<UIComponent> children = uiInputSet.getChildren();
-         /*********************************************************************/
-         for (UIComponent uiChild : children)
-         {
-            if (uiChild instanceof UIFormInputBase)
-            {
-               UIFormInputBase uiInput = (UIFormInputBase)uiChild;
-               if (!uiInput.isValid())
-                  continue;
-               List<Validator> validators = uiInput.getValidators();
-               if (validators == null)
-                  continue;
-               try
-               {
-                  for (Validator validator : validators)
-                     validator.validate(uiInput);
-               }
-               catch (MessageException ex)
-               {
-                  uiPortalApp.addMessage(ex.getDetailMessage());
-                  return;
-               }
-               catch (Exception ex)
-               {
-                  //TODO:  This is a  critical exception and should be handle  in the UIApplication
-                  uiPortalApp.addMessage(new ApplicationMessage(ex.getMessage(), null));
-                  return;
-               }
-            }
-         }
-
-         UserACL userACL = uiForm.getApplicationComponent(UserACL.class);
-
-         String ownerId = uiForm.getOwner();
-         String[] accessPermission = new String[1];
-         accessPermission[0] = "*:" + ownerId;
-         String editPermission = userACL.getMakableMT() + ":" + ownerId;
-         
-         if (PortalConfig.PORTAL_TYPE.equals(uiForm.getOwnerType()))
-         {
-            UIPortal uiPortal = Util.getUIPortal();
-            accessPermission = uiPortal.getAccessPermissions();
-            editPermission = uiPortal.getEditPermission();
-         }
-         
-         
-         UIFormStringInput uiPageName = uiInputSet.getChildById("pageName");
-         UIFormStringInput uiPageTitle = uiInputSet.getChildById("pageTitle");
-
-         Page page = new Page();
-         page.setOwnerType(uiForm.getOwnerType());
-         page.setOwnerId(ownerId);
-         page.setName(uiPageName.getValue());
-         String title = uiPageTitle.getValue();;
-         if (title == null || title.trim().length() < 1)
-            title = page.getName();
-         page.setTitle(title);
-
-         page.setShowMaxWindow(false);
-
-         page.setAccessPermissions(accessPermission);
-         page.setEditPermission(editPermission);
-
-         userACL.hasPermission(page);
-
-         page.setModifiable(true);
-         if (page.getChildren() == null)
-            page.setChildren(new ArrayList<ModelObject>());
-
-         // check page is exist
-         DataStorage dataService = uiForm.getApplicationComponent(DataStorage.class);
-         Page existPage = dataService.getPage(page.getPageId());
-         if (existPage != null)
-         {
-            uiPortalApp.addMessage(new ApplicationMessage("UIPageForm.msg.sameName", null));
-            pcontext.addUIComponentToUpdateByAjax(uiPortalApp.getUIPopupMessages());
-            return;
-         }
-
-         // save page to database
-         dataService.create(page);
-         pageSelector.setValue(page.getPageId());
-      }
-   }
-}

Copied: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageSearchForm.java (from rev 6783, portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageSearchForm.java)
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageSearchForm.java	                        (rev 0)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageSearchForm.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -0,0 +1,79 @@
+/**
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.portal.webui.page;
+
+import org.exoplatform.commons.serialization.api.annotations.Serialized;
+import org.exoplatform.webui.config.annotation.ComponentConfig;
+import org.exoplatform.webui.config.annotation.EventConfig;
+import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
+import org.exoplatform.webui.core.model.SelectItemOption;
+import org.exoplatform.webui.event.Event;
+import org.exoplatform.webui.event.EventListener;
+import org.exoplatform.webui.form.UIForm;
+import org.exoplatform.webui.form.UIFormInputSet;
+import org.exoplatform.webui.form.UIFormSelectBox;
+import org.exoplatform.webui.form.UIFormStringInput;
+
+import java.util.List;
+
+/**
+ * @author <a href="kienna at exoplatform.com">Kien Nguyen</a>
+ * @version $Revision$
+ */
+ at ComponentConfig(lifecycle = UIFormLifecycle.class, template = "system:/groovy/portal/webui/page/UIPageSearchForm.gtmpl", 
+                  events = @EventConfig(listeners = UIPageSearchForm.QuickSearchActionListener.class))
+ at Serialized
+public class UIPageSearchForm extends UIForm
+{
+   /**
+    * The name of the quick search set
+    */
+   final static public String QUICK_SEARCH_SET = "QuickSearchSet";
+
+   public UIPageSearchForm() throws Exception
+   {
+      UIFormInputSet uiQuickSearchSet = new UIFormInputSet(QUICK_SEARCH_SET);
+      uiQuickSearchSet.addUIFormInput(new UIFormStringInput("pageTitle", "pageTitle", null));
+      uiQuickSearchSet.addUIFormInput(new UIFormStringInput("siteName", "siteName", null));
+      uiQuickSearchSet.addUIFormInput(new UIFormSelectBox("searchOption", null, null));
+      addChild(uiQuickSearchSet);
+   }
+
+   public void setOptions(List<SelectItemOption<String>> options)
+   {
+      UIFormSelectBox uiSelect = (UIFormSelectBox)getQuickSearchInputSet().getChild(2);
+      uiSelect.setOptions(options);
+   }
+
+   public UIFormInputSet getQuickSearchInputSet()
+   {
+      return (UIFormInputSet)getChild(0);
+   }
+
+   static public class QuickSearchActionListener extends EventListener<UIPageSearchForm>
+   {
+      public void execute(Event<UIPageSearchForm> event) throws Exception
+      {
+         UIPageSearchForm uiForm = event.getSource();
+         UIPageBrowser uiSearch = uiForm.getParent();
+         uiSearch.quickSearch(uiForm.getQuickSearchInputSet());
+         event.getRequestContext().addUIComponentToUpdateByAjax(uiSearch);
+      }
+   }
+}

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageSelector.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageSelector.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageSelector.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -30,6 +30,8 @@
 import org.exoplatform.webui.config.annotation.ComponentConfigs;
 import org.exoplatform.webui.config.annotation.EventConfig;
 import org.exoplatform.webui.core.UIApplication;
+import org.exoplatform.webui.core.UIComponent;
+import org.exoplatform.webui.core.UIPopupWindow;
 import org.exoplatform.webui.core.UIRepeater;
 import org.exoplatform.webui.core.UIVirtualList;
 import org.exoplatform.webui.event.Event;
@@ -37,16 +39,22 @@
 import org.exoplatform.webui.form.UIForm;
 import org.exoplatform.webui.form.UIFormInput;
 import org.exoplatform.webui.form.UIFormInputContainer;
+import org.exoplatform.webui.form.UIFormInputSet;
 import org.exoplatform.webui.form.UIFormPopupWindow;
+import org.exoplatform.webui.form.UIFormStringInput;
+import org.exoplatform.webui.form.validator.IdentifierValidator;
+import org.exoplatform.webui.form.validator.MandatoryValidator;
+import org.exoplatform.webui.form.validator.StringLengthValidator;
+import java.util.List;
 
 /**
- * Author : Dang Van Minh
- *          minhdv81 at yahoo.com
- * Jun 14, 2006
+ * Author : Dang Van Minh minhdv81 at yahoo.com Jun 14, 2006
  */
 @ComponentConfigs({
-   @ComponentConfig(template = "system:/groovy/portal/webui/page/UIPageSelector.gtmpl"),
-   @ComponentConfig(id = "SelectPage", type = UIPageBrowser.class, template = "system:/groovy/portal/webui/page/UIPageBrowser.gtmpl", events = @EventConfig(listeners = UIPageSelector.SelectPageActionListener.class))})
+   @ComponentConfig(template = "system:/groovy/portal/webui/page/UIPageSelector.gtmpl", events = @EventConfig(listeners = UIPageSelector.OpenSelectPagePopUp.class)),
+   @ComponentConfig(id = "SelectPage", type = UIPageBrowser.class, template = "system:/groovy/portal/webui/page/UIPageBrowser.gtmpl", events = @EventConfig(listeners = UIPageSelector.SelectPageActionListener.class)),
+   @ComponentConfig(type = UIFormPopupWindow.class, template = "system:/groovy/webui/core/UIPopupWindow.gtmpl",
+      events = @EventConfig(listeners = UIPageSelector.CloseActionListener.class, name = "CloseFormPopup", phase = Event.Phase.DECODE))})
 public class UIPageSelector extends UIFormInputContainer<String>
 {
 
@@ -57,15 +65,19 @@
    public UIPageSelector() throws Exception
    {
       super("UIPageSelector", null);
-      UIFormPopupWindow uiPopup = addChild(UIFormPopupWindow.class, null, "PopupPageSelector");
+      UIFormPopupWindow uiPopup = addChild(UIFormPopupWindow.class, null, "PopupPageSelector2");
       uiPopup.setWindowSize(900, 400);
-      uiPopup.setRendered(false);
-      UIPageBrowser uiPageBrowser = createUIComponent(UIPageBrowser.class, "SelectPage", null);
-      uiPopup.setUIComponent(uiPageBrowser);
-      //UIGrid uiGrid = uiPageBrowser.getChild(UIGrid.class);
-      //uiGrid.configure("pageId", UIPageBrowser.BEAN_FIELD, new String[]{"SelectPage"});
-      UIVirtualList uiVirtualList = uiPageBrowser.getChild(UIVirtualList.class);
-      configureVirtualList(uiVirtualList);
+      uiPopup.setShow(false);
+
+      UIFormInputSet uiInputSet = new UIFormInputSet("PageNodeSetting");
+
+      uiInputSet.addChild(new UIFormStringInput("pageId", "pageId", null));
+      uiInputSet.addChild(new UIFormStringInput("pageName", "pageName", null).addValidator(StringLengthValidator.class,
+         3, 30).addValidator(IdentifierValidator.class).addValidator(MandatoryValidator.class));
+      uiInputSet.addChild(new UIFormStringInput("pageTitle", "pageTitle", null).addValidator(
+         StringLengthValidator.class, 3, 120));
+
+      addChild(uiInputSet);
    }
 
    private static void configureVirtualList(UIVirtualList vList)
@@ -118,9 +130,56 @@
    {
       super.processDecode(context);
       UIPageBrowser uiPageBrowser = findFirstComponentOfType(UIPageBrowser.class);
-      uiPageBrowser.processDecode(context);
+      if (uiPageBrowser != null)
+      {
+         uiPageBrowser.processDecode(context);
+      }
+      
+      UIFormInputSet uiInputSet = getChild(UIFormInputSet.class);
+
+      List<UIComponent> children = uiInputSet.getChildren();
+      for (UIComponent ele : children)
+      {
+         ele.processDecode(context);
+      }
+      //    UIFormStringInput uiPageId = getChildById("pageId");
+      //    uiPageId.processDecode(context);
+      //
+      //    UIFormStringInput uiPageName = getChildById("pageName");
+      //    uiPageName.processDecode(context);
+      //
+      //    UIFormStringInput uiPageTitle = getChildById("pageTitle");
+      //    uiPageTitle.processDecode(context);
    }
 
+   static public class OpenSelectPagePopUp extends EventListener<UIPageSelector>
+   {
+      @Override
+      public void execute(Event<UIPageSelector> event) throws Exception
+      {
+         UIPageSelector pageSelector = event.getSource();
+         UIFormPopupWindow uiPopup = pageSelector.getChild(UIFormPopupWindow.class);
+
+         UIPageBrowser uiPageBrowser = pageSelector.createUIComponent(UIPageBrowser.class, "SelectPage", null);
+         uiPopup.setUIComponent(uiPageBrowser);
+         uiPopup.setShow(true);
+
+         UIVirtualList uiVirtualList = uiPageBrowser.getChild(UIVirtualList.class);
+         configureVirtualList(uiVirtualList);
+      }
+   }
+
+   static public class CloseActionListener extends UIFormPopupWindow.CloseActionListener
+   {
+      @Override
+      public void execute(Event<UIPopupWindow> event) throws Exception
+      {
+         UIPopupWindow popWindow = event.getSource();
+         popWindow.setUIComponent(null);
+         super.execute(event);
+      }
+   }
+
    static public class SelectPageActionListener extends EventListener<UIPageBrowser>
    {
       public void execute(Event<UIPageBrowser> event) throws Exception
@@ -137,7 +196,7 @@
             uiApp.addMessage(new ApplicationMessage("UIPageBrowser.msg.NoPermission", new String[]{id}));;
          }
          uiPageSelector.setValue(id);
-         uiPageBrowser.feedDataWithQuery(null);
+//         uiPageBrowser.feedDataWithQuery(null);
 
          UIForm uiForm = uiPageSelector.getAncestorOfType(UIForm.class);
          if (uiForm != null)
@@ -149,6 +208,7 @@
             ctx.addUIComponentToUpdateByAjax(uiPageSelector.getParent());
          }
          UIFormPopupWindow uiPopup = uiPageSelector.getChild(UIFormPopupWindow.class);
+         uiPopup.setUIComponent(null);
          uiPopup.setShow(false);
       }
    }

Deleted: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageSelector2.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageSelector2.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageSelector2.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -1,186 +0,0 @@
-/**
- * Copyright (C) 2009 eXo Platform SAS.
- * 
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.portal.webui.page;
-
-import org.exoplatform.portal.config.UserACL;
-import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.services.log.ExoLogger;
-import org.exoplatform.services.log.Log;
-import org.exoplatform.web.application.ApplicationMessage;
-import org.exoplatform.webui.application.WebuiRequestContext;
-import org.exoplatform.webui.config.annotation.ComponentConfig;
-import org.exoplatform.webui.config.annotation.ComponentConfigs;
-import org.exoplatform.webui.config.annotation.EventConfig;
-import org.exoplatform.webui.core.UIApplication;
-import org.exoplatform.webui.core.UIComponent;
-import org.exoplatform.webui.core.UIRepeater;
-import org.exoplatform.webui.core.UIVirtualList;
-import org.exoplatform.webui.event.Event;
-import org.exoplatform.webui.event.EventListener;
-import org.exoplatform.webui.form.UIForm;
-import org.exoplatform.webui.form.UIFormInput;
-import org.exoplatform.webui.form.UIFormInputContainer;
-import org.exoplatform.webui.form.UIFormInputSet;
-import org.exoplatform.webui.form.UIFormPopupWindow;
-import org.exoplatform.webui.form.UIFormStringInput;
-import org.exoplatform.webui.form.validator.IdentifierValidator;
-import org.exoplatform.webui.form.validator.MandatoryValidator;
-import org.exoplatform.webui.form.validator.StringLengthValidator;
-
-import java.util.List;
-
-/**
- * Author : Dang Van Minh minhdv81 at yahoo.com Jun 14, 2006
- */
- at ComponentConfigs({
-   @ComponentConfig(template = "system:/groovy/portal/webui/page/UIPageSelector2.gtmpl"),
-   @ComponentConfig(id = "SelectPage", type = UIPageBrowser.class, template = "system:/groovy/portal/webui/page/UIPageBrowser.gtmpl", events = @EventConfig(listeners = UIPageSelector2.SelectPageActionListener.class))})
-public class UIPageSelector2 extends UIFormInputContainer<String>
-{
-
-   private Page page_;
-
-   private static Log logger = ExoLogger.getExoLogger(UIPageSelector2.class);
-
-   public UIPageSelector2() throws Exception
-   {
-      super("UIPageSelector2", null);
-      UIFormPopupWindow uiPopup = addChild(UIFormPopupWindow.class, null, "PopupPageSelector2");
-      uiPopup.setWindowSize(900, 400);
-      uiPopup.setRendered(false);
-      UIPageBrowser uiPageBrowser = createUIComponent(UIPageBrowser.class, "SelectPage", null);
-      uiPopup.setUIComponent(uiPageBrowser);
-
-      UIFormInputSet uiInputSet = new UIFormInputSet("PageNodeSetting");
-
-      uiInputSet.addChild(new UIFormStringInput("pageId", "pageId", null));
-      uiInputSet.addChild(new UIFormStringInput("pageName", "pageName", null).addValidator(StringLengthValidator.class,
-         3, 30).addValidator(IdentifierValidator.class).addValidator(MandatoryValidator.class));
-      uiInputSet.addChild(new UIFormStringInput("pageTitle", "pageTitle", null).addValidator(
-         StringLengthValidator.class, 3, 120));
-
-      addChild(uiInputSet);
-      UIVirtualList uiVirtualList = uiPageBrowser.getChild(UIVirtualList.class);
-      configureVirtualList(uiVirtualList);
-   }
-
-   private static void configureVirtualList(UIVirtualList vList)
-   {
-      UIRepeater repeater;
-      try
-      {
-         repeater = (UIRepeater)vList.getUIComponent();
-         repeater.configure("pageId", UIPageBrowser.BEAN_FIELD, new String[]{"SelectPage"});
-      }
-      catch (ClassCastException clCastEx)
-      {
-         logger.info("Could not upcast to UIRepeater", clCastEx);
-      }
-   }
-
-   public void configure(String iname, String bfield)
-   {
-      setId(iname);
-      setName(iname);
-      setBindingField(bfield);
-   }
-
-   public UIFormInput<?> setValue(String value) throws Exception
-   {
-      WebuiRequestContext ctx = WebuiRequestContext.getCurrentInstance();
-      UserPortalConfigService service = getApplicationComponent(UserPortalConfigService.class);
-      Page page = service.getPage(value, ctx.getRemoteUser());
-      page_ = page;
-      super.setValue(value);
-      return this;
-   }
-
-   public Page getPage()
-   {
-      return page_;
-   }
-
-   public void setPage(Page page)
-   {
-      page_ = page;
-   }
-
-   public Class<String> getTypeValue()
-   {
-      return String.class;
-   }
-
-   public void processDecode(WebuiRequestContext context) throws Exception
-   {
-      super.processDecode(context);
-      UIPageBrowser uiPageBrowser = findFirstComponentOfType(UIPageBrowser.class);
-      uiPageBrowser.processDecode(context);
-
-      UIFormInputSet uiInputSet = getChild(UIFormInputSet.class);
-
-      List<UIComponent> children = uiInputSet.getChildren();
-      for (UIComponent ele : children)
-      {
-         ele.processDecode(context);
-      }
-      //    UIFormStringInput uiPageId = getChildById("pageId");
-      //    uiPageId.processDecode(context);
-      //
-      //    UIFormStringInput uiPageName = getChildById("pageName");
-      //    uiPageName.processDecode(context);
-      //
-      //    UIFormStringInput uiPageTitle = getChildById("pageTitle");
-      //    uiPageTitle.processDecode(context);
-   }
-
-   static public class SelectPageActionListener extends EventListener<UIPageBrowser>
-   {
-      public void execute(Event<UIPageBrowser> event) throws Exception
-      {
-         UIPageBrowser uiPageBrowser = event.getSource();
-         String id = event.getRequestContext().getRequestParameter(OBJECTID);
-         WebuiRequestContext ctx = event.getRequestContext();
-         UIApplication uiApp = ctx.getUIApplication();
-         UIPageSelector2 uiPageSelector = uiPageBrowser.getAncestorOfType(UIPageSelector2.class);
-         UserPortalConfigService service = uiPageBrowser.getApplicationComponent(UserPortalConfigService.class);
-         UserACL userACL = uiPageBrowser.getApplicationComponent(UserACL.class);
-         if (!userACL.hasPermission(service.getPage(id)))
-         {
-            uiApp.addMessage(new ApplicationMessage("UIPageBrowser.msg.NoPermission", new String[]{id}));;
-         }
-         uiPageSelector.setValue(id);
-         uiPageBrowser.feedDataWithQuery(null);
-
-         UIForm uiForm = uiPageSelector.getAncestorOfType(UIForm.class);
-         if (uiForm != null)
-         {
-            ctx.addUIComponentToUpdateByAjax(uiForm.getParent());
-         }
-         else
-         {
-            ctx.addUIComponentToUpdateByAjax(uiPageSelector.getParent());
-         }
-         UIFormPopupWindow uiPopup = uiPageSelector.getChild(UIFormPopupWindow.class);
-         uiPopup.setShow(false);
-      }
-   }
-
-}

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIWizardPageSetInfo.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIWizardPageSetInfo.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIWizardPageSetInfo.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,22 +19,18 @@
 
 package org.exoplatform.portal.webui.page;
 
-import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
 import org.exoplatform.portal.config.model.PortalConfig;
+import java.util.Calendar;
+
+import org.exoplatform.portal.mop.Visibility;
+import org.exoplatform.portal.mop.navigation.NavigationServiceException;
+import org.exoplatform.portal.mop.user.UserNode;
 import org.exoplatform.portal.webui.navigation.UIPageNodeSelector;
-import org.exoplatform.portal.webui.portal.UIPortal;
 import org.exoplatform.portal.webui.util.Util;
-import org.exoplatform.portal.webui.workspace.UIPortalApplication;
 import org.exoplatform.web.application.ApplicationMessage;
 import org.exoplatform.webui.application.WebuiRequestContext;
 import org.exoplatform.webui.config.annotation.ComponentConfig;
-import org.exoplatform.webui.config.annotation.ComponentConfigs;
 import org.exoplatform.webui.config.annotation.EventConfig;
-import org.exoplatform.webui.core.UIComponent;
-import org.exoplatform.webui.core.UITree;
 import org.exoplatform.webui.core.UIWizard;
 import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
 import org.exoplatform.webui.event.Event;
@@ -43,25 +39,23 @@
 import org.exoplatform.webui.form.UIForm;
 import org.exoplatform.webui.form.UIFormCheckBoxInput;
 import org.exoplatform.webui.form.UIFormDateTimeInput;
+import org.exoplatform.webui.form.UIFormInputBase;
 import org.exoplatform.webui.form.UIFormStringInput;
 import org.exoplatform.webui.form.validator.DateTimeValidator;
 import org.exoplatform.webui.form.validator.IdentifierValidator;
 import org.exoplatform.webui.form.validator.MandatoryValidator;
 import org.exoplatform.webui.form.validator.StringLengthValidator;
 
-import java.util.Calendar;
-import java.util.Date;
-
 /**
  * Created by The eXo Platform SARL
  * Author : Nguyen Thi Hoa
  *          hoa.nguyen at exoplatform.com
  * Oct 31, 2006  
  */
- at ComponentConfigs({@ComponentConfig(lifecycle = UIFormLifecycle.class, template = "system:/groovy/portal/webui/page/UIWizardPageSetInfo.gtmpl", events = {
+ at ComponentConfig(lifecycle = UIFormLifecycle.class, template = "system:/groovy/portal/webui/page/UIWizardPageSetInfo.gtmpl", events = {
    @EventConfig(listeners = UIWizardPageSetInfo.ChangeNodeActionListener.class, phase = Phase.DECODE),
    @EventConfig(listeners = UIWizardPageSetInfo.SwitchVisibleActionListener.class, phase = Phase.DECODE),
-   @EventConfig(listeners = UIWizardPageSetInfo.SwitchPublicationDateActionListener.class, phase = Phase.DECODE)})})
+   @EventConfig(listeners = UIWizardPageSetInfo.SwitchPublicationDateActionListener.class, phase = Phase.DECODE)})
 public class UIWizardPageSetInfo extends UIForm
 {
 
@@ -83,23 +77,35 @@
 
    public UIWizardPageSetInfo() throws Exception
    {
-   	UIFormCheckBoxInput<Boolean> uiDateInputCheck =
-         new UIFormCheckBoxInput<Boolean>(SHOW_PUBLICATION_DATE, SHOW_PUBLICATION_DATE, false);
-   	UIFormCheckBoxInput<Boolean> uiVisibleCheck = new UIFormCheckBoxInput<Boolean>(VISIBLE, VISIBLE, false);
-   	uiDateInputCheck.setOnChange("SwitchPublicationDate");
-   	uiVisibleCheck.setOnChange("SwitchVisible");
-   	
+      UIFormCheckBoxInput<Boolean> uiDateInputCheck =
+         new UIFormCheckBoxInput<Boolean>(SHOW_PUBLICATION_DATE, null, false);
+      UIFormCheckBoxInput<Boolean> uiVisibleCheck = new UIFormCheckBoxInput<Boolean>(VISIBLE, null, false);
+      uiDateInputCheck.setOnChange("SwitchPublicationDate");
+      uiVisibleCheck.setOnChange("SwitchVisible");
+
       addChild(UIPageNodeSelector.class, null, null);
       addUIFormInput(new UIFormStringInput(PAGE_NAME, "name", null).addValidator(MandatoryValidator.class)
-                     .addValidator(StringLengthValidator.class, 3, 30).addValidator(IdentifierValidator.class));
-      addUIFormInput(new UIFormStringInput(PAGE_DISPLAY_NAME, "label", null)
-      		.setMaxLength(255).addValidator(StringLengthValidator.class, 3, 120));
+         .addValidator(StringLengthValidator.class, 3, 30).addValidator(IdentifierValidator.class));
+      addUIFormInput(new UIFormStringInput(PAGE_DISPLAY_NAME, "label", null).setMaxLength(255).addValidator(
+         StringLengthValidator.class, 3, 120));
       addUIFormInput(uiVisibleCheck.setChecked(true));
       addUIFormInput(uiDateInputCheck);
-      addUIFormInput(new UIFormDateTimeInput(START_PUBLICATION_DATE, null, null).addValidator(DateTimeValidator.class));
-      addUIFormInput(new UIFormDateTimeInput(END_PUBLICATION_DATE, null, null).addValidator(DateTimeValidator.class));
+      UIFormInputBase<String> startPubDateInput = new UIFormDateTimeInput(START_PUBLICATION_DATE, null, null).addValidator(DateTimeValidator.class);
+      UIFormInputBase<String> endPubDateInput = new UIFormDateTimeInput(END_PUBLICATION_DATE, null, null).addValidator(DateTimeValidator.class);
+      addUIFormInput(startPubDateInput);
+      addUIFormInput(endPubDateInput);
+
+      boolean isUserNav = Util.getUIPortal().getOwnerType().equals(PortalConfig.USER_TYPE);
+      if (isUserNav)
+      {
+         uiVisibleCheck.setRendered(false);
+         uiDateInputCheck.setRendered(false);
+         startPubDateInput.setRendered(false);
+         endPubDateInput.setRendered(false);
+      }
    }
 
+   //TODO: it looks like this method is not used
    public void setEditMode() throws Exception
    {
       isEditMode = true;
@@ -114,56 +120,46 @@
 
    public void invokeSetBindingBean(Object bean) throws Exception
    {
+      UIFormStringInput nameTextBox = getUIStringInput(PAGE_NAME);
+      //this help to ignore name textbox
+      nameTextBox.setEditable(false);
       super.invokeSetBindingBean(bean);
-      PageNode node = (PageNode)bean;
-      if(!getUIFormCheckBoxInput(SHOW_PUBLICATION_DATE).isChecked())
+      nameTextBox.setEditable(true);
+
+      UserNode node = (UserNode)bean;
+      
+      Visibility visibility;
+      if (getUIFormCheckBoxInput(VISIBLE).isChecked())
       {
-      	node.setVisible(getUIFormCheckBoxInput(VISIBLE).isChecked());	
+         UIFormCheckBoxInput showPubDate = getUIFormCheckBoxInput(SHOW_PUBLICATION_DATE);
+         visibility = showPubDate.isChecked() ?  Visibility.TEMPORAL : Visibility.DISPLAYED;
       }
+      else
+      {
+         visibility = Visibility.HIDDEN;
+      }
+      node.setVisibility(visibility);
+
       Calendar cal = getUIFormDateTimeInput(START_PUBLICATION_DATE).getCalendar();
-      Date date = (cal != null) ? cal.getTime() : null;
-      node.setStartPublicationDate(date);
+      long time = (cal != null) ? cal.getTimeInMillis() : -1;
+      node.setStartPublicationTime(time);
       cal = getUIFormDateTimeInput(END_PUBLICATION_DATE).getCalendar();
-      date = (cal != null) ? cal.getTime() : null;
-      node.setEndPublicationDate(date);
+      time = (cal != null) ? cal.getTimeInMillis() : -1;
+      node.setEndPublicationTime(time);
    }
 
-   public PageNode getPageNode() throws Exception
-   {
-      if (isEditMode)
+   public UserNode createUserNode(UserNode parent) throws Exception
+   {      
+      UIFormStringInput nameTextBox = getUIStringInput(PAGE_NAME);
+      String nodeName = nameTextBox.getValue();   
+      
+      UserNode child = parent.addChild(nodeName);
+      invokeSetBindingBean(child);
+      if (child.getLabel() == null || child.getLabel().trim().length() == 0)
       {
-         PageNode pageNode = getSelectedPageNode();
-         PageNode clonedNode = (pageNode != null) ? pageNode.clone() : null;
-         invokeSetBindingBean(clonedNode);
-         if (clonedNode.getLabel() == null || clonedNode.getLabel().trim().length() == 0)
-         {
-            clonedNode.setLabel(clonedNode.getName());
-         }
-         return clonedNode;
+         child.setLabel(child.getName());
       }
-
-      PageNode pageNode = new PageNode();
-      invokeSetBindingBean(pageNode);
-      if (pageNode.getLabel() == null || pageNode.getLabel().trim().length() == 0)
-      {
-         pageNode.setLabel(pageNode.getName());
-      }
-
-      UIPageNodeSelector uiNodeSelector = getChild(UIPageNodeSelector.class);
-      PageNode selectedNode = uiNodeSelector.getSelectedPageNode();
-      PageNavigation nav = uiNodeSelector.getSelectedNavigation();
-      if(nav.getOwnerType().equals(PortalConfig.USER_TYPE))
-         pageNode.setUri(pageNode.getName());
-      else
-      {
-         if (selectedNode != null)
-         {
-            pageNode.setUri(selectedNode.getUri() + "/" + pageNode.getName());
-         }
-         else
-            pageNode.setUri(pageNode.getName());
-      }
-      return pageNode;
+      return child;
    }
 
    public void setShowCheckPublicationDate(boolean show)
@@ -173,63 +169,26 @@
       uiForm.setRendered(show);
       setShowPublicationDate(show && uiForm.isChecked());
    }
-   
+
    public void setShowPublicationDate(boolean show)
    {
       getUIFormDateTimeInput(START_PUBLICATION_DATE).setRendered(show);
       getUIFormDateTimeInput(END_PUBLICATION_DATE).setRendered(show);
    }
 
-   public void setPageNode(PageNode pageNode) throws Exception
+   public UserNode getSelectedPageNode()
    {
-      if (pageNode.getName() != null)
-         getUIStringInput(PAGE_NAME).setValue(pageNode.getName());
-      if (pageNode.getLabel() != null)
-         getUIStringInput(PAGE_DISPLAY_NAME).setValue(pageNode.getLabel());
-      getUIFormCheckBoxInput(VISIBLE).setChecked(pageNode.isVisible());
-      setShowPublicationDate(pageNode.isShowPublicationDate());
-      Calendar cal = Calendar.getInstance();
-      if (pageNode.getStartPublicationDate() != null)
-      {
-         cal.setTime(pageNode.getStartPublicationDate());
-         getUIFormDateTimeInput(START_PUBLICATION_DATE).setCalendar(cal);
-      }
-      else
-         getUIFormDateTimeInput(START_PUBLICATION_DATE).setValue(null);
-      if (pageNode.getEndPublicationDate() != null)
-      {
-         cal.setTime(pageNode.getEndPublicationDate());
-         getUIFormDateTimeInput(END_PUBLICATION_DATE).setCalendar(cal);
-      }
-      else
-         getUIFormDateTimeInput(END_PUBLICATION_DATE).setValue(null);
-   }
-
-   public PageNode getSelectedPageNode()
-   {
       UIPageNodeSelector uiPageNodeSelector = getChild(UIPageNodeSelector.class);
-      PageNavigation nav = uiPageNodeSelector.getSelectedNavigation();
-      if(nav.getOwnerType().equals(PortalConfig.USER_TYPE))
-         return null;
-      return uiPageNodeSelector.getSelectedPageNode();
+      return uiPageNodeSelector.getSelectedNode();
    }
 
    public void processRender(WebuiRequestContext context) throws Exception
    {
-      if (isEditMode && getChild(UIPageNodeSelector.class).getSelectedPageNode() == null)
+      if (isEditMode && getChild(UIPageNodeSelector.class).getSelectedNode() == null)
          reset();
       super.processRender(context);
    }
 
-   public void processDecode(WebuiRequestContext context) throws Exception
-   {
-      super.processDecode(context);
-      String action = context.getRequestParameter(UIForm.ACTION);
-      Event<UIComponent> event = createEvent(action, Event.Phase.DECODE, context);
-      if (event != null)
-         event.broadcast();
-   }
-
    public boolean isFirstTime()
    {
       return firstTime;
@@ -244,62 +203,28 @@
    {
       public void execute(Event<UIWizardPageSetInfo> event) throws Exception
       {
-         String uri = event.getRequestContext().getRequestParameter(OBJECTID);
-         UIWizardPageSetInfo uiForm = event.getSource();
-
-         UIPageNodeSelector uiPageNodeSelector = event.getSource().getChild(UIPageNodeSelector.class);
-         UITree tree = uiPageNodeSelector.getChild(UITree.class);
-
-         if (tree.getParentSelected() == null && (uri == null || uri.length() < 1))
+         WebuiRequestContext context = event.getRequestContext();
+         UIWizardPageSetInfo pageSetInfo = event.getSource();
+         UIPageCreationWizard uiWizard = (UIPageCreationWizard)pageSetInfo.getAncestorOfType(UIPageCreationWizard.class);
+         
+         String uri = context.getRequestParameter(OBJECTID);
+         UIPageNodeSelector uiPageNodeSelector = pageSetInfo.getChild(UIPageNodeSelector.class);
+         try 
          {
-            uiPageNodeSelector.selectNavigation(uiPageNodeSelector.getSelectedNavigation());
-         }
-         else
-         {
-            uiPageNodeSelector.selectPageNodeByUri(uri);
-         }
-
-         UIPortalApplication uiPortalApp = uiPageNodeSelector.getAncestorOfType(UIPortalApplication.class);
-         UIWizard uiWizard = uiPortalApp.findFirstComponentOfType(UIWizard.class);
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiWizard);
-
-         if (!event.getSource().isEditMode())
-         {
-            return;
-         }
-         PageNode pageNode = uiPageNodeSelector.getSelectedPageNode();
-
-         if (pageNode == null && uiForm.isFirstTime())
-         {
-            uiForm.setShowPublicationDate(false);
-            uiForm.setFirstTime(false);
-            UIPortal uiPortal = Util.getUIPortal();
-            uiPageNodeSelector.selectNavigation(uiPortal.getSelectedNavigation());
-            if (uiPortal.getSelectedNode() != null)
+            uiPageNodeSelector.setSelectedURI(uri);            
+            if (!uiPageNodeSelector.getSelectedNode().getURI().equals(uri))
             {
-               uiPageNodeSelector.selectPageNodeByUri(uiPortal.getSelectedNode().getUri());
+               context.getUIApplication().addMessage(new ApplicationMessage("UIWizardPageSetInfo.msg.node.deleted", null));
             }
-            pageNode = uiPageNodeSelector.getSelectedPageNode();
          }
-
-         if (pageNode == null)
+         catch (NavigationServiceException ex)
          {
-            uiForm.setShowPublicationDate(false);
+            context.getUIApplication().addMessage(new ApplicationMessage("UIWizardPageSetInfo.msg.navigation.deleted", null));
+            uiWizard.createEvent("Abort", Phase.PROCESS, context).broadcast();
             return;
          }
-         UserPortalConfigService configService = uiWizard.getApplicationComponent(UserPortalConfigService.class);
-         String accessUser = event.getRequestContext().getRemoteUser();
-         Page page = null;
-         if (pageNode.getPageReference() != null)
-            page = configService.getPage(pageNode.getPageReference(), accessUser);
-         if (page == null)
-         {
-            uiPortalApp.addMessage(new ApplicationMessage("UIWizardPageSetInfo.msg.null", null));
-            uiForm.reset();
-            uiForm.setShowPublicationDate(false);
-            return;
-         }
-         uiForm.setPageNode(pageNode);
+
+         event.getRequestContext().addUIComponentToUpdateByAjax(uiWizard);
       }
    }
 
@@ -316,17 +241,17 @@
       }
 
    }
-   
+
    static public class SwitchVisibleActionListener extends EventListener<UIWizardPageSetInfo>
    {
-		@Override
-		public void execute(Event<UIWizardPageSetInfo> event) throws Exception
-		{
-			UIWizardPageSetInfo uiForm = event.getSource();
-			boolean isCheck = uiForm.getUIFormCheckBoxInput(VISIBLE).isChecked();
-			uiForm.setShowCheckPublicationDate(isCheck);
-			event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
-		}
+      @Override
+      public void execute(Event<UIWizardPageSetInfo> event) throws Exception
+      {
+         UIWizardPageSetInfo uiForm = event.getSource();
+         boolean isCheck = uiForm.getUIFormCheckBoxInput(VISIBLE).isChecked();
+         uiForm.setShowCheckPublicationDate(isCheck);
+         event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
+      }
    }
 
 }

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UILanguageSelector.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UILanguageSelector.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UILanguageSelector.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -178,8 +178,6 @@
             localeConfig = localeConfigService.getDefaultLocaleConfig();
          PortalRequestContext prqCtx = PortalRequestContext.getCurrentInstance();
          prqCtx.setLocale(localeConfig.getLocale());
-         //uiApp.setOrientation(localeConfig.getOrientation());
-         //uiApp.localizeNavigations();
       }
    }
 

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortal.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortal.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortal.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -21,16 +21,16 @@
 
 import org.exoplatform.portal.account.UIAccountSetting;
 import org.exoplatform.portal.application.PortalRequestContext;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
-import org.exoplatform.portal.config.model.PortalConfig;
 import org.exoplatform.portal.config.model.PortalProperties;
 import org.exoplatform.portal.config.model.Properties;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
 import org.exoplatform.portal.webui.application.UIPortlet;
 import org.exoplatform.portal.webui.container.UIContainer;
 import org.exoplatform.portal.webui.page.UIPage;
-import org.exoplatform.portal.webui.page.UIPageBody;
 import org.exoplatform.portal.webui.page.UIPageActionListener.ChangePageNodeActionListener;
+import org.exoplatform.portal.webui.page.UIPageBody;
 import org.exoplatform.portal.webui.portal.UIPortalComponentActionListener.ChangeApplicationListActionListener;
 import org.exoplatform.portal.webui.portal.UIPortalComponentActionListener.ChangeLanguageActionListener;
 import org.exoplatform.portal.webui.portal.UIPortalComponentActionListener.ChangeSkinActionListener;
@@ -43,7 +43,7 @@
 import org.exoplatform.portal.webui.workspace.UIPortalApplication;
 import org.exoplatform.services.organization.OrganizationService;
 import org.exoplatform.services.organization.User;
-import org.exoplatform.services.resources.ResourceBundleManager;
+import org.exoplatform.web.application.JavascriptManager;
 import org.exoplatform.web.login.InitiateLoginServlet;
 import org.exoplatform.web.login.LogoutControl;
 import org.exoplatform.web.security.security.AbstractTokenService;
@@ -54,15 +54,10 @@
 import org.exoplatform.webui.core.UIComponent;
 import org.exoplatform.webui.event.Event;
 import org.exoplatform.webui.event.EventListener;
-import org.exoplatform.web.application.JavascriptManager;
 
 import java.net.URLEncoder;
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
 import java.util.Map;
-import java.util.ResourceBundle;
 
 import javax.portlet.WindowState;
 import javax.servlet.http.Cookie;
@@ -100,18 +95,19 @@
 
    private Properties properties;
 
-   private PageNavigation navigation;
-   
-   private List<PageNode> selectedPath;
+   private UserNode navPath;
 
-   private PageNode selectedNode_;
-   
    private Map<String, UIPage> all_UIPages;
    
    private Map<String, String[]> publicParameters_ = new HashMap<String, String[]>();
 
    private UIComponent maximizedUIComponent;
 
+   public SiteKey getSiteKey()
+   {
+      return new SiteKey(ownerType, name_);
+   }
+   
    public String getOwner()
    {
       return owner;
@@ -171,13 +167,20 @@
    {
       publicParameters_ = publicParams;
    }
+
+   public UserNode getNavPath() throws Exception
+   {
+      if (navPath == null)
+      {
+         UIPortalApplication uiApp = Util.getUIPortalApplication();
+         navPath = uiApp.getUserPortalConfig().getUserPortal().getDefaultPath(null);
+      }
+      return navPath;
+   }
    
-   /** At the moment, this method ensure compatibility with legacy code */
-   public List<PageNavigation> getNavigations() throws Exception
+   public void setNavPath(UserNode nav)
    {
-      List<PageNavigation> listNavs = new ArrayList<PageNavigation>();
-      listNavs.add(navigation);
-      return listNavs;
+      this.navPath = nav;
    }
    
    /**
@@ -211,9 +214,11 @@
          this.all_UIPages.remove(pageReference);
    }
    
-   public void setNavigation(PageNavigation _navigation)
+   public UserNavigation getUserNavigation() throws Exception
    {
-      this.navigation = _navigation;
+      UIPortalApplication uiPortalApp = getAncestorOfType(UIPortalApplication.class);
+      SiteKey siteKey = new SiteKey(ownerType, owner);
+      return uiPortalApp.getUserPortalConfig().getUserPortal().getNavigation(siteKey);
    }
    
    /**
@@ -223,11 +228,6 @@
     */
    public void refreshUIPage() throws Exception
    {
-      if(selectedNode_ == null)
-      {
-         selectedNode_ = navigation.getNodes().get(0);
-      }
-      
       UIPageBody uiPageBody = findFirstComponentOfType(UIPageBody.class);
       if(uiPageBody == null)
       {
@@ -240,84 +240,14 @@
          currentPortlet.setCurrentWindowState(WindowState.NORMAL);
          uiPageBody.setMaximizedUIComponent(null);
       }
-      uiPageBody.setPageBody(selectedNode_, this);
-      
-      //Refresh locale
-      Locale locale = Util.getPortalRequestContext().getLocale();
-      localizePageNavigation(navigation, locale);
+      uiPageBody.setPageBody(getSelectedUserNode(), this);
    }
    
-   public synchronized void setSelectedNode(PageNode node)
+   public UserNode getSelectedUserNode() throws Exception
    {
-      selectedNode_ = node;
+      return getNavPath();
    }
 
-   /*
-   public PageNode getSelectedNode() throws Exception
-   {
-      if (selectedNode_ != null)
-         return selectedNode_;
-      if (getSelectedNavigation() == null || selectedNavigation_.getNodes() == null
-         || selectedNavigation_.getNodes().size() < 1)
-         return null;
-      selectedNode_ = selectedNavigation_.getNodes().get(0);
-      return selectedNode_;
-   }
-   */
-   
-   public PageNode getSelectedNode() throws Exception
-   {
-      if(selectedNode_ != null)
-      {
-         return selectedNode_;
-      }
-      if(navigation == null || navigation.getNodes() == null || navigation.getNodes().size() < 1)
-      {
-         return null;
-      }
-      return navigation.getNodes().get(0);
-   }
-
-   public List<PageNode> getSelectedPath()
-   {
-      return selectedPath;
-   }
-
-   public void setSelectedPath(List<PageNode> nodes)
-   {
-      selectedPath = nodes;
-   }
-   
-   public PageNavigation getSelectedNavigation() throws Exception
-   {
-      return navigation;
-   }
-   
-   public void setSelectedNavigation(PageNavigation _navigation)
-   {
-      this.navigation = _navigation;
-   }
-
-   /**
-   public PageNavigation getPageNavigation(int id)
-   {
-      for (PageNavigation nav : navigations)
-      {
-         if (nav.getId() == id)
-            return nav;
-      }
-      return null;
-   }
-
-*/
-   /*
-   public void setSelectedNavigation(PageNavigation selectedNavigation)
-   {
-      selectedNavigation_ = selectedNavigation;
-   }
-
-   */
-   
    public UIComponent getMaximizedUIComponent()
    {
       return maximizedUIComponent;
@@ -402,30 +332,6 @@
       this.description = description;
    }
 
-   private void localizePageNavigation(PageNavigation nav,Locale locale)
-   {
-      ResourceBundleManager mgr = getApplicationComponent(ResourceBundleManager.class);
-      if (nav.getOwnerType().equals(PortalConfig.USER_TYPE))
-         return;
-      String localeLanguage = (locale.getCountry().length() > 0) ? locale.getLanguage() + "_" + locale.getCountry() : locale.getLanguage();
-      ResourceBundle res = mgr.getNavigationResourceBundle(localeLanguage, nav.getOwnerType(), nav.getOwnerId());
-      for (PageNode node : nav.getNodes())
-      {
-         resolveLabel(res, node);
-      }
-   }
-
-   private void resolveLabel(ResourceBundle res, PageNode node)
-   {
-      node.setResolvedLabel(res);
-      if (node.getChildren() == null)
-         return;
-      for (PageNode childNode : node.getChildren())
-      {
-         resolveLabel(res, childNode);
-      }
-   }
-
    static public class LogoutActionListener extends EventListener<UIComponent>
    {
       public void execute(Event<UIComponent> event) throws Exception

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComponentActionListener.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComponentActionListener.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComponentActionListener.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -482,10 +482,13 @@
          UIPortal uiPortal = Util.getUIPortal();
          UIPortalApplication uiApp = uiPortal.getAncestorOfType(UIPortalApplication.class);
          UserPortalConfigService service = uiApp.getApplicationComponent(UserPortalConfigService.class);
+         PortalRequestContext context = Util.getPortalRequestContext();
          if (portalName != null
             && service.getUserPortalConfig(portalName, event.getRequestContext().getRemoteUser()) == null)
          {
             uiApp.addMessage(new ApplicationMessage("UISiteManagement.msg.portal-not-exist", new String[]{portalName}));
+            context.addUIComponentToUpdateByAjax(uiApp.findFirstComponentOfType(UIWorkingWorkspace.class));    
+            context.setFullRender(true);
             return;
          }
 
@@ -494,8 +497,7 @@
          portalForm.setPortalOwner(portalName);
          portalForm.setBindingBean();
          uiMaskWS.setWindowSize(700, -1);
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiMaskWS);
-
+         context.addUIComponentToUpdateByAjax(uiMaskWS);
       }
    }
 }

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComposer.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComposer.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComposer.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -57,8 +57,8 @@
 import org.exoplatform.webui.core.UITabPane;
 import org.exoplatform.webui.core.UIWizard;
 import org.exoplatform.webui.event.Event;
+import org.exoplatform.webui.event.Event.Phase;
 import org.exoplatform.webui.event.EventListener;
-import org.exoplatform.webui.event.Event.Phase;
 
 import java.util.List;
 import java.util.ResourceBundle;
@@ -415,7 +415,7 @@
          UIPortal uiPortal = uiWorkingWS.getBackupUIPortal();
          siteBody.setUIComponent(uiPortal);
 
-         String uri = uiPortal.getSelectedNode() != null ? uiPortal.getSelectedNode().getUri() : null;
+         String uri = uiPortal.getSelectedUserNode() != null ? uiPortal.getSelectedUserNode().getURI() : null;
          PageNodeEvent<UIPortal> pnevent = new PageNodeEvent<UIPortal>(uiPortal, PageNodeEvent.CHANGE_PAGE_NODE, uri);
          uiPortal.broadcast(pnevent, Event.Phase.PROCESS);
          prContext.addUIComponentToUpdateByAjax(uiWorkingWS);
@@ -462,14 +462,13 @@
          uiWorkingWS.setRenderedChild(UIPortalApplication.UI_VIEWING_WS_ID);
          prContext.ignoreAJAXUpdateOnPortlets(true);
 
-         String uri = (uiPortal.getSelectedNode() != null)? (uiPortal.getSelectedNode().getUri()) : null;
+         String uri = (uiPortal.getSelectedUserNode() != null)? (uiPortal.getSelectedUserNode().getURI()) : null;
         
          if (uiComposer.isPortalExist(editPortal))
          {
             DataStorage storage = uiPortalApp.getApplicationComponent(DataStorage.class);
             PortalConfig pConfig =
-               storage.getPortalConfig(uiPortal.getSelectedNavigation().getOwnerType(), uiPortal
-                  .getSelectedNavigation().getOwnerId());
+               storage.getPortalConfig(uiPortal.getSiteKey().getTypeName(), uiPortal.getSiteKey().getName());
             if (pConfig != null)
             {
                uiPortalApp.getUserPortalConfig().setPortal(pConfig);
@@ -656,7 +655,8 @@
          UIPortalApplication uiPortalApp = Util.getUIPortalApplication();
          uiPortalApp.setModeState(UIPortalApplication.NORMAL_MODE);
          uiWorkingWS.setRenderedChild(UIPortalApplication.UI_VIEWING_WS_ID);
-         Util.getPortalRequestContext().ignoreAJAXUpdateOnPortlets(true);
+         PortalRequestContext prContext = Util.getPortalRequestContext();
+         prContext.ignoreAJAXUpdateOnPortlets(true);
 
          UIPortal uiPortal = uiPortalApp.getShowedUIPortal();
          uiPortal.setRenderSibling(UIPortal.class);
@@ -666,9 +666,10 @@
          uiPortal.refreshUIPage();
          
          PageNodeEvent<UIPortal> pnevent =
-            new PageNodeEvent<UIPortal>(uiPortal, PageNodeEvent.CHANGE_PAGE_NODE, (uiPortal.getSelectedNode() != null
-               ? uiPortal.getSelectedNode().getUri() : null));
+            new PageNodeEvent<UIPortal>(uiPortal, PageNodeEvent.CHANGE_PAGE_NODE, (uiPortal.getSelectedUserNode() != null
+               ? uiPortal.getSelectedUserNode().getURI() : null));
          uiPortal.broadcast(pnevent, Event.Phase.PROCESS);
+         prContext.addUIComponentToUpdateByAjax(uiWorkingWS);
          JavascriptManager jsManager = event.getRequestContext().getJavascriptManager();
          jsManager.addJavascript("eXo.portal.portalMode=" + UIPortalApplication.NORMAL_MODE + ";");
       }
@@ -689,7 +690,8 @@
          UIEditInlineWorkspace editInlineWS = event.getSource().getParent();
          UIWorkingWorkspace uiWorkingWS = editInlineWS.getParent();
          UIPortalToolPanel uiToolPanel = uiWorkingWS.findFirstComponentOfType(UIPortalToolPanel.class);
-
+         Util.getPortalRequestContext().addUIComponentToUpdateByAjax(uiWorkingWS);
+         
          UIPage uiPage = uiToolPanel.findFirstComponentOfType(UIPage.class);
          Page page = (Page)PortalDataMapper.buildModelObject(uiPage);
          String pageId = page.getPageId();
@@ -708,7 +710,7 @@
             Util.getPortalRequestContext().ignoreAJAXUpdateOnPortlets(true);
             PageNodeEvent<UIPortal> pnevent =
                new PageNodeEvent<UIPortal>(uiPortal, PageNodeEvent.CHANGE_PAGE_NODE,
-                  (uiPortal.getSelectedNode() != null ? uiPortal.getSelectedNode().getUri() : null));
+                  (uiPortal.getSelectedUserNode() != null ? uiPortal.getSelectedUserNode().getURI() : null));
             uiPortal.broadcast(pnevent, Event.Phase.PROCESS);
             JavascriptManager jsManager = event.getRequestContext().getJavascriptManager();
             jsManager.addJavascript("eXo.portal.portalMode=" + UIPortalApplication.NORMAL_MODE + ";");
@@ -764,8 +766,8 @@
          uiWorkingWS.setRenderedChild(UIPortalApplication.UI_VIEWING_WS_ID);
          Util.getPortalRequestContext().ignoreAJAXUpdateOnPortlets(true);
          PageNodeEvent<UIPortal> pnevent =
-            new PageNodeEvent<UIPortal>(uiPortal, PageNodeEvent.CHANGE_PAGE_NODE, (uiPortal.getSelectedNode() != null
-               ? uiPortal.getSelectedNode().getUri() : null));
+            new PageNodeEvent<UIPortal>(uiPortal, PageNodeEvent.CHANGE_PAGE_NODE, (uiPortal.getSelectedUserNode() != null
+               ? uiPortal.getSelectedUserNode().getURI() : null));
          uiPortal.broadcast(pnevent, Event.Phase.PROCESS);
          JavascriptManager jsManager = event.getRequestContext().getJavascriptManager();
          jsManager.addJavascript("eXo.portal.portalMode=" + UIPortalApplication.NORMAL_MODE + ";");

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalForm.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalForm.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalForm.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -17,7 +17,7 @@
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
 
-package org.exoplatform.portal.webui.portal;
+package org.exoplatform.portal.webui.portal; 
 
 import org.exoplatform.container.ExoContainer;
 import org.exoplatform.container.ExoContainerContext;
@@ -25,7 +25,6 @@
 import org.exoplatform.portal.config.DataStorage;
 import org.exoplatform.portal.config.UserPortalConfig;
 import org.exoplatform.portal.config.UserPortalConfigService;
-import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.model.PortalConfig;
 import org.exoplatform.portal.config.model.PortalProperties;
 import org.exoplatform.portal.resource.SkinService;
@@ -53,8 +52,8 @@
 import org.exoplatform.webui.core.model.SelectItemCategory;
 import org.exoplatform.webui.core.model.SelectItemOption;
 import org.exoplatform.webui.event.Event;
-import org.exoplatform.webui.event.EventListener;
 import org.exoplatform.webui.event.Event.Phase;
+import org.exoplatform.webui.event.EventListener;
 import org.exoplatform.webui.form.UIFormInputItemSelector;
 import org.exoplatform.webui.form.UIFormInputSet;
 import org.exoplatform.webui.form.UIFormSelectBox;
@@ -64,8 +63,8 @@
 import org.exoplatform.webui.form.validator.MandatoryValidator;
 import org.exoplatform.webui.form.validator.StringLengthValidator;
 import org.exoplatform.webui.organization.UIListPermissionSelector;
-import org.exoplatform.webui.organization.UIPermissionSelector;
 import org.exoplatform.webui.organization.UIListPermissionSelector.EmptyIteratorValidator;
+import org.exoplatform.webui.organization.UIPermissionSelector;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -74,8 +73,8 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
-import java.util.ResourceBundle;
 import java.util.MissingResourceException;
+import java.util.ResourceBundle;
 
 @ComponentConfigs({
    @ComponentConfig(lifecycle = UIFormLifecycle.class, template = "system:/groovy/webui/form/UIFormTabPane.gtmpl", events = {
@@ -321,7 +320,7 @@
             {
                PortalConfig portalConfig = (PortalConfig)PortalDataMapper.buildModelObject(uiPortal);
                dataService.save(portalConfig);
-               prContext.setAttribute(UserPortalConfig.class, service.getUserPortalConfig(uiForm.getPortalOwner(), prContext.getRemoteUser()));
+               prContext.setAttribute(UserPortalConfig.class, service.getUserPortalConfig(uiForm.getPortalOwner(), prContext.getRemoteUser(), PortalRequestContext.USER_PORTAL_CONTEXT));
                uiPortalApp.reloadSkinPortal(prContext);
                
                // We should use IPC to update some portlets in the future instead of
@@ -344,6 +343,7 @@
             
             UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
             prContext.addUIComponentToUpdateByAjax(uiWorkingWS);
+            prContext.setFullRender(true);
          }
 
          UIMaskWorkspace uiMaskWorkspace = uiForm.getParent();
@@ -374,9 +374,7 @@
          UserPortalConfig userPortalConfig = service.getUserPortalConfig(portalName, pcontext.getRemoteUser());
          PortalConfig pconfig = userPortalConfig.getPortalConfig();
          uiForm.invokeSetBindingBean(pconfig);
-         PageNavigation navigation = dataService.getPageNavigation(PortalConfig.PORTAL_TYPE, portalName);
          dataService.save(pconfig);
-         dataService.save(navigation);
          UIPortalApplication uiPortalApp = event.getSource().getAncestorOfType(UIPortalApplication.class);
          UIMaskWorkspace uiMaskWS = uiPortalApp.getChildById(UIPortalApplication.UI_MASK_WS_ID);
          uiMaskWS.setUIComponent(null);

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/util/PortalDataMapper.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/util/PortalDataMapper.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/util/PortalDataMapper.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -365,7 +365,7 @@
          }
       }
       //uiPortal.setNavigation(userPortalConfig.getNavigations());
-      uiPortal.setNavigation(userPortalConfig.getSelectedNavigation());
+//      uiPortal.setNavigation(userPortalConfig.getSelectedNavigation());
    }
 
    private static void buildUIContainer(UIContainer uiContainer, Object model, boolean dashboard) throws Exception

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/util/Util.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/util/Util.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/util/Util.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -213,10 +213,24 @@
       }
    }
 
+   /**
+    * @deprecated use {@link #toUIPage(String, UIComponent)} instead
+    * 
+    * @param node
+    * @param uiParent
+    * @return
+    * @throws Exception
+    */
+   @Deprecated
    static public UIPage toUIPage(PageNode node, UIComponent uiParent) throws Exception
    {
+      return toUIPage(node.getPageReference(), uiParent);
+   }
+   
+   static public UIPage toUIPage(String pageRef, UIComponent uiParent) throws Exception
+   {
       UserPortalConfigService configService = uiParent.getApplicationComponent(UserPortalConfigService.class);
-      Page page = configService.getPage(node.getPageReference(), getPortalRequestContext().getRemoteUser());
+      Page page = configService.getPage(pageRef, getPortalRequestContext().getRemoteUser());
       return toUIPage(page, uiParent);
    }
 

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/workspace/UIMainActionListener.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/workspace/UIMainActionListener.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/workspace/UIMainActionListener.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -26,8 +26,12 @@
 import org.exoplatform.portal.config.UserPortalConfig;
 import org.exoplatform.portal.config.UserPortalConfigService;
 import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
 import org.exoplatform.portal.config.model.PortalConfig;
+import org.exoplatform.portal.mop.navigation.Scope;
+import org.exoplatform.portal.mop.user.UserNavigation;
+import org.exoplatform.portal.mop.user.UserNode;
+import org.exoplatform.portal.mop.user.UserNodeFilterConfig;
+import org.exoplatform.portal.mop.user.UserPortal;
 import org.exoplatform.portal.webui.page.UIPage;
 import org.exoplatform.portal.webui.page.UIPageBody;
 import org.exoplatform.portal.webui.page.UIPageCreationWizard;
@@ -110,17 +114,38 @@
    static public class PageCreationWizardActionListener extends EventListener<UIWorkingWorkspace>
    {
       public void execute(Event<UIWorkingWorkspace> event) throws Exception
-      {
+      {         
          UIPortalApplication uiApp = Util.getUIPortalApplication();
-         uiApp.setModeState(UIPortalApplication.APP_BLOCK_EDIT_MODE);
+         UIPortal uiPortal = Util.getUIPortal();
          UIWorkingWorkspace uiWorkingWS = uiApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
          
-         if (!hasPageCreationPermission())
+         UserNavigation currNav = uiPortal.getUserNavigation();
+         if (currNav == null)
          {
+            uiApp.addMessage(new ApplicationMessage("UIPortalManagement.msg.navigation.deleted", null));
+            event.getRequestContext().addUIComponentToUpdateByAjax(uiWorkingWS);
+            return;
+         }                 
+         
+         if (!currNav.isModifiable())
+         {
             uiApp.addMessage(new ApplicationMessage("UIPortalManagement.msg.Invalid-CreatePage-Permission", null));
             return;
          }
+         
+         //Should renew the selectedNode. Don't reuse the cached selectedNode
+         UserNode selectedNode = Util.getUIPortal().getSelectedUserNode();
+         UserNodeFilterConfig filterConfig = createFilterConfig();         
+         UserNode resolvedNode = resolveNode(selectedNode, filterConfig);                 
+         if (resolvedNode == null)
+         {
+            WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
+            context.getUIApplication().addMessage(new ApplicationMessage("UIPortalManagement.msg.node.deleted", null));         
+            event.getRequestContext().addUIComponentToUpdateByAjax(uiWorkingWS);
+            return;
+         }
 
+         uiApp.setModeState(UIPortalApplication.APP_BLOCK_EDIT_MODE);
          uiWorkingWS.setRenderedChild(UIEditInlineWorkspace.class);
 
          UIPortalComposer portalComposer = uiWorkingWS.findFirstComponentOfType(UIPortalComposer.class);
@@ -135,23 +160,33 @@
          uiToolPanel.setShowMaskLayer(false);
          uiToolPanel.setWorkingComponent(UIPageCreationWizard.class, null);
          UIPageCreationWizard uiWizard = (UIPageCreationWizard)uiToolPanel.getUIComponent();
+         uiWizard.configure(resolvedNode);
+         
          UIWizardPageSetInfo uiPageSetInfo = uiWizard.getChild(UIWizardPageSetInfo.class);
          uiPageSetInfo.setShowPublicationDate(false);
-         event.getRequestContext().addUIComponentToUpdateByAjax(uiWorkingWS);
+         event.getRequestContext().addUIComponentToUpdateByAjax(uiWorkingWS);                                             
       }
-      
-      private boolean hasPageCreationPermission() throws Exception
-      {
-         UIPortal currentPortal = Util.getUIPortal();
-         UserACL userACL = Util.getUIPortalApplication().getApplicationComponent(UserACL.class);
-         PageNavigation selectedNavigation = currentPortal.getSelectedNavigation();
-         if (PortalConfig.PORTAL_TYPE.equals(selectedNavigation.getOwnerType()))
+
+      private UserNode resolveNode(UserNode selectedNode, UserNodeFilterConfig filterConfig) throws Exception
+      {         
+         UserNavigation currNav = selectedNode.getNavigation();
+         UserPortal userPortal = Util.getUIPortalApplication().getUserPortalConfig().getUserPortal();
+         if (currNav.getKey().getTypeName().equals(PortalConfig.USER_TYPE))
+         {            
+            return userPortal.getNode(currNav, Scope.CHILDREN, filterConfig, null);
+         }
+         else
          {
-            return userACL.hasEditPermissionOnPortal(currentPortal.getOwnerType(), currentPortal.getOwner(), currentPortal.getEditPermission());
+            return userPortal.resolvePath(currNav, filterConfig, selectedNode.getURI());
          }
-         
-         return userACL.hasEditPermission(selectedNavigation);
       }
+
+      private UserNodeFilterConfig createFilterConfig()
+      {
+         UserNodeFilterConfig.Builder filterConfigBuilder = UserNodeFilterConfig.builder();
+         filterConfigBuilder.withAuthorizationCheck();
+         return filterConfigBuilder.build();
+      }
    }
 
    static public class EditInlineActionListener extends EventListener<UIWorkingWorkspace>
@@ -189,9 +224,10 @@
 
          UIPortal newPortal = uiWorkingWS.createUIComponent(UIPortal.class, null, null);
          PortalDataMapper.toUIPortal(newPortal, userConfig);
-         newPortal.setSelectedNode(uiPortal.getSelectedNode());
-         newPortal.setSelectedNavigation(uiPortal.getSelectedNavigation());
-         newPortal.setSelectedPath(uiPortal.getSelectedPath());
+//         newPortal.setSelectedNode(uiPortal.getSelectedNode());
+//         newPortal.setNavigation(uiPortal.getNavigation());
+//         newPortal.setSelectedPath(uiPortal.getSelectedPath());
+         newPortal.setNavPath(uiPortal.getNavPath());
          newPortal.refreshUIPage();
 
          UIEditInlineWorkspace uiEditWS = uiWorkingWS.getChild(UIEditInlineWorkspace.class);

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/workspace/UIPortalApplication.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/workspace/UIPortalApplication.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portal/src/main/java/org/exoplatform/portal/webui/workspace/UIPortalApplication.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -28,14 +28,13 @@
 import org.exoplatform.portal.config.UserPortalConfigService;
 import org.exoplatform.portal.config.model.Container;
 import org.exoplatform.portal.config.model.Page;
-import org.exoplatform.portal.config.model.PageNavigation;
-import org.exoplatform.portal.config.model.PageNode;
+import org.exoplatform.portal.mop.SiteKey;
+import org.exoplatform.portal.mop.user.UserNode;
 import org.exoplatform.portal.resource.Skin;
 import org.exoplatform.portal.resource.SkinConfig;
 import org.exoplatform.portal.resource.SkinService;
 import org.exoplatform.portal.resource.SkinURL;
 import org.exoplatform.portal.webui.application.UIPortlet;
-import org.exoplatform.portal.webui.navigation.PageNavigationUtils;
 import org.exoplatform.portal.webui.page.UISiteBody;
 import org.exoplatform.portal.webui.portal.PageNodeEvent;
 import org.exoplatform.portal.webui.portal.UIPortal;
@@ -48,7 +47,6 @@
 import org.exoplatform.services.resources.LocaleConfigService;
 import org.exoplatform.services.resources.LocaleContextInfo;
 import org.exoplatform.services.resources.Orientation;
-import org.exoplatform.services.resources.ResourceBundleManager;
 import org.exoplatform.web.application.javascript.JavascriptConfigService;
 import org.exoplatform.webui.application.WebuiRequestContext;
 import org.exoplatform.webui.config.annotation.ComponentConfig;
@@ -111,10 +109,8 @@
 
    private boolean isSessionOpen = false;
    
-   private Map<UIPortalKey, UIPortal> all_UIPortals;
+   private Map<SiteKey, UIPortal> all_UIPortals;
    
-   private List<PageNavigation> all_Navigations;
-   
    private UIPortal showedUIPortal;
    
    /**
@@ -168,15 +164,13 @@
       // -------------------------------------------------------------------------------
       context.setUIApplication(this);
 
-      this.all_UIPortals = new HashMap<UIPortalKey, UIPortal>(5);
+      this.all_UIPortals = new HashMap<SiteKey, UIPortal>(5);
       
       addWorkingWorkspace();
       
       setOwner(context.getPortalOwner());
       
       //Minh Hoang TO: Localizes navigations, need to put this code snippet below 'setLocale' block
-      this.all_Navigations = userPortalConfig_.getNavigations();
-      localizeNavigations();
    }
 
    /**
@@ -219,9 +213,18 @@
       {
          return null;
       }
-      return this.all_UIPortals.get(new UIPortalKey(ownerType, ownerId));
+      return this.all_UIPortals.get(new SiteKey(ownerType, ownerId));
    }
    
+   public UIPortal getCachedUIPortal(SiteKey key)
+   {
+      if(key == null)
+      {
+         return null;
+      }
+      return this.all_UIPortals.get(key);
+   }
+   
    /**
     * Associates the specified UIPortal to a cache map with specified key which bases on OwnerType and OwnerId
     * 
@@ -234,7 +237,7 @@
       
       if(ownerType != null && ownerId != null)
       {
-         this.all_UIPortals.put(new UIPortalKey(ownerType, ownerId), uiPortal);
+         this.all_UIPortals.put(new SiteKey(ownerType, ownerId), uiPortal);
       }
    }
    
@@ -250,7 +253,7 @@
       {
          return;
       }
-      this.all_UIPortals.remove(new UIPortalKey(ownerType, ownerId));
+      this.all_UIPortals.remove(new SiteKey(ownerType, ownerId));
    }
    
    public boolean isSessionOpen()
@@ -672,14 +675,14 @@
       UserPortalConfigService userPortalConfigService =
          (UserPortalConfigService)appContainer.getComponentInstanceOfType(UserPortalConfigService.class);
       Page page = null;
-      PageNode pageNode = Util.getUIPortal().getSelectedNode();
+      UserNode pageNode = Util.getUIPortal().getSelectedUserNode();
       if (pageNode != null)
       {
          try
          {
-            if (pageNode.getPageReference() != null)
+            if (pageNode.getPageRef() != null)
             {
-               page = userPortalConfigService.getPage(pageNode.getPageReference(), context.getRemoteUser());
+               page = userPortalConfigService.getPage(pageNode.getPageRef(), context.getRemoteUser());
             }
          }
          catch (NoSuchDataException nsde)
@@ -690,17 +693,6 @@
       return (page != null);
    }
 
-   public void localizeNavigations()
-   {
-      ResourceBundleManager i18nManager = getApplicationComponent(ResourceBundleManager.class);
-      Locale locale = getLocale();
-      
-      for(PageNavigation nav : this.getNavigations())
-      {
-         PageNavigationUtils.localizePageNavigation(nav, locale, i18nManager);
-      }
-   }
-   
    /**
     * Get portal skin from {@link UserProfile} or from {@link UserPortalConfig}
     * 
@@ -741,65 +733,4 @@
             skin_ = userPortalConfigSkin;
       }
    }
-   
-   public void setNavigations(List<PageNavigation> navs)
-   {
-      this.all_Navigations = navs;
-   }
-   
-   public List<PageNavigation> getNavigations()
-   {
-      return this.all_Navigations;
-   }
-   
-   private class UIPortalKey
-   {
-
-      /** . */
-      private final String ownerType;
-
-      /** . */
-      private final String ownerId;
-
-      UIPortalKey(String _ownerType, String _ownerId)
-      {
-         if (_ownerType == null)
-         {
-            throw new NullPointerException();
-         }
-         if (_ownerId == null)
-         {
-            throw new NullPointerException();
-         }
-         this.ownerType = _ownerType;
-         this.ownerId = _ownerId;
-      }
-
-      @Override
-      public boolean equals(Object obj)
-      {
-         if (this == null || obj == null)
-         {
-            return this == null && obj == null;
-         }
-         if (!(obj instanceof UIPortalKey))
-         {
-            return false;
-         }
-         return this.ownerType.equals(((UIPortalKey)obj).ownerType) && this.ownerId.equals(((UIPortalKey)obj).ownerId);
-      }
-      
-      @Override
-      public int hashCode()
-      {
-         return this.ownerType.hashCode() * 2 + this.ownerId.hashCode();
-      }
-      
-      @Override
-      public String toString()
-      {
-        return "OWNERTYPE: " + ownerType + " OWNERID: " + ownerId;  
-      }
-   }
-
 }

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/application/portlet/PortletApplication.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/application/portlet/PortletApplication.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/application/portlet/PortletApplication.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -50,6 +50,8 @@
 import javax.portlet.PortletResponse;
 import javax.portlet.RenderRequest;
 import javax.portlet.RenderResponse;
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
 
 /**
  * May 26, 2006
@@ -214,6 +216,50 @@
          WebuiRequestContext.setCurrentInstance(parentAppRequestContext);
       }
    }
+   
+   /**
+    * This method is called when a JSR 286 serveResource lifecycle method is targeting the current portlet.
+    * 
+    * 1) The current instance of the WebuiRequestContext (stored in a ThreadLocal in the class) is referenced
+    * 2) A new request context of type PortletRequestContext (which extends the class WebuiRequestContext) is
+    *    created as a child of the current context instance
+    * 3) The new context is place inside the ThreadLocal and hence overides its parent one there, 
+    *    only for the portlet request lifecycle
+    * 4) The method onStartRequest() is called in all the ApplicationLifecycle objects referenced in the webui 
+    *    configuration XML file
+    * 5) The StateManager object (in case of portlet it is an object of type ParentAppStateManager) is used to get the RootComponent
+    *    also referenced in the XML configuration file
+    * 6) The method serveResource of UIPortletApplication is called
+    * 7) Finally, the method onEndRequest() is called on every ApplicationLifecycle referenced in the portlet
+    *    configuration XML file and the parent WebuiRequestContext is restored
+    */
+   public void serveResource(ResourceRequest req, ResourceResponse res) throws Exception
+   {
+      WebuiRequestContext parentAppRequestContext = WebuiRequestContext.getCurrentInstance();
+      PortletRequestContext context = createRequestContext(req, res, parentAppRequestContext);
+      WebuiRequestContext.setCurrentInstance(context);
+      try
+      {
+         for (ApplicationLifecycle<RequestContext> lifecycle : getApplicationLifecycle())
+         {
+            lifecycle.onStartRequest(this, context);
+         }
+         StateManager sm = getStateManager();
+         UIApplication uiApp = sm.restoreUIRootComponent(context);
+         context.setUIApplication(uiApp);
+         if (uiApp instanceof UIPortletApplication)
+         {
+            ((UIPortletApplication)uiApp).serveResource(context);           
+         }
+         
+         // Store ui root
+         sm.storeUIRootComponent(context);
+      }
+      finally
+      {
+         WebuiRequestContext.setCurrentInstance(parentAppRequestContext);
+      }
+   }
 
    /**
     * The render method business logic is quite similar to the processAction() one.
@@ -313,5 +359,4 @@
       context.setParentAppRequestContext(parentAppRequestContext);
       return context;
    }
-
 }

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/application/portlet/PortletApplicationController.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/application/portlet/PortletApplicationController.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/application/portlet/PortletApplicationController.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -38,6 +38,8 @@
 import javax.portlet.PortletException;
 import javax.portlet.RenderRequest;
 import javax.portlet.RenderResponse;
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
 
 /**
  * Created by The eXo Platform SAS
@@ -84,6 +86,7 @@
          log.error("Error while processing action in the porlet", ex);
       }
    }
+   
 
    /**
     * Delegate the action to the PortletApplication object
@@ -99,6 +102,21 @@
          log.error("Error while processing event in the porlet", ex);
       }
    }
+   
+   /**
+    * Delegate the action to the PortletApplication object
+    */
+   public void serveResource(ResourceRequest req, ResourceResponse res) throws PortletException, IOException
+   {
+      try
+      {
+         getPortletApplication().serveResource(req, res);
+      }
+      catch (Exception ex)
+      {
+         log.error("Error while serving resource in the porlet", ex);
+      }
+   }
 
    /**
     * Delegate the render to the PortletApplication object

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/application/portlet/PortletRequestContext.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/application/portlet/PortletRequestContext.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/application/portlet/PortletRequestContext.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -19,24 +19,24 @@
 
 package org.exoplatform.webui.application.portlet;
 
-import org.exoplatform.commons.utils.WriterPrinter;
-import org.exoplatform.services.resources.Orientation;
-import org.exoplatform.web.application.URLBuilder;
-import org.exoplatform.webui.application.WebuiApplication;
-import org.exoplatform.webui.application.WebuiRequestContext;
-import org.exoplatform.webui.core.UIApplication;
-import org.exoplatform.webui.core.UIComponent;
-
 import java.io.Writer;
 
 import javax.portlet.ActionResponse;
+import javax.portlet.MimeResponse;
 import javax.portlet.PortletMode;
 import javax.portlet.PortletModeException;
 import javax.portlet.PortletRequest;
 import javax.portlet.PortletResponse;
-import javax.portlet.RenderResponse;
 import javax.portlet.StateAwareResponse;
 
+import org.exoplatform.commons.utils.WriterPrinter;
+import org.exoplatform.services.resources.Orientation;
+import org.exoplatform.web.application.URLBuilder;
+import org.exoplatform.webui.application.WebuiApplication;
+import org.exoplatform.webui.application.WebuiRequestContext;
+import org.exoplatform.webui.core.UIApplication;
+import org.exoplatform.webui.core.UIComponent;
+
 /**
  * The request context of a portlet
  *
@@ -195,7 +195,7 @@
 
    public URLBuilder<UIComponent> getURLBuilder()
    {
-      RenderResponse renderRes = (RenderResponse)response_;
+      MimeResponse renderRes = (MimeResponse)response_;
       urlBuilder.setBaseURL(renderRes.createActionURL().toString());
       return urlBuilder;
    }

Modified: epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/core/UIPortletApplication.java
===================================================================
--- epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/core/UIPortletApplication.java	2011-07-18 22:13:58 UTC (rev 6884)
+++ epp/portal/branches/EPP_5_2_Branch/webui/portlet/src/main/java/org/exoplatform/webui/core/UIPortletApplication.java	2011-07-18 22:48:36 UTC (rev 6885)
@@ -23,7 +23,10 @@
 import java.util.Map;
 import java.util.Set;
 
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
 import javax.portlet.WindowState;
+import javax.resource.spi.IllegalStateException;
 
 import org.apache.commons.collections.map.HashedMap;
 import org.exoplatform.commons.serialization.api.annotations.Serialized;
@@ -145,4 +148,16 @@
       }
       super.processRender(context);
    }
+
+   /**
+    * Root uicomponent of a portlet should override this method to leverage serveResource that JSR286 offers 
+    * @param context - WebUI context
+    */
+   public void serveResource(WebuiRequestContext context) throws Exception
+   {      
+      if (!(context.getRequest() instanceof ResourceRequest))
+      {
+         throw new IllegalStateException("serveSource can only be called in portlet context");
+      }
+   }
 }
\ No newline at end of file



More information about the gatein-commits mailing list