/*
* 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 org.entando.entando.apsadmin.portal.model;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.entando.entando.aps.system.services.widgettype.IWidgetTypeManager;
import org.entando.entando.apsadmin.portal.model.helper.IPageModelActionHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import com.agiletec.aps.system.exception.ApsSystemException;
import com.agiletec.aps.system.services.pagemodel.Frame;
import com.agiletec.aps.system.services.pagemodel.PageModel;
import com.agiletec.aps.system.services.pagemodel.PageModelDOM;
import com.agiletec.apsadmin.system.ApsAdminSystemConstants;
import java.io.File;
/**
* @author E.Santoboni
*/
public class PageModelAction extends AbstractPageModelAction {
private static final Logger _logger = LoggerFactory.getLogger(PageModelAction.class);
@Override
public void validate() {
super.validate();
List<String> codeFieldErrors = this.getFieldErrors().get("code");
if (null == codeFieldErrors || codeFieldErrors.isEmpty()) {
if (this.getStrutsAction() == ApsAdminSystemConstants.ADD) {
String currectCode = this.getCode();
if (currectCode.length() > 0 && null != this.getPageModel(currectCode)) {
String[] args = {currectCode};
this.addFieldError("code", this.getText("error.pageModel.duplicateCode", args));
}
}
try {
String template = this.getTemplate();
if (StringUtils.isBlank(template)) {
String jspTemplatePath = PageModel.getPageModelJspPath(this.getCode(), this.getPluginCode());
boolean existsJsp = false;
if (StringUtils.isNotBlank(jspTemplatePath)) {
String folderPath = this.getRequest().getSession().getServletContext().getRealPath("/");
existsJsp = (new File(folderPath + jspTemplatePath)).exists();
if (!existsJsp) {
existsJsp = this.checkModelResource("file:**" + jspTemplatePath);
}
}
if (!existsJsp) {
this.addFieldError("template", this.getText("error.pageModel.templateRequired"));
}
}
if (!this.checkModelConfiguration()) {
this.addFieldError("xmlConfiguration", this.getText("error.pageModel.invalidConfiguration"));
}
} catch (Throwable t) {
_logger.error("error in validate", t);
}
}
}
private boolean checkModelResource(String path) throws Throwable {
boolean existsJsp = false;
if (StringUtils.isBlank(path)) {
return existsJsp;
}
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources(path);
for (int i = 0; i < resources.length; i++) {
Resource resource = resources[i];
if (resource.exists()) {
return true;
}
}
return false;
}
private boolean checkModelConfiguration() throws Throwable {
try {
String xml = this.getXmlConfiguration();
PageModelDOM dom = new PageModelDOM(xml, this.getWidgetTypeManager());
Frame[] configuration = dom.getConfiguration();
return true;
} catch (Exception e) {
return false;
}
}
public String newModel() {
this.setStrutsAction(ApsAdminSystemConstants.ADD);
return SUCCESS;
}
public String edit() {
this.setStrutsAction(ApsAdminSystemConstants.EDIT);
return this.extractPageModelFormValues();
}
public String showDetails() {
String result = this.extractPageModelFormValues();
if (!result.equals(SUCCESS)) return result;
this.extractReferencingObjects(this.getCode());
return result;
}
protected String extractPageModelFormValues() {
try {
PageModel pageModel = super.getPageModel(this.getCode());
if (null == pageModel) {
this.addActionError(this.getText("error.pageModel.notExist"));
return "pageModelList";
}
this.setDescription(pageModel.getDescription());
this.setPluginCode(pageModel.getPluginCode());
//TO DELETE - start
if (null != pageModel.getConfiguration()) {
PageModelDOM dom = new PageModelDOM(pageModel);
String xml = dom.getXMLDocument();
this.setXmlConfiguration(xml);
}
//TO DELETE - end
this.setTemplate(pageModel.getTemplate());
} catch (Throwable t) {
_logger.error("error in extractPageModelFormValues", t);
return FAILURE;
}
return SUCCESS;
}
public String trash() {
try {
String check = this.checkModelForDelete();
if (null != check) return check;
} catch (Throwable t) {
_logger.error("error in trash", t);
return FAILURE;
}
return SUCCESS;
}
public String delete() {
try {
String check = this.checkModelForDelete();
if (null != check) return check;
this.getPageModelManager().deletePageModel(this.getCode());
} catch (Throwable t) {
_logger.error("error in delete", t);
return FAILURE;
}
return SUCCESS;
}
public String save() {
try {
PageModel model = this.createPageModel();
if (ApsAdminSystemConstants.ADD == this.getStrutsAction()) {
this.getPageModelManager().addPageModel(model);
} else {
this.getPageModelManager().updatePageModel(model);
}
} catch (Throwable t) {
_logger.error("error in save", t);
return FAILURE;
}
return SUCCESS;
}
protected PageModel createPageModel() throws Throwable {
PageModel model = null;
try {
if (ApsAdminSystemConstants.ADD == this.getStrutsAction()) {
model = new PageModel();
model.setCode(this.getCode());
} else {
model = this.getPageModel(this.getCode());
}
model.setDescription(this.getDescription());
String template = (!StringUtils.isBlank(this.getTemplate())) ? this.getTemplate() : null;
model.setTemplate(template);
//TO DELETE - start
String xml = this.getXmlConfiguration();
PageModelDOM dom = new PageModelDOM(xml, this.getWidgetTypeManager());
Frame[] configuration = dom.getConfiguration();
int mainFrame = dom.getMainFrame();
if (mainFrame > -1 ) {
model.setMainFrame(mainFrame);
}
model.setConfiguration(configuration);
//TO DELETE - end
} catch (Throwable t) {
_logger.error("error in creating page model", t);
throw t;
}
return model;
}
protected String checkModelForDelete() throws ApsSystemException {
PageModel model = super.getPageModel(this.getCode());
if (null == model) {
this.addActionError(this.getText("error.pageModel.notExist"));
return "pageModelList";
}
this.extractReferencingObjects(this.getCode());
if (null != this.getReferences() && this.getReferences().size() > 0) {
return "references";
}
return null;
}
protected void extractReferencingObjects(String pageModelCode) {
try {
PageModel model = super.getPageModel(pageModelCode);
if (null != model) {
Map references = this.getPageModelActionHelper().getReferencingObjects(model, this.getRequest());
if (null != references && references.size() > 0) {
this.setReferences(references);
}
}
} catch (Throwable t) {
_logger.error("Error extracting referenced objects by page model '{}'", pageModelCode, t);
}
}
public String getCode() {
return _code;
}
public void setCode(String code) {
this._code = code;
}
public Integer getStrutsAction() {
return _strutsAction;
}
public void setStrutsAction(Integer strutsAction) {
this._strutsAction = strutsAction;
}
public String getDescription() {
return _description;
}
public void setDescription(String description) {
this._description = description;
}
public String getPluginCode() {
return _pluginCode;
}
public void setPluginCode(String pluginCode) {
this._pluginCode = pluginCode;
}
@Deprecated //TO DELETE
public String getXmlConfiguration() {
return _xmlConfiguration;
}
@Deprecated //TO DELETE
public void setXmlConfiguration(String xmlConfiguration) {
this._xmlConfiguration = xmlConfiguration;
}
public String getTemplate() {
return _template;
}
public void setTemplate(String template) {
this._template = template;
}
public Map<String, List<Object>> getReferences() {
return _references;
}
protected void setReferences(Map<String, List<Object>> references) {
this._references = references;
}
protected IWidgetTypeManager getWidgetTypeManager() {
return _widgetTypeManager;
}
public void setWidgetTypeManager(IWidgetTypeManager widgetTypeManager) {
this._widgetTypeManager = widgetTypeManager;
}
protected IPageModelActionHelper getPageModelActionHelper() {
return _pageModelActionHelper;
}
public void setPageModelActionHelper(IPageModelActionHelper pageModelActionHelper) {
this._pageModelActionHelper = pageModelActionHelper;
}
private String _code;
private Integer _strutsAction;
private String _description;
private String _pluginCode;
@Deprecated
private String _xmlConfiguration;//TO DELETE
private String _template;
private Map<String, List<Object>> _references;
private IWidgetTypeManager _widgetTypeManager;
private IPageModelActionHelper _pageModelActionHelper;
}