/* * 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; } }