/*
*
* Copyright 2005 AgileTec s.r.l. (http://www.agiletec.it) All rights reserved.
*
* This file is part of jAPS software.
* jAPS is a free software;
* you can redistribute it and/or modify it
* under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation; version 2.
*
* See the file License for the specific language governing permissions
* and limitations under the License
*
*
*
* Copyright 2005 AgileTec s.r.l. (http://www.agiletec.it) All rights reserved.
*
*/
package com.agiletec.plugins.jacms.aps.system.services.cache;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.agiletec.aps.system.ApsSystemUtils;
import com.agiletec.aps.system.common.AbstractService;
import com.agiletec.aps.system.common.entity.event.EntityTypesChangingEvent;
import com.agiletec.aps.system.common.entity.event.EntityTypesChangingObserver;
import com.agiletec.aps.system.common.entity.model.IApsEntity;
import com.agiletec.aps.system.services.cache.ICacheManager;
import com.agiletec.aps.system.services.lang.ILangManager;
import com.agiletec.aps.system.services.lang.Lang;
import com.agiletec.plugins.jacms.aps.system.JacmsSystemConstants;
import com.agiletec.plugins.jacms.aps.system.services.content.ContentManager;
import com.agiletec.plugins.jacms.aps.system.services.content.IContentManager;
import com.agiletec.plugins.jacms.aps.system.services.content.event.PublicContentChangedEvent;
import com.agiletec.plugins.jacms.aps.system.services.content.event.PublicContentChangedObserver;
import com.agiletec.plugins.jacms.aps.system.services.content.model.Content;
import com.agiletec.plugins.jacms.aps.system.services.contentmodel.ContentModel;
import com.agiletec.plugins.jacms.aps.system.services.contentmodel.IContentModelManager;
import com.agiletec.plugins.jacms.aps.system.services.contentmodel.event.ContentModelChangedEvent;
import com.agiletec.plugins.jacms.aps.system.services.contentmodel.event.ContentModelChangedObserver;
import com.agiletec.plugins.jacms.aps.system.services.resource.ResourceUtilizer;
import com.agiletec.plugins.jacms.aps.system.services.resource.event.ResourceChangedEvent;
import com.agiletec.plugins.jacms.aps.system.services.resource.event.ResourceChangedObserver;
import com.agiletec.plugins.jacms.aps.system.services.resource.model.ResourceInterface;
/**
* Cache Wrapper Manager for plugin jacms
* @author E.Santoboni
*/
public class CmsCacheWrapperManager extends AbstractService
implements PublicContentChangedObserver, ContentModelChangedObserver, EntityTypesChangingObserver, ResourceChangedObserver {
@Override
public void init() throws Exception {
ApsSystemUtils.getLogger().config(this.getClass().getName() + ": initialized");
}
@Override
public void updateFromPublicContentChanged(PublicContentChangedEvent event) {
try {
Content content = event.getContent();
Logger log = ApsSystemUtils.getLogger();
if (log.isLoggable(Level.FINEST)) {
log.info("Notified public content update : type " + content.getId());
}
this.releaseRelatedItems(content);
} catch (Throwable t) {
ApsSystemUtils.logThrowable(t, this, "updateFromPublicContentChanged",
"Error notifing event " + PublicContentChangedEvent.class.getName());
}
}
@Override
public void updateFromContentModelChanged(ContentModelChangedEvent event) {
try {
ContentModel model = event.getContentModel();
Logger log = ApsSystemUtils.getLogger();
if (log.isLoggable(Level.FINEST)) {
log.info("Notified content model update : type " + model.getId());
}
String cacheGroupKey = JacmsSystemConstants.CONTENT_MODEL_CACHE_GROUP_PREFIX + model.getId();
this.getCacheManager().flushGroup(cacheGroupKey);
} catch (Throwable t) {
ApsSystemUtils.logThrowable(t, this, "updateFromContentModelChanged",
"Error notifing event " + ContentModelChangedEvent.class.getName());
}
}
@Override
public void updateFromEntityTypesChanging(EntityTypesChangingEvent event) {
try {
String entityManagerName = event.getEntityManagerName();
if (!entityManagerName.equals(JacmsSystemConstants.CONTENT_MANAGER)) return;
if (event.getOperationCode() == EntityTypesChangingEvent.INSERT_OPERATION_CODE) return;
IApsEntity oldEntityType = event.getOldEntityType();
Logger log = ApsSystemUtils.getLogger();
if (log.isLoggable(Level.FINEST)) {
log.info("Notified content type modify : type " + oldEntityType.getTypeCode());
}
String typeGroupKey = JacmsSystemConstants.CONTENTS_TYPE_CACHE_GROUP_PREFIX + oldEntityType.getTypeCode();
this.getCacheManager().flushGroup(typeGroupKey);
} catch (Throwable t) {
ApsSystemUtils.logThrowable(t, this, "updateFromEntityTypesChanging",
"Error notifing event " + EntityTypesChangingEvent.class.getName());
}
}
@Override
public void updateFromResourceChanged(ResourceChangedEvent event) {
try {
ResourceInterface resource = event.getResource();
if (null == resource) return;
List<String> utilizers = ((ResourceUtilizer) this.getContentManager()).getResourceUtilizers(resource.getId());
for (int i = 0; i < utilizers.size(); i++) {
String contentId = utilizers.get(i);
Content content = this.getContentManager().loadContent(contentId, true);
if (null != content) {
this.releaseRelatedItems(content);
}
}
} catch (Throwable t) {
ApsSystemUtils.logThrowable(t, this, "updateFromResourceChanged",
"Error notifing event " + ResourceChangedEvent.class.getName());
}
}
private void releaseRelatedItems(Content content) {
String authInfokey = ContentManager.getContentAuthInfoCacheKey(content.getId());
this.getCacheManager().flushEntry(authInfokey);
this.getCacheManager().flushGroup(JacmsSystemConstants.CONTENTS_ID_CACHE_GROUP_PREFIX + content.getTypeCode());
List<Lang> langs = this.getLangManager().getLangs();
List<ContentModel> models = this.getContentModelManager().getModelsForContentType(content.getTypeCode());
for (int i = 0; i < langs.size(); i++) {
Lang lang = langs.get(i);
for (int j = 0; j < models.size(); j++) {
ContentModel contentModel = models.get(j);
String key = ContentManager.getRenderedContentCacheKey(content.getId(), contentModel.getId(), lang.getCode());
this.getCacheManager().flushEntry(key);
}
}
}
protected IContentManager getContentManager() {
return _contentManager;
}
public void setContentManager(IContentManager contentManager) {
this._contentManager = contentManager;
}
protected ICacheManager getCacheManager() {
return _cacheManager;
}
public void setCacheManager(ICacheManager cacheManager) {
this._cacheManager = cacheManager;
}
protected ILangManager getLangManager() {
return _langManager;
}
public void setLangManager(ILangManager langManager) {
this._langManager = langManager;
}
protected IContentModelManager getContentModelManager() {
return _contentModelManager;
}
public void setContentModelManager(IContentModelManager contentModelManager) {
this._contentModelManager = contentModelManager;
}
private IContentManager _contentManager;
private ICacheManager _cacheManager;
private ILangManager _langManager;
private IContentModelManager _contentModelManager;
}