/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.vertical.adminweb;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.enonic.vertical.engine.handlers.MenuHandler;
import com.enonic.cms.core.security.SecurityService;
import com.enonic.cms.core.security.user.UserEntity;
import com.enonic.cms.core.structure.DefaultSiteAccessRightAccumulator;
import com.enonic.cms.core.structure.DefaultSiteAccumulatedAccessRights;
import com.enonic.cms.core.structure.SiteEntity;
import com.enonic.cms.core.structure.SiteKey;
import com.enonic.cms.core.structure.SitePropertiesService;
import com.enonic.cms.core.structure.menuitem.MenuItemAccessRightAccumulator;
import com.enonic.cms.core.structure.menuitem.MenuItemAccumulatedAccessRights;
import com.enonic.cms.core.structure.menuitem.MenuItemAndUserAccessRights;
import com.enonic.cms.core.structure.menuitem.MenuItemEntity;
import com.enonic.cms.core.structure.menuitem.MenuItemKey;
import com.enonic.cms.store.dao.MenuItemDao;
import com.enonic.cms.store.dao.SiteDao;
/**
* Nov 24, 2009
*/
public class MenuBrowseModelFactory
{
private SecurityService securityService;
private SiteDao siteDao;
private MenuItemDao menuItemDao;
private MenuItemAccessRightAccumulator menuItemAccessRightAccumulator;
private SitePropertiesService sitePropertiesService;
private MenuHandler menuHandler;
public MenuBrowseModelFactory( SecurityService securityService, SiteDao siteDao, MenuItemDao menuItemDao,
SitePropertiesService sitePropertiesService, MenuHandler menuHandler )
{
this.securityService = securityService;
this.siteDao = siteDao;
this.menuItemDao = menuItemDao;
this.menuItemAccessRightAccumulator = new MenuItemAccessRightAccumulator( securityService );
this.sitePropertiesService = sitePropertiesService;
this.menuHandler = menuHandler;
}
public MenuBrowseMenuItemsModel createMenuItemModel( UserEntity user, SiteKey siteKey, MenuItemKey selectedMenuItemKey )
{
MenuBrowseMenuItemsModel model = new MenuBrowseMenuItemsModel();
SiteEntity site = siteDao.findByKey( siteKey );
model.setSite( site );
model.setSiteProperties( sitePropertiesService.getSiteProperties( site.getKey() ) );
DefaultSiteAccessRightAccumulator defaultSiteAccessRightAccumulator = new DefaultSiteAccessRightAccumulator( securityService );
DefaultSiteAccumulatedAccessRights userRightsForSite = defaultSiteAccessRightAccumulator.getAccessRightsAccumulated( site, user );
model.setUserRightsForSite( userRightsForSite );
MenuItemEntity selectedMenuItem = null;
if ( selectedMenuItemKey != null )
{
selectedMenuItem = menuItemDao.findByKey( selectedMenuItemKey.toInt() );
model.setSelectedMenuItem( selectedMenuItem );
model.setSelectedMenuItemPath( selectedMenuItem.getMenuItemPath() );
model.setUserRightsForSelectedMenuItem( resolveUserRights( selectedMenuItem, user ) );
MenuItemEntity parentToSelectedMenuItem = selectedMenuItem.getParent();
model.setParentToSelectedMenuItem( parentToSelectedMenuItem );
if ( parentToSelectedMenuItem != null )
{
model.setUserRightsForParentToSelectedMenuItem( resolveUserRights( parentToSelectedMenuItem, user ) );
}
}
Collection<MenuItemAndUserAccessRights> menuItemsToList = resolveMenuItemsToList( site, selectedMenuItem, user );
model.setMenuItemsToList( menuItemsToList );
return model;
}
public MenuItemFormModel createMenuItemFormModel( UserEntity user, SiteKey siteKey, MenuItemKey selectedMenuItemKey,
MenuItemKey parentMenuItemKey )
{
MenuItemFormModel model = new MenuItemFormModel( selectedMenuItemKey, menuHandler );
SiteEntity site = siteDao.findByKey( siteKey );
model.setSite( site );
model.setSiteProperties( sitePropertiesService.getSiteProperties( site.getKey() ) );
DefaultSiteAccessRightAccumulator defaultSiteAccessRightAccumulator = new DefaultSiteAccessRightAccumulator( securityService );
DefaultSiteAccumulatedAccessRights userRightsForSite = defaultSiteAccessRightAccumulator.getAccessRightsAccumulated( site, user );
model.setUserRightsForSite( userRightsForSite );
if ( selectedMenuItemKey != null )
{
MenuItemEntity selectedMenuItem = menuItemDao.findByKey( selectedMenuItemKey.toInt() );
model.setSelectedMenuItemPath( selectedMenuItem.getMenuItemPath() );
}
else if ( parentMenuItemKey != null )
{
MenuItemEntity parentMenuItem = menuItemDao.findByKey( parentMenuItemKey.toInt() );
model.setSelectedMenuItemPath( parentMenuItem.getMenuItemPath() );
}
return model;
}
public MenuBrowseContentModel createContentModel( final UserEntity user, final SiteKey siteKey, final MenuItemKey selectedMenuItemKey )
{
final MenuBrowseContentModel model = new MenuBrowseContentModel();
final SiteEntity site = siteDao.findByKey( siteKey.toInt() );
model.setSite( site );
model.setSiteProperties( sitePropertiesService.getSiteProperties( site.getKey() ) );
final DefaultSiteAccessRightAccumulator defaultSiteAccessRightAccumulator =
new DefaultSiteAccessRightAccumulator( securityService );
final DefaultSiteAccumulatedAccessRights userRightsForSite =
defaultSiteAccessRightAccumulator.getAccessRightsAccumulated( site, user );
model.setUserRightsForSite( userRightsForSite );
if ( selectedMenuItemKey != null )
{
final MenuItemEntity selectedMenuItem = menuItemDao.findByKey( selectedMenuItemKey.toInt() );
model.setSelectedMenuItem( selectedMenuItem );
model.setSelectedMenuItemPath( selectedMenuItem.getMenuItemPath() );
model.setUserRightsForSelectedMenuItem( resolveUserRights( selectedMenuItem, user ) );
final MenuItemEntity parentToSelectedMenuItem = selectedMenuItem.getParent();
model.setParentToSelectedMenuItem( parentToSelectedMenuItem );
if ( parentToSelectedMenuItem != null )
{
model.setUserRightsForParentToSelectedMenuItem( resolveUserRights( parentToSelectedMenuItem, user ) );
}
}
return model;
}
private Collection<MenuItemAndUserAccessRights> resolveMenuItemsToList( final SiteEntity site, final MenuItemEntity parentMenuItem,
final UserEntity user )
{
final UserEntity anonymousUser = securityService.getUser( securityService.getAnonymousUserKey() );
if ( parentMenuItem == null )
{
final List<MenuItemAndUserAccessRights> menuItemsAndUserAccessRights = new ArrayList<MenuItemAndUserAccessRights>();
final Collection<MenuItemEntity> menuItems = site.getTopMenuItems();
for ( MenuItemEntity menuItem : menuItems )
{
final MenuItemAccumulatedAccessRights accessRightsForAnonymousUser = resolveUserRights( menuItem, anonymousUser );
final MenuItemAccumulatedAccessRights accessRightsForRunningUser = resolveUserRights( menuItem, user );
menuItemsAndUserAccessRights.add(
new MenuItemAndUserAccessRights( menuItem, accessRightsForRunningUser, accessRightsForAnonymousUser ) );
}
return menuItemsAndUserAccessRights;
}
else
{
final List<MenuItemAndUserAccessRights> menuItemsAndUserAccessRights = new ArrayList<MenuItemAndUserAccessRights>();
final Collection<MenuItemEntity> menuItems = parentMenuItem.getChildren();
for ( MenuItemEntity menuItem : menuItems )
{
final MenuItemAccumulatedAccessRights accessRightsForAnonymousUser = resolveUserRights( menuItem, anonymousUser );
final MenuItemAccumulatedAccessRights accessRightsForRunningUser = resolveUserRights( menuItem, user );
menuItemsAndUserAccessRights.add(
new MenuItemAndUserAccessRights( menuItem, accessRightsForRunningUser, accessRightsForAnonymousUser ) );
}
return menuItemsAndUserAccessRights;
}
}
private MenuItemAccumulatedAccessRights resolveUserRights( final MenuItemEntity menuItem, final UserEntity user )
{
return menuItemAccessRightAccumulator.getAccessRightsAccumulated( menuItem, user );
}
}