package br.com.centralit.bpm.servico;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import br.com.centralit.bpm.dto.ElementoFluxoDTO;
import br.com.centralit.bpm.dto.ElementoFluxoInicioDTO;
import br.com.centralit.bpm.dto.ElementoFluxoRaiaDTO;
import br.com.centralit.bpm.dto.FluxoDTO;
import br.com.centralit.bpm.dto.SequenciaFluxoDTO;
import br.com.centralit.bpm.dto.TipoFluxoDTO;
import br.com.centralit.bpm.integracao.ElementoFluxoDao;
import br.com.centralit.bpm.integracao.ElementoFluxoEmailDao;
import br.com.centralit.bpm.integracao.ElementoFluxoEventoDao;
import br.com.centralit.bpm.integracao.ElementoFluxoFinalizacaoDao;
import br.com.centralit.bpm.integracao.ElementoFluxoInicioDao;
import br.com.centralit.bpm.integracao.ElementoFluxoPortaDao;
import br.com.centralit.bpm.integracao.ElementoFluxoScriptDao;
import br.com.centralit.bpm.integracao.ElementoFluxoTarefaDao;
import br.com.centralit.bpm.integracao.FluxoDao;
import br.com.centralit.bpm.integracao.InstanciaFluxoDao;
import br.com.centralit.bpm.integracao.SequenciaFluxoDao;
import br.com.centralit.bpm.integracao.TipoFluxoDao;
import br.com.centralit.bpm.util.Enumerados.TipoElementoFluxo;
import br.com.citframework.dto.IDto;
import br.com.citframework.excecao.LogicException;
import br.com.citframework.excecao.PersistenceException;
import br.com.citframework.excecao.ServiceException;
import br.com.citframework.integracao.TransactionControler;
import br.com.citframework.integracao.TransactionControlerImpl;
import br.com.citframework.service.CrudServiceImpl;
import br.com.citframework.util.Reflexao;
import br.com.citframework.util.UtilDatas;
public class FluxoServiceEjb extends CrudServiceImpl implements FluxoService {
private FluxoDao dao;
@Override
protected FluxoDao getDao() {
if (dao == null) {
dao = new FluxoDao();
}
return dao;
}
@Override
protected void validaCreate(final Object arg0) throws Exception {
final FluxoDTO fluxoDto = (FluxoDTO) arg0;
if (fluxoDto.getIdTipoFluxo() == null) {
throw new LogicException("Tipo de fluxo n�o definido.");
}
if (fluxoDto.getDataInicio() == null) {
throw new LogicException("Data in�cio n�o definida.");
}
fluxoDto.setVersao("1.0");
}
@Override
protected void validaDelete(final Object arg0) throws Exception {
final FluxoDTO fluxoDto = (FluxoDTO) arg0;
final FluxoDTO fluxoAuxDto = (FluxoDTO) this.getDao().restore(fluxoDto);
if (fluxoAuxDto != null) {
final Collection colInstancias = new InstanciaFluxoDao().findByIdFluxo(fluxoAuxDto.getIdFluxo());
if (colInstancias != null && !colInstancias.isEmpty()) {
throw new LogicException("Fluxo '" + fluxoAuxDto.getDescricao() + "' n�o pode ser exclu�do. J� existem inst�ncias vinculadas.");
}
}
}
@Override
protected void validaFind(final Object arg0) throws Exception {}
@Override
protected void validaUpdate(final Object arg0) throws Exception {
final FluxoDTO fluxoDto = (FluxoDTO) arg0;
if (fluxoDto.getIdTipoFluxo() == null) {
throw new LogicException("Tipo de fluxo n�o definido.");
}
if (fluxoDto.getDataInicio() == null) {
throw new LogicException("Data in�cio n�o definida.");
}
}
@Override
public Collection listAll() throws Exception {
return this.getDao().listAll();
}
@Override
public FluxoDTO findByTipoFluxo(final Integer idTipoFluxo) throws Exception {
return this.getDao().findByTipoFluxo(idTipoFluxo);
}
private void criaElementos(final FluxoDTO fluxoDto, final TransactionControler tc) throws Exception {
if (fluxoDto.getInicioFluxo() == null) {
throw new LogicException("In�cio do fluxo n�o definido");
}
if (fluxoDto.getColFinalizacoes() == null || fluxoDto.getColFinalizacoes().isEmpty()) {
throw new LogicException("T�rmino do fluxo n�o definido");
}
if (fluxoDto.getColSequenciamentos() == null || fluxoDto.getColSequenciamentos().isEmpty()) {
throw new LogicException("O fluxo deve ter pelo menos uma liga��o entre elementos");
}
final ElementoFluxoInicioDao fluxoInicioDao = new ElementoFluxoInicioDao();
final ElementoFluxoFinalizacaoDao fluxoFinalizacaoDao = new ElementoFluxoFinalizacaoDao();
final ElementoFluxoTarefaDao fluxoTarefaDao = new ElementoFluxoTarefaDao();
final ElementoFluxoPortaDao fluxoPortaDao = new ElementoFluxoPortaDao();
final ElementoFluxoScriptDao fluxoScriptDao = new ElementoFluxoScriptDao();
final ElementoFluxoEmailDao fluxoEmailDao = new ElementoFluxoEmailDao();
final ElementoFluxoEventoDao fluxoEventoDao = new ElementoFluxoEventoDao();
final SequenciaFluxoDao fluxoSequenciaDao = new SequenciaFluxoDao();
fluxoInicioDao.setTransactionControler(tc);
fluxoFinalizacaoDao.setTransactionControler(tc);
fluxoTarefaDao.setTransactionControler(tc);
fluxoPortaDao.setTransactionControler(tc);
fluxoScriptDao.setTransactionControler(tc);
fluxoEmailDao.setTransactionControler(tc);
fluxoEventoDao.setTransactionControler(tc);
fluxoSequenciaDao.setTransactionControler(tc);
final Map<String, String> mapRaias = new HashMap<>();
final List<ElementoFluxoRaiaDTO> colRaias = fluxoDto.getColRaias();
if (colRaias != null) {
for (final ElementoFluxoRaiaDTO raiaDto : colRaias) {
if (raiaDto.getSiglaGrupo() != null && raiaDto.getSiglaGrupo().trim().length() > 0 && raiaDto.getIdElementosAgrupados() != null) {
for (final String elemento : raiaDto.getIdElementosAgrupados()) {
mapRaias.put(elemento, raiaDto.getSiglaGrupo());
}
}
}
}
if (fluxoDto.getIdFluxo() != null) {
fluxoSequenciaDao.deleteByIdFluxo(fluxoDto.getIdFluxo());
fluxoInicioDao.deleteByIdFluxo(fluxoDto.getIdFluxo());
fluxoTarefaDao.deleteByIdFluxo(fluxoDto.getIdFluxo());
fluxoScriptDao.deleteByIdFluxo(fluxoDto.getIdFluxo());
fluxoPortaDao.deleteByIdFluxo(fluxoDto.getIdFluxo());
fluxoEmailDao.deleteByIdFluxo(fluxoDto.getIdFluxo());
fluxoEventoDao.deleteByIdFluxo(fluxoDto.getIdFluxo());
fluxoFinalizacaoDao.deleteByIdFluxo(fluxoDto.getIdFluxo());
}
final Integer idFluxo = fluxoDto.getIdFluxo();
final Map<String, ElementoFluxoDTO> mapId = new HashMap<>();
ElementoFluxoDTO inicioDto = fluxoDto.getInicioFluxo();
if (inicioDto != null) {
inicioDto.setIdFluxo(idFluxo);
inicioDto = (ElementoFluxoDTO) fluxoInicioDao.create(inicioDto);
mapId.put(inicioDto.getIdDesenho(), inicioDto);
}
final List<ElementoFluxoDTO> colTarefas = fluxoDto.getColTarefas();
if (colTarefas != null) {
for (ElementoFluxoDTO tarefaDto : colTarefas) {
if (tarefaDto.getGrupos() == null || tarefaDto.getGrupos().trim().length() == 0) {
tarefaDto.setGrupos(mapRaias.get(tarefaDto.getIdDesenho()));
}
tarefaDto.setIdFluxo(idFluxo);
tarefaDto = (ElementoFluxoDTO) fluxoTarefaDao.create(tarefaDto);
mapId.put(tarefaDto.getIdDesenho(), tarefaDto);
}
}
final List<ElementoFluxoDTO> colScripts = fluxoDto.getColScripts();
if (colScripts != null) {
for (ElementoFluxoDTO scriptDto : colScripts) {
scriptDto.setIdFluxo(idFluxo);
scriptDto = (ElementoFluxoDTO) fluxoScriptDao.create(scriptDto);
mapId.put(scriptDto.getIdDesenho(), scriptDto);
}
}
final List<ElementoFluxoDTO> colEventos = fluxoDto.getColEventos();
if (colEventos != null) {
for (ElementoFluxoDTO eventoDto : colEventos) {
eventoDto.setIdFluxo(idFluxo);
eventoDto = (ElementoFluxoDTO) fluxoEventoDao.create(eventoDto);
mapId.put(eventoDto.getIdDesenho(), eventoDto);
}
}
final List<ElementoFluxoDTO> colEmails = fluxoDto.getColEmails();
if (colEmails != null) {
for (ElementoFluxoDTO emailDto : colEmails) {
emailDto.setIdFluxo(idFluxo);
emailDto = (ElementoFluxoDTO) fluxoEmailDao.create(emailDto);
mapId.put(emailDto.getIdDesenho(), emailDto);
}
}
final List<ElementoFluxoDTO> colPortas = fluxoDto.getColPortas();
if (colPortas != null) {
for (ElementoFluxoDTO decisaoDto : colPortas) {
decisaoDto.setIdFluxo(idFluxo);
decisaoDto = (ElementoFluxoDTO) fluxoPortaDao.create(decisaoDto);
mapId.put(decisaoDto.getIdDesenho(), decisaoDto);
}
}
final List<ElementoFluxoDTO> colFinalizacoes = fluxoDto.getColFinalizacoes();
if (colFinalizacoes != null) {
for (ElementoFluxoDTO finalizacaoDto : colFinalizacoes) {
finalizacaoDto.setIdFluxo(idFluxo);
finalizacaoDto = (ElementoFluxoDTO) fluxoFinalizacaoDao.create(finalizacaoDto);
mapId.put(finalizacaoDto.getIdDesenho(), finalizacaoDto);
}
}
final List<SequenciaFluxoDTO> colSequenciamentos = fluxoDto.getColSequenciamentos();
if (colSequenciamentos != null) {
for (SequenciaFluxoDTO sequenciaDto : colSequenciamentos) {
sequenciaDto.setIdFluxo(idFluxo);
ElementoFluxoDTO elementoDto = mapId.get(sequenciaDto.getIdDesenhoOrigem());
if (elementoDto != null) {
sequenciaDto.setIdElementoOrigem(elementoDto.getIdElemento());
}
elementoDto = mapId.get(sequenciaDto.getIdDesenhoDestino());
if (elementoDto != null) {
sequenciaDto.setIdElementoDestino(elementoDto.getIdElemento());
}
sequenciaDto = (SequenciaFluxoDTO) fluxoSequenciaDao.create(sequenciaDto);
}
}
}
@Override
public IDto create(final IDto model) throws ServiceException, LogicException {
final TransactionControler tc = new TransactionControlerImpl(this.getDao().getAliasDB());
try {
tc.start();
FluxoDTO fluxoDto = (FluxoDTO) model;
fluxoDto = this.create(fluxoDto, tc);
tc.commit();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
throw new ServiceException(e);
} finally {
tc.closeQuietly();
}
return model;
}
@Override
public void update(final IDto model) throws ServiceException, LogicException {
final FluxoDao fluxoDao = new FluxoDao();
final TipoFluxoDao tipoFluxoDao = new TipoFluxoDao();
final TransactionControler tc = new TransactionControlerImpl(fluxoDao.getAliasDB());
try {
this.validaUpdate(model);
tc.start();
fluxoDao.setTransactionControler(tc);
tipoFluxoDao.setTransactionControler(tc);
final FluxoDTO fluxoDto = (FluxoDTO) model;
fluxoDao.update(fluxoDto);
TipoFluxoDTO tipoFluxoDto = tipoFluxoDao.findByNome(fluxoDto.getNomeFluxo());
if (tipoFluxoDto != null && tipoFluxoDto.getIdTipoFluxo().intValue() != fluxoDto.getIdTipoFluxo().intValue()) {
throw new LogicException("J� existe um fluxo com esse nome");
}
tipoFluxoDto = new TipoFluxoDTO();
Reflexao.copyPropertyValues(fluxoDto, tipoFluxoDto);
tipoFluxoDao.update(tipoFluxoDto);
tc.commit();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
throw new ServiceException(e);
} finally {
tc.closeQuietly();
}
}
@Override
public FluxoDTO criaEstrutura(final FluxoDTO fluxoDto) throws Exception {
final FluxoDao fluxoDao = new FluxoDao();
final TransactionControler tc = new TransactionControlerImpl(new FluxoDao().getAliasDB());
try {
fluxoDao.setTransactionControler(tc);
tc.start();
/** Chamada do m�todo espec�fico que recupera o fluxo com os elementos. Opera��o Usain Bolt - 27.01.2015 - carlos.santos */
fluxoDao.restoreComEstrutura(fluxoDto);
this.criaEstrutura(fluxoDto, tc);
tc.commit();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
throw new ServiceException(e);
} finally {
tc.closeQuietly();
}
return fluxoDto;
}
@Override
public FluxoDTO criaFluxoEEstrutura(FluxoDTO fluxoDto) throws Exception {
final TipoFluxoDao tipoFluxoDao = new TipoFluxoDao();
TipoFluxoDTO tipoFluxoDto = tipoFluxoDao.findByNome(fluxoDto.getNomeFluxo());
if (tipoFluxoDto != null) {
throw new LogicException("J� existe um fluxo com esse nome");
}
final TransactionControler tc = new TransactionControlerImpl(new FluxoDao().getAliasDB());
final FluxoDao fluxoDao = new FluxoDao();
try {
fluxoDao.setTransactionControler(tc);
tipoFluxoDao.setTransactionControler(tc);
tc.start();
tipoFluxoDto = new TipoFluxoDTO();
tipoFluxoDto.setNomeFluxo(fluxoDto.getNomeFluxo());
tipoFluxoDto.setDescricao(fluxoDto.getDescricao());
tipoFluxoDto.setNomeClasseFluxo(fluxoDto.getNomeClasseFluxo());
tipoFluxoDto = (TipoFluxoDTO) tipoFluxoDao.create(tipoFluxoDto);
fluxoDto.setDataInicio(UtilDatas.getDataAtual());
fluxoDto.setVersao("1.0");
fluxoDto.setIdTipoFluxo(tipoFluxoDto.getIdTipoFluxo());
fluxoDto = (FluxoDTO) fluxoDao.create(fluxoDto);
this.criaEstrutura(fluxoDto, tc);
tc.commit();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
throw new ServiceException(e);
} finally {
tc.closeQuietly();
}
return fluxoDto;
}
public FluxoDTO create(FluxoDTO fluxoDto, final TransactionControler tc) throws Exception {
final FluxoDao fluxoDao = new FluxoDao();
final TipoFluxoDao tipoFluxoDao = new TipoFluxoDao();
fluxoDao.setTransactionControler(tc);
tipoFluxoDao.setTransactionControler(tc);
// Executa operacoes pertinentes ao negocio.
fluxoDto.setDataInicio(UtilDatas.getDataAtual());
fluxoDto.setVersao("1.0");
TipoFluxoDTO tipoFluxoDto = tipoFluxoDao.findByNome(fluxoDto.getNomeFluxo());
if (fluxoDto.getIdTipoFluxo() == null) {
if (tipoFluxoDto != null) {
throw new LogicException("J� existe um fluxo com esse nome");
}
tipoFluxoDto = new TipoFluxoDTO();
tipoFluxoDto.setNomeFluxo(fluxoDto.getNomeFluxo());
tipoFluxoDto.setDescricao(fluxoDto.getDescricao());
tipoFluxoDto.setNomeClasseFluxo(fluxoDto.getNomeClasseFluxo());
tipoFluxoDto = (TipoFluxoDTO) tipoFluxoDao.create(tipoFluxoDto);
fluxoDto.setIdTipoFluxo(tipoFluxoDto.getIdTipoFluxo());
} else {
if (tipoFluxoDto != null && tipoFluxoDto.getIdTipoFluxo().intValue() != fluxoDto.getIdTipoFluxo().intValue()) {
throw new LogicException("J� existe um fluxo com esse nome");
}
tipoFluxoDto = new TipoFluxoDTO();
tipoFluxoDto.setNomeFluxo(fluxoDto.getNomeFluxo());
tipoFluxoDto.setIdTipoFluxo(fluxoDto.getIdTipoFluxo());
tipoFluxoDto.setDescricao(fluxoDto.getDescricao());
tipoFluxoDto.setNomeClasseFluxo(fluxoDto.getNomeClasseFluxo());
tipoFluxoDao.update(tipoFluxoDto);
}
fluxoDto = (FluxoDTO) fluxoDao.create(fluxoDto);
return fluxoDto;
}
private FluxoDTO criaEstrutura(FluxoDTO fluxoDto, final TransactionControler tc) throws Exception {
final FluxoDao fluxoDao = new FluxoDao();
final Collection<ElementoFluxoDTO> colElementos = fluxoDto.getColElementos();
final Collection<SequenciaFluxoDTO> colSeq = fluxoDto.getColSequenciamentos();
fluxoDao.setTransactionControler(tc);
FluxoDTO fluxoAuxDto = new FluxoDTO();
fluxoAuxDto.setIdFluxo(fluxoDto.getIdFluxo());
fluxoAuxDto = (FluxoDTO) fluxoDao.restore(fluxoAuxDto);
final Collection colInstancias = new InstanciaFluxoDao().findByIdFluxo(fluxoAuxDto.getIdFluxo());
if (colInstancias != null && !colInstancias.isEmpty()) {
fluxoAuxDto.setDataFim(UtilDatas.getDataAtual());
fluxoDao.update(fluxoAuxDto);
fluxoDto.setIdFluxo(null);
final Double versao = new Double(fluxoDto.getVersao()) + 1;
fluxoDto.setVersao(versao.toString());
fluxoDto.setDataInicio(UtilDatas.getDataAtual());
fluxoDto.setDataFim(null);
fluxoDto = (FluxoDTO) fluxoDao.create(fluxoDto);
}
ElementoFluxoInicioDTO elementoInicioDto = null;
final List<ElementoFluxoDTO> colTarefas = new ArrayList<>();
final List<ElementoFluxoDTO> colScripts = new ArrayList<>();
final List<ElementoFluxoDTO> colEventos = new ArrayList<>();
final List<ElementoFluxoDTO> colEmails = new ArrayList<>();
final List<ElementoFluxoDTO> colPortas = new ArrayList<>();
final List<ElementoFluxoDTO> colFinalizacoes = new ArrayList<>();
final List<SequenciaFluxoDTO> colSequencias = new ArrayList<>();
if (colElementos != null) {
for (final ElementoFluxoDTO elementoDto : colElementos) {
elementoDto.setIdDesenho("" + elementoDto.getIdElemento());
elementoDto.setIdElemento(null);
if (elementoDto.getTipoElemento().equalsIgnoreCase(TipoElementoFluxo.Tarefa.name())) {
if (elementoDto.getTipoInteracao() != null) {
if (elementoDto.getTipoInteracao().equalsIgnoreCase("U")) {
elementoDto.setUrl(elementoDto.getInteracao());
} else {
elementoDto.setVisao(elementoDto.getInteracao());
}
}
colTarefas.add(elementoDto);
} else if (elementoDto.getTipoElemento().equalsIgnoreCase(TipoElementoFluxo.Script.name())) {
colScripts.add(elementoDto);
} else if (elementoDto.getTipoElemento().equalsIgnoreCase(TipoElementoFluxo.Email.name())) {
colEmails.add(elementoDto);
} else if (elementoDto.getTipoElemento().equalsIgnoreCase(TipoElementoFluxo.Evento.name())) {
colEventos.add(elementoDto);
} else if (elementoDto.getTipoElemento().equalsIgnoreCase(TipoElementoFluxo.Porta.name())) {
colPortas.add(elementoDto);
} else if (elementoDto.getTipoElemento().equalsIgnoreCase(TipoElementoFluxo.Finalizacao.name())) {
colFinalizacoes.add(elementoDto);
} else if (elementoDto.getTipoElemento().equalsIgnoreCase(TipoElementoFluxo.Inicio.name())) {
elementoInicioDto = new ElementoFluxoInicioDTO();
Reflexao.copyPropertyValues(elementoDto, elementoInicioDto);
}
}
}
if (colSeq != null) {
for (final SequenciaFluxoDTO sequenciaDto : colSeq) {
sequenciaDto.setIdDesenhoOrigem("" + sequenciaDto.getIdElementoOrigem());
sequenciaDto.setIdDesenhoDestino("" + sequenciaDto.getIdElementoDestino());
if (sequenciaDto.getPosicaoAlterada() == null) {
sequenciaDto.setPosicaoAlterada("N");
}
colSequencias.add(sequenciaDto);
}
}
fluxoDto.setInicioFluxo(elementoInicioDto);
fluxoDto.setColTarefas(colTarefas);
fluxoDto.setColScripts(colScripts);
fluxoDto.setColEventos(colEventos);
fluxoDto.setColEmails(colEmails);
fluxoDto.setColPortas(colPortas);
fluxoDto.setColFinalizacoes(colFinalizacoes);
fluxoDto.setColSequenciamentos(colSequencias);
this.criaElementos(fluxoDto, tc);
return fluxoDto;
}
@Override
public void delete(final IDto model) throws ServiceException, LogicException {
final FluxoDao fluxoDao = new FluxoDao();
final ElementoFluxoDao elementoFluxoDao = new ElementoFluxoDao();
final SequenciaFluxoDao sequenciaFluxoDao = new SequenciaFluxoDao();
final TipoFluxoDao tipoFluxoDao = new TipoFluxoDao();
final TransactionControler tc = new TransactionControlerImpl(fluxoDao.getAliasDB());
try {
this.validaDelete(model);
tc.start();
fluxoDao.setTransactionControler(tc);
tipoFluxoDao.setTransactionControler(tc);
elementoFluxoDao.setTransactionControler(tc);
sequenciaFluxoDao.setTransactionControler(tc);
final FluxoDTO fluxoDto = (FluxoDTO) model;
sequenciaFluxoDao.deleteByIdFluxo(fluxoDto.getIdFluxo());
elementoFluxoDao.deleteAllByIdFluxo(fluxoDto.getIdFluxo());
fluxoDao.delete(fluxoDto);
TipoFluxoDTO tipoFluxoDto = new TipoFluxoDTO();
tipoFluxoDto.setIdTipoFluxo(fluxoDto.getIdTipoFluxo());
tipoFluxoDto = (TipoFluxoDTO) tipoFluxoDao.restore(tipoFluxoDto);
tipoFluxoDto.setNomeFluxo(tipoFluxoDto.getNomeFluxo() + "_EXCL_FLUXO_" + fluxoDto.getIdFluxo());
tipoFluxoDao.updateNotNull(tipoFluxoDto);
tc.commit();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
throw new ServiceException(e);
} finally {
tc.closeQuietly();
}
}
/**
* Restore do FluxoDTO com a estrutura.
*
* @param obj
* @return IDto - Fluxo com os Elementos.
* @throws PersistenceException
* @author carlos.santos
* @since 27.01.2015 - Opera��o Usain Bolt.
*/
public IDto restoreComEstrutura(final IDto obj) throws PersistenceException {
return getDao().restoreComEstrutura(obj);
}
}