59378891ec16ca8ff89564b0cb2d7d147f1b8f61
[simdecs2.git] / src / java / org / ufcspa / simdecs / comunicacao / MetodoIniciaCaso.java
1 /*
2  * To change this template, choose Tools | Templates
3  * and open the template in the editor.
4  */
5 package org.ufcspa.simdecs.comunicacao;
6
7 import java.io.PrintWriter;
8 import java.util.ArrayList;
9 import java.util.Date;
10 import java.util.Iterator;
11 import java.util.List;
12 import javax.persistence.EntityManager;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15 import org.ufcspa.simdecs.entities.*;
16 import org.ufcspa.simdecs.util.DbUtil;
17 import org.ufcspa.simdecs.util.UnBBayesUtil;
18 import unbbayes.prs.bn.ProbabilisticNode;
19 import unbbayes.prs.bn.TreeVariable;
20
21 /**
22  *
23  * @author maroni
24  */
25 public class MetodoIniciaCaso extends BaseComunicacao {
26
27     private String getPerguntaNodo(Long idNodo) {
28         EntityManager em = DbUtil.getInstance().getEntityManager();
29         List <PerguntaNodo> perguntas = em.createQuery("From PerguntaNodo where nodo.id=:pIdNodo")
30                                          .setParameter("pIdNodo", idNodo)
31                                          .getResultList();
32         
33         int random = (int) (1+Math.random()*perguntas.size());
34         int i=1;
35         
36         for(PerguntaNodo pergunta : perguntas) {
37             if (i++ == random)
38                 return pergunta.getTexto();
39         }
40                 
41         return "";
42     }
43
44     
45     private String getRespostaNodo(Nodo nodo, Paciente paciente) throws Exception {
46         EntityManager em = DbUtil.getInstance().getEntityManager();
47
48         
49         UnBBayesUtil unBUtil = new UnBBayesUtil(paciente.getRede());
50         unBUtil.abreRede(paciente.getRede());
51         
52         Iterator<NodoPaciente> it = em.createQuery("From NodoPaciente Where paciente.id=:pIdPaciente")
53                                       .setParameter("pIdPaciente", paciente.getId())
54                                       .getResultList()
55                                       .iterator();
56         
57         float pcProbabilidade=0;
58         while(it.hasNext()) {
59             NodoPaciente nodoPac = it.next();
60             
61             if (nodoPac.getNodo().getBogus()) {
62                 if (nodoPac.getNodo().getId() == nodo.getId())
63                     pcProbabilidade = 100;
64
65                 continue;
66             }
67             
68             ProbabilisticNode pn = (ProbabilisticNode) unBUtil.getNodeByName(nodoPac.getNodo().getNome());
69             unBUtil.setNodeState(pn, "Yes", 1, "Not", 0);
70         }
71         
72         
73         if (nodo.getBogus()) {
74             if (pcProbabilidade == 0)
75                 pcProbabilidade = (int) (1+Math.random()*50);
76         }
77         else {
78             pcProbabilidade = unBUtil.getProbabilidadeByState((TreeVariable) unBUtil.getNodeByName(nodo.getNome()), "Yes") * 100;
79         }
80         
81         // Ajusta os percentuais de probabilidade caso ultrapasse em decimos os extremos
82         if (pcProbabilidade < 0)
83             pcProbabilidade = 0;
84         
85         if (pcProbabilidade > 100)
86             pcProbabilidade = 100;
87
88         List <RespostaNodo> respostas = em.createQuery("From RespostaNodo where nodo.id=:pIdNodo")
89                                          .setParameter("pIdNodo", nodo.getId())
90                                          .getResultList();
91
92         int random = (int) (1+Math.random()*respostas.size());
93         int i=1;
94         
95
96         for(RespostaNodo resposta : respostas) {
97             if (i++ == random) {
98                 List<IntervaloTabelaResposta> listaInt = em.createQuery("From IntervaloTabelaResposta Where tabelaResposta.id=:pIdTabela and :pProbabilidade between pesoMinimo and pesoMaximo")
99                                                           .setParameter("pIdTabela", resposta.getTabelaResposta().getId())
100                                                           .setParameter("pProbabilidade", pcProbabilidade)
101                                                           .getResultList();
102                 
103                 int randomInt = (int) (1+Math.random()*listaInt.size());
104                 int x=1;
105                 for(IntervaloTabelaResposta intervalo : listaInt) {
106                     if (x++ == random) {
107                         String returnResposta = resposta.getTexto().replaceAll("&&tabela", intervalo.getTexto());
108
109                         if (returnResposta.substring(0,1).equals(returnResposta.substring(0,1).toLowerCase()))
110                             return returnResposta.substring(0,1).toUpperCase() + returnResposta.substring(1);
111                         else
112                             return returnResposta;
113                         
114                     }
115                 }
116             }
117         }
118
119         return "";
120     }
121     
122     private String getDependencia(Long idNodo) {
123         return "";
124     }
125
126     
127     private void registraPerguntaLog(EntityManager em, SessaoUsuario sessaoUsuario, Paciente paciente, Nodo nodo, boolean ativo, String tipoNodo, String pergunta, String nomeAmigavel, String resposta) {
128         if (!em.getTransaction().isActive())
129             em.getTransaction().begin();
130         
131         LogPerguntas logPerguntas = new LogPerguntas();
132         logPerguntas.setNodo(nodo);
133         logPerguntas.setAtivo(ativo);
134         logPerguntas.setPaciente(paciente);
135         logPerguntas.setPergunta(pergunta);
136         logPerguntas.setSessaoUsuario(sessaoUsuario);
137         logPerguntas.setTipoNodo(tipoNodo);
138         logPerguntas.setNomeAmigavel(nomeAmigavel);
139         logPerguntas.setResposta(resposta);
140         
141         em.persist(logPerguntas);
142         em.getTransaction().commit();
143         
144     }
145     
146     
147     @Override
148     protected void executaServico(EntityManager em, HttpServletRequest request, HttpServletResponse response, PrintWriter out) throws Exception
149     {
150         response.setContentType("text/html;charset=UTF-8");
151         Caso caso = em.find(Caso.class, Long.parseLong(request.getParameter("idcaso")));
152
153
154         if (!em.getTransaction().isActive()) {
155             em.getTransaction().begin();
156         }
157
158         // Cria sessao
159         SessaoUsuario sessaoUsuario = new SessaoUsuario();
160         sessaoUsuario.setData(new Date());
161         sessaoUsuario.setCaso(caso);
162         em.persist(sessaoUsuario);
163         //em.flush();
164
165         // Logo inicio do caso.
166         Log log = new Log();
167         log.setTipo(em.find(TipoEventoLog.class, TipoEventoLog.INICIO_CASO));
168         log.setCaso(caso);
169         log.setData(new Date());
170         log.setSessaoUsuario(sessaoUsuario);
171
172
173         em.persist(log);
174
175
176         em.getTransaction().commit();
177
178
179         out.println("<xml>");
180         out.println("   <caso uid=\"caso-" + caso.getId() + "\" sessao=\"" + sessaoUsuario.getId() + "\" titulo=\"" + caso.getNome() + "\" modelo=\"" + caso.getModelo() + "\" descricaoAmbiente=\"" + caso.getTextoInicial() + "\">");
181
182         Iterator<Paciente> itPac = em.createQuery("From Paciente where caso.id=:pIdCaso").setParameter("pIdCaso", caso.getId()).getResultList().iterator();
183         while (itPac.hasNext()) {
184             Paciente paciente = itPac.next();
185             out.println("    <ator uid=\"" + paciente.getId() + "\" tipo=\"paciente\" nome=\"" + paciente.getNome() + "\" modelo=\"" + paciente.getModelo() + "\" idade=\"" + paciente.getIdade() + "\" peso=\"" + paciente.getPeso() + "\" altura=\"" + paciente.getAltura() + "\" >");
186
187             out.println("        <etapa uid=\"etapa-1\" nome=\"Investigação\" sequencia=\"1\" tipo=\"investigacao\">");
188
189             List<String> listaSintomas = new ArrayList<String>();
190             
191             List<NodoPaciente> nodos = em.createQuery("From NodoPaciente Where paciente.id=:pIDPaciente").setParameter("pIDPaciente", paciente.getId()).getResultList();
192             for (NodoPaciente nodo : nodos) {
193                 if (!nodo.getNodo().getTipo().equals(Nodo.SINAL_SINTOMA) && !nodo.getNodo().getTipo().equals(Nodo.HISTORICO)) {
194                     continue;
195                 }
196
197                 {
198                     String pergunta = getPerguntaNodo(nodo.getNodo().getId());
199                     String resposta = getRespostaNodo(nodo.getNodo(), paciente);
200                     registraPerguntaLog(em, sessaoUsuario, paciente, nodo.getNodo(), true, Nodo.SINAL_SINTOMA, pergunta, nodo.getNodo().getNomeAmigavel(), resposta);
201                     listaSintomas.add("                <sintoma uid=\"sintoma-np-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nomeCientifico=\"" + nodo.getNodo().getNome() + "\" nomePopular=\"" + pergunta + "\" imagem=\"\" som=\"\" video=\"\" dependencia=\"" + getDependencia(nodo.getNodo().getId()) + "\" falaPaciente=\"" + resposta + "\" />");
202                 }
203             }
204
205             // Sinais e sintomas inativos
206             List<Nodo> nodosNaoSelecionados = em.createQuery("From Nodo Where rede.id=:pIDRede and id not in (Select nodo.id from NodoPaciente Where paciente.id=:pIDPaciente)").setParameter("pIDRede", paciente.getRede().getId()).setParameter("pIDPaciente", paciente.getId()).getResultList();
207             for (Nodo nodo : nodosNaoSelecionados) {
208                 if (!nodo.getTipo().equals(Nodo.SINAL_SINTOMA) && !nodo.getTipo().equals(Nodo.HISTORICO)) {
209                     continue;
210                 }
211
212                 {
213                     String pergunta = getPerguntaNodo(nodo.getId());
214                     String resposta = getRespostaNodo(nodo, paciente);
215                     registraPerguntaLog(em, sessaoUsuario, paciente, nodo, false, Nodo.SINAL_SINTOMA, pergunta, nodo.getNomeAmigavel(), resposta);
216                     listaSintomas.add("                <sintoma uid=\"sintoma-nd-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nomeCientifico=\"" + nodo.getNome() + "\" nomePopular=\"" + pergunta + "\" imagem=\"\" som=\"\" video=\"\" dependencia=\"" + getDependencia(nodo.getId()) + "\" falaPaciente=\"" + resposta + "\" />");
217                 }
218             }
219             
220             // Randomiza sinais e sintomas
221             Object[] listaRandom = listaSintomas.toArray();
222             for(int i=0; i < listaRandom.length; i++) {
223                 int random = (int) (Math.random()*listaRandom.length);
224                 Object temp = listaRandom[i];
225                 listaRandom[i] = listaRandom[random];
226                 listaRandom[random] = temp;
227             }
228             
229                 
230             // Sinais e sintomas
231             out.println("            <perguntar_sintoma uid=\"perguntar-sintoma-" + paciente.getId() + "\" descricao=\"Perguntar Sinais/Sintomas\">");
232             for(int i=0; i < listaRandom.length; i++) {
233                 out.println(listaRandom[i]);
234             }
235             out.println("            </perguntar_sintoma>");
236
237             // Exame Físico
238             out.println("            <realiza_exame_fisico uid=\"realiza-exame-fisico-" + paciente.getId() + "\" descricao=\"Realizar Exame Físico\">");
239             for (NodoPaciente nodo : nodos) {
240                 if (!nodo.getNodo().getTipo().equals(Nodo.EXAME_FISICO)) {
241                     continue;
242                 }
243
244                 {
245                     registraPerguntaLog(em, sessaoUsuario, paciente, nodo.getNodo(), false, Nodo.EXAME_FISICO, null, nodo.getNodo().getNomeAmigavel(), null);
246                     out.println("                <exame_fisico uid=\"exame-fisico-np-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" dependencia=\"" + getDependencia(nodo.getNodo().getId()) + "\" descricao=\"" + nodo.getNodo().getNomeAmigavel() + "\" resultado=\"\" imagem=\"\" som=\"\" video=\"\" />");
247                 }
248             }
249             out.println("            </realiza_exame_fisico>");
250
251             // Exame Complementar
252             out.println("            <solicitar_exames_complementar uid=\"solicitar-exame-complementar-" + paciente.getId() + "\" descricao=\"Solicitar Exame Complementar\">\"");
253             for (NodoPaciente nodo : nodos) {
254                 if (!nodo.getNodo().getTipo().equals(Nodo.EXAME_COMPLEMENTAR)) {
255                     continue;
256                 }
257
258                 {
259                     registraPerguntaLog(em, sessaoUsuario, paciente, nodo.getNodo(), false, Nodo.EXAME_COMPLEMENTAR, null, nodo.getNodo().getNomeAmigavel(), null);
260                     out.println("                <exame_complementar uid=\"exame-complementar-np-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" dependencia=\"" + getDependencia(nodo.getNodo().getId()) + "\" descricao=\"" + nodo.getNodo().getNomeAmigavel() + "\" resultado=\"\" imagem=\"\" som=\"\" video=\"\" />");
261                 }
262             }
263             out.println("            </solicitar_exames_complementar>");
264             /*
265              * // historico for(NodoPaciente nodo : nodos) { if
266              * (!nodo.getNodo().getTipo().equals(Nodo.HISTORICO)) continue;
267              *
268              * out.println(" <historico_medico uid=\"historico-medico-" +
269              * nodo.getId() + "\" dependencia=\"" +
270              * getDependencia(nodo.getNodo().getId()) + "\"
271              * descricao=\"Histórico Médico\" historico=\"" +
272              * nodo.getNodo().getNomeAmigavel() + "\" imagem=\"\" som=\"\"
273              * video=\"\" />"); }
274              */
275             out.println("        <historico_medico uid=\"historico-medico-1" + ":paciente-" + paciente.getId() + "\" dependencia=\"\" descricao=\"Histórico Médico\" historico=\"" + paciente.getCaso().getTextoInicial() + "\n\n" +   paciente.getHistorico() + "\" imagem=\"\" som=\"\" video=\"\" />");
276
277
278             out.println("        </etapa>");
279
280             out.println("        <etapa uid=\"etapa-2\" nome=\"Diagnóstico\" sequencia=\"2\" tipo=\"diagnostico\">");
281             Iterator<Nodo> itDiagnosticos = em.createQuery("From Nodo where tipo=:pTipo").setParameter("pTipo", Nodo.DIAGNOSTICO).getResultList().iterator();
282             while (itDiagnosticos.hasNext()) {
283                 Nodo nodo = itDiagnosticos.next();
284                 {
285                     String resposta = getPerguntaNodo(nodo.getId());
286                     registraPerguntaLog(em, sessaoUsuario, paciente, nodo, false, Nodo.DIAGNOSTICO, null, nodo.getNomeAmigavel(), resposta);
287                     out.println("            <diagnostico uid=\"diagnostico-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nome=\"" + nodo.getNomeAmigavel() + "\" falaMedico=\"" + resposta + "\" />");
288                 }
289             }
290             out.println("        </etapa>");
291
292             out.println("        <etapa uid=\"etapa-3\" nome=\"Conduta\" sequencia=\"3\" tipo=\"conduta\">");
293             Iterator<Nodo> itConduta = em.createQuery("From Nodo where tipo=:pTipo").setParameter("pTipo", Nodo.CONDUTA).getResultList().iterator();
294             while (itConduta.hasNext()) {
295                 Nodo nodo = itConduta.next();
296                 {
297                     String resposta = getPerguntaNodo(nodo.getId());
298                     registraPerguntaLog(em, sessaoUsuario, paciente, nodo, false, Nodo.CONDUTA, null, nodo.getNomeAmigavel(), resposta);
299                     out.println("            <conduta uid=\"conduta-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nome=\"" + nodo.getNomeAmigavel() + "\" falaMedico=\"" + resposta + "\" />");
300                 }
301             }
302             out.println("        </etapa>");
303             out.println("    </ator>");
304         }
305
306
307         out.println("  </caso>");
308         out.println("  <execucao sucesso=\"sim\" />" );
309         out.println("</xml>");
310     }
311
312 }