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