/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.structure; import java.util.List; import javax.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.enonic.cms.core.portal.SiteNotFoundException; import com.enonic.cms.core.portal.cache.PageCacheService; import com.enonic.cms.core.security.user.User; import com.enonic.cms.core.security.user.UserEntity; import com.enonic.cms.store.dao.SiteDao; import com.enonic.cms.store.dao.UserDao; @Component("siteService") public class SiteServiceImpl implements SiteService, SitePropertiesListener { private static final Logger LOG = LoggerFactory.getLogger( SiteServiceImpl.class ); private PageCacheService pageCacheService; private SiteContextManager siteContextManager; private SitePropertiesService sitePropertiesService; private SiteDao siteDao; private UserDao userDao; private final Object lock = new Object(); @PostConstruct public void postConstruct() { sitePropertiesService.registerSitePropertiesListener( this ); } @Override public void sitePropertiesLoaded( final SiteProperties siteProperties ) { registerSite( siteProperties.getSiteKey() ); } @Override public void sitePropertiesReloaded( final SiteProperties siteProperties ) { final SiteContext siteContext = siteContextManager.getSiteContext( siteProperties.getSiteKey() ); siteContext.setAuthenticationLoggingEnabled( siteProperties.getAuthenticationLoggingEnabled() ); } private void registerSite( SiteKey siteKey ) { synchronized ( lock ) { if ( !siteContextManager.isRegistered( siteKey ) ) { LOG.info( "Site [" + siteKey + "] is registering..." ); SiteContext siteContext = createSiteContext( siteKey ); siteContextManager.registerSiteContext( siteContext ); LOG.info( "Site [" + siteKey + "] is registered" ); } } } private void unregisterSite( SiteKey siteKey ) { synchronized ( lock ) { if ( siteContextManager.isRegistered( siteKey ) ) { LOG.info( "Site [" + siteKey + "] is unregistering..." ); siteContextManager.unregisterSiteContext( siteKey ); pageCacheService.tearDownPageCache( siteKey ); LOG.info( "Site [" + siteKey + "] is unregistered." ); } } } private SiteContext createSiteContext( SiteKey siteKey ) { final SiteContext siteContext = new SiteContext( siteKey ); siteContext.setAuthenticationLoggingEnabled( sitePropertiesService.getSiteProperties( siteKey ).getAuthenticationLoggingEnabled() ); pageCacheService.setUpPageCache( siteKey ); return siteContext; } /** * @inheritDoc */ public boolean siteExists( SiteKey siteKey ) { return siteDao.findByKey( siteKey.toInt() ) != null; } /** * @inheritDoc */ public void checkSiteExist( SiteKey siteKey ) throws SiteNotFoundException { if ( !siteExists( siteKey ) ) { throw new SiteNotFoundException( siteKey ); } } /** * @inheritDoc */ public SiteContext getSiteContext( SiteKey siteKey ) throws SiteNotFoundException { SiteContext siteContext = siteContextManager.getSiteContext( siteKey ); boolean siteExistsInDb = siteDao.findByKey( siteKey ) != null; boolean isRegistered = siteContext != null; if ( siteExistsInDb && isRegistered ) { return siteContext; } if ( siteExistsInDb && !isRegistered ) { registerSite( siteKey ); return getSiteContext( siteKey ); } if ( !siteExistsInDb && isRegistered ) { unregisterSite( siteKey ); throw new SiteNotFoundException( siteKey ); } throw new SiteNotFoundException( siteKey ); } public List<SiteEntity> getSitesToPublishTo( int contentTypeKey, User oldUser ) { UserEntity user = userDao.findByKey( oldUser.getKey() ); return siteDao.findByPublishPossible( contentTypeKey, user ); } @Autowired public void setPageCacheService( PageCacheService value ) { this.pageCacheService = value; } @Autowired public void setSiteContextManager( SiteContextManager value ) { this.siteContextManager = value; } @Autowired public void setSitePropertiesService( SitePropertiesService value ) { this.sitePropertiesService = value; } @Autowired public void setSiteDao( SiteDao value ) { this.siteDao = value; } @Autowired public void setUserDao( UserDao value ) { this.userDao = value; } }