diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b3ee0b3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,57 @@ +*.class +*.jasper + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +*.pydevproject +.metadata +.gradle +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath + +# Eclipse Core +.project + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# Java annotation processor (APT) +.factorypath + +# PDT-specific +.buildpath + +# sbteclipse plugin +.target + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans +target diff --git a/cit-esi-listener-api/pom.xml b/cit-esi-listener-api/pom.xml new file mode 100644 index 0000000..d790744 --- /dev/null +++ b/cit-esi-listener-api/pom.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + 4.0.0 + + + br.com.centralit + cit-esi-listener + 1.8.0-SNAPSHOT + + + cit-esi-listener-api + cit-esi-listener-api + + Este projeto contém as classes estruturais que são utilizadas pelo projeto cit-esi-listener-web. + + + ${project.parent.parent.parent.basedir}/filterfile.xml + ${project.parent.parent.basedir}/src/licensing + package + + + + + br.com.centralit + cit-core + ${project.version} + + + br.com.centralit + cit-esi-api + ${project.version} + + + + org.apache.activemq + activemq-all + + + org.quartz-scheduler + quartz + + + org.quartz-scheduler + quartz-jobs + + + + diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/jms/message/RuntimeOutputMessage.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/jms/message/RuntimeOutputMessage.java new file mode 100644 index 0000000..2238c8c --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/jms/message/RuntimeOutputMessage.java @@ -0,0 +1,25 @@ +package br.com.centralit.esi.api.jms.message; + +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.Session; + +import org.springframework.jms.support.converter.MessageConversionException; + +import br.com.centralit.esi.api.runtime.RuntimeEnvironmentOutput; + +public class RuntimeOutputMessage { + + private final RuntimeEnvironmentOutput output; + private RuntimeOutputMessageConverter messageConverter; + + public RuntimeOutputMessage(RuntimeEnvironmentOutput output, RuntimeOutputMessageConverter messageConverter) { + this.output = output; + this.messageConverter = messageConverter; + } + + public Message convertToMessage(Session session) throws MessageConversionException, JMSException { + return (this.messageConverter.toMessage(this.output, session)); + } + +} diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/jms/message/RuntimeOutputMessageConverter.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/jms/message/RuntimeOutputMessageConverter.java new file mode 100644 index 0000000..5ab3e0c --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/jms/message/RuntimeOutputMessageConverter.java @@ -0,0 +1,47 @@ +package br.com.centralit.esi.api.jms.message; + +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.Session; +import javax.jms.TextMessage; + +import org.springframework.jms.support.converter.MessageConversionException; +import org.springframework.jms.support.converter.MessageConverter; + +import br.com.centralit.esi.api.runtime.RuntimeEnvironmentOutput; +import br.com.centralit.esi.api.util.ConvertUtilsESI; +import br.com.centralit.esi.api.util.XStreamTranslator; + +public class RuntimeOutputMessageConverter implements MessageConverter{ + + public Object fromMessage(Message message) throws JMSException,MessageConversionException { + if (message instanceof TextMessage) { + TextMessage textMessage = (TextMessage) message; + String text = textMessage.getText().trim(); + if (text.charAt(0) == '<') { + return (RuntimeEnvironmentOutput) XStreamTranslator.getInstance().toObject(text); + }else if (text.charAt(0) == '{') { + return (RuntimeEnvironmentOutput) ConvertUtilsESI.fromJson(text, RuntimeEnvironmentOutput.class); + }else { + throw new MessageConversionException("Formato inválido de mensagem"); + } + }else { + throw new MessageConversionException("Formato inválido de mensagem"); + } + } + + public Message toMessage(Object object, Session session) throws JMSException,MessageConversionException { + RuntimeEnvironmentOutput output = (RuntimeEnvironmentOutput) object; + RuntimeEnvironmentOutput auxOutput = new RuntimeEnvironmentOutput(); + if (output.getProcessInstance() != null) + auxOutput.setProcessInstanceId(output.getProcessInstance().getId()); + auxOutput.setOutputVariables(output.getOutputVariables()); + auxOutput.setSynchronous(output.isSynchronous()); + + String xml = XStreamTranslator.getInstance().toXMLString(auxOutput); + TextMessage message = session.createTextMessage(xml); + + return message; + } + +} diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/jms/service/RuntimeOutputProducer.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/jms/service/RuntimeOutputProducer.java new file mode 100644 index 0000000..5ff99bb --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/jms/service/RuntimeOutputProducer.java @@ -0,0 +1,9 @@ +package br.com.centralit.esi.api.jms.service; + +import br.com.centralit.esi.api.runtime.RuntimeEnvironmentOutput; + +public interface RuntimeOutputProducer { + + public void send(final RuntimeEnvironmentOutput output, final String correlationId); + +} \ No newline at end of file diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/jms/service/impl/RuntimeOutputProducerImpl.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/jms/service/impl/RuntimeOutputProducerImpl.java new file mode 100644 index 0000000..ca3df27 --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/jms/service/impl/RuntimeOutputProducerImpl.java @@ -0,0 +1,50 @@ +package br.com.centralit.esi.api.jms.service.impl; + +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.Session; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jms.core.JmsTemplate; +import org.springframework.jms.core.MessageCreator; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import br.com.centralit.esi.api.jms.message.RuntimeOutputMessage; +import br.com.centralit.esi.api.jms.message.RuntimeOutputMessageConverter; +import br.com.centralit.esi.api.jms.service.RuntimeOutputProducer; +import br.com.centralit.esi.api.runtime.RuntimeEnvironmentOutput; + +@Service("runtimeOutputProducerService") +public class RuntimeOutputProducerImpl implements InitializingBean, RuntimeOutputProducer { + + @Autowired + @Qualifier("runtimeOutputProducer") + private JmsTemplate jmsTemplate; + + @Autowired + private RuntimeOutputMessageConverter messageConverter; + + @Override + public void send(final RuntimeEnvironmentOutput output, final String correlationId) { + this.jmsTemplate.send(new MessageCreator() { + @Override + public Message createMessage(Session session) throws JMSException { + Message message = new RuntimeOutputMessage(output, messageConverter).convertToMessage(session); + message.setJMSCorrelationID(correlationId); + return message; + } + }); + } + + protected final JmsTemplate getJmsTemplate() { + return (this.jmsTemplate); + } + + @Override + public void afterPropertiesSet() throws Exception { + Assert.notNull(this.jmsTemplate, "JmsTemplate instance can not be null. See the Spring configuration file context."); + } +} diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/router/service/RouterService.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/router/service/RouterService.java new file mode 100644 index 0000000..6b8a3b3 --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/router/service/RouterService.java @@ -0,0 +1,34 @@ +package br.com.centralit.esi.api.router.service; + +import java.util.List; + +import br.com.centralit.esi.api.runtime.RuntimeEnvironmentInput; +import br.com.centralit.esi.api.runtime.RuntimeEnvironmentOutput; +import br.com.centralit.framework.esi.environment.SignalEventInput; + + +public interface RouterService { + + void processJob(RuntimeEnvironmentInput input); + + RuntimeEnvironmentOutput signalEvent(SignalEventInput input); + + RuntimeEnvironmentOutput completeTask(RuntimeEnvironmentInput runtimeEnvironment); + + List execute(String flowName, String[] response, String[] variables); + + RuntimeEnvironmentOutput start(RuntimeEnvironmentInput input); + + RuntimeEnvironmentOutput captureTask(RuntimeEnvironmentInput input); + + RuntimeEnvironmentOutput delegateUserTask(RuntimeEnvironmentInput input); + + RuntimeEnvironmentOutput removeUserTaskDelegation(RuntimeEnvironmentInput input); + + RuntimeEnvironmentOutput suspendProcessInstance(RuntimeEnvironmentInput input); + + RuntimeEnvironmentOutput restartProcessInstance(RuntimeEnvironmentInput input); + + RuntimeEnvironmentOutput reopenProcessInstance(RuntimeEnvironmentInput input); + +} diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/router/service/impl/RouterServiceImpl.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/router/service/impl/RouterServiceImpl.java new file mode 100644 index 0000000..308d3ee --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/router/service/impl/RouterServiceImpl.java @@ -0,0 +1,153 @@ +package br.com.centralit.esi.api.router.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import br.com.centralit.esi.api.business.model.BusinessProcessInstance; +import br.com.centralit.esi.api.business.service.BusinessProcessManager; +import br.com.centralit.esi.api.design.model.FlowVersion; +import br.com.centralit.esi.api.enumerated.RuntimeActionEnum; +import br.com.centralit.esi.api.execution.model.ProcessInstance; +import br.com.centralit.esi.api.execution.service.ProcessInstanceService; +import br.com.centralit.esi.api.jms.service.RuntimeOutputProducer; +import br.com.centralit.esi.api.log.service.RuntimeLogService; +import br.com.centralit.esi.api.router.service.RouterService; +import br.com.centralit.esi.api.runtime.RuntimeEnvironmentInput; +import br.com.centralit.esi.api.runtime.RuntimeEnvironmentOutput; +import br.com.centralit.esi.api.runtime.service.RuntimeManager; +import br.com.centralit.esi.api.runtime.service.RuntimeManagerBase; +import br.com.centralit.esi.api.security.service.SecurityService; +import br.com.centralit.esi.api.signal.service.SignalEventProducer; +import br.com.centralit.esi.api.util.EsiAppUtils; +import br.com.centralit.esi.exception.EsiControlledException; +import br.com.centralit.framework.esi.environment.EnvironmentInput; +import br.com.centralit.framework.esi.environment.SignalEventInput; + +@Service("routerService") +public class RouterServiceImpl implements RouterService { + + @Autowired + private RuntimeManager runtimeManager; + + @Autowired + private BusinessProcessManager businessProcessManager; + + @Autowired + private SignalEventProducer signalEventProducer; + + @Autowired + private RuntimeOutputProducer runtimeOutputProducer; + + @Autowired + protected RuntimeLogService runtimeLogService; + + @Autowired + protected SecurityService securityService; + + @Autowired + private ProcessInstanceService processInstanceService; + + private RuntimeManagerBase getRuntimeManager(EnvironmentInput input) { + if (input.getProcessInstanceId() != null) { + ProcessInstance processInstance = (ProcessInstance) EsiAppUtils.getUnproxyModel(processInstanceService.find(input.getProcessInstanceId())); + if (processInstance != null && processInstance.hasBusinessProcess()) { + input.setBusinessProcessId(((BusinessProcessInstance) processInstance).getBusinessProcess().getId()); + input.setBusinessProcessName(((BusinessProcessInstance) processInstance).getBusinessProcess().getName()); + return businessProcessManager; + }else{ + return runtimeManager; + } + }else{ + return input.getBusinessProcessId() != null ? businessProcessManager : runtimeManager; + } + } + + protected void solveException(RuntimeActionEnum action, Throwable exception, EnvironmentInput runtimeEnvironmentInput, FlowVersion flowVersion, ProcessInstance processInstance) { + exception.printStackTrace(); + if (!(exception instanceof EsiControlledException) || processInstance == null) { + runtimeLogService.create(action, exception, securityService.getAuthenticatedUser(), runtimeEnvironmentInput, flowVersion, processInstance); + throw new EsiControlledException(exception); + }else if (exception instanceof RuntimeException) { + throw (RuntimeException) exception; + }else{ + throw new EsiControlledException(exception); + } + } + + @Override + public void processJob(RuntimeEnvironmentInput input) { + RuntimeEnvironmentOutput output = null; + if (input.getWorkItemId() != null) { + output = this.getRuntimeManager(input).executeWorkItem(input, null); + }else{ + output = this.getRuntimeManager(input).start(input); + } + + if (input.isSignal()) { + ProcessInstance processInstance = output.getProcessInstance(); + FlowVersion flowVersion = processInstance != null ? processInstance.getFlowVersion() : null; + try { + runtimeOutputProducer.send(output, input.getCorrelationId()); + } catch (Exception e) { + solveException(RuntimeActionEnum.PROCESS_JOB, e, input, flowVersion, processInstance); + } + } + } + + @Override + public RuntimeEnvironmentOutput signalEvent(SignalEventInput input) { + RuntimeEnvironmentOutput output = null; + try { + output = signalEventProducer.send(input); + } catch (Exception e) { + solveException(RuntimeActionEnum.SIGNAL_EVENT, e, input, null, null); + } + return output; + } + + @Override + public RuntimeEnvironmentOutput completeTask(RuntimeEnvironmentInput input) { + return this.getRuntimeManager(input).completeTask(input); + } + + @Override + public RuntimeEnvironmentOutput start(RuntimeEnvironmentInput input) { + return this.getRuntimeManager(input).start(input); + } + + @Override + public List execute(String flowName, String[] response, String[] variables) { + return runtimeManager.execute(flowName, response, variables); + } + + @Override + public RuntimeEnvironmentOutput captureTask(RuntimeEnvironmentInput input) { + return this.getRuntimeManager(input).captureTask(input); + } + + @Override + public RuntimeEnvironmentOutput delegateUserTask(RuntimeEnvironmentInput input) { + return this.getRuntimeManager(input).delegateUserTask(input); } + + @Override + public RuntimeEnvironmentOutput removeUserTaskDelegation(RuntimeEnvironmentInput input) { + return this.getRuntimeManager(input).removeUserTaskDelegation(input); + } + + @Override + public RuntimeEnvironmentOutput suspendProcessInstance(RuntimeEnvironmentInput input) { + return this.getRuntimeManager(input).suspendProcessInstance(input); + } + + @Override + public RuntimeEnvironmentOutput restartProcessInstance(RuntimeEnvironmentInput input) { + return this.getRuntimeManager(input).restartProcessInstance(input); + } + + @Override + public RuntimeEnvironmentOutput reopenProcessInstance(RuntimeEnvironmentInput input) { + return this.getRuntimeManager(input).reopenProcessInstance(input); + } +} diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/scheduler/EventScheduler.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/scheduler/EventScheduler.java new file mode 100644 index 0000000..1984ecd --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/scheduler/EventScheduler.java @@ -0,0 +1,170 @@ +package br.com.centralit.esi.api.scheduler; + +import java.util.List; +import java.util.UUID; + +import org.quartz.CronScheduleBuilder; +import org.quartz.CronTrigger; +import org.quartz.JobBuilder; +import org.quartz.JobDataMap; +import org.quartz.JobDetail; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.SchedulerFactory; +import org.quartz.Trigger; +import org.quartz.TriggerBuilder; +import org.quartz.impl.StdSchedulerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import br.com.centralit.esi.api.design.model.event.SignalEvent; +import br.com.centralit.esi.api.router.service.RouterService; +import br.com.centralit.esi.api.runtime.RuntimeEnvironmentInput; +import br.com.centralit.esi.api.scheduler.job.RuntimeJob; +import br.com.centralit.esi.api.scheduler.model.EventJob; +import br.com.centralit.esi.api.scheduler.service.EventJobService; +import br.com.centralit.esi.exception.EsiExecutionException; +import br.com.centralit.framework.esi.environment.SignalEventInput; + + +public class EventScheduler { + + public final String GROUP_NAME = "EsiTimerEventGoup"; + + private Scheduler schedule = null; + + private RouterService routerService; + + private EventJobService eventJobService; + + @Autowired + private EventScheduler(RouterService routerService, EventJobService eventJobService) { + this.routerService = routerService; + this.eventJobService = eventJobService; + } + + public void initialize() { + try { + SchedulerFactory sf = new StdSchedulerFactory(); + schedule = sf.getScheduler(); + schedule.start(); + + this.retrieveJobs(); + } catch (SchedulerException e) { + e.printStackTrace(); + throw new EsiExecutionException(e); + } + } + + private void retrieveJobs() { + List jobs = eventJobService.findAll(); + for (EventJob eventJob : jobs) { + if (eventJob.isActive()) { + this.schedulerTimerEvent(eventJob); + } + } + } + + private void deleteJob(JobKey jobKey) { + try { + this.schedule.deleteJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + throw new EsiExecutionException(e); + } + } + + private void buildJobDataMap(JobDetail job, RuntimeEnvironmentInput input) { + JobDataMap data = job.getJobDataMap(); + data.put("runtimeManager", routerService); + data.put("environmentInput", input); + } + + private void schedulerTimerJob(JobDetail job, String cronExpression) { + try { + CronTrigger cronTrigger = TriggerBuilder.newTrigger() + .withIdentity("CronTrigger_"+job.getKey().getName(), GROUP_NAME) + .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)) + .build(); + + this.schedule.scheduleJob(job, cronTrigger); + } catch (SchedulerException e) { + e.printStackTrace(); + throw new EsiExecutionException(e); + } + } + + private void schedulerImmediateTimerJob(JobDetail job) { + Trigger trigger = TriggerBuilder.newTrigger() + .withIdentity("Trigger_"+job.getKey().getName(), GROUP_NAME) + .startNow() + .build(); + + try { + this.schedule.scheduleJob(job, trigger); + } catch (SchedulerException e) { + e.printStackTrace(); + throw new EsiExecutionException(e); + } + } + + private void schedulerTimerEvent(EventJob eventJob) { + String jobName = eventJob.getName(); + String cronExpression = eventJob.getCronExpression(); + RuntimeEnvironmentInput input = eventJob.getEnvironmentInput(); + + JobDetail job = createJobDetail(jobName); + + this.buildJobDataMap(job, input); + this.deleteJob(job.getKey()); + if (input.isSignal()) { + this.schedulerImmediateTimerJob(job); + }else{ + this.schedulerTimerJob(job, cronExpression); + } + } + + private JobDetail createJobDetail(String jobName) { + return JobBuilder.newJob(RuntimeJob.class) + .withIdentity(jobName, GROUP_NAME) + .build(); + } + + public void schedulerSignalEvent(SignalEvent signalEvent, SignalEventInput signalEventInput, String correlationId, Long workItemId) { + RuntimeEnvironmentInput input = new RuntimeEnvironmentInput( + signalEvent.getFlowVersion().getFlow().getName() + , workItemId + , signalEvent.getName() + , signalEventInput.getBusinessProcessId() + , signalEventInput.getCorrelationId() + , true + , signalEventInput.isSynchronous() + , true + , signalEventInput.getUsername() + , true); + + + String jobName = "SignalEvent#"+UUID.randomUUID().toString(); + input.setInputVariables(signalEventInput.getInputVariables()); + input.setUuid(signalEventInput.getUuid()); + + this.schedule(jobName, null, input); + } + + public void schedule(String jobName, String cronExpression, RuntimeEnvironmentInput input) { + JobDetail job = createJobDetail(jobName); + + this.buildJobDataMap(job, input); + this.deleteJob(job.getKey()); + if (input.isSignal()) { + this.schedulerImmediateTimerJob(job); + }else{ + this.schedulerTimerJob(job, cronExpression); + } + } + + public void removeSchedule(String jobName) { + this.deleteJob(new JobKey(jobName, GROUP_NAME)); + } + +} diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/scheduler/job/RuntimeJob.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/scheduler/job/RuntimeJob.java new file mode 100644 index 0000000..c2bb685 --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/scheduler/job/RuntimeJob.java @@ -0,0 +1,24 @@ +package br.com.centralit.esi.api.scheduler.job; + +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import br.com.centralit.esi.api.router.service.RouterService; +import br.com.centralit.esi.api.runtime.RuntimeEnvironmentInput; + +@DisallowConcurrentExecution +public class RuntimeJob implements Job { + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + JobDataMap data = context.getJobDetail().getJobDataMap(); + RouterService runtimeManager = (RouterService) data.get("runtimeManager"); + RuntimeEnvironmentInput input = (RuntimeEnvironmentInput) data.get("environmentInput"); + + runtimeManager.processJob(input); + } + +} diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/consumer/SignalEventConsumer.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/consumer/SignalEventConsumer.java new file mode 100644 index 0000000..2341754 --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/consumer/SignalEventConsumer.java @@ -0,0 +1,37 @@ +package br.com.centralit.esi.api.signal.consumer; + +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.MessageListener; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jms.support.converter.MessageConversionException; + +import br.com.centralit.esi.api.signal.message.SignalEventMessageConverter; +import br.com.centralit.esi.api.signal.service.SignalEventService; +import br.com.centralit.framework.esi.environment.SignalEventInput; + +public class SignalEventConsumer implements MessageListener { + + @Autowired + private SignalEventService signalEventService; + + @Autowired + private SignalEventMessageConverter messageConverter; + + @Override + public void onMessage(Message message) { + try { + Object obj = messageConverter.fromMessage(message); + if (obj instanceof SignalEventInput) { + SignalEventInput input = (SignalEventInput) obj; + signalEventService.receive(input, message); + } + } catch (MessageConversionException e) { + e.printStackTrace(); + } catch (JMSException e) { + e.printStackTrace(); + } + } + +} diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/message/SignalEventMessage.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/message/SignalEventMessage.java new file mode 100644 index 0000000..36a8ca3 --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/message/SignalEventMessage.java @@ -0,0 +1,25 @@ +package br.com.centralit.esi.api.signal.message; + +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.Session; + +import org.springframework.jms.support.converter.MessageConversionException; + +import br.com.centralit.framework.esi.environment.SignalEventInput; + +public class SignalEventMessage { + + private final SignalEventInput input; + private SignalEventMessageConverter messageConverter; + + public SignalEventMessage(SignalEventInput input, SignalEventMessageConverter messageConverter) { + this.input = input; + this.messageConverter = messageConverter; + } + + public Message convertToMessage(Session session) throws MessageConversionException, JMSException { + return (this.messageConverter.toMessage(this.input, session)); + } + +} diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/message/SignalEventMessageConverter.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/message/SignalEventMessageConverter.java new file mode 100644 index 0000000..f3fea63 --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/message/SignalEventMessageConverter.java @@ -0,0 +1,58 @@ +package br.com.centralit.esi.api.signal.message; + +import javax.jms.JMSException; +import javax.jms.MapMessage; +import javax.jms.Message; +import javax.jms.Session; +import javax.jms.TextMessage; + +import org.springframework.jms.support.converter.MessageConversionException; +import org.springframework.jms.support.converter.MessageConverter; + +import br.com.centralit.esi.api.util.ConvertUtilsESI; +import br.com.centralit.esi.api.util.XStreamTranslator; +import br.com.centralit.framework.esi.enumerated.EventTargetEnum; +import br.com.centralit.framework.esi.environment.EnvironmentVariable; +import br.com.centralit.framework.esi.environment.SignalEventInput; + +import com.thoughtworks.xstream.XStream; + +public class SignalEventMessageConverter implements MessageConverter{ + + private XStream xstream = new XStream(); + + public Object fromMessage(Message message) throws JMSException,MessageConversionException { + if (message instanceof MapMessage) { + MapMessage mapMessage = (MapMessage) message; + return new SignalEventInput() + .setEventTarget(EventTargetEnum.values()[mapMessage.getInt("eventTarget")]) + .setEventName(mapMessage.getString("eventName")) + .setFlowName(mapMessage.getString("flowName")) + .setProcessInstanceId(mapMessage.getLong("processInstanceId")); + }else if (message instanceof TextMessage) { + TextMessage textMessage = (TextMessage) message; + String text = textMessage.getText().trim(); + if (text.charAt(0) == '<') { + xstream.alias("signalEventInput", SignalEventInput.class); + xstream.alias("environmentVariable", EnvironmentVariable.class); + + return (SignalEventInput) xstream.fromXML(text); + }else if (text.charAt(0) == '{') { + return (SignalEventInput) ConvertUtilsESI.fromJson(text, SignalEventInput.class); + }else { + throw new MessageConversionException("Formato inválido de mensagem"); + } + }else { + throw new MessageConversionException("Formato inválido de mensagem"); + } + } + + public Message toMessage(Object object, Session session) throws JMSException,MessageConversionException { + SignalEventInput input = (SignalEventInput) object; + String xml = XStreamTranslator.getInstance().toXMLString(input); + TextMessage message = session.createTextMessage(xml); + + return message; + } + +} diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/service/SignalEventProducer.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/service/SignalEventProducer.java new file mode 100644 index 0000000..41dd4d8 --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/service/SignalEventProducer.java @@ -0,0 +1,10 @@ +package br.com.centralit.esi.api.signal.service; + +import br.com.centralit.esi.api.runtime.RuntimeEnvironmentOutput; +import br.com.centralit.framework.esi.environment.SignalEventInput; + +public interface SignalEventProducer { + + public RuntimeEnvironmentOutput send(final SignalEventInput input); + +} \ No newline at end of file diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/service/SignalEventService.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/service/SignalEventService.java new file mode 100644 index 0000000..5e01351 --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/service/SignalEventService.java @@ -0,0 +1,10 @@ +package br.com.centralit.esi.api.signal.service; + +import javax.jms.Message; + +import br.com.centralit.framework.esi.environment.SignalEventInput; + + +public interface SignalEventService { + public void receive(SignalEventInput input, Message message); +} diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/service/impl/SignalEventProducerImpl.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/service/impl/SignalEventProducerImpl.java new file mode 100644 index 0000000..39f47f7 --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/service/impl/SignalEventProducerImpl.java @@ -0,0 +1,135 @@ +package br.com.centralit.esi.api.signal.service.impl; + +import java.util.UUID; + +import javax.jms.Connection; +import javax.jms.ConnectionFactory; +import javax.jms.Destination; +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.MessageConsumer; +import javax.jms.MessageProducer; +import javax.jms.Session; +import javax.jms.TextMessage; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jms.core.JmsTemplate; +import org.springframework.jms.core.MessageCreator; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import br.com.centralit.esi.api.jms.message.RuntimeOutputMessageConverter; +import br.com.centralit.esi.api.runtime.RuntimeEnvironmentOutput; +import br.com.centralit.esi.api.signal.message.SignalEventMessage; +import br.com.centralit.esi.api.signal.message.SignalEventMessageConverter; +import br.com.centralit.esi.api.signal.service.SignalEventProducer; +import br.com.centralit.esi.exception.RuntimeManagerException; +import br.com.centralit.framework.esi.environment.SignalEventInput; + + +@Service("signalEventProducerService") +public class SignalEventProducerImpl implements InitializingBean, SignalEventProducer { + + @Autowired + @Qualifier("signalEventProducer") + private JmsTemplate jmsTemplate; + + @Autowired + @Qualifier("runtimeOutputProducer") + private JmsTemplate jmsOutputTemplate; + + @Autowired + private SignalEventMessageConverter messageConverter; + + @Autowired + private RuntimeOutputMessageConverter outputMessageConverter; + + @Override + public RuntimeEnvironmentOutput send(final SignalEventInput input) { + if (input.isSynchronous()) { + return sendSynchronous(input); + }else{ + this.jmsTemplate.send(new MessageCreator() { + @Override + public Message createMessage(Session session) throws JMSException { + return new SignalEventMessage(input, messageConverter).convertToMessage(session); + } + }); + return new RuntimeEnvironmentOutput(); + } + } + + public RuntimeEnvironmentOutput sendSynchronous(SignalEventInput input) { + Destination replyQueue = this.jmsOutputTemplate.getDefaultDestination(); + ConnectionFactory connectionFactory = this.jmsTemplate.getConnectionFactory(); + + try { + Connection connection = connectionFactory.createConnection(); + Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + Destination destination = this.jmsTemplate.getDefaultDestination(); + MessageProducer messageProducer = session.createProducer(destination); + + connection = connectionFactory.createConnection(); + session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + + connection.start(); + try{ + return this.sendMessage(session, messageProducer, replyQueue, input); + }finally{ + try { + messageProducer.close(); + } catch (Exception e) { + } + try { + session.close(); + } catch (Exception e) { + } + try { + connection.close(); + } catch (Exception e) { + } + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeManagerException(e); + } + } + + private RuntimeEnvironmentOutput sendMessage(Session session, MessageProducer messageProducer, Destination replyQueue, SignalEventInput input) { + try { + UUID id = UUID.randomUUID(); + String correlationId = id.toString(); + + TextMessage message = (TextMessage) messageConverter.toMessage(input, session); + message.setJMSReplyTo(replyQueue); + message.setJMSCorrelationID(correlationId); + String messageSelector = "JMSCorrelationID = '" + correlationId + "'"; + + MessageConsumer replyConsumer = session.createConsumer(replyQueue,messageSelector); + messageProducer.send(message, javax.jms.DeliveryMode.PERSISTENT, javax.jms.Message.DEFAULT_PRIORITY, 15000); + + Message replyMessage = replyConsumer.receive(); + + return (RuntimeEnvironmentOutput) outputMessageConverter.fromMessage(replyMessage); + } catch (Exception je) { + throw new RuntimeManagerException(je); + } + } + + + + protected final JmsTemplate getJmsTemplate() { + return (this.jmsTemplate); + } + + protected final JmsTemplate getOutputJmsTemplate() { + return (this.jmsOutputTemplate); + } + + @Override + public void afterPropertiesSet() throws Exception { + Assert.notNull(this.jmsTemplate, "JmsTemplate instance can not be null. See the Spring configuration file context."); + } +} diff --git a/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/service/impl/SignalEventServiceImpl.java b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/service/impl/SignalEventServiceImpl.java new file mode 100644 index 0000000..bb5c5db --- /dev/null +++ b/cit-esi-listener-api/src/main/java/br/com/centralit/esi/api/signal/service/impl/SignalEventServiceImpl.java @@ -0,0 +1,133 @@ +package br.com.centralit.esi.api.signal.service.impl; + +import java.util.List; +import java.util.UUID; + +import javax.jms.JMSException; +import javax.jms.Message; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import br.com.centralit.esi.api.business.model.BusinessProcess; +import br.com.centralit.esi.api.business.service.BusinessProcessService; +import br.com.centralit.esi.api.design.model.FlowElement; +import br.com.centralit.esi.api.design.model.event.Event; +import br.com.centralit.esi.api.design.model.event.SignalEvent; +import br.com.centralit.esi.api.design.service.FlowElementService; +import br.com.centralit.esi.api.enumerated.RuntimeActionEnum; +import br.com.centralit.esi.api.execution.model.WorkItem; +import br.com.centralit.esi.api.execution.service.WorkItemService; +import br.com.centralit.esi.api.log.service.RuntimeLogService; +import br.com.centralit.esi.api.scheduler.EventScheduler; +import br.com.centralit.esi.api.security.service.SecurityService; +import br.com.centralit.esi.api.signal.service.SignalEventService; +import br.com.centralit.esi.exception.EsiControlledException; +import br.com.centralit.esi.exception.RuntimeManagerException; +import br.com.centralit.framework.esi.enumerated.EventTargetEnum; +import br.com.centralit.framework.esi.environment.SignalEventInput; +import br.com.centralit.framework.util.UtilString; + +@Service("signalEventService") +public class SignalEventServiceImpl implements SignalEventService { + + @Autowired + protected RuntimeLogService runtimeLogService; + + @Autowired + protected EventScheduler eventScheduler; + + @SuppressWarnings("rawtypes") + @Autowired + protected WorkItemService workItemService; + + @Autowired + protected FlowElementService flowElementService; + + @Autowired + protected BusinessProcessService businessProcessService; + + @Autowired + protected SecurityService securityService; + + + @SuppressWarnings("unchecked") + @Override + public void receive(SignalEventInput input, Message message) { + this.validateInput(input); + + String correlationId = null; + try { + correlationId = message.getJMSCorrelationID(); + } catch (JMSException e) { + } + + if (input.getEventTarget().equals(EventTargetEnum.PROCESS_INSTANCE)) { + List workItems = workItemService.retrieveAvailableEvents(input); + this.executeWorkItems(input, correlationId, workItems); + }else{ + List elements = flowElementService.retrieveSignalEvents(input); + this.startProcess(input, correlationId, elements); + } + } + + private void startProcess(SignalEventInput input, String correlationId, List elements) { + if (elements != null) { + for (FlowElement flowElement : elements) { + if (!((Event) flowElement).isCatchEvent()) { + continue; + } + if (input.getEventName() == null) { + input.setEventName(((SignalEvent) flowElement).getName()); + } + eventScheduler.schedulerSignalEvent((SignalEvent) flowElement, input, correlationId, null); + } + } + } + + private void executeWorkItems(SignalEventInput input, String correlationId, List workItems) { + if (workItems != null) { + for (WorkItem workItem : workItems) { + eventScheduler.schedulerSignalEvent((SignalEvent) workItem.getFlowElement(), input, correlationId, workItem.getId()); + } + } + } + + private void validateInput(SignalEventInput input) { + try { + if (input.getEventTarget() == null) { + if (!UtilString.isNullOrEmpty(input.getBusinessProcessName())) { + input.setEventTarget(EventTargetEnum.BUSINESS_PROCESS); + }else if (!UtilString.isNullOrEmpty(input.getFlowName())) { + input.setEventTarget(EventTargetEnum.FLOW_ELEMENT); + } + if (input.getEventTarget() == null) { + throw new EsiControlledException("Alvo não informado"); + } + }else if (input.getEventTarget().equals(EventTargetEnum.FLOW_ELEMENT) && UtilString.isNullOrEmpty(input.getFlowName())) { + throw new RuntimeManagerException("Nome do fluxo não informado"); + }else if (input.getEventTarget().equals(EventTargetEnum.BUSINESS_PROCESS) && UtilString.isNullOrEmpty(input.getBusinessProcessName())) { + throw new EsiControlledException("Nome do processo de negócio não informado"); + } + + if (input.getEventTarget().equals(EventTargetEnum.BUSINESS_PROCESS)) { + BusinessProcess businessProcess = businessProcessService.findByName(input.getBusinessProcessName()); + if (businessProcess == null) { + throw new EsiControlledException("Processo de negócio não encontrado"); + } + input.setEventTarget(EventTargetEnum.BUSINESS_PROCESS); + input.setBusinessProcessId(businessProcess.getId()); + input.setFlowName(businessProcess.getFlow().getName()); + } + if (input.getUuid() == null) { + input.setUuid(UUID.randomUUID().toString()); + } + } catch (EsiControlledException e) { + runtimeLogService.create(RuntimeActionEnum.SIGNAL_EVENT, e, securityService.getAuthenticatedUser(), input, null, null); + throw e; + }catch (Exception e) { + runtimeLogService.create(RuntimeActionEnum.SIGNAL_EVENT, e, securityService.getAuthenticatedUser(), input, null, null); + throw new EsiControlledException(e); + } + } +} diff --git a/cit-esi-listener-api/src/main/resources/.gitignore b/cit-esi-listener-api/src/main/resources/.gitignore new file mode 100644 index 0000000..53a7042 --- /dev/null +++ b/cit-esi-listener-api/src/main/resources/.gitignore @@ -0,0 +1 @@ +/*.tag diff --git a/cit-esi-listener-web/pom.xml b/cit-esi-listener-web/pom.xml new file mode 100644 index 0000000..5caa0f8 --- /dev/null +++ b/cit-esi-listener-web/pom.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + 4.0.0 + + + br.com.centralit + cit-esi-listener + 1.8.0-SNAPSHOT + + + cit-esi-listener-web + war + cit-esi-listener-web + + + ${project.parent.parent.parent.basedir}/filterfile.xml + ${project.parent.parent.basedir}/src/licensing + package + prepare-package + + + + + br.com.centralit + cit-esi-listener-api + + + + diff --git a/cit-esi-listener-web/src/main/java/br/com/centralit/controller/RuntimeManagerController.java b/cit-esi-listener-web/src/main/java/br/com/centralit/controller/RuntimeManagerController.java new file mode 100644 index 0000000..2e68edc --- /dev/null +++ b/cit-esi-listener-web/src/main/java/br/com/centralit/controller/RuntimeManagerController.java @@ -0,0 +1,145 @@ +package br.com.centralit.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import br.com.centralit.esi.api.business.service.BusinessRuleManager; +import br.com.centralit.esi.api.design.model.FlowVersion; +import br.com.centralit.esi.api.design.service.FlowVersionService; +import br.com.centralit.esi.api.execution.service.ProcessInstanceService; +import br.com.centralit.esi.api.execution.service.WorkItemAssignmentService; +import br.com.centralit.esi.api.execution.service.WorkItemService; +import br.com.centralit.esi.api.router.service.RouterService; +import br.com.centralit.esi.api.runtime.RuntimeEnvironmentInput; +import br.com.centralit.esi.api.scheduler.EventScheduler; +import br.com.centralit.framework.controller.GenericController; +import br.com.centralit.framework.esi.environment.SignalEventInput; +import br.com.centralit.framework.json.ResponseBodyWrapper; +import br.com.centralit.framework.json.Views; +import br.com.centralit.framework.json.Views.GenericView; + +@Controller +@RequestMapping("/rest/esi") +public class RuntimeManagerController extends GenericController{ + + @Autowired + private RouterService runtimeManager; + + @Autowired + private WorkItemService workItemService; + + @Autowired + private WorkItemAssignmentService workItemAssignmentService; + + @Autowired + private ProcessInstanceService processInstanceService; + + @Autowired + private BusinessRuleManager businessRuleManager; + + @Autowired + private EventScheduler eventScheduler; + + @Autowired + public RuntimeManagerController(FlowVersionService flowVersionService) { + super(flowVersionService); + } + + @RequestMapping(value = "/start", method = RequestMethod.POST) + @ResponseBody + public ResponseBodyWrapper start(@RequestBody RuntimeEnvironmentInput input) { + return new ResponseBodyWrapper(runtimeManager.start(input), getEditView()); + } + + @RequestMapping(value = "/task/capture", method = RequestMethod.POST) + @ResponseBody + public ResponseBodyWrapper captureTask(@RequestBody RuntimeEnvironmentInput runtimeEnvironment) { + return new ResponseBodyWrapper(runtimeManager.captureTask(runtimeEnvironment), getEditView()); + } + + @RequestMapping(value = "/task/complete", method = RequestMethod.POST) + @ResponseBody + public ResponseBodyWrapper completeTask(@RequestBody RuntimeEnvironmentInput runtimeEnvironment) { + return new ResponseBodyWrapper(runtimeManager.completeTask(runtimeEnvironment), getEditView()); + } + + @RequestMapping(value = "/execute/{flowName}", method = RequestMethod.GET) + @ResponseBody + public ResponseBodyWrapper execute(@PathVariable("flowName") String flowName, @RequestParam("response") final String[] response, @RequestParam(value="variables",required = false) final String[] variables) { + return new ResponseBodyWrapper(runtimeManager.execute(flowName, response, variables), Views.GenericView.class); + } + + @RequestMapping(value = "/signalEvent", method = RequestMethod.POST) + @ResponseBody + public ResponseBodyWrapper signalEvent(@RequestBody SignalEventInput signalEventInput) { + return new ResponseBodyWrapper(runtimeManager.signalEvent(signalEventInput), getEditView()); + } + + @RequestMapping(value = "/schedule", method = RequestMethod.POST) + @ResponseBody + public ResponseBodyWrapper schedule(@RequestBody RuntimeEnvironmentInput input) { + eventScheduler.schedule(input.getJobName(), input.getCronExpression(), input); + return new ResponseBodyWrapper(null, getEditView()); + } + + @RequestMapping(value = "/removeSchedule", method = RequestMethod.POST) + @ResponseBody + public ResponseBodyWrapper removeSchedule(@RequestBody RuntimeEnvironmentInput input) { + eventScheduler.removeSchedule(input.getJobName()); + return new ResponseBodyWrapper(null, getEditView()); + } + + @RequestMapping(value = "/rule/execute", method = RequestMethod.POST) + @ResponseBody + public ResponseBodyWrapper executeBusinessRule(@RequestBody RuntimeEnvironmentInput input) { + return new ResponseBodyWrapper(businessRuleManager.execute(input), null); + } + + @RequestMapping(value = "/task/delegate", method = RequestMethod.POST) + @ResponseBody + public ResponseBodyWrapper delegateUserTask(@RequestBody RuntimeEnvironmentInput input) { + return new ResponseBodyWrapper(runtimeManager.delegateUserTask(input), getEditView()); + } + + @RequestMapping(value = "/task/removeDelegation", method = RequestMethod.POST) + @ResponseBody + public ResponseBodyWrapper removeUserTaskDelegation(@RequestBody RuntimeEnvironmentInput input) { + return new ResponseBodyWrapper(runtimeManager.removeUserTaskDelegation(input), getEditView()); + } + + @RequestMapping(value = "/instance/suspend", method = RequestMethod.POST) + @ResponseBody + public ResponseBodyWrapper suspendProcessInstance(@RequestBody RuntimeEnvironmentInput input) { + return new ResponseBodyWrapper(runtimeManager.suspendProcessInstance(input), getEditView()); + } + + @RequestMapping(value = "/instance/restart", method = RequestMethod.POST) + @ResponseBody + public ResponseBodyWrapper restartProcessInstance(@RequestBody RuntimeEnvironmentInput input) { + return new ResponseBodyWrapper(runtimeManager.restartProcessInstance(input), getEditView()); + } + + @RequestMapping(value = "/instance/reopen", method = RequestMethod.POST) + @ResponseBody + public ResponseBodyWrapper reopenProcessInstance(@RequestBody RuntimeEnvironmentInput input) { + return new ResponseBodyWrapper(runtimeManager.reopenProcessInstance(input), getEditView()); + } + + @Override + public Class getEditView() { + return Views.EsiEditView.class; + } + + @Override + public Class getListView() { + return Views.EsiListView.class; + } + +} + diff --git a/cit-esi-listener-web/src/main/java/br/com/centralit/listener/StartupListenerEsiListener.java b/cit-esi-listener-web/src/main/java/br/com/centralit/listener/StartupListenerEsiListener.java new file mode 100644 index 0000000..b2156bd --- /dev/null +++ b/cit-esi-listener-web/src/main/java/br/com/centralit/listener/StartupListenerEsiListener.java @@ -0,0 +1,73 @@ +package br.com.centralit.listener; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.stereotype.Component; + +import br.com.centralit.esi.api.parameter.model.Parameter; +import br.com.centralit.esi.api.parameter.service.ParameterService; +import br.com.centralit.esi.api.scheduler.EventScheduler; +import br.com.centralit.esi.api.util.EsiAppUtils; +import br.com.centralit.framework.model.UtilStartup; + +/** + *

+ * + *

+ * + *

+ * Company: Central IT - Governança Corporativa - + *

+ * + *

+ * Title: + *

+ * + *

+ * Description: + *

+ * + *

+ * Iniciativa(s): NUMERO_INICIATIVA + *

+ * + *

+ * Regra(s) de negócio: NUMERO_REGRA_DE_NEGOCIO + *

+ * + * @since 29/05/2015 - 18:05:54 + * + * @version 1.0.0 + * + * @author carlos.alberto + * + */ +@Component +public class StartupListenerEsiListener extends UtilStartup implements ApplicationListener { + + @Autowired + private EventScheduler eventScheduler; + + @Autowired + private ParameterService parameterService; + + /** + * + */ + @Override + public void onApplicationEvent(final ContextRefreshedEvent event) { + eventScheduler.initialize(); + + List parameters = parameterService.findAll(); + if (parameters != null && parameters.size() > 0) { + for (Parameter parameter : parameters) { + EsiAppUtils.updateParameter(parameter); + } + } + + } + +} diff --git a/cit-esi-listener-web/src/main/resources/.gitignore b/cit-esi-listener-web/src/main/resources/.gitignore new file mode 100644 index 0000000..53a7042 --- /dev/null +++ b/cit-esi-listener-web/src/main/resources/.gitignore @@ -0,0 +1 @@ +/*.tag diff --git a/cit-esi-listener-web/src/main/resources/log4j.properties b/cit-esi-listener-web/src/main/resources/log4j.properties new file mode 100644 index 0000000..7ba7fc7 --- /dev/null +++ b/cit-esi-listener-web/src/main/resources/log4j.properties @@ -0,0 +1,22 @@ +# Root logger option +log4j.rootLogger=INFO, file, stdout + +# Direct log messages to a log file +log4j.appender.file=org.apache.log4j.RollingFileAppender +log4j.appender.file.File=${project.build.directory}/log/${project.name}.log +log4j.appender.file.MaxFileSize=5MB +log4j.appender.file.MaxBackupIndex=10 +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + +# Direct log messages to stdout +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + +#Frameworks to logging +log4j.logger.org.springframework=DEBUG +log4j.logger.org.hibernate.engine.internal.StatefulPersistenceContext=ERROR +log4j.logger.org.hibernate=INFO +log4j.logger.org.hibernate.type=trace diff --git a/cit-esi-listener-web/src/main/resources/metadata/idp.xml b/cit-esi-listener-web/src/main/resources/metadata/idp.xml new file mode 100644 index 0000000..d0a8162 --- /dev/null +++ b/cit-esi-listener-web/src/main/resources/metadata/idp.xml @@ -0,0 +1,78 @@ + + + + + + + MIIDUjCCAjqgAwIBAgIEUOLIQTANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQGEwJGSTEQMA4GA1UE + CBMHVXVzaW1hYTERMA8GA1UEBxMISGVsc2lua2kxGDAWBgNVBAoTD1JNNSBTb2Z0d2FyZSBPeTEM + MAoGA1UECwwDUiZEMQ8wDQYDVQQDEwZhcG9sbG8wHhcNMTMwMTAxMTEyODAxWhcNMjIxMjMwMTEy + ODAxWjBrMQswCQYDVQQGEwJGSTEQMA4GA1UECBMHVXVzaW1hYTERMA8GA1UEBxMISGVsc2lua2kx + GDAWBgNVBAoTD1JNNSBTb2Z0d2FyZSBPeTEMMAoGA1UECwwDUiZEMQ8wDQYDVQQDEwZhcG9sbG8w + ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCXqP0wqL2Ai1haeTj0alwsLafhrDtUt00E + 5xc7kdD7PISRA270ZmpYMB4W24Uk2QkuwaBp6dI/yRdUvPfOT45YZrqIxMe2451PAQWtEKWF5Z13 + F0J4/lB71TtrzyH94RnqSHXFfvRN8EY/rzuEzrpZrHdtNs9LRyLqcRTXMMO4z7QghBuxh3K5gu7K + qxpHx6No83WNZj4B3gvWLRWv05nbXh/F9YMeQClTX1iBNAhLQxWhwXMKB4u1iPQ/KSaal3R26pON + UUmu1qVtU1quQozSTPD8HvsDqGG19v2+/N3uf5dRYtvEPfwXN3wIY+/R93vBA6lnl5nTctZIRsyg + 0Gv5AgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAFQwAAYUjso1VwjDc2kypK/RRcB8bMAUUIG0hLGL + 82IvnKouGixGqAcULwQKIvTs6uGmlgbSG6Gn5ROb2mlBztXqQ49zRvi5qWNRttir6eyqwRFGOM6A + 8rxj3Jhxi2Vb/MJn7XzeVHHLzA1sV5hwl/2PLnaL2h9WyG9QwBbwtmkMEqUt/dgixKb1Rvby/tBu + RogWgPONNSACiW+Z5o8UdAOqNMZQozD/i1gOjBXoF0F5OksjQN7xoQZLj9xXefxCFQ69FPcFDeEW + bHwSoBy5hLPNALaEUoa5zPDwlixwRjFQTc5XXaRpgIjy/2gsL8+Y5QRhyXnLqgO67BlLYW/GuHE= + + + + + + + + + MIIDUjCCAjqgAwIBAgIEUOLIQTANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQGEwJGSTEQMA4GA1UE + CBMHVXVzaW1hYTERMA8GA1UEBxMISGVsc2lua2kxGDAWBgNVBAoTD1JNNSBTb2Z0d2FyZSBPeTEM + MAoGA1UECwwDUiZEMQ8wDQYDVQQDEwZhcG9sbG8wHhcNMTMwMTAxMTEyODAxWhcNMjIxMjMwMTEy + ODAxWjBrMQswCQYDVQQGEwJGSTEQMA4GA1UECBMHVXVzaW1hYTERMA8GA1UEBxMISGVsc2lua2kx + GDAWBgNVBAoTD1JNNSBTb2Z0d2FyZSBPeTEMMAoGA1UECwwDUiZEMQ8wDQYDVQQDEwZhcG9sbG8w + ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCXqP0wqL2Ai1haeTj0alwsLafhrDtUt00E + 5xc7kdD7PISRA270ZmpYMB4W24Uk2QkuwaBp6dI/yRdUvPfOT45YZrqIxMe2451PAQWtEKWF5Z13 + F0J4/lB71TtrzyH94RnqSHXFfvRN8EY/rzuEzrpZrHdtNs9LRyLqcRTXMMO4z7QghBuxh3K5gu7K + qxpHx6No83WNZj4B3gvWLRWv05nbXh/F9YMeQClTX1iBNAhLQxWhwXMKB4u1iPQ/KSaal3R26pON + UUmu1qVtU1quQozSTPD8HvsDqGG19v2+/N3uf5dRYtvEPfwXN3wIY+/R93vBA6lnl5nTctZIRsyg + 0Gv5AgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAFQwAAYUjso1VwjDc2kypK/RRcB8bMAUUIG0hLGL + 82IvnKouGixGqAcULwQKIvTs6uGmlgbSG6Gn5ROb2mlBztXqQ49zRvi5qWNRttir6eyqwRFGOM6A + 8rxj3Jhxi2Vb/MJn7XzeVHHLzA1sV5hwl/2PLnaL2h9WyG9QwBbwtmkMEqUt/dgixKb1Rvby/tBu + RogWgPONNSACiW+Z5o8UdAOqNMZQozD/i1gOjBXoF0F5OksjQN7xoQZLj9xXefxCFQ69FPcFDeEW + bHwSoBy5hLPNALaEUoa5zPDwlixwRjFQTc5XXaRpgIjy/2gsL8+Y5QRhyXnLqgO67BlLYW/GuHE= + + + + + + + + urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + + + urn:oasis:names:tc:SAML:2.0:nameid-format:transient + + + urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + + + urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + + + urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName + + + + + \ No newline at end of file diff --git a/cit-esi-listener-web/src/main/resources/security/samlKeystore.jks b/cit-esi-listener-web/src/main/resources/security/samlKeystore.jks new file mode 100644 index 0000000..7552eb0 Binary files /dev/null and b/cit-esi-listener-web/src/main/resources/security/samlKeystore.jks differ diff --git a/cit-esi-listener-web/src/main/resources/spring/applicationContext.xml b/cit-esi-listener-web/src/main/resources/spring/applicationContext.xml new file mode 100644 index 0000000..ec2154f --- /dev/null +++ b/cit-esi-listener-web/src/main/resources/spring/applicationContext.xml @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${broker.url} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cit-esi-listener-web/src/main/resources/spring/security.properties b/cit-esi-listener-web/src/main/resources/spring/security.properties new file mode 100644 index 0000000..f94a0b7 --- /dev/null +++ b/cit-esi-listener-web/src/main/resources/spring/security.properties @@ -0,0 +1,6 @@ +/html/**=ROLE_USER +/admin/**=ROLE_ADMIN,ROLE_MANAGER +/admin/userPreference/**=ROLE_MANAGER +/admin/userPreference/updatePreference.action=ROLE_USER,ROLE_ASSOCIATE +/admin/userPreference/deletePreference.action=ROLE_USER +/html/dominio/**=ROLE_ADMIN diff --git a/cit-esi-listener-web/src/main/resources/spring/spring-security-cas.xml b/cit-esi-listener-web/src/main/resources/spring/spring-security-cas.xml new file mode 100644 index 0000000..6ccd942 --- /dev/null +++ b/cit-esi-listener-web/src/main/resources/spring/spring-security-cas.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + authorities + + + + + diff --git a/cit-esi-listener-web/src/main/resources/spring/spring-security-db.xml b/cit-esi-listener-web/src/main/resources/spring/spring-security-db.xml new file mode 100644 index 0000000..1f3e818 --- /dev/null +++ b/cit-esi-listener-web/src/main/resources/spring/spring-security-db.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cit-esi-listener-web/src/main/resources/spring/spring-security-openam.xml b/cit-esi-listener-web/src/main/resources/spring/spring-security-openam.xml new file mode 100644 index 0000000..f243dab --- /dev/null +++ b/cit-esi-listener-web/src/main/resources/spring/spring-security-openam.xml @@ -0,0 +1,372 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://iam.cit.local:8080/openam/saml2/jsp/exportmetadata.jsp?realm=grp + + + + 15000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cit-esi-listener-web/src/main/resources/spring/webmvc-context.xml b/cit-esi-listener-web/src/main/resources/spring/webmvc-context.xml new file mode 100644 index 0000000..6d7d608 --- /dev/null +++ b/cit-esi-listener-web/src/main/resources/spring/webmvc-context.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cit-esi-listener-web/src/main/webapp/WEB-INF/jboss-deployment-structure.xml b/cit-esi-listener-web/src/main/webapp/WEB-INF/jboss-deployment-structure.xml new file mode 100644 index 0000000..be86dea --- /dev/null +++ b/cit-esi-listener-web/src/main/webapp/WEB-INF/jboss-deployment-structure.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/cit-esi-listener-web/src/main/webapp/WEB-INF/jboss-web.xml b/cit-esi-listener-web/src/main/webapp/WEB-INF/jboss-web.xml new file mode 100644 index 0000000..ccd369f --- /dev/null +++ b/cit-esi-listener-web/src/main/webapp/WEB-INF/jboss-web.xml @@ -0,0 +1,3 @@ + + /cit-esi-listener-web + \ No newline at end of file diff --git a/cit-esi-listener-web/src/main/webapp/WEB-INF/web.xml b/cit-esi-listener-web/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..602de71 --- /dev/null +++ b/cit-esi-listener-web/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,109 @@ + + + BPE/ESI + + 600 + + + org.springframework.web.context.request.RequestContextListener + + + org.springframework.web.context.ContextLoaderListener + + + contextConfigLocation + + /WEB-INF/classes/spring/applicationContext.xml + + + + + + contextInitializerClasses + br.com.centralit.framework.util.CustomApplicationContextInitializer + + + propertiesFile + classpath:cit-app.properties + + + propertiesFileLoadOrder + FIRST + + + + + + + + openSessionInViewFilter + org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter + + + openSessionInViewFilter + *.json + + + + encoding-filter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + + encoding-filter + /* + + + + CAS Single Sign Out Filter + org.jasig.cas.client.session.SingleSignOutFilter + + + + CAS Single Sign Out Filter + /* + + + + org.jasig.cas.client.session.SingleSignOutHttpSessionListener + + + + springSecurityFilterChain + org.springframework.web.filter.DelegatingFilterProxy + + + springSecurityFilterChain + /* + + + + + cors + br.com.centralit.framework.filter.SimpleCORSFilter + + + + cors + /* + + + + spring + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + + + + + spring + / + + \ No newline at end of file diff --git a/cit-esi-listener-web/src/main/webapp/assets/js/angular/custom/.gitignore b/cit-esi-listener-web/src/main/webapp/assets/js/angular/custom/.gitignore new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/cit-esi-listener-web/src/main/webapp/assets/js/angular/custom/.gitignore diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..985460a --- /dev/null +++ b/pom.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + 4.0.0 + + + br.com.centralit + citsmart-grp-modules + 1.8.0-SNAPSHOT + ../cit-grp-modules + + + cit-esi-listener + pom + cit-esi-listener + + + ${project.parent.parent.basedir}/filterfile.xml + ${project.parent.basedir}/src/licensing + + + + + + + br.com.centralit + cit-esi-listener-web + ${project.version} + + + br.com.centralit + cit-esi-listener-api + ${project.version} + + + + + + cit-esi-listener-web + cit-esi-listener-api + + + \ No newline at end of file -- libgit2 0.21.2