/*
* Copyright 2015-Present Entando Inc. (http://www.entando.com) All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.entando.entando.plugins.jpwebform.aps.system.services.form;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import ognl.InappropriateExpressionException;
import ognl.MethodFailedException;
import ognl.NoSuchPropertyException;
import ognl.Ognl;
import ognl.OgnlContext;
import org.apache.commons.lang.StringUtils;
import org.entando.entando.aps.system.services.userprofile.IUserProfileManager;
import org.entando.entando.aps.system.services.userprofile.model.IUserProfile;
import org.entando.entando.plugins.jpwebform.aps.system.services.JpwebformSystemConstants;
import org.entando.entando.plugins.jpwebform.aps.system.services.form.events.FormSubmittedEvent;
import org.entando.entando.plugins.jpwebform.aps.system.services.form.parse.FormTypeDOM;
import org.entando.entando.plugins.jpwebform.aps.system.services.form.parse.MessageNotifierConfigDOM;
import org.entando.entando.plugins.jpwebform.aps.system.services.form.parse.StepConfigsDOM;
import org.entando.entando.plugins.jpwebform.aps.system.services.message.model.Answer;
import org.entando.entando.plugins.jpwebform.aps.system.services.message.model.Message;
import org.entando.entando.plugins.jpwebform.aps.system.services.message.model.MessageModel;
import org.entando.entando.plugins.jpwebform.aps.system.services.message.model.MessageRecordVO;
import org.entando.entando.plugins.jpwebform.aps.system.services.message.model.MessageTypeNotifierConfig;
import org.entando.entando.plugins.jpwebform.aps.system.services.message.model.SmallMessageType;
import org.entando.entando.plugins.jpwebform.aps.system.services.message.model.Step;
import org.entando.entando.plugins.jpwebform.aps.system.services.message.model.StepGuiConfig;
import org.entando.entando.plugins.jpwebform.aps.system.services.message.model.StepsConfig;
import org.entando.entando.plugins.jpwebform.aps.system.services.message.model.TypeVersionGuiConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.InputSource;
import com.agiletec.aps.system.common.entity.ApsEntityManager;
import com.agiletec.aps.system.common.entity.IEntityDAO;
import com.agiletec.aps.system.common.entity.IEntitySearcherDAO;
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.EntitySearchFilter;
import com.agiletec.aps.system.common.entity.model.IApsEntity;
import com.agiletec.aps.system.common.entity.model.attribute.AttributeInterface;
import com.agiletec.aps.system.common.entity.model.attribute.CompositeAttribute;
import com.agiletec.aps.system.common.entity.model.attribute.ITextAttribute;
import com.agiletec.aps.system.common.entity.parse.EntityHandler;
import com.agiletec.aps.system.common.renderer.IEntityRenderer;
import com.agiletec.aps.system.exception.ApsSystemException;
import com.agiletec.aps.system.services.baseconfig.ConfigInterface;
import com.agiletec.aps.system.services.i18n.II18nManager;
import com.agiletec.aps.system.services.keygenerator.IKeyGeneratorManager;
import com.agiletec.aps.system.services.lang.ILangManager;
import com.agiletec.aps.system.services.lang.Lang;
import com.agiletec.aps.util.ApsProperties;
import com.agiletec.plugins.jpmail.aps.services.mail.IMailManager;
import com.agiletec.plugins.jpmail.aps.services.mail.MailSendersUtilizer;
/**
* Implementation of the Manager of Form Message Object.
*
* @author E.Santoboni
*/
public class FormManager extends ApsEntityManager implements IFormManager, EntityTypesChangingObserver, MailSendersUtilizer {
private static final Logger _logger = LoggerFactory.getLogger(FormManager.class);
@Override
public void init() throws Exception {
super.init();
this.initSmallMessageTypes();
this.loadNotifierConfig();
this.loadStepsConfig();
this.checkConfig();
_logger.debug("{} ready. Initialized {} entity types", this.getClass().getName(), super.getEntityTypes().size());
}
@Override
protected void release() {
super.release();
this.getLastVersionConfigs().clear();
this.getTypeVersionConfigs().clear();
}
@Override
public Message resumeMessageByUserAndType(String user, String typeCode, Integer status) throws ApsSystemException {
EntitySearchFilter userFilter = new EntitySearchFilter(IFormManager.FILTER_KEY_USERNAME, false, user, false);
EntitySearchFilter typeFilter = new EntitySearchFilter(IFormManager.FILTER_KEY_MESSAGE_TYPE, false, typeCode, false);
EntitySearchFilter dateFilter = new EntitySearchFilter(IFormManager.FILTER_KEY_SEND_DATE, false);
EntitySearchFilter statusFilter = new EntitySearchFilter(IFormManager.FILTER_KEY_DONE, false, status, false);
dateFilter.setOrder(EntitySearchFilter.DESC_ORDER);
EntitySearchFilter[] filters = new EntitySearchFilter[]{userFilter, typeFilter, dateFilter, statusFilter};
List<String> searchId = this.searchId(filters);
if (null != searchId && !searchId.isEmpty()) {
return this.getMessage(searchId.get(0));
} else {
return null;
}
}
/**
* Initialize the SmallMessageType list and map.
*/
protected void initSmallMessageTypes() {
Map<String, SmallMessageType> smallMessageTypes = new HashMap<String, SmallMessageType>(this.getEntityTypes().size());
List<IApsEntity> types = new ArrayList<IApsEntity>(this.getEntityTypes().values());
for (int i = 0; i < types.size(); i++) {
IApsEntity type = types.get(i);
if (type instanceof Message) {
if (0 != ((Message) type).getVersionType().intValue()) {
SmallMessageType smallMessageType = new SmallMessageType();
smallMessageType.setCode(type.getTypeCode());
smallMessageType.setDescr(type.getTypeDescr());
smallMessageTypes.put(smallMessageType.getCode(), smallMessageType);
}
}
}
this.setSmallMessageTypesMap(smallMessageTypes);
}
protected void loadNotifierConfig() throws ApsSystemException {
try {
ConfigInterface configManager = this.getConfigManager();
String xml = configManager.getConfigItem(JpwebformSystemConstants.MESSAGE_NOTIFIER_CONFIG_ITEM);
if (xml == null) {
throw new ApsSystemException("Configuration item not present: " + JpwebformSystemConstants.MESSAGE_NOTIFIER_CONFIG_ITEM);
}
MessageNotifierConfigDOM configDOM = new MessageNotifierConfigDOM();
this.setNotifierConfigMap(configDOM.extractConfig(xml));
} catch (Throwable t) {
_logger.error("Error initializing the configuration", t);
throw new ApsSystemException("Error initializing the configuration", t);
}
}
protected void loadStepsConfig() throws ApsSystemException {
try {
ConfigInterface configManager = this.getConfigManager();
String xml = configManager.getConfigItem(JpwebformSystemConstants.MESSAGE_STEPS_CONFIG_ITEM);
if (xml == null) {
throw new ApsSystemException("Configuration item not present: " + JpwebformSystemConstants.MESSAGE_STEPS_CONFIG_ITEM);
}
StepConfigsDOM dom = new StepConfigsDOM();
this.setStepsConfig(dom.extractConfig(xml));
} catch (Throwable t) {
_logger.error("Error loading Steps Config", t);
throw new ApsSystemException("Error loading Steps Config", t);
}
}
@Override
public void deleteTypeVersion(String typeCode) throws ApsSystemException {
try {
this.getFormTypeGuiDAO().deleteTypeVersion(typeCode);
} catch (Throwable t) {
_logger.error("Error removing typeVersion configuration", t);
this.loadNotifierConfig();
throw new ApsSystemException("Error removing typeVersion configuration");
}
}
@Override
public void updateFromEntityTypesChanging(EntityTypesChangingEvent event) {
try {
if (this.getName().equals(event.getEntityManagerName())) {
switch (event.getOperationCode()) {
case EntityTypesChangingEvent.REMOVE_OPERATION_CODE:
String typeCode = event.getOldEntityType().getTypeCode();
this.removeNotifierConfig(typeCode);
_logger.trace("Removed notifier configuration for entity type {}", typeCode);
break;
case EntityTypesChangingEvent.INSERT_OPERATION_CODE:
MessageTypeNotifierConfig config = new MessageTypeNotifierConfig();
config.setTypeCode(event.getNewEntityType().getTypeCode());
config.setStore(true);
this.saveNotifierConfig(config);
break;
default:
break;
}
}
} catch (Throwable t) {
_logger.error("error in updateFromEntityTypesChanging", t);
}
}
/**
* Returns the notifier's configuration for a given type of message.
*
* @param type The type of the message.
* @return The notifier's configuration for a given type of message.
*/
@Override
public MessageTypeNotifierConfig getNotifierConfig(String typeCode) {
return _messageNotifierConfigMap.get(typeCode);
}
@Override
public void saveNotifierConfig(MessageTypeNotifierConfig config) throws ApsSystemException {
try {
MessageNotifierConfigDOM configDOM = new MessageNotifierConfigDOM();
Map<String, MessageTypeNotifierConfig> configMap = this.getNotifierConfigMap();
configMap.put(config.getTypeCode(), config);
String xml = configDOM.createConfigXml(configMap);
ConfigInterface configManager = this.getConfigManager();
configManager.updateConfigItem(JpwebformSystemConstants.MESSAGE_NOTIFIER_CONFIG_ITEM, xml);
} catch (Throwable t) {
_logger.error("Error updating notifier configuration", t);
this.loadNotifierConfig();
throw new ApsSystemException("Error updating notifier configuration");
}
}
@Override
public Boolean validateOgnl(String expression, Message entity, String currentUser) throws ApsSystemException {
Boolean value = true;
if (StringUtils.isBlank(expression)) {
return value;
}
try {
Object expr = Ognl.parseExpression(expression);
OgnlContext context = this.createContextForExpressionValidation(entity, currentUser);
return (Boolean) Ognl.getValue(expr, context, entity, Boolean.class);
} catch (Throwable t) {
_logger.error("error in validateOgnl", t);
throw new ApsSystemException("Error on validateOgnl");
}
}
public OGNL_MESSAGES verifyOgnlExpression(String expression, Message entity, String currentUser) throws ApsSystemException {
if (!StringUtils.isBlank(expression)) {
try {
Object expr = Ognl.parseExpression(expression);
OgnlContext context = this.createContextForExpressionValidation(entity, currentUser);
Ognl.getValue(expr, context, entity, Boolean.class);
} catch (InappropriateExpressionException ex) {
_logger.error("InappropriateExpressionException in expression {}", expression, ex);
//Logger.getLogger(FormManager.class.getName()).log(Level.SEVERE, null, ex);
return OGNL_MESSAGES.METHOD_ERROR;
} catch (MethodFailedException ex) {
_logger.error("MethodFailedException in expression {}", expression, ex);
//Logger.getLogger(FormManager.class.getName()).log(Level.SEVERE, null, ex);
return OGNL_MESSAGES.METHOD_ERROR;
} catch (NoSuchPropertyException ex) {
_logger.error("NoSuchPropertyException in expression {}", expression, ex);
//Logger.getLogger(FormManager.class.getName()).log(Level.SEVERE, null, ex);
return OGNL_MESSAGES.PROPERTY_ERROR;
} catch (Throwable t) {
return OGNL_MESSAGES.GENERIC_ERROR;
}
}
return OGNL_MESSAGES.SUCCESS;
}
protected OgnlContext createContextForExpressionValidation(Message entity, String currentUser) throws ApsSystemException {
OgnlContext context = new OgnlContext();
Map<String, Lang> langs = new HashMap<String, Lang>();
List<Lang> langList = this.getLangManager().getLangs();
for (int i = 0; i < langList.size(); i++) {
Lang lang = langList.get(i);
langs.put(lang.getCode(), lang);
}
context.put("langs", langs);
context.put("entity", entity);
IUserProfile userProfile = this.getUserProfileManager().getProfile(currentUser);
context.put("currentUser", userProfile);
return context;
}
protected Map<String, MessageTypeNotifierConfig> getNotifierConfigMap() {
return _messageNotifierConfigMap;
}
protected void setNotifierConfigMap(Map<String, MessageTypeNotifierConfig> messageNotifierConfigMap) {
this._messageNotifierConfigMap = messageNotifierConfigMap;
}
/**
* Remove the notifier's configuration for the given type of message.
*
* @param type The type of the message.
* @throws ApsSystemException
*/
protected void removeNotifierConfig(String typeCode) throws ApsSystemException {
try {
MessageNotifierConfigDOM configDOM = new MessageNotifierConfigDOM();
Map<String, MessageTypeNotifierConfig> configMap = this.getNotifierConfigMap();
configMap.remove(typeCode);
String xml = configDOM.createConfigXml(configMap);
ConfigInterface configManager = this.getConfigManager();
configManager.updateConfigItem(JpwebformSystemConstants.MESSAGE_NOTIFIER_CONFIG_ITEM, xml);
} catch (Throwable t) {
_logger.error("Error updating notifier configuration", t);
this.loadNotifierConfig();
throw new ApsSystemException("Error updating notifier configuration");
}
}
protected void checkConfig() {
Map<String, MessageTypeNotifierConfig> notifierConfig = this.getNotifierConfigMap();
Set<String> messageTypes = this.getSmallMessageTypesMap().keySet();
Iterator<String> iter = messageTypes.iterator();
while (iter.hasNext()) {
String messageType = iter.next();
if (!notifierConfig.containsKey(messageType)) {
_logger.warn("Message Type {} hasn't notifier configuration!", messageType );
}
}
}
@Override
public String[] getSenderCodes() {
Collection<MessageTypeNotifierConfig> notifierConfigs = this.getNotifierConfigMap().values();
String[] senderCodes = new String[notifierConfigs.size()];
int i = 0;
for (MessageTypeNotifierConfig config : notifierConfigs) {
senderCodes[i++] = config.getSenderCode();
}
return senderCodes;
}
@Override
public Message createMessageType(String typeCode) {
return (Message) super.getEntityPrototype(typeCode);
}
@Override
public List<SmallMessageType> getSmallMessageTypes() {
List<SmallMessageType> smallMessageTypes = new ArrayList<SmallMessageType>();
smallMessageTypes.addAll(this._smallMessageTypes.values());
Collections.sort(smallMessageTypes);
return smallMessageTypes;
}
@Override
public Map<String, SmallMessageType> getSmallMessageTypesMap() {
return this._smallMessageTypes;
}
protected void setSmallMessageTypesMap(Map<String, SmallMessageType> smallMessageTypes) {
this._smallMessageTypes = smallMessageTypes;
}
@Override
public String getMailAttributeName(String typeCode) {
MessageTypeNotifierConfig config = this.getNotifierConfig(typeCode);
String mailAttrName = null;
if (config != null) {
mailAttrName = config.getMailAttrName();
}
return mailAttrName;
}
@Override
public List<String> loadMessagesId(EntitySearchFilter[] filters) throws ApsSystemException {
List<String> contentsId = null;
try {
contentsId = this.getEntitySearcherDao().searchId(filters);
} catch (Throwable t) {
_logger.error("Errore caricamento id message", t);
throw new ApsSystemException("Errore caricamento id message", t);
}
return contentsId;
}
@Override
public List<String> loadMessagesId(EntitySearchFilter[] filters, boolean answered) throws ApsSystemException {
List<String> contentsId = null;
try {
contentsId = ((IFormSearcherDAO) this.getEntitySearcherDao()).searchId(filters, answered);
} catch (Throwable t) {
_logger.error("Errore caricamento id message", t);
throw new ApsSystemException("Errore caricamento id message", t);
}
return contentsId;
}
@Override
public Message getMessage(String id) throws ApsSystemException {
Message message = null;
try {
MessageRecordVO messageRecord = (MessageRecordVO) this.getFormDAO().loadEntityRecord(id);
if (messageRecord != null) {
message = (Message) this.getTypeVersionGui(messageRecord.getTypeCode(), messageRecord.getVersionType()).getPrototype().getEntityPrototype();
message.setLangCode(messageRecord.getLangCode());
this.valueEntityFromXml(message, messageRecord.getXml());
message.setUsername(messageRecord.getUsername());
message.setCreationDate(messageRecord.getCreationDate());
message.setCompleted(messageRecord.isCompleted());
message.setSendDate(messageRecord.getSendDate());
}
} catch (Throwable t) {
_logger.error("Error loading messageRecord", t);
throw new ApsSystemException("Error loading messageRecord", t);
}
return message;
}
// @Override
public Message getMessage(String id, TypeVersionGuiConfig config) throws ApsSystemException {
Message message = null;
try {
MessageRecordVO messageRecord = (MessageRecordVO) this.getFormDAO().loadEntityRecord(id);
if (messageRecord != null) {
message = (Message) config.getPrototype().getEntityPrototype();
message.setLangCode(messageRecord.getLangCode());
this.valueEntityFromXml(message, messageRecord.getXml());
message.setUsername(messageRecord.getUsername());
message.setCreationDate(messageRecord.getCreationDate());
message.setCompleted(messageRecord.isCompleted());
message.setSendDate(messageRecord.getSendDate());
}
} catch (Throwable t) {
_logger.error("Error loading messageRecord", t);
throw new ApsSystemException("Error loading messageRecord", t);
}
return message;
}
protected void valueEntityFromXml(IApsEntity entityPrototype, String xml) throws ApsSystemException {
try {
SAXParserFactory parseFactory = SAXParserFactory.newInstance();
SAXParser parser = parseFactory.newSAXParser();
InputSource is = new InputSource(new StringReader(xml));
EntityHandler handler = this.getEntityHandler();
handler.initHandler(entityPrototype, this.getXmlAttributeRootElementName(), this.getCategoryManager());
parser.parse(is, handler);
} catch (Throwable t) {
_logger.error("Error detected while creating the entity. xml:{}", xml, t);
throw new ApsSystemException("Error detected while creating the entity", t);
}
}
@Override
public void addUpdateMessage(Message message) throws ApsSystemException {
try {
String id = message.getId();
boolean newMessage = (null == id || null == this.getFormDAO().loadEntityRecord(id));
if (newMessage) {
int key = this.getKeyGeneratorManager().getUniqueKeyCurrentValue();
id = message.getTypeCode() + key;
message.setId(id);
this.getFormDAO().addEntity(message);
} else {
this.getFormDAO().updateEntity(message);
}
} catch (Throwable t) {
_logger.error("Error saving message", t);
throw new ApsSystemException("Error saving message", t);
}
}
@Override
public void sendMessage(Message message) throws ApsSystemException {
this.sendMessage(message, null);
}
@Override
public void sendMessage(Message message, String customEmail) throws ApsSystemException {
try {
this.sendMessageNotification(message, customEmail);
this.addUpdateMessage(message);
} catch (Throwable t) {
_logger.error("Error saving message", t);
throw new ApsSystemException("Error saving message", t);
}
}
@Override
public void deleteMessage(String messageId) throws ApsSystemException {
try {
this.getFormDAO().deleteEntity(messageId);
} catch (Throwable t) {
_logger.error("Error deleting message {}", messageId, t);
throw new ApsSystemException("Error deleting message " + messageId, t);
}
}
@Override
public boolean sendAnswer(Answer answer) throws ApsSystemException {
try {
int key = this.getKeyGeneratorManager().getUniqueKeyCurrentValue();
answer.setAnswerId(String.valueOf(key));
this.getFormDAO().addAnswer(answer);
boolean sent = this.sendAnswerNotification(answer);
return sent;
} catch (Throwable t) {
_logger.error("Error saving answer");
throw new ApsSystemException("Error saving answer", t);
}
}
@Override
public List<Answer> getAnswers(String messageId) throws ApsSystemException {
try {
return this.getFormDAO().loadAnswers(messageId);
} catch (Throwable t) {
_logger.error("Error saving message", t);
throw new ApsSystemException("Error saving message", t);
}
}
protected boolean sendMessageNotification(Message message, String customEmail) throws ApsSystemException {
boolean sent = false;
try {
this.notifyFormSubmittedEvent(message);
MessageTypeNotifierConfig config = this.getNotifierConfig(message.getTypeCode());
if (config != null && config.isNotifiable()) {
MessageModel messageModel = null;
String renderingLangCode = this.getLangManager().getDefaultLang().getCode();
String subject = null;
String text = null;
String[] recipientsTo = null;
if (customEmail != null && !customEmail.isEmpty()) {
messageModel = config.getMessageModelResp();
subject = this.getEntityRenderer().render(message, messageModel.getSubjectModel(), renderingLangCode, false);
text = this.getEntityRenderer().render(message, messageModel.getBodyModel(), renderingLangCode, true);
recipientsTo = new String[]{customEmail};
} else {
messageModel = config.getMessageModel();
subject = this.getEntityRenderer().render(message, messageModel.getSubjectModel(), renderingLangCode, false);
text = this.getEntityRenderer().render(message, messageModel.getBodyModel(), renderingLangCode, true);
recipientsTo = config.getRecipientsTo();
}
String[] recipientsCc = config.getRecipientsCc();
String[] recipientsBcc = config.getRecipientsBcc();
String senderCode = config.getSenderCode();
this.getMailManager().sendMail(text, subject,
recipientsTo, recipientsCc, recipientsBcc, senderCode, IMailManager.CONTENTTYPE_TEXT_HTML);
sent = true;
} else {
_logger.warn("Message notification not sent! Message lacking in notifier configuration.");
}
} catch (Throwable t) {
_logger.error("Error sending notification to message {}", message.getId(), t);
throw new ApsSystemException("Error sending notification to message " + message.getId(), t);
}
return sent;
}
protected boolean sendAnswerNotification(Answer answer) throws ApsSystemException {
boolean sent = false;
try {
Message message = this.getMessage(answer.getMessageId());
MessageTypeNotifierConfig config = this.getNotifierConfig(message.getTypeCode());
if (config != null) {
String email = this.extractUserMail(message, config);
if (null != email) {
String renderingLangCode = message.getLangCode();
if (renderingLangCode == null || this.getLangManager().getLang(renderingLangCode) == null) {
renderingLangCode = this.getLangManager().getDefaultLang().getCode();
}
MessageModel messageModel = config.getMessageModel();
String subject = this.getEntityRenderer().render(message, messageModel.getSubjectModel(), renderingLangCode, false);
subject = "RE: " + subject;
String text = answer.getText();
String senderCode = config.getSenderCode();
String[] recipientsTo = new String[]{email};
Properties attachmentFiles = answer.getAttachments();
this.getMailManager().sendMail(text, subject, IMailManager.CONTENTTYPE_TEXT_PLAIN,
attachmentFiles, recipientsTo, null, null, senderCode);
sent = true;
} else {
_logger.warn("ATTENTION: email Attribute {} for Message {} isn't valued!!\nCheck \"jpwebform_messageTypes\" Configuration or \"{}\" Configuration", config.getMailAttrName(), message.getId(), JpwebformSystemConstants.MESSAGE_NOTIFIER_CONFIG_ITEM);
}
} else {
_logger.warn("Answer not sent! Message lacking in notifier configuration.");
}
} catch (Throwable t) {
_logger.error("error in sendAnswerNotification", t);
// Do not launch any exception
// throw new ApsSystemException("Error sending notification for answer " + answer.getAnswerId(), t);
}
return sent;
}
protected String extractUserMail(Message message, MessageTypeNotifierConfig config) {
String email = null;
if (null != config) {
String mailAttrName = config.getMailAttrName();
if (null != mailAttrName && mailAttrName.length() > 0) {
ITextAttribute mailAttribute = (ITextAttribute) message.getAttribute(mailAttrName);
if (mailAttribute != null) {
email = mailAttribute.getText();
}
}
}
return email;
}
protected Map<String, TypeVersionGuiConfig> getLastVersionConfigs() {
return _lastVersionConfigs;
}
protected Map<String, TypeVersionGuiConfig> getTypeVersionConfigs() {
return _typeVersionConfigs;
}
@Override
public TypeVersionGuiConfig getTypeVersionGui(String formTypeCode) throws ApsSystemException {
try {
TypeVersionGuiConfig config = this.getLastVersionConfigs().get(formTypeCode);
if (null == config) {
config = this.getFormTypeGuiDAO().getTypeVersionGui(formTypeCode);
this.fillVersionType(config);
this.getLastVersionConfigs().put(formTypeCode, config);
}
return config;
} catch (Throwable t) {
_logger.error("Error extracting last Type Version Gui for type {}", formTypeCode, t);
throw new ApsSystemException("Error extracting last Type Version Gui for type " + formTypeCode, t);
}
}
@Override
public TypeVersionGuiConfig getTypeVersionGui(String formTypeCode, Integer version) throws ApsSystemException {
try {
String key = formTypeCode + "%" + version;
TypeVersionGuiConfig config = this.getTypeVersionConfigs().get(key);
if (null == config) {
config = this.getFormTypeGuiDAO().getTypeVersionGui(formTypeCode, version);
this.fillVersionType(config);
this.getTypeVersionConfigs().put(key, config);
}
return config;
} catch (Throwable t) {
_logger.error("Error extracting Type Version Gui for type {}, version {}" ,formTypeCode, version, t);
throw new ApsSystemException("Error extracting Type Version Gui for type " + formTypeCode + ", version " + version, t);
}
}
private void fillVersionType(TypeVersionGuiConfig config) throws ApsSystemException {
if (null == config) {
return;
}
try {
StepConfigsDOM dom = new StepConfigsDOM();
StepsConfig stepsConfig = dom.extractStepConfig(config.getStepsConfigXml());
config.setStepsConfig(stepsConfig);
String typeCode = config.getFormTypeCode();
String modelConfig = config.getPrototypeXml();
Message prototype = (Message) super.getEntityTypeDom().extractEntityType(modelConfig, super.getEntityClass(), this.getEntityDom(), typeCode);
List<AttributeInterface> attributes = prototype.getAttributeList();
for (int i = 0; i < attributes.size(); i++) {
AttributeInterface attribute = attributes.get(i);
String[] disablingCodes = stepsConfig.getDisabilingCodes(attribute.getName());
attribute.setDisablingCodes(disablingCodes);
}
config.setPrototype(prototype);
} catch (Throwable t) {
_logger.error("Error filling Type Version", t);
throw new ApsSystemException("Error filling Type Version", t);
}
}
@Override
public void deleteStepsConfig(String formTypeCode) throws ApsSystemException {
try {
StepConfigsDOM dom = new StepConfigsDOM();
this.getStepsConfig().remove(formTypeCode);
String xml = dom.createConfigXml(this.getStepsConfig());
ConfigInterface configManager = this.getConfigManager();
configManager.updateConfigItem(JpwebformSystemConstants.MESSAGE_STEPS_CONFIG_ITEM, xml);
} catch (Throwable t) {
_logger.error("Error saving Steps Config", t);
throw new ApsSystemException("Error saving Steps Config", t);
}
}
@Override
public void saveStepsConfig(StepsConfig config) throws ApsSystemException {
try {
String formTypeCode = config.getFormTypeCode();
StepConfigsDOM dom = new StepConfigsDOM();
this.getStepsConfig().put(formTypeCode, config);
String xml = dom.createConfigXml(this.getStepsConfig());
ConfigInterface configManager = this.getConfigManager();
configManager.updateConfigItem(JpwebformSystemConstants.MESSAGE_STEPS_CONFIG_ITEM, xml);
} catch (Throwable t) {
_logger.error("Error saving Steps Config", t);
throw new ApsSystemException("Error saving Steps Config", t);
}
}
@Override
public StepsConfig getPublicSteps(String formTypeCode) throws ApsSystemException {
return this.getTypeVersionGui(formTypeCode).getStepsConfig();
}
@Override
public StepsConfig getPublicSteps(String formTypeCode, Integer version) throws ApsSystemException {
return this.getTypeVersionGui(formTypeCode, version).getStepsConfig();
}
@Override
public StepGuiConfig generateWorkStepUserGui(String formTypeCode, String stepCode, boolean save) throws ApsSystemException {
try {
StepsConfig stepsConfig = this.getStepsConfig().get(formTypeCode);
IApsEntity prototype = this.getEntityPrototype(formTypeCode);
UserGuiGenerator generator = this.getUserGuiGenerator();
String userGui = generator.generateUserGui(stepCode, stepsConfig, prototype);
StepGuiConfig stepGuiConfig = new StepGuiConfig();
stepGuiConfig.setUserGui(userGui);
stepGuiConfig.setStepCode(stepCode);
stepGuiConfig.setFormTypeCode(formTypeCode);
if (save) {
this.getFormTypeGuiDAO().saveWorkGuiConfig(stepGuiConfig);
this.saveStepsConfig(stepsConfig);
}
return stepGuiConfig;
} catch (Throwable t) {
_logger.error("Error generating Work Step User Gui - {} - stepCode {}",formTypeCode,stepCode, t);
throw new ApsSystemException("Error generating Work Step User Gui - formTypeCode " + formTypeCode + " - stepCode " + stepCode, t);
}
}
@Override
public StepGuiConfig getWorkGuiConfig(String typeCode, String stepCode) throws ApsSystemException {
try {
return this.getFormTypeGuiDAO().getWorkGuiConfig(typeCode, stepCode);
} catch (Throwable t) {
_logger.error("error in getWorkGuiConfig", t);
throw new ApsSystemException("Error deleting Work Step User Gui - "
+ "formTypeCode " + typeCode + " - stepCode " + stepCode, t);
}
}
@Override
public void saveWorkGuiConfig(StepGuiConfig config) throws ApsSystemException {
try {
this.getFormTypeGuiDAO().saveWorkGuiConfig(config);
} catch (Throwable t) {
_logger.error("Error saving Work Step User Gui - formTypeCode:{} - stepCode:{}", config.getFormTypeCode(), config.getStepCode(), t);
throw new ApsSystemException("Error saving Work Step User Gui - "
+ "formTypeCode " + config.getFormTypeCode() + " - stepCode " + config.getStepCode(), t);
}
}
@Override
public void deleteWorkGuiConfig(String typeCode, String stepCode) throws ApsSystemException {
try {
this.getFormTypeGuiDAO().deleteWorkGuiConfig(typeCode, stepCode);
} catch (Throwable t) {
_logger.error("Error deleting Work Step User Gui formTypeCode:{} - stepCode ", typeCode, stepCode, t);
throw new ApsSystemException("Error deleting Work Step User Gui - "
+ "formTypeCode " + typeCode + " - stepCode " + stepCode, t);
}
}
@Override
public void deleteAllWorkGuiConfig(String typeCode) throws ApsSystemException {
try {
this.getFormTypeGuiDAO().deleteAllWorkGuiConfig(typeCode);
} catch (Throwable t) {
_logger.error("Error deleting Work Step User Gui - formTypeCode {}", typeCode, t);
throw new ApsSystemException("Error deleting Work Step User Gui - formTypeCode " + typeCode, t);
}
}
@Override
public synchronized void generateNewVersionType(String formTypeCode) throws ApsSystemException {
try {
Message prototype = (Message) super.getEntityPrototype(formTypeCode);
Integer version = 1;
if (null != prototype) {
version = prototype.getVersionType() + 1;
}
prototype.setVersionType(version);
String modelXml = new FormTypeDOM().getXml(prototype);
StepsConfig stepsConfig = this.getStepsConfig(formTypeCode);
String stepsXml = new StepConfigsDOM().createConfigXml(stepsConfig);
TypeVersionGuiConfig versionConfig = new TypeVersionGuiConfig();
versionConfig.setFormTypeCode(formTypeCode);
versionConfig.setPrototypeXml(modelXml);
versionConfig.setPrototype(prototype);
versionConfig.setStepsConfigXml(stepsXml);
versionConfig.setStepsConfig(stepsConfig);
Map<String, StepGuiConfig> workGuiConfigs = this.getFormTypeGuiDAO().getWorkGuiConfigs(formTypeCode);
List<StepGuiConfig> guiConfigs = new ArrayList<StepGuiConfig>();
guiConfigs.addAll(workGuiConfigs.values());
versionConfig.setGuiConfigs(guiConfigs);
versionConfig.setVersion(prototype.getVersionType());
this.generateLabels(versionConfig);
this.getFormTypeGuiDAO().addTypeVersionGui(versionConfig);
this.getLastVersionConfigs().put(formTypeCode, versionConfig);
this.updateEntityPrototype(prototype);
} catch (Throwable t) {
_logger.error("Error generating new version type - {}", formTypeCode, t);
throw new ApsSystemException("Error generating new version type - " + formTypeCode, t);
}
}
private void generateLabels(TypeVersionGuiConfig versionConfig) throws ApsSystemException {
Integer version = versionConfig.getVersion();
StepsConfig stepsConfig = versionConfig.getStepsConfig();
List<Step> steps = stepsConfig.getSteps();
for (int i = 0; i < steps.size(); i++) {
Step step = steps.get(i);
//String labelKey = "jpwebform_TITLE_"+versionConfig.getFormTypeCode()+"_"+versionConfig.getVersion()+"_"+step.getCode();
String prevLabelKey = this.createLabelKey("jpwebform_TITLE",
versionConfig.getFormTypeCode(), String.valueOf(version - 1), step.getCode());
String labelKey = this.createLabelKey("jpwebform_TITLE",
versionConfig.getFormTypeCode(), String.valueOf(version), step.getCode());
String stepCode = step.getCode();
this.createCheckLabels(prevLabelKey, labelKey, stepCode);
if (!step.equals(stepsConfig.getFirstStep())) {
//String backLabelKey = "jpwebform_BACK_"+versionConfig.getFormTypeCode()+"_"+versionConfig.getVersion()+"_"+step.getCode();
String prevBackLabelKey = this.createLabelKey("jpwebform_BACK",
versionConfig.getFormTypeCode(), String.valueOf(version - 1), step.getCode());
String backLabelKey = this.createLabelKey("jpwebform_BACK",
versionConfig.getFormTypeCode(), String.valueOf(version), step.getCode());
this.createCheckLabels(prevBackLabelKey, backLabelKey, "back");
}
//String submitLabelKey = "jpwebform_SUBMIT_"+versionConfig.getFormTypeCode()+"_"+versionConfig.getVersion()+"_"+step.getCode();
String prevSubmitLabelKey = this.createLabelKey("jpwebform_SUBMIT",
versionConfig.getFormTypeCode(), String.valueOf(version - 1), step.getCode());
String submitLabelKey = this.createLabelKey("jpwebform_SUBMIT",
versionConfig.getFormTypeCode(), String.valueOf(version), step.getCode());
this.createCheckLabels(prevSubmitLabelKey, submitLabelKey, "submit");
if (stepsConfig.isConfirmGui()) {
//String backConfirmLabelKey = "jpwebform_BACK_"+versionConfig.getFormTypeCode()+"_"+versionConfig.getVersion()+"_confirm";
String prevBackConfirmLabelKey = this.createLabelKey("jpwebform_BACK",
versionConfig.getFormTypeCode(), String.valueOf(version - 1), "confirm");
String backConfirmLabelKey = this.createLabelKey("jpwebform_BACK",
versionConfig.getFormTypeCode(), String.valueOf(version), "confirm");
this.createCheckLabels(prevBackConfirmLabelKey, backConfirmLabelKey, "Back");
//String submitConfirmLabelKey = "jpwebform_SUBMIT_"+versionConfig.getFormTypeCode()+"_"+versionConfig.getVersion()+"_confirm";
String prevSubmitConfirmLabelKey = this.createLabelKey("jpwebform_SUBMIT",
versionConfig.getFormTypeCode(), String.valueOf(version - 1), "confirm");
String submitConfirmLabelKey = this.createLabelKey("jpwebform_SUBMIT",
versionConfig.getFormTypeCode(), String.valueOf(version), "confirm");
this.createCheckLabels(prevSubmitConfirmLabelKey, submitConfirmLabelKey, "Submit");
}
List<String> attributeOrder = step.getAttributeOrder();
for (int j = 0; j < attributeOrder.size(); j++) {
String attributeName = attributeOrder.get(j);
Object attribute = versionConfig.getPrototype().getAttribute(attributeName);
if (attribute instanceof CompositeAttribute) {
List<AttributeInterface> attributes = ((CompositeAttribute) attribute).getAttributes();
for (int k = 0; k < attributes.size(); k++) {
AttributeInterface attributeInterface = attributes.get(k);
//labelKey = "jpwebform_LABEL_"+versionConfig.getFormTypeCode()+"_"+versionConfig.getVersion()+"_"+step.getCode()+"_"+attributeInterface.getName();
prevLabelKey = this.createLabelKey("jpwebform_LABEL", versionConfig.getFormTypeCode(),
String.valueOf(version - 1), step.getCode(), attributeInterface.getName());
labelKey = this.createLabelKey("jpwebform_LABEL", versionConfig.getFormTypeCode(),
String.valueOf(version), step.getCode(), attributeInterface.getName());
String description = attributeInterface.getDescription();
String defaultValue = (StringUtils.isBlank(description)) ? attributeInterface.getName() : description;
this.createCheckLabels(prevLabelKey, labelKey, defaultValue);
}
}
//labelKey = "jpwebform_LABEL_"+versionConfig.getFormTypeCode()+"_"+versionConfig.getVersion()+"_"+step.getCode()+"_"+attributeName;
prevLabelKey = this.createLabelKey("jpwebform_LABEL", versionConfig.getFormTypeCode(),
String.valueOf(version - 1), step.getCode(), attributeName);
labelKey = this.createLabelKey("jpwebform_LABEL", versionConfig.getFormTypeCode(),
String.valueOf(version), step.getCode(), attributeName);
this.createCheckLabels(prevLabelKey, labelKey, attributeName);
}
}
}
private void createCheckLabels(String prevLabelkey, String labelKey, String defaultValue) throws ApsSystemException {
ApsProperties properties = this.getI18nManager().getLabelGroup(prevLabelkey);
if (null == properties) {
properties = new ApsProperties();
this.fillPropertyForEveryLang(properties, defaultValue);
}
this.addUpdateLabel(labelKey, properties);
}
private String createLabelKey(String prefix, String... parameters) {
StringBuilder label = new StringBuilder(prefix);
for (int i = 0; i < parameters.length; i++) {
String param = parameters[i];
label.append("_").append(param);
}
return label.toString();
}
private void addUpdateLabel(String labelKey, ApsProperties properties) throws ApsSystemException {
Map<String, ApsProperties> labelGroups = this.getI18nManager().getLabelGroups();
if (!labelGroups.containsKey(labelKey)) {
this.getI18nManager().addLabelGroup(labelKey, properties);
} else {
this.getI18nManager().updateLabelGroup(labelKey, properties);
}
}
private void fillPropertyForEveryLang(ApsProperties properties, String defaultValue) {
List<Lang> langs = this.getLangManager().getLangs();
for (int k = 0; k < langs.size(); k++) {
Lang lang = langs.get(k);
properties.put(lang.getCode(), defaultValue);
}
}
@Override
public boolean checkStepGui(String entityTypeCode) {
StepsConfig stepsConfig = this.getStepsConfig(entityTypeCode);
if (stepsConfig != null) {
return stepsConfig.checkGuiSteps();
}
return false;
}
@Override
public StepsConfig getStepsConfig(String formTypeCode) {
return this.getStepsConfig().get(formTypeCode);
}
private void notifyFormSubmittedEvent(Message message) {
FormSubmittedEvent event = new FormSubmittedEvent();
event.setMessage(message);
this.notifyEvent(event);
}
protected Map<String, StepsConfig> getStepsConfig() {
return _stepsConfig;
}
protected void setStepsConfig(Map<String, StepsConfig> stepsConfig) {
this._stepsConfig = stepsConfig;
}
@Override
public IApsEntity getEntity(String entityId) throws ApsSystemException {
return this.getMessage(entityId);
}
@Override
protected IEntityDAO getEntityDao() {
return (IEntityDAO) this._formDAO;
}
protected IFormDAO getFormDAO() {
return _formDAO;
}
public void setFormDAO(IFormDAO formDAO) {
this._formDAO = formDAO;
}
@Override
protected IEntitySearcherDAO getEntitySearcherDao() {
return _entitySearcherDAO;
}
public void setEntitySearcherDAO(IEntitySearcherDAO entitySearcherDAO) {
this._entitySearcherDAO = entitySearcherDAO;
}
protected IFormTypeGuiDAO getFormTypeGuiDAO() {
return _formTypeGuiDAO;
}
public void setFormTypeGuiDAO(IFormTypeGuiDAO formTypeGuiDAO) {
this._formTypeGuiDAO = formTypeGuiDAO;
}
protected IKeyGeneratorManager getKeyGeneratorManager() {
return _keyGeneratorManager;
}
public void setKeyGeneratorManager(IKeyGeneratorManager keyGeneratorManager) {
this._keyGeneratorManager = keyGeneratorManager;
}
protected ConfigInterface getConfigManager() {
return _configManager;
}
public void setConfigManager(ConfigInterface configManager) {
this._configManager = configManager;
}
protected ILangManager getLangManager() {
return _langManager;
}
public void setLangManager(ILangManager langManager) {
this._langManager = langManager;
}
protected IEntityRenderer getEntityRenderer() {
return _entityRenderer;
}
public void setEntityRenderer(IEntityRenderer entityRenderer) {
this._entityRenderer = entityRenderer;
}
protected IMailManager getMailManager() {
return _mailManager;
}
public void setMailManager(IMailManager mailManager) {
this._mailManager = mailManager;
}
protected II18nManager getI18nManager() {
return _i18nManager;
}
public void setI18nManager(II18nManager i18nManager) {
this._i18nManager = i18nManager;
}
public UserGuiGenerator getUserGuiGenerator() {
return _userGuiGenerator;
}
public void setUserGuiGenerator(UserGuiGenerator userGuiGenerator) {
this._userGuiGenerator = userGuiGenerator;
}
public IUserProfileManager getUserProfileManager() {
return _userProfileManager;
}
public void setUserProfileManager(IUserProfileManager userProfileManager) {
this._userProfileManager = userProfileManager;
}
/**
* Mappa dei prototipi dei tipi di contenuti il forma Small, indicizzati in
* base al codice del tipo.
*/
private Map<String, SmallMessageType> _smallMessageTypes;
/**
* A map containing the configuration of the notifier for each message type,
* identified by the type code.
*/
private Map<String, MessageTypeNotifierConfig> _messageNotifierConfigMap;
private Map<String, StepsConfig> _stepsConfig;
private Map<String, TypeVersionGuiConfig> _typeVersionConfigs = new HashMap<String, TypeVersionGuiConfig>();
private Map<String, TypeVersionGuiConfig> _lastVersionConfigs = new HashMap<String, TypeVersionGuiConfig>();
private IFormDAO _formDAO;
private IEntitySearcherDAO _entitySearcherDAO;
private IFormTypeGuiDAO _formTypeGuiDAO;
private IKeyGeneratorManager _keyGeneratorManager;
private ConfigInterface _configManager;
private ILangManager _langManager;
private IEntityRenderer _entityRenderer;
private IMailManager _mailManager;
private II18nManager _i18nManager;
private UserGuiGenerator _userGuiGenerator;
private IUserProfileManager _userProfileManager;
}