/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.structure;
import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.jdom.Document;
import org.jdom.Element;
import com.enonic.cms.framework.util.LazyInitializedJDOMDocument;
import com.enonic.cms.core.CaseInsensitiveString;
import com.enonic.cms.core.Path;
import com.enonic.cms.core.language.LanguageEntity;
import com.enonic.cms.core.portal.ResourceNotFoundException;
import com.enonic.cms.core.resource.ResourceKey;
import com.enonic.cms.core.security.group.GroupKey;
import com.enonic.cms.core.structure.menuitem.MenuItemEntity;
import com.enonic.cms.core.structure.page.template.PageTemplateEntity;
public class SiteEntity
implements Serializable
{
private static final long serialVersionUID = -9069139070885625332L;
private SiteKey key;
private String name;
private Date timestamp;
private LazyInitializedJDOMDocument xmlData;
private MenuItemEntity frontPage;
private MenuItemEntity loginPage;
private MenuItemEntity errorPage;
private PageTemplateEntity pageTemplate;
private Set<PageTemplateEntity> pageTemplates = new HashSet<PageTemplateEntity>();
private LanguageEntity language;
private String statisticsUrl;
private Map<CaseInsensitiveString, MenuItemEntity> topMenuItems = new HashMap<CaseInsensitiveString, MenuItemEntity>();
private Map<GroupKey, DefaultSiteAccessEntity> defaultAccesses;
/**
* For internal caching of the xml data document.
*/
private transient Document xmlDataAsJDOMDocument;
private transient SiteData siteData;
public SiteKey getKey()
{
return key;
}
public String getName()
{
return name;
}
public Date getTimestamp()
{
return timestamp;
}
public MenuItemEntity getFrontPage()
{
return frontPage;
}
public MenuItemEntity getLoginPage()
{
return loginPage;
}
public MenuItemEntity getErrorPage()
{
return errorPage;
}
public PageTemplateEntity getPageTemplate()
{
return pageTemplate;
}
public LanguageEntity getLanguage()
{
return language;
}
public String getStatisticsUrl()
{
return statisticsUrl;
}
public boolean isDeviceClassificationEnabled()
{
return getSiteData().getDeviceClassResolver() != null;
}
public ResourceKey getDeviceClassResolver()
{
return getSiteData().getDeviceClassResolver();
}
public ResourceKey getPathToPublicResources()
{
return getSiteData().getPathToPublicResources();
}
public ResourceKey getPathToResources()
{
return getSiteData().getPathToResources();
}
public boolean isLocalizationEnabled()
{
return getSiteData().getDefaultLocalizationResource() != null;
}
public ResourceKey getDefaultLocalizationResource()
{
return getSiteData().getDefaultLocalizationResource();
}
public ResourceKey getLocaleResolver()
{
return getSiteData().getLocaleResolver();
}
public void setKey( int key )
{
this.key = new SiteKey( key );
}
public void setName( String name )
{
this.name = name;
}
public void setTimestamp( Date timestamp )
{
this.timestamp = timestamp;
}
public void setFirstPage( MenuItemEntity firstPage )
{
this.frontPage = firstPage;
}
public void setLoginPage( MenuItemEntity loginPage )
{
this.loginPage = loginPage;
}
public void setErrorPage( MenuItemEntity errorPage )
{
this.errorPage = errorPage;
}
public void setPageTemplate( PageTemplateEntity pageTemplate )
{
this.pageTemplate = pageTemplate;
}
public void setLanguage( LanguageEntity language )
{
this.language = language;
}
public void setStatisticsUrl( String statisticsUrl )
{
this.statisticsUrl = statisticsUrl;
}
public void setDeviceClassResolver( ResourceKey value )
{
this.getSiteData().setDeviceClassResolver( value );
}
public void setDefaultLocalizationResource( ResourceKey value )
{
this.getSiteData().setDefaultLocalizationResource( value );
}
public void setPathToPublicResources( ResourceKey value )
{
this.getSiteData().setPathToPublicResources( value );
}
public void setLocaleResolver( ResourceKey value )
{
this.getSiteData().setLocaleResolver( value );
}
public Set<String> getAllowedPageTypes()
{
return getSiteData().getAllowedPageTypes();
}
public ResourceKey getDefaultCssKey()
{
return getSiteData().getDefaultCssKey();
}
public void setDefaultCssKey( ResourceKey resourceKey )
{
if ( xmlData != null )
{
Document doc = xmlData.getDocument();
Element elem = doc.getRootElement().getChild( "defaultcss" );
if ( elem != null )
{
elem.setAttribute( "key", resourceKey.toString() );
setXmlData( doc );
}
}
// Invalidate caches
xmlDataAsJDOMDocument = null;
siteData = null;
}
public void addTopMenuItem( MenuItemEntity menuItem )
{
CaseInsensitiveString menuItemName = new CaseInsensitiveString( menuItem.getName() );
if ( topMenuItems.containsKey( menuItemName ) )
{
throw new IllegalArgumentException( "Menu item already exist." );
}
topMenuItems.put( menuItemName, menuItem );
}
public Collection<MenuItemEntity> getTopMenuItems()
{
return topMenuItems.values();
}
public void setTopMenuItems( Map<CaseInsensitiveString, MenuItemEntity> topMenuItems )
{
this.topMenuItems = topMenuItems;
}
public MenuItemEntity getChild( String name )
{
return this.topMenuItems.get( new CaseInsensitiveString( name ) );
}
public Document getXmlDataAsClonedJDomDocument()
{
if ( xmlData == null )
{
return null;
}
if ( xmlDataAsJDOMDocument == null )
{
xmlDataAsJDOMDocument = xmlData.getDocument();
}
return (Document) xmlDataAsJDOMDocument.clone();
}
public void setXmlData( Document value )
{
if ( value == null )
{
this.xmlData = null;
}
else
{
this.xmlData = LazyInitializedJDOMDocument.parse( value );
}
// Invalidate caches
xmlDataAsJDOMDocument = null;
siteData = null;
}
public MenuItemEntity resolveMenuItemByPath( Path localPath )
throws ResourceNotFoundException
{
if ( localPath.isRoot() )
{
if ( this.getFrontPage() == null )
{
return getFirstMenuItem();
}
return this.getFrontPage();
}
// check first path element in top menu items
String firstPathElement = localPath.getPathElement( 0 );
MenuItemEntity menuItem = this.getChild( firstPathElement.toLowerCase() );
if ( menuItem == null )
{
return null;
}
else if ( localPath.numberOfElements() == 1 )
{
return menuItem;
}
//StringBuffer correctPath = new StringBuffer( 32 );
//correctPath.append( firstPathElement ).append( "/" );
// check next path elements in children
for ( int i = 1; i < localPath.numberOfElements(); i++ )
{
String pathElement = localPath.getPathElement( i );
menuItem = menuItem.getChildByName( pathElement );
if ( menuItem == null )
{
break;
}
//correctPath.append( pathElement ).append( "/" );
}
return menuItem;
}
public MenuItemEntity getFirstMenuItem()
{
if ( topMenuItems.isEmpty() )
{
return null;
}
return topMenuItems.values().iterator().next();
}
public DefaultSiteAccessEntity getAccess( GroupKey groupKey )
{
return defaultAccesses.get( groupKey );
}
@Override
public boolean equals( Object o )
{
if ( this == o )
{
return true;
}
if ( !( o instanceof SiteEntity ) )
{
return false;
}
SiteEntity that = (SiteEntity) o;
if ( !getKey().equals( that.getKey() ) )
{
return false;
}
return true;
}
public int hashCode()
{
return new HashCodeBuilder( 269, 761 ).append( key ).toHashCode();
}
private SiteData getSiteData()
{
if ( siteData == null )
{
Document xmlDataAsDoc = getXmlDataAsClonedJDomDocument();
if ( xmlDataAsDoc != null )
{
siteData = new SiteData( xmlDataAsDoc );
}
else
{
siteData = new SiteData();
}
}
return siteData;
}
public Map<GroupKey, DefaultSiteAccessEntity> getDefaultAccesses()
{
return defaultAccesses;
}
public Set<PageTemplateEntity> getPageTemplates()
{
return pageTemplates;
}
public void setPageTemplates( Set<PageTemplateEntity> pageTemplates )
{
this.pageTemplates = pageTemplates;
}
}