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