Correção de bug na chamada a flush em MetodoIniciaCaso
[simdecs2.git] / src / java / org / ufcspa / simdecs / comunicacao / MetodoIniciaCaso.java
CommitLineData
ad3ad9f6 1/*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5package org.ufcspa.simdecs.comunicacao;
6
ad3ad9f6 7import java.io.PrintWriter;
8import java.util.Date;
9import java.util.Iterator;
10import java.util.List;
11import javax.persistence.EntityManager;
ad3ad9f6 12import javax.servlet.http.HttpServletRequest;
13import javax.servlet.http.HttpServletResponse;
ad3ad9f6 14import org.ufcspa.simdecs.entities.*;
15import org.ufcspa.simdecs.util.DbUtil;
25aea581 16import org.ufcspa.simdecs.util.UnBBayesUtil;
c1897a7f 17import unbbayes.prs.bn.ProbabilisticNode;
25aea581 18import unbbayes.prs.bn.TreeVariable;
ad3ad9f6 19
20/**
21 *
22 * @author maroni
23 */
cff9bc95 24public class MetodoIniciaCaso extends BaseComunicacao {
ad3ad9f6 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 }
c1897a7f 42
ad3ad9f6 43
25aea581 44 private String getRespostaNodo(Nodo nodo, Paciente paciente) throws Exception {
024c8c40 45 EntityManager em = DbUtil.getInstance().getEntityManager();
c1897a7f 46
25aea581 47
48 UnBBayesUtil unBUtil = new UnBBayesUtil(paciente.getRede());
39c9eade 49 unBUtil.abreRede(paciente.getRede());
c1897a7f 50
51 Iterator<NodoPaciente> it = em.createQuery("From NodoPaciente Where paciente.id=:pIdPaciente")
39c9eade 52 .setParameter("pIdPaciente", paciente.getId())
c1897a7f 53 .getResultList()
54 .iterator();
55
5123af69 56 float pcProbabilidade=0;
c1897a7f 57 while(it.hasNext()) {
58 NodoPaciente nodoPac = it.next();
59
5123af69 60 if (nodoPac.getNodo().getBogus()) {
61 if (nodoPac.getNodo().getId() == nodo.getId())
62 pcProbabilidade = 100;
63
64 continue;
65 }
66
25aea581 67 ProbabilisticNode pn = (ProbabilisticNode) unBUtil.getNodeByName(nodoPac.getNodo().getNome());
68 unBUtil.setNodeState(pn, "Yes", 1, "Not", 0);
c1897a7f 69 }
70
5123af69 71
72 if (nodo.getBogus()) {
73 if (pcProbabilidade == 0)
74 pcProbabilidade = (int) (1+Math.random()*50);
75 }
76 else {
25aea581 77 pcProbabilidade = unBUtil.getProbabilidadeByState((TreeVariable) unBUtil.getNodeByName(nodo.getNome()), "Yes") * 100;
5123af69 78 }
c1897a7f 79
be36ba96 80 List <RespostaNodo> respostas = em.createQuery("From RespostaNodo where nodo.id=:pIdNodo")
39c9eade 81 .setParameter("pIdNodo", nodo.getId())
024c8c40 82 .getResultList();
83
be36ba96 84 int random = (int) (1+Math.random()*respostas.size());
024c8c40 85 int i=1;
86
be36ba96 87 for(RespostaNodo resposta : respostas) {
c1897a7f 88 if (i++ == random) {
89
924227dc 90 List<IntervaloTabelaResposta> listaInt = em.createQuery("From IntervaloTabelaResposta Where tabelaResposta.id=:pIdTabela and :pProbabilidade between pesoMinimo and pesoMaximo")
c1897a7f 91 .setParameter("pIdTabela", resposta.getTabelaResposta().getId())
5123af69 92 .setParameter("pProbabilidade", pcProbabilidade)
c1897a7f 93 .getResultList();
94
95 int randomInt = (int) (1+Math.random()*listaInt.size());
96 int x=1;
3c6b9f2e 97 for(IntervaloTabelaResposta intervalo : listaInt) {
7dddea5a 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);
ff92a9b4 103 else
104 return returnResposta;
7dddea5a 105
106 }
c1897a7f 107 }
108 }
024c8c40 109 }
7470aeb9 110
024c8c40 111 return "";
112 }
113
ad3ad9f6 114 private String getDependencia(Long idNodo) {
115 return "";
116 }
117
56f36e0a 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
cff9bc95 139 @Override
140 protected void executaServico(EntityManager em, HttpServletRequest request, HttpServletResponse response, PrintWriter out) throws Exception
141 {
ad3ad9f6 142 response.setContentType("text/html;charset=UTF-8");
cff9bc95 143 Caso caso = em.find(Caso.class, Long.parseLong(request.getParameter("idcaso")));
ad3ad9f6 144
39c9eade 145
cff9bc95 146 if (!em.getTransaction().isActive()) {
147 em.getTransaction().begin();
148 }
ad3ad9f6 149
cff9bc95 150 // Cria sessao
151 SessaoUsuario sessaoUsuario = new SessaoUsuario();
152 sessaoUsuario.setData(new Date());
153 sessaoUsuario.setCaso(caso);
154 em.persist(sessaoUsuario);
26b5eb8a 155 //em.flush();
ad3ad9f6 156
cff9bc95 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
e5335b9d 171 out.println("<xml>");
28042ed9 172 out.println(" <caso uid=\"caso-" + caso.getId() + "\" sessao=\"" + sessaoUsuario.getId() + "\" titulo=\"" + caso.getNome() + "\" modelo=\"" + caso.getModelo() + "\" descricaoAmbiente=\"" + caso.getTextoInicial() + "\">");
cff9bc95 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;
ad3ad9f6 187 }
cff9bc95 188
56f36e0a 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 }
cff9bc95 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;
ad3ad9f6 202 }
cff9bc95 203
56f36e0a 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 }
cff9bc95 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;
ad3ad9f6 219 }
cff9bc95 220
56f36e0a 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 }
cff9bc95 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;
ad3ad9f6 233 }
cff9bc95 234
56f36e0a 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 }
cff9bc95 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();
56f36e0a 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 }
cff9bc95 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();
56f36e0a 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 }
cff9bc95 278 }
279 out.println(" </etapa>");
280 out.println(" </ator>");
ad3ad9f6 281 }
ad3ad9f6 282
ad3ad9f6 283
28042ed9 284 out.println(" </caso>");
e5335b9d 285 out.println(" <execucao sucesso=\"sim\" />" );
286 out.println("</xml>");
ad3ad9f6 287 }
288
ad3ad9f6 289}