Commit 2371b732 authored by doc@bgerp.org's avatar doc@bgerp.org

p12098 Process status changed on note add fix.

parent 31024a30
C: Additional logging in event processing, refactoring and cleanup of code.
......@@ -23,72 +23,72 @@ import ru.bgcrm.util.sql.ConnectionSet;
import ru.bgcrm.util.sql.SingleConnectionConnectionSet;
public class MessageTypeNote extends MessageType {
private static final Logger log = Logger.getLogger(MessageTypeNote.class);
public MessageTypeNote(int id, ParameterMap config) throws BGException {
super(id, config.get("title"), config);
}
@Override
public void updateMessage(Connection con, DynActionForm form, Message message) throws Exception {
message.setSystemId("");
message.setFrom("");
message.setProcessed(true);
message.setToTime(new Date());
message.setDirection(Message.DIRECTION_INCOMING);
Map<Integer, FileInfo> tmpFiles = processMessageAttaches(con, form, message);
new MessageDAO(con).updateMessage(message);
SessionTemporaryFiles.deleteFiles(form, tmpFiles.keySet());
// генерация события
int processId = message.getProcessId();
// определение кода процесса
if (processId > 0) {
Process process = new ProcessDAO(con).getProcess(processId);
ProcessType type = ProcessTypeCache.getProcessType(process.getTypeId());
if (type == null) {
log.error("Not found process type with id:" + process.getTypeId());
} else {
EventProcessor.processEvent(new ProcessMessageAddedEvent(form, message, process),
type.getProperties().getActualScriptName(), new SingleConnectionConnectionSet(con));
}
}
}
@Override
public void messageDelete(ConnectionSet conSet, String... messageIds) throws BGException {
for (String messageId : messageIds)
new MessageDAO(conSet.getConnection()).deleteMessage(Utils.parseInt(messageId));
}
@Override
public boolean isAnswerSupport() {
return true;
}
@Override
public boolean isEditable(Message message) {
return true;
}
@Override
public boolean isRemovable(Message message) {
return true;
}
@Override
public boolean isProcessChangeSupport() {
return true;
}
@Override
public String getProcessMessageHeaderColor(Message message) {
return "#e6fb9d";
}
private static final Logger log = Logger.getLogger(MessageTypeNote.class);
public MessageTypeNote(int id, ParameterMap config) throws BGException {
super(id, config.get("title"), config);
}
@Override
public void updateMessage(Connection con, DynActionForm form, Message message) throws Exception {
message.setSystemId("");
message.setFrom("");
message.setProcessed(true);
message.setToTime(new Date());
message.setDirection(Message.DIRECTION_INCOMING);
Map<Integer, FileInfo> tmpFiles = processMessageAttaches(con, form, message);
new MessageDAO(con).updateMessage(message);
SessionTemporaryFiles.deleteFiles(form, tmpFiles.keySet());
// генерация события
int processId = message.getProcessId();
// определение кода процесса
if (processId > 0) {
Process process = new ProcessDAO(con).getProcess(processId);
ProcessType type = ProcessTypeCache.getProcessType(process.getTypeId());
if (type == null) {
log.error("Not found process type with id:" + process.getTypeId());
} else {
EventProcessor.processEvent(new ProcessMessageAddedEvent(form, message, process),
type.getProperties().getActualScriptName(), new SingleConnectionConnectionSet(con));
}
}
}
@Override
public void messageDelete(ConnectionSet conSet, String... messageIds) throws BGException {
for (String messageId : messageIds)
new MessageDAO(conSet.getConnection()).deleteMessage(Utils.parseInt(messageId));
}
@Override
public boolean isAnswerSupport() {
return true;
}
@Override
public boolean isEditable(Message message) {
return true;
}
@Override
public boolean isRemovable(Message message) {
return true;
}
@Override
public boolean isProcessChangeSupport() {
return true;
}
@Override
public String getProcessMessageHeaderColor(Message message) {
return "#e6fb9d";
}
}
......@@ -7,8 +7,6 @@ import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import org.apache.log4j.Logger;
import ru.bgcrm.dao.message.MessageType;
import ru.bgcrm.dynamic.DynamicClassManager;
import ru.bgcrm.model.BGException;
......@@ -18,81 +16,82 @@ import ru.bgcrm.util.Config;
import ru.bgcrm.util.ParameterMap;
import ru.bgcrm.util.Preferences;
import ru.bgcrm.util.sql.ConnectionSet;
import ru.bgerp.util.Log;
public class MessageTypeConfig extends Config {
private static final Logger log = Logger.getLogger(MessageTypeConfig.class);
@SuppressWarnings("serial")
private SortedMap<Integer, MessageType> typeMap = new TreeMap<Integer, MessageType>() {
@Override
public MessageType get(Object key) {
MessageType result = super.get(key);
if (result == null) {
try {
result = new MessageTypeUncknown((Integer) key);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
return result;
}
};
public MessageTypeConfig(ParameterMap setup) {
super(setup);
for (Map.Entry<Integer, ParameterMap> me : setup.subIndexed("messageType.").entrySet()) {
int id = me.getKey();
ParameterMap config = me.getValue();
try {
@SuppressWarnings("unchecked")
Class<? extends MessageType> typeClass = (Class<? extends MessageType>) DynamicClassManager
.getClass(config.get("class"));
MessageType type = typeClass.getConstructor(int.class, ParameterMap.class).newInstance(id, config);
type.setId(id);
typeMap.put(type.getId(), type);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
public SortedMap<Integer, MessageType> getTypeMap() {
return typeMap;
}
public void setTypeMap(SortedMap<Integer, MessageType> typeMap) {
this.typeMap = typeMap;
}
@SuppressWarnings("unchecked")
public<T extends MessageType> T getMessageType(Class<T> clazz) {
return (T)typeMap.values().stream().filter(o -> clazz.isInstance(o)).findAny().orElse(null);
}
private static class MessageTypeUncknown extends MessageType {
public MessageTypeUncknown(int id) throws BGException {
super(id, "??? " + id, new Preferences());
}
@Override
public void process() {
}
@Override
public boolean isAnswerSupport() {
return false;
}
@Override
public void updateMessage(Connection con, DynActionForm form, Message message) throws BGException {
}
@Override
public List<Message> newMessageList(ConnectionSet conSet) {
return Collections.emptyList();
}
}
private static final Log log = Log.getLog();
@SuppressWarnings("serial")
private SortedMap<Integer, MessageType> typeMap = new TreeMap<Integer, MessageType>() {
@Override
public MessageType get(Object key) {
MessageType result = super.get(key);
if (result == null) {
try {
result = new MessageTypeUncknown((Integer) key);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
return result;
}
};
public MessageTypeConfig(ParameterMap setup) {
super(setup);
for (Map.Entry<Integer, ParameterMap> me : setup.subIndexed("messageType.").entrySet()) {
int id = me.getKey();
ParameterMap config = me.getValue();
try {
@SuppressWarnings("unchecked")
Class<? extends MessageType> typeClass = (Class<? extends MessageType>) DynamicClassManager
.getClass(config.get("class"));
MessageType type = typeClass.getConstructor(int.class, ParameterMap.class).newInstance(id, config);
type.setId(id);
typeMap.put(type.getId(), type);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
public SortedMap<Integer, MessageType> getTypeMap() {
return typeMap;
}
public void setTypeMap(SortedMap<Integer, MessageType> typeMap) {
this.typeMap = typeMap;
}
@SuppressWarnings("unchecked")
public<T extends MessageType> T getMessageType(Class<T> clazz) {
return (T)typeMap.values().stream().filter(o -> clazz.isInstance(o)).findAny().orElse(null);
}
private static class MessageTypeUncknown extends MessageType {
public MessageTypeUncknown(int id) throws BGException {
super(id, "??? " + id, new Preferences());
}
@Override
public void process() {
}
@Override
public boolean isAnswerSupport() {
return false;
}
@Override
public void updateMessage(Connection con, DynActionForm form, Message message) throws BGException {
}
@Override
public List<Message> newMessageList(ConnectionSet conSet) {
return Collections.emptyList();
}
}
}
\ No newline at end of file
......@@ -29,9 +29,10 @@ import ru.bgcrm.util.Setup;
import ru.bgcrm.util.Utils;
import ru.bgcrm.util.sql.ConnectionSet;
import ru.bgcrm.util.sql.SQLUtils;
import ru.bgerp.util.Log;
public class EventProcessor {
private static final Logger log = Logger.getLogger(EventProcessor.class);
private static final Log log = Log.getLog();
private static Object sync = new Object();
private static Map<Class<?>, List<EventListener<?>>> subscribers = new ConcurrentHashMap<Class<?>, List<EventListener<?>>>();
......@@ -108,7 +109,7 @@ public class EventProcessor {
try {
unsubscribe(className);
DynamicClassManager.getClass(className).newInstance();
DynamicClassManager.getClass(className).getDeclaredConstructor().newInstance();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
......@@ -127,6 +128,8 @@ public class EventProcessor {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static boolean processEvent(Event event, String className, ConnectionSet conSet,
boolean systemListenerProcessing) throws Exception {
log.debug("Processing event: %s, className: %s", event, className);
if (systemListenerProcessing) {
// обработка системными зарегестрированными слушателями
List<EventListener<?>> listeners = subscribers.get(event.getClass());
......
......@@ -9,20 +9,20 @@ import ru.bgcrm.struts.form.DynActionForm;
* В процесс добавлено сообщение, автоматически соотнесено процессу.
*/
public class ProcessMessageAddedEvent extends UserEvent {
private final Message message;
private final Process process;
private final Message message;
private final Process process;
public ProcessMessageAddedEvent(DynActionForm form, Message message, Process process) {
super(form);
this.message = message;
this.process = process;
}
public ProcessMessageAddedEvent(DynActionForm form, Message message, Process process) {
super(form);
this.message = message;
this.process = process;
}
public Message getMessage() {
return message;
}
public Message getMessage() {
return message;
}
public Process getProcess() {
return process;
}
public Process getProcess() {
return process;
}
}
......@@ -13,183 +13,183 @@ import ru.bgcrm.model.process.Process;
* Одно входящее или исходящее сообщение.
*/
public class Message extends Id {
public static final String OBJECT_TYPE = "message";
public static final int DIRECTION_INCOMING = 1;
public static final int DIRECTION_OUTGOING = 2;
// системный идентификатор
private String systemId = "";
private int processId;
private Process process;
// тип сообщения
private int typeId = -1;
// направение сообщения
private int direction = DIRECTION_INCOMING;
// для исходящего звонка - код звонившего пользователя
// для входящего звонка - код принявшего пользователя
// для входящего HD, EMail - код прочитавшего пользователя
// для исходящего HD, EMail - код отписавшего пользователя
private int userId;
// для звонка - время начала, для HD - время создания сообщения
// для входящих EMail - время получения сообщения демоном
// для исходящих EMail - время создания сообщения
private Date fromTime;
// для звонка - время окончания, для HD - время прочтения,
// для входящих EMail - время прочтения
// для исходящих EMail - время отправки
private Date toTime;
// для звонка - с номера, для EMail - с адреса, для HD - код контрагента в виде строки
private String from = "";
// для звонка - на номер, для EMail - на адрес, для HD - код контрагента в виде строки
private String to;
// для HD/E-Mail - тема сообщения
private String subject = "";
// для HD/E-Mail - текст сообщения, для телефона - краткое описание.
private String text = "";
// флаг, что сообщение обработано
private boolean processed;
// прикрепленные файлы
private List<FileData> attaches = new ArrayList<>();
public String getSystemId() {
return systemId;
}
public void setSystemId(String systemId) {
this.systemId = systemId;
}
public int getProcessId() {
return processId;
}
public void setProcessId(int processId) {
this.processId = processId;
}
public Process getProcess() {
return process;
}
public void setProcess(Process process) {
this.process = process;
this.processId = process.getId();
}
public Date getFromTime() {
return fromTime;
}
public void setFromTime(Date createDate) {
this.fromTime = createDate;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public int getTypeId() {
return typeId;
}
public void setTypeId(int type) {
this.typeId = type;
}
public int getUserId() {
return userId;
}
public void setUserId(int createUserId) {
this.userId = createUserId;
}
public Date getToTime() {
return toTime;
}
public void setToTime(Date readDate) {
this.toTime = readDate;
}
public String getUserTitle() {
return UserCache.getUser(userId).getTitle();
}
public int getDirection() {
return direction;
}
public void setDirection(int direction) {
this.direction = direction;
}
public boolean isIncoming() {
return direction == DIRECTION_INCOMING;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public boolean isProcessed() {
return processed;
}
public void setProcessed(boolean processed) {
this.processed = processed;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
/**
* Получить список прикрепленных файлов
* @return список файлов
*/
public List<FileData> getAttachList() {
return attaches;
}
/**
* Добавляет к сообщению файл
* @param messageAttach
*/
public void addAttach(FileData messageAttach) {
this.attaches.add(messageAttach);
}
public String getLockEdit() {
return "message_edit_" + id;
}
public static final String OBJECT_TYPE = "message";
public static final int DIRECTION_INCOMING = 1;
public static final int DIRECTION_OUTGOING = 2;
// системный идентификатор
private String systemId = "";
private int processId;
private Process process;
// тип сообщения
private int typeId = -1;
// направение сообщения
private int direction = DIRECTION_INCOMING;
// для исходящего звонка - код звонившего пользователя
// для входящего звонка - код принявшего пользователя
// для входящего HD, EMail - код прочитавшего пользователя
// для исходящего HD, EMail - код отписавшего пользователя
private int userId;
// для звонка - время начала, для HD - время создания сообщения
// для входящих EMail - время получения сообщения демоном
// для исходящих EMail - время создания сообщения
private Date fromTime;
// для звонка - время окончания, для HD - время прочтения,
// для входящих EMail - время прочтения
// для исходящих EMail - время отправки
private Date toTime;
// для звонка - с номера, для EMail - с адреса, для HD - код контрагента в виде строки
private String from = "";
// для звонка - на номер, для EMail - на адрес, для HD - код контрагента в виде строки
private String to;
// для HD/E-Mail - тема сообщения
private String subject = "";
// для HD/E-Mail - текст сообщения, для телефона - краткое описание.
private String text = "";
// флаг, что сообщение обработано
private boolean processed;
// прикрепленные файлы
private List<FileData> attaches = new ArrayList<>();
public String getSystemId() {
return systemId;
}
public void setSystemId(String systemId) {
this.systemId = systemId;
}
public int getProcessId() {
return processId;
}
public void setProcessId(int processId) {
this.processId = processId;
}
public Process getProcess() {
return process;
}
public void setProcess(Process process) {
this.process = process;
this.processId = process.getId();
}
public Date getFromTime() {
return fromTime;
}
public void setFromTime(Date createDate) {
this.fromTime = createDate;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public int getTypeId() {
return typeId;
}
public void setTypeId(int type) {
this.typeId = type;
}
public int getUserId() {
return userId;
}
public void setUserId(int createUserId) {
this.userId = createUserId;
}
public Date getToTime() {
return toTime;
}
public void setToTime(Date readDate) {
this.toTime = readDate;
}
public String getUserTitle() {
return UserCache.getUser(userId).getTitle();
}
public int getDirection() {
return direction;
}
public void setDirection(int direction) {
this.direction = direction;
}
public boolean isIncoming() {
return direction == DIRECTION_INCOMING;
}