2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
5 package org.ufcspa.simdecs.comunicacao;
7 import java.io.PrintWriter;
8 import java.util.ArrayList;
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;
25 public class MetodoIniciaCaso extends BaseComunicacao {
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)
33 int random = (int) (1+Math.random()*perguntas.size());
36 for(PerguntaNodo pergunta : perguntas) {
38 return pergunta.getTexto();
45 private String getRespostaNodo(Nodo nodo, Paciente paciente) throws Exception {
46 EntityManager em = DbUtil.getInstance().getEntityManager();
49 UnBBayesUtil unBUtil = new UnBBayesUtil(paciente.getRede());
50 unBUtil.abreRede(paciente.getRede());
52 Iterator<NodoPaciente> it = em.createQuery("From NodoPaciente Where paciente.id=:pIdPaciente")
53 .setParameter("pIdPaciente", paciente.getId())
57 float pcProbabilidade=0;
59 NodoPaciente nodoPac = it.next();
61 if (nodoPac.getNodo().getBogus()) {
62 if (nodoPac.getNodo().getId() == nodo.getId())
63 pcProbabilidade = 100;
68 ProbabilisticNode pn = (ProbabilisticNode) unBUtil.getNodeByName(nodoPac.getNodo().getNome());
69 unBUtil.setNodeState(pn, "Yes", 1, "Not", 0);
73 if (nodo.getBogus()) {
74 if (pcProbabilidade == 0)
75 pcProbabilidade = (int) (1+Math.random()*50);
78 pcProbabilidade = unBUtil.getProbabilidadeByState((TreeVariable) unBUtil.getNodeByName(nodo.getNome()), "Yes") * 100;
81 // Ajusta os percentuais de probabilidade caso ultrapasse em decimos os extremos
82 if (pcProbabilidade < 0)
85 if (pcProbabilidade > 100)
86 pcProbabilidade = 100;
88 List <RespostaNodo> respostas = em.createQuery("From RespostaNodo where nodo.id=:pIdNodo")
89 .setParameter("pIdNodo", nodo.getId())
92 int random = (int) (1+Math.random()*respostas.size());
96 for(RespostaNodo resposta : respostas) {
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)
103 int randomInt = (int) (1+Math.random()*listaInt.size());
105 for(IntervaloTabelaResposta intervalo : listaInt) {
107 String returnResposta = resposta.getTexto().replaceAll("&&tabela", intervalo.getTexto());
109 if (returnResposta.substring(0,1).equals(returnResposta.substring(0,1).toLowerCase()))
110 return returnResposta.substring(0,1).toUpperCase() + returnResposta.substring(1);
112 return returnResposta;
122 private String getDependencia(Long idNodo) {
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();
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);
141 em.persist(logPerguntas);
142 em.getTransaction().commit();
148 protected void executaServico(EntityManager em, HttpServletRequest request, HttpServletResponse response, PrintWriter out) throws Exception
150 response.setContentType("text/html;charset=UTF-8");
151 Caso caso = em.find(Caso.class, Long.parseLong(request.getParameter("idcaso")));
154 if (!em.getTransaction().isActive()) {
155 em.getTransaction().begin();
159 SessaoUsuario sessaoUsuario = new SessaoUsuario();
160 sessaoUsuario.setData(new Date());
161 sessaoUsuario.setCaso(caso);
162 em.persist(sessaoUsuario);
165 // Logo inicio do caso.
167 log.setTipo(em.find(TipoEventoLog.class, TipoEventoLog.INICIO_CASO));
169 log.setData(new Date());
170 log.setSessaoUsuario(sessaoUsuario);
176 em.getTransaction().commit();
179 out.println("<xml>");
180 out.println(" <caso uid=\"caso-" + clear(caso.getId()) + "\" sessao=\"" + clear(sessaoUsuario.getId()) + "\" titulo=\"" + clear(caso.getNome()) + "\" modelo=\"" + clear(caso.getModelo()) + "\" descricaoAmbiente=\"" + clear(caso.getTextoInicial()) + "\">");
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=\"" + 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()) + "\" >");
187 out.println(" <etapa uid=\"etapa-1\" nome=\"Investigação\" sequencia=\"1\" tipo=\"investigacao\">");
189 List<String> listaSintomas = new ArrayList<String>();
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)) {
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=\"" + clear(nodo.getNodo().getNome()) + "\" nomePopular=\"" + clear(pergunta) + "\" imagem=\"\" som=\"\" video=\"\" dependencia=\"" + getDependencia(nodo.getNodo().getId()) + "\" falaPaciente=\"" + clear(resposta) + "\" />");
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)) {
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=\"" + clear(nodo.getNome()) + "\" nomePopular=\"" + clear(pergunta) + "\" imagem=\"\" som=\"\" video=\"\" dependencia=\"" + getDependencia(nodo.getId()) + "\" falaPaciente=\"" + clear(resposta) + "\" />");
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;
230 out.println(" <perguntar_sintoma uid=\"perguntar-sintoma-" + paciente.getId() + "\" descricao=\"Perguntar Sinais/Sintomas\">");
231 for(int i=0; i < listaRandom.length; i++) {
232 out.println(listaRandom[i]);
234 out.println(" </perguntar_sintoma>");
237 out.println(" <realiza_exame_fisico uid=\"realiza-exame-fisico-" + paciente.getId() + "\" descricao=\"Realizar Exame Físico\">");
238 for (NodoPaciente nodo : nodos) {
239 if (!nodo.getNodo().getTipo().equals(Nodo.EXAME_FISICO)) {
244 registraPerguntaLog(em, sessaoUsuario, paciente, nodo.getNodo(), false, Nodo.EXAME_FISICO, null, nodo.getNodo().getNomeAmigavel(), null);
245 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=\"\" />");
248 out.println(" </realiza_exame_fisico>");
250 // Exame Complementar
251 out.println(" <solicitar_exames_complementar uid=\"solicitar-exame-complementar-" + paciente.getId() + "\" descricao=\"Solicitar Exame Complementar\">\"");
252 for (NodoPaciente nodo : nodos) {
253 if (!nodo.getNodo().getTipo().equals(Nodo.EXAME_COMPLEMENTAR)) {
258 registraPerguntaLog(em, sessaoUsuario, paciente, nodo.getNodo(), false, Nodo.EXAME_COMPLEMENTAR, null, nodo.getNodo().getNomeAmigavel(), null);
259 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=\"\" />");
262 out.println(" </solicitar_exames_complementar>");
264 * // historico for(NodoPaciente nodo : nodos) { if
265 * (!nodo.getNodo().getTipo().equals(Nodo.HISTORICO)) continue;
267 * out.println(" <historico_medico uid=\"historico-medico-" +
268 * nodo.getId() + "\" dependencia=\"" +
269 * getDependencia(nodo.getNodo().getId()) + "\"
270 * descricao=\"Histórico Médico\" historico=\"" +
271 * nodo.getNodo().getNomeAmigavel() + "\" imagem=\"\" som=\"\"
274 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=\"\" />");
277 out.println(" </etapa>");
279 out.println(" <etapa uid=\"etapa-2\" nome=\"Diagnóstico\" sequencia=\"2\" tipo=\"diagnostico\">");
280 Iterator<Nodo> itDiagnosticos = em.createQuery("From Nodo where tipo=:pTipo").setParameter("pTipo", Nodo.DIAGNOSTICO).getResultList().iterator();
281 while (itDiagnosticos.hasNext()) {
282 Nodo nodo = itDiagnosticos.next();
284 String resposta = getPerguntaNodo(nodo.getId());
285 registraPerguntaLog(em, sessaoUsuario, paciente, nodo, false, Nodo.DIAGNOSTICO, null, nodo.getNomeAmigavel(), resposta);
286 out.println(" <diagnostico uid=\"diagnostico-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nome=\"" + clear(nodo.getNomeAmigavel()) + "\" falaMedico=\"" + clear(resposta) + "\" />");
289 out.println(" </etapa>");
291 out.println(" <etapa uid=\"etapa-3\" nome=\"Conduta\" sequencia=\"3\" tipo=\"conduta\">");
292 Iterator<Nodo> itConduta = em.createQuery("From Nodo where tipo=:pTipo").setParameter("pTipo", Nodo.CONDUTA).getResultList().iterator();
293 while (itConduta.hasNext()) {
294 Nodo nodo = itConduta.next();
296 String resposta = getPerguntaNodo(nodo.getId());
297 registraPerguntaLog(em, sessaoUsuario, paciente, nodo, false, Nodo.CONDUTA, null, nodo.getNomeAmigavel(), resposta);
298 out.println(" <conduta uid=\"conduta-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nome=\"" + clear(nodo.getNomeAmigavel()) + "\" falaMedico=\"" + clear(resposta) + "\" />");
301 out.println(" </etapa>");
302 out.println(" </ator>");
306 out.println(" </caso>");
307 out.println(" <execucao sucesso=\"sim\" />" );
308 out.println("</xml>");