/*
* Copyright 2015-Present Entando Inc. (http://www.entando.com) All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.agiletec.aps.system.services.pagemodel;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.entando.entando.aps.system.services.guifragment.GuiFragmentUtilizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.agiletec.aps.system.common.AbstractService;
import com.agiletec.aps.system.exception.ApsSystemException;
import com.agiletec.aps.system.services.page.IPage;
import com.agiletec.aps.system.services.page.events.PageChangedEvent;
import com.agiletec.aps.system.services.pagemodel.events.PageModelChangedEvent;
/**
* The manager of the page models.
* @author M.Diana - E.Santoboni
*/
public class PageModelManager extends AbstractService implements IPageModelManager, GuiFragmentUtilizer {
private static final Logger _logger = LoggerFactory.getLogger(PageModelManager.class);
@Override
public void init() throws Exception {
this.loadPageModels();
_logger.debug("{} ready. initialized {} page models", this.getClass().getName() ,this._models.size());
}
private void loadPageModels() throws ApsSystemException {
try {
this._models = this.getPageModelDAO().loadModels();
} catch (Throwable t) {
_logger.error("Error loading page models", t);
throw new ApsSystemException("Error loading page models", t);
}
}
/**
* Restituisce il modello di pagina con il codice dato
* @param name Il nome del modelo di pagina
* @return Il modello di pagina richiesto
*/
@Override
public PageModel getPageModel(String name) {
return this._models.get(name);
}
/**
* Restituisce la Collection completa di modelli.
* @return la collection completa dei modelli disponibili in oggetti PageModel.
*/
@Override
public Collection<PageModel> getPageModels() {
return _models.values();
}
@Override
public void addPageModel(PageModel pageModel) throws ApsSystemException {
if (null == pageModel) {
_logger.debug("Null page model can be add");
return;
}
try {
this.getPageModelDAO().addModel(pageModel);
this._models.put(pageModel.getCode(), pageModel);
this.notifyPageModelChangedEvent(pageModel, PageModelChangedEvent.INSERT_OPERATION_CODE);
} catch (Throwable t) {
_logger.error("Error adding page models", t);
throw new ApsSystemException("Error adding page models", t);
}
}
@Override
public void updatePageModel(PageModel pageModel) throws ApsSystemException {
if (null == pageModel) {
_logger.debug("Null page model can be update");
return;
}
try {
PageModel pageModelToUpdate = this._models.get(pageModel.getCode());
if (null == pageModelToUpdate) {
_logger.debug("Page model {} does not exist", pageModel.getCode());
return;
}
this.getPageModelDAO().updateModel(pageModel);
//pageModelToUpdate.setDefaultWidget(pageModel.getDefaultWidget());
pageModelToUpdate.setDescription(pageModel.getDescription());
//pageModelToUpdate.setFrames(pageModel.getFrames());
pageModelToUpdate.setConfiguration(pageModel.getConfiguration());
pageModelToUpdate.setMainFrame(pageModel.getMainFrame());
pageModelToUpdate.setPluginCode(pageModel.getPluginCode());
pageModelToUpdate.setTemplate(pageModel.getTemplate());
this.notifyPageModelChangedEvent(pageModelToUpdate, PageModelChangedEvent.UPDATE_OPERATION_CODE);
} catch (Throwable t) {
_logger.error("Error updating page model {}", pageModel.getCode(), t);
throw new ApsSystemException("Error updating page model " + pageModel.getCode(), t);
}
}
@Override
public void deletePageModel(String code) throws ApsSystemException {
try {
PageModel model = this.getPageModel(code);
this.getPageModelDAO().deleteModel(code);
this._models.remove(code);
this.notifyPageModelChangedEvent(model, PageModelChangedEvent.REMOVE_OPERATION_CODE);
} catch (Throwable t) {
_logger.error("Error deleting page models", t);
throw new ApsSystemException("Error deleting page models", t);
}
}
private void notifyPageModelChangedEvent(PageModel pageModel, int operationCode) {
PageModelChangedEvent event = new PageModelChangedEvent();
event.setPageModel(pageModel);
event.setOperationCode(operationCode);
this.notifyEvent(event);
}
@Override
public List getGuiFragmentUtilizers(String guiFragmentCode) throws ApsSystemException {
List<PageModel> utilizers = new ArrayList<PageModel>();
try {
Iterator<PageModel> it = this.getPageModels().iterator();
while (it.hasNext()) {
PageModel pModel = it.next();
String template = pModel.getTemplate();
if (StringUtils.isNotBlank(template)) {
Pattern pattern = Pattern.compile("<@wp\\.fragment.*code=\""+ guiFragmentCode + "\".*/>", Pattern.MULTILINE);
Matcher matcher = pattern.matcher(template);
if (matcher.find()) {
utilizers.add(pModel);
}
}
}
} catch (Throwable t) {
_logger.error("Error extracting utilizers", t);
throw new ApsSystemException("Error extracting utilizers", t);
}
return utilizers;
}
protected IPageModelDAO getPageModelDAO() {
return _pageModelDao;
}
public void setPageModelDAO(IPageModelDAO pageModelDAO) {
this._pageModelDao = pageModelDAO;
}
/**
* Map dei modelli di pagina configurati nel sistema
*/
private Map<String, PageModel> _models;
private IPageModelDAO _pageModelDao;
}