(no commit message)
[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;
a837b415 8import java.util.ArrayList;
ad3ad9f6 9import java.util.Date;
10import java.util.Iterator;
11import java.util.List;
12import javax.persistence.EntityManager;
ad3ad9f6 13import javax.servlet.http.HttpServletRequest;
14import javax.servlet.http.HttpServletResponse;
ad3ad9f6 15import org.ufcspa.simdecs.entities.*;
16import org.ufcspa.simdecs.util.DbUtil;
25aea581 17import org.ufcspa.simdecs.util.UnBBayesUtil;
c1897a7f 18import unbbayes.prs.bn.ProbabilisticNode;
25aea581 19import unbbayes.prs.bn.TreeVariable;
ad3ad9f6 20
21/**
22 *
23 * @author maroni
24 */
cff9bc95 25public class MetodoIniciaCaso extends BaseComunicacao {
ad3ad9f6 26
c68b2731 27 private String getPerguntaNodo(Long idNodo, EntityManager em) {
ad3ad9f6 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 }
25aea581 66 ProbabilisticNode pn = (ProbabilisticNode) unBUtil.getNodeByName(nodoPac.getNodo().getNome());
67 unBUtil.setNodeState(pn, "Yes", 1, "Not", 0);
c1897a7f 68 }
69
5123af69 70
71 if (nodo.getBogus()) {
72 if (pcProbabilidade == 0)
73 pcProbabilidade = (int) (1+Math.random()*50);
74 }
75 else {
25aea581 76 pcProbabilidade = unBUtil.getProbabilidadeByState((TreeVariable) unBUtil.getNodeByName(nodo.getNome()), "Yes") * 100;
db744358 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;
c1897a7f 85
be36ba96 86 List <RespostaNodo> respostas = em.createQuery("From RespostaNodo where nodo.id=:pIdNodo")
39c9eade 87 .setParameter("pIdNodo", nodo.getId())
024c8c40 88 .getResultList();
db744358 89
be36ba96 90 int random = (int) (1+Math.random()*respostas.size());
024c8c40 91 int i=1;
92
a837b415 93
be36ba96 94 for(RespostaNodo resposta : respostas) {
c1897a7f 95 if (i++ == random) {
924227dc 96 List<IntervaloTabelaResposta> listaInt = em.createQuery("From IntervaloTabelaResposta Where tabelaResposta.id=:pIdTabela and :pProbabilidade between pesoMinimo and pesoMaximo")
c1897a7f 97 .setParameter("pIdTabela", resposta.getTabelaResposta().getId())
5123af69 98 .setParameter("pProbabilidade", pcProbabilidade)
c1897a7f 99 .getResultList();
100
101 int randomInt = (int) (1+Math.random()*listaInt.size());
102 int x=1;
3c6b9f2e 103 for(IntervaloTabelaResposta intervalo : listaInt) {
7dddea5a 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);
ff92a9b4 109 else
110 return returnResposta;
7dddea5a 111
112 }
c1897a7f 113 }
114 }
024c8c40 115 }
7470aeb9 116
024c8c40 117 return "";
118 }
119
ad3ad9f6 120 private String getDependencia(Long idNodo) {
121 return "";
122 }
123
56f36e0a 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
cff9bc95 145 @Override
146 protected void executaServico(EntityManager em, HttpServletRequest request, HttpServletResponse response, PrintWriter out) throws Exception
147 {
ad3ad9f6 148 response.setContentType("text/html;charset=UTF-8");
cff9bc95 149 Caso caso = em.find(Caso.class, Long.parseLong(request.getParameter("idcaso")));
ad3ad9f6 150
39c9eade 151
cff9bc95 152 if (!em.getTransaction().isActive()) {
153 em.getTransaction().begin();
154 }
ad3ad9f6 155
cff9bc95 156 // Cria sessao
157 SessaoUsuario sessaoUsuario = new SessaoUsuario();
158 sessaoUsuario.setData(new Date());
159 sessaoUsuario.setCaso(caso);
ec18a5ac 160 sessaoUsuario.setUsuario((Usuario)request.getSession(true).getAttribute("usuario"));
cff9bc95 161 em.persist(sessaoUsuario);
26b5eb8a 162 //em.flush();
ad3ad9f6 163
cff9bc95 164 // Logo inicio do caso.
165 Log log = new Log();
166 log.setTipo(em.find(TipoEventoLog.class, TipoEventoLog.INICIO_CASO));
167 log.setCaso(caso);
168 log.setData(new Date());
169 log.setSessaoUsuario(sessaoUsuario);
170
171
172 em.persist(log);
173
174
175 em.getTransaction().commit();
176
177
e5335b9d 178 out.println("<xml>");
e1005ea9 179 out.println(" <caso uid=\"caso-" + clear(caso.getId()) + "\" sessao=\"" + clear(sessaoUsuario.getId()) + "\" titulo=\"" + clear(caso.getNome()) + "\" modelo=\"" + clear(caso.getModelo()) + "\" descricaoAmbiente=\"" + clear(caso.getTextoInicial()) + "\">");
cff9bc95 180
181 Iterator<Paciente> itPac = em.createQuery("From Paciente where caso.id=:pIdCaso").setParameter("pIdCaso", caso.getId()).getResultList().iterator();
182 while (itPac.hasNext()) {
183 Paciente paciente = itPac.next();
e1005ea9 184 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()) + "\" >");
cff9bc95 185
186 out.println(" <etapa uid=\"etapa-1\" nome=\"Investigação\" sequencia=\"1\" tipo=\"investigacao\">");
187
a837b415 188 List<String> listaSintomas = new ArrayList<String>();
189
cff9bc95 190 List<NodoPaciente> nodos = em.createQuery("From NodoPaciente Where paciente.id=:pIDPaciente").setParameter("pIDPaciente", paciente.getId()).getResultList();
191 for (NodoPaciente nodo : nodos) {
192 if (!nodo.getNodo().getTipo().equals(Nodo.SINAL_SINTOMA) && !nodo.getNodo().getTipo().equals(Nodo.HISTORICO)) {
193 continue;
ad3ad9f6 194 }
cff9bc95 195
56f36e0a 196 {
c68b2731 197 String pergunta = getPerguntaNodo(nodo.getNodo().getId(), em);
56f36e0a 198 String resposta = getRespostaNodo(nodo.getNodo(), paciente);
199 registraPerguntaLog(em, sessaoUsuario, paciente, nodo.getNodo(), true, Nodo.SINAL_SINTOMA, pergunta, nodo.getNodo().getNomeAmigavel(), resposta);
e1005ea9 200 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) + "\" />");
56f36e0a 201 }
cff9bc95 202 }
203
204 // Sinais e sintomas inativos
205 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();
206 for (Nodo nodo : nodosNaoSelecionados) {
207 if (!nodo.getTipo().equals(Nodo.SINAL_SINTOMA) && !nodo.getTipo().equals(Nodo.HISTORICO)) {
208 continue;
ad3ad9f6 209 }
cff9bc95 210
56f36e0a 211 {
c68b2731 212 String pergunta = getPerguntaNodo(nodo.getId(), em);
56f36e0a 213 String resposta = getRespostaNodo(nodo, paciente);
214 registraPerguntaLog(em, sessaoUsuario, paciente, nodo, false, Nodo.SINAL_SINTOMA, pergunta, nodo.getNomeAmigavel(), resposta);
e1005ea9 215 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) + "\" />");
56f36e0a 216 }
cff9bc95 217 }
a837b415 218
219 // Randomiza sinais e sintomas
220 Object[] listaRandom = listaSintomas.toArray();
221 for(int i=0; i < listaRandom.length; i++) {
222 int random = (int) (Math.random()*listaRandom.length);
223 Object temp = listaRandom[i];
224 listaRandom[i] = listaRandom[random];
225 listaRandom[random] = temp;
226 }
227
a837b415 228 // Sinais e sintomas
229 out.println(" <perguntar_sintoma uid=\"perguntar-sintoma-" + paciente.getId() + "\" descricao=\"Perguntar Sinais/Sintomas\">");
230 for(int i=0; i < listaRandom.length; i++) {
231 out.println(listaRandom[i]);
232 }
cff9bc95 233 out.println(" </perguntar_sintoma>");
234
235 // Exame Físico
236 out.println(" <realiza_exame_fisico uid=\"realiza-exame-fisico-" + paciente.getId() + "\" descricao=\"Realizar Exame Físico\">");
237 for (NodoPaciente nodo : nodos) {
238 if (!nodo.getNodo().getTipo().equals(Nodo.EXAME_FISICO)) {
239 continue;
ad3ad9f6 240 }
cff9bc95 241
56f36e0a 242 {
243 registraPerguntaLog(em, sessaoUsuario, paciente, nodo.getNodo(), false, Nodo.EXAME_FISICO, null, nodo.getNodo().getNomeAmigavel(), null);
e1005ea9 244 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=\"\" />");
56f36e0a 245 }
cff9bc95 246 }
247 out.println(" </realiza_exame_fisico>");
248
249 // Exame Complementar
250 out.println(" <solicitar_exames_complementar uid=\"solicitar-exame-complementar-" + paciente.getId() + "\" descricao=\"Solicitar Exame Complementar\">\"");
251 for (NodoPaciente nodo : nodos) {
252 if (!nodo.getNodo().getTipo().equals(Nodo.EXAME_COMPLEMENTAR)) {
253 continue;
ad3ad9f6 254 }
cff9bc95 255
56f36e0a 256 {
257 registraPerguntaLog(em, sessaoUsuario, paciente, nodo.getNodo(), false, Nodo.EXAME_COMPLEMENTAR, null, nodo.getNodo().getNomeAmigavel(), null);
e1005ea9 258 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=\"\" />");
56f36e0a 259 }
cff9bc95 260 }
261 out.println(" </solicitar_exames_complementar>");
262 /*
263 * // historico for(NodoPaciente nodo : nodos) { if
264 * (!nodo.getNodo().getTipo().equals(Nodo.HISTORICO)) continue;
265 *
266 * out.println(" <historico_medico uid=\"historico-medico-" +
267 * nodo.getId() + "\" dependencia=\"" +
268 * getDependencia(nodo.getNodo().getId()) + "\"
269 * descricao=\"Histórico Médico\" historico=\"" +
270 * nodo.getNodo().getNomeAmigavel() + "\" imagem=\"\" som=\"\"
271 * video=\"\" />"); }
272 */
e1005ea9 273 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=\"\" />");
cff9bc95 274
275
276 out.println(" </etapa>");
277
278 out.println(" <etapa uid=\"etapa-2\" nome=\"Diagnóstico\" sequencia=\"2\" tipo=\"diagnostico\">");
279 Iterator<Nodo> itDiagnosticos = em.createQuery("From Nodo where tipo=:pTipo").setParameter("pTipo", Nodo.DIAGNOSTICO).getResultList().iterator();
280 while (itDiagnosticos.hasNext()) {
281 Nodo nodo = itDiagnosticos.next();
56f36e0a 282 {
c68b2731 283 String resposta = getPerguntaNodo(nodo.getId(), em);
56f36e0a 284 registraPerguntaLog(em, sessaoUsuario, paciente, nodo, false, Nodo.DIAGNOSTICO, null, nodo.getNomeAmigavel(), resposta);
e1005ea9 285 out.println(" <diagnostico uid=\"diagnostico-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nome=\"" + clear(nodo.getNomeAmigavel()) + "\" falaMedico=\"" + clear(resposta) + "\" />");
56f36e0a 286 }
cff9bc95 287 }
288 out.println(" </etapa>");
289
290 out.println(" <etapa uid=\"etapa-3\" nome=\"Conduta\" sequencia=\"3\" tipo=\"conduta\">");
291 Iterator<Nodo> itConduta = em.createQuery("From Nodo where tipo=:pTipo").setParameter("pTipo", Nodo.CONDUTA).getResultList().iterator();
292 while (itConduta.hasNext()) {
293 Nodo nodo = itConduta.next();
56f36e0a 294 {
c68b2731 295 String resposta = getPerguntaNodo(nodo.getId(), em);
56f36e0a 296 registraPerguntaLog(em, sessaoUsuario, paciente, nodo, false, Nodo.CONDUTA, null, nodo.getNomeAmigavel(), resposta);
e1005ea9 297 out.println(" <conduta uid=\"conduta-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nome=\"" + clear(nodo.getNomeAmigavel()) + "\" falaMedico=\"" + clear(resposta) + "\" />");
56f36e0a 298 }
cff9bc95 299 }
300 out.println(" </etapa>");
301 out.println(" </ator>");
ad3ad9f6 302 }
ad3ad9f6 303
ad3ad9f6 304
28042ed9 305 out.println(" </caso>");
e5335b9d 306 out.println(" <execucao sucesso=\"sim\" />" );
307 out.println("</xml>");
ad3ad9f6 308 }
309
ad3ad9f6 310}