package br.com.centralit.bpm.util; import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import br.com.centralit.bpm.dto.ElementoFluxoDTO; import br.com.centralit.bpm.dto.ElementoFluxoEmailDTO; import br.com.centralit.bpm.dto.ElementoFluxoFinalizacaoDTO; import br.com.centralit.bpm.dto.ElementoFluxoInicioDTO; import br.com.centralit.bpm.dto.ElementoFluxoPortaDTO; import br.com.centralit.bpm.dto.ElementoFluxoRaiaDTO; import br.com.centralit.bpm.dto.ElementoFluxoScriptDTO; import br.com.centralit.bpm.dto.ElementoFluxoTarefaDTO; import br.com.centralit.bpm.dto.FluxoDTO; import br.com.centralit.bpm.dto.SequenciaFluxoDTO; import br.com.citframework.util.UtilStrings; import br.com.citframework.util.UtilTratamentoArquivos; public class XmlFluxo { private static String prefixo = ""; public static void carregaTextoXml(final FluxoDTO fluxoDto) throws Exception { final InputStream ioos = new ByteArrayInputStream(fluxoDto.getConteudoXml().getBytes()); final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); final DocumentBuilder builder = factory.newDocumentBuilder(); final Document doc = builder.parse(ioos); carrega(doc, fluxoDto); } public static void carregaArquivoXml(final String nomeArquivo, final FluxoDTO fluxoDto) throws Exception { InputStream ioos = ClassLoader.getSystemResourceAsStream(nomeArquivo); if (ioos == null) { ioos = new FileInputStream(nomeArquivo); } final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); final DocumentBuilder builder = factory.newDocumentBuilder(); final Document doc = builder.parse(ioos); carrega(doc, fluxoDto); fluxoDto.setConteudoXml(UtilTratamentoArquivos.getStringTextFromFileTxt(nomeArquivo)); } public static void carrega(final Document doc, final FluxoDTO fluxoDto) throws Exception { if (doc == null) { return; } final List<ElementoFluxoDTO> tarefas = new ArrayList<>(); final List<SequenciaFluxoDTO> sequenciamentos = new ArrayList<>(); final List<ElementoFluxoDTO> portas = new ArrayList<>(); final List<ElementoFluxoDTO> scripts = new ArrayList<>(); final List<ElementoFluxoRaiaDTO> raias = new ArrayList<>(); final List<ElementoFluxoDTO> emails = new ArrayList<>(); final List<ElementoFluxoDTO> finalizacoes = new ArrayList<>(); String variaveis = ""; final Node noRoot = doc.getChildNodes().item(0); for (int j = 0; j < noRoot.getChildNodes().getLength(); j++) { final Node noItem = noRoot.getChildNodes().item(j); if (noItem.getNodeName().equals("#text")) { continue; } final String nodeName = noItem.getNodeName(); if (nodeName.indexOf(":process") > 0) { prefixo = nodeName.substring(0, nodeName.indexOf(":")); final NamedNodeMap map = noItem.getAttributes(); String nome = UtilStrings.nullToVazio(map.getNamedItem("name").getNodeValue()); nome = nome.replaceAll("\n", ""); fluxoDto.setNomeFluxo(nome.trim()); // fluxoDto.setVersao(UtilStrings.nullToVazio(map.getNamedItem("drools:version").getNodeValue())); for (int i = 0; i < noItem.getChildNodes().getLength(); i++) { final Node noItemParm = noItem.getChildNodes().item(i); if (noItemParm.getNodeName().equals("#text")) { continue; } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":property")) { final String str = carregaVariavel(noItemParm); if (str != null) { if (variaveis.length() > 0) { variaveis += ";"; } variaveis += str; } } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":startEvent")) { fluxoDto.setInicioFluxo(carregaInicioFluxo(noItemParm)); } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":laneSet")) { carregaRaia(noItemParm, raias); } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":sendTask")) { emails.add(carregaEmail(noItemParm)); } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":task")) { tarefas.add(carregaTarefa(noItemParm)); } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":scriptTask")) { final ElementoFluxoScriptDTO scriptDto = carregaScript(noItemParm); if (scriptDto != null) { scripts.add(scriptDto); } } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":exclusiveGateway") || noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":parallelGateway")) { portas.add(carregaPorta(noItemParm)); } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":endEvent")) { finalizacoes.add(carregaFinalizacao(noItemParm)); } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":sequenceFlow")) { sequenciamentos.add(carregaSequencia(noItemParm)); } } } } fluxoDto.setVariaveis(variaveis); fluxoDto.setColTarefas(tarefas); fluxoDto.setColPortas(portas); fluxoDto.setColScripts(scripts); fluxoDto.setColEmails(emails); fluxoDto.setColRaias(raias); fluxoDto.setColFinalizacoes(finalizacoes); fluxoDto.setColSequenciamentos(sequenciamentos); } private static String carregaVariavel(final Node noItem) { if (!noItem.getNodeName().equalsIgnoreCase(prefixo + ":property")) { return null; } final NamedNodeMap mapItem = noItem.getAttributes(); return UtilStrings.nullToVazio(mapItem.getNamedItem("id").getNodeValue()); } private static ElementoFluxoTarefaDTO carregaTarefa(final Node noItem) throws Exception { if (!noItem.getNodeName().equalsIgnoreCase(prefixo + ":task")) { return null; } final NamedNodeMap map = noItem.getAttributes(); final ElementoFluxoTarefaDTO tarefaDto = new ElementoFluxoTarefaDTO(); tarefaDto.setIdDesenho(UtilStrings.nullToVazio(map.getNamedItem("id").getNodeValue())); tarefaDto.setNome(UtilStrings.nullToVazio(map.getNamedItem("name").getNodeValue()).replaceAll("\n", "")); final String id[] = UtilStrings.nullToVazio(map.getNamedItem("drools:taskName").getNodeValue()).split(":"); if (id.length > 0) { if (id[0].equalsIgnoreCase("visao")) { tarefaDto.setTipoInteracao(Enumerados.INTERACAO_VISAO); tarefaDto.setVisao(id[1].trim()); } else if (id[0].equalsIgnoreCase("url")) { tarefaDto.setTipoInteracao(Enumerados.INTERACAO_URL); tarefaDto.setUrl(id[1].trim()); } } final List<String> usuarios = new ArrayList<>(); final List<String> grupos = new ArrayList<>(); for (int i = 0; i < noItem.getChildNodes().getLength(); i++) { final Node noItemParm = noItem.getChildNodes().item(i); if (noItemParm.getNodeName().equals("#text")) { continue; } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":documentation")) { tarefaDto.setDocumentacao(UtilStrings.nullToVazio(noItemParm.getTextContent())); } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":potentialOwner")) { final String str[] = UtilStrings.nullToVazio(noItemParm.getTextContent().trim()).split(","); if (str.length > 0) { for (final String element : str) { final String potentialOwner[] = element.split(":"); if (potentialOwner.length > 1) { if (potentialOwner[0].equalsIgnoreCase("usuario")) { usuarios.add(potentialOwner[1]); } else if (potentialOwner[0].equalsIgnoreCase("grupo")) { grupos.add(potentialOwner[1]); } } else { grupos.add(element); } } } } } if (usuarios.size() > 0) { final String[] usr = new String[usuarios.size()]; final int i = 0; for (final String str : usuarios) { usr[i] = str; } tarefaDto.setColUsuarios(usr); } if (grupos.size() > 0) { final String[] grp = new String[grupos.size()]; final int i = 0; for (final String str : grupos) { grp[i] = str; } tarefaDto.setColGrupos(grp); } if (tarefaDto.getIdDesenho() == null) { throw new Exception("ID XML n�o definido para tarefa"); } if (tarefaDto.getNome() == null) { throw new Exception("Nome da tarefa " + tarefaDto.getIdDesenho() + " n�o definido"); } if (tarefaDto.getDocumentacao() == null) { throw new Exception("Documenta��o da tarefa " + tarefaDto.getIdDesenho() + " n�o definido"); } if (tarefaDto.getTipoInteracao() == null) { throw new Exception("Tipo de intera��o da tarefa " + tarefaDto.getIdDesenho() + " n�o definido"); } return tarefaDto; } private static SequenciaFluxoDTO carregaSequencia(final Node noItem) throws Exception { if (!noItem.getNodeName().equalsIgnoreCase(prefixo + ":sequenceFlow")) { return null; } final SequenciaFluxoDTO sequenciaDto = new SequenciaFluxoDTO(); final NamedNodeMap map = noItem.getAttributes(); sequenciaDto.setIdDesenhoOrigem(UtilStrings.nullToVazio(map.getNamedItem("sourceRef").getNodeValue())); sequenciaDto.setIdDesenhoDestino(UtilStrings.nullToVazio(map.getNamedItem("targetRef").getNodeValue())); for (int i = 0; i < noItem.getChildNodes().getLength(); i++) { final Node noItemParm = noItem.getChildNodes().item(i); if (noItemParm.getNodeName().equals("#text")) { continue; } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":conditionExpression")) { sequenciaDto.setCondicao(UtilStrings.nullToVazio(noItemParm.getTextContent())); } } if (sequenciaDto.getIdDesenhoOrigem() == null) { throw new Exception("ID origem n�o definido para sequ�ncia"); } if (sequenciaDto.getIdDesenhoDestino() == null) { throw new Exception("ID destino n�o definido para sequ�ncia"); } return sequenciaDto; } private static ElementoFluxoInicioDTO carregaInicioFluxo(final Node noItem) throws Exception { if (!noItem.getNodeName().equalsIgnoreCase(prefixo + ":startEvent")) { return null; } final ElementoFluxoInicioDTO inicioFluxoDto = new ElementoFluxoInicioDTO(); final NamedNodeMap map = noItem.getAttributes(); inicioFluxoDto.setIdDesenho(UtilStrings.nullToVazio(map.getNamedItem("id").getNodeValue())); return inicioFluxoDto; } private static ElementoFluxoPortaDTO carregaPorta(final Node noItem) throws Exception { if (!noItem.getNodeName().equalsIgnoreCase(prefixo + ":exclusiveGateway") && !noItem.getNodeName().equalsIgnoreCase(prefixo + ":parallelGateway")) { return null; } final NamedNodeMap map = noItem.getAttributes(); final String direction = UtilStrings.nullToVazio(map.getNamedItem("gatewayDirection").getNodeValue()); final ElementoFluxoPortaDTO decisaoDto = new ElementoFluxoPortaDTO(); if (noItem.getNodeName().equalsIgnoreCase(prefixo + ":exclusiveGateway")) { decisaoDto.setSubTipo(Enumerados.TipoPorta.Decisao.name()); } else if (direction.equalsIgnoreCase("Converging")) { decisaoDto.setSubTipo(Enumerados.TipoPorta.Convergente.name()); } else { decisaoDto.setSubTipo(Enumerados.TipoPorta.Paralela.name()); } decisaoDto.setIdDesenho(UtilStrings.nullToVazio(map.getNamedItem("id").getNodeValue())); if (decisaoDto.getIdDesenho() == null) { throw new Exception("ID XML n�o definido para decis�o"); } return decisaoDto; } private static void carregaRaia(final Node noItem, final List<ElementoFluxoRaiaDTO> raias) throws Exception { if (!noItem.getNodeName().equalsIgnoreCase(prefixo + ":laneSet")) { return; } for (int i = 0; i < noItem.getChildNodes().getLength(); i++) { final Node noItemParm = noItem.getChildNodes().item(i); if (noItemParm.getNodeName().equals("#text")) { continue; } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":lane")) { final ElementoFluxoRaiaDTO raiaDto = new ElementoFluxoRaiaDTO(); final NamedNodeMap map = noItemParm.getAttributes(); raiaDto.setIdDesenho(UtilStrings.nullToVazio(map.getNamedItem("id").getNodeValue())); raiaDto.setSiglaGrupo(UtilStrings.nullToVazio(map.getNamedItem("name").getNodeValue())); final List<String> elementos = new ArrayList<>(); for (int x = 0; x < noItemParm.getChildNodes().getLength(); x++) { final Node noItemLane = noItemParm.getChildNodes().item(x); if (noItemLane.getNodeName().equals("#text")) { continue; } if (noItemLane.getNodeName().equalsIgnoreCase(prefixo + ":flowNodeRef")) { elementos.add(UtilStrings.nullToVazio(noItemLane.getTextContent())); } } raiaDto.setIdElementosAgrupados(elementos); if (raiaDto.getIdDesenho() == null) { throw new Exception("ID XML n�o definido para raia"); } if (raiaDto.getSiglaGrupo() == null) { throw new Exception("Identifica��o do grupo executor n�o definido para raia " + raiaDto.getIdDesenho()); } raias.add(raiaDto); } } } private static ElementoFluxoEmailDTO carregaEmail(final Node noItem) throws Exception { if (!noItem.getNodeName().equalsIgnoreCase(prefixo + ":sendTask")) { return null; } final ElementoFluxoEmailDTO emailDto = new ElementoFluxoEmailDTO(); final NamedNodeMap map = noItem.getAttributes(); emailDto.setIdDesenho(UtilStrings.nullToVazio(map.getNamedItem("id").getNodeValue())); emailDto.setNome(UtilStrings.nullToVazio(map.getNamedItem("drools:taskName").getNodeValue())); if (emailDto.getIdDesenho() == null) { throw new Exception("ID XML n�o definido para email"); } if (emailDto.getNome() == null) { throw new Exception("Identificador de email n�o definido para " + emailDto.getIdDesenho()); } return emailDto; } private static ElementoFluxoFinalizacaoDTO carregaFinalizacao(final Node noItem) throws Exception { if (!noItem.getNodeName().equalsIgnoreCase(prefixo + ":endEvent")) { return null; } final ElementoFluxoFinalizacaoDTO finalizacaoDto = new ElementoFluxoFinalizacaoDTO(); final NamedNodeMap map = noItem.getAttributes(); finalizacaoDto.setIdDesenho(UtilStrings.nullToVazio(map.getNamedItem("id").getNodeValue())); String doc = ""; boolean bEncadeado = false; for (int i = 0; i < noItem.getChildNodes().getLength(); i++) { final Node noItemParm = noItem.getChildNodes().item(i); if (noItemParm.getNodeName().equals("#text")) { continue; } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":documentation")) { doc = UtilStrings.nullToVazio(noItemParm.getTextContent()); } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":signalEventDefinition")) { bEncadeado = true; } } if (doc.trim().length() > 0 && bEncadeado) { final String[] str = doc.split(":"); if (str.length > 1 && str[0].equalsIgnoreCase("nomeFluxo")) { finalizacaoDto.setSubTipo(Enumerados.TipoFinalizacao.Encadeada.name()); finalizacaoDto.setNomeFluxoEncadeado(str[1]); } } return finalizacaoDto; } private static ElementoFluxoScriptDTO carregaScript(final Node noItem) throws Exception { if (!noItem.getNodeName().equalsIgnoreCase(prefixo + ":scriptTask")) { return null; } final ElementoFluxoScriptDTO scriptDto = new ElementoFluxoScriptDTO(); final NamedNodeMap map = noItem.getAttributes(); scriptDto.setIdDesenho(UtilStrings.nullToVazio(map.getNamedItem("id").getNodeValue())); for (int i = 0; i < noItem.getChildNodes().getLength(); i++) { final Node noItemParm = noItem.getChildNodes().item(i); if (noItemParm.getNodeName().equals("#text")) { continue; } if (noItemParm.getNodeName().equalsIgnoreCase(prefixo + ":script")) { scriptDto.setScript(UtilStrings.nullToVazio(noItemParm.getTextContent())); } } if (scriptDto.getIdDesenho() == null) { throw new Exception("ID XML n�o definido para script"); } if (scriptDto.getScript() == null) { throw new Exception("Texto script n�o definido para " + scriptDto.getIdDesenho()); } return scriptDto; } }