/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.structure.page;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.enonic.cms.core.structure.menuitem.MenuItemEntity;
import com.enonic.cms.core.structure.page.template.PageTemplateEntity;
import com.enonic.cms.core.structure.page.template.PageTemplateRegionEntity;
import com.enonic.cms.core.structure.portlet.PortletEntity;
/**
* Aug 21, 2009
*/
public class RegionFactory
{
public static Regions createRegionsForPage( PageTemplateEntity pageTemplate, MenuItemEntity menuItem )
{
Regions regions = new Regions();
Map<String, Region> regionsInPageTemplateMapByName = doCreateRegionsAsMapByName( pageTemplate );
for ( Region region : regionsInPageTemplateMapByName.values() )
{
region.makeWindowsOfTemplates( menuItem );
}
if ( menuItem.getPage() != null )
{
Set<PageWindowEntity> pageWindows = menuItem.getPage().getPageWindows();
for ( PageWindowEntity pageWindow : pageWindows )
{
String regionName = pageWindow.getPageTemplateRegion().getName();
Region region = regionsInPageTemplateMapByName.get( regionName );
if ( region == null )
{
// if region does not exist in page template we do not allow addition
continue;
}
else if ( region.originatesFrom( RegionOrigin.PAGETEMPLATE ) )
{
region = region.cloneWithoutPortletWindows( RegionOrigin.PAGE );
regionsInPageTemplateMapByName.put( region.getName(), region );
}
PortletEntity portlet = pageWindow.getPortlet();
Window window = new Window();
window.setKey( new WindowKey( menuItem.getKey(), portlet.getPortletKey() ) );
window.setPortlet( portlet );
window.setRegion( region );
region.addWindow( window );
}
}
for ( Region region : regionsInPageTemplateMapByName.values() )
{
regions.addRegion( region );
}
return regions;
}
public static Regions createRegionsOriginatingPageTemplate( PageTemplateEntity pageTemplate, MenuItemEntity menuItem )
{
Collection<Region> regionsOnPageTemplate = doCreateRegionsCollection( pageTemplate );
Regions regions = new Regions();
for ( Region region : regionsOnPageTemplate )
{
regions.addRegion( region );
region.makeWindowsOfTemplates( menuItem );
}
return regions;
}
private static Map<String, Region> doCreateRegionsAsMapByName( final PageTemplateEntity pageTemplate )
{
if ( pageTemplate == null )
{
throw new NullPointerException( "pageTemplate cannot be null" );
}
Collection<Region> regions = doCreateRegionsCollection( pageTemplate );
Map<String, Region> regionMapByName = new LinkedHashMap<String, Region>( regions.size() );
for ( Region region : regions )
{
regionMapByName.put( region.getName(), region );
}
return regionMapByName;
}
private static Collection<Region> doCreateRegionsCollection( final PageTemplateEntity pageTemplate )
{
if ( pageTemplate == null )
{
throw new NullPointerException( "pageTemplate cannot be null" );
}
final Set<PageTemplateRegionEntity> pageTemplateRegions = pageTemplate.getPageTemplateRegions();
List<Region> regions = new ArrayList<Region>( pageTemplateRegions.size() );
for ( PageTemplateRegionEntity pagetTemplateRegion : pageTemplateRegions )
{
Region region = new Region( pagetTemplateRegion.getName(), pagetTemplateRegion.getSeparator(), pageTemplate.getPortlets() );
regions.add( region );
}
return regions;
}
}