Implementação dos registros de Log de eventos!
[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.NodoBean;
17 import org.ufcspa.simdecs.util.UnBUtil;
18 import unbbayes.prs.bn.ProbabilisticNode;
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) {
45         EntityManager em = DbUtil.getInstance().getEntityManager();
46
47         UnBUtil unBUtil = UnBUtil.getInstance(paciente.getRede());
48         unBUtil.abreRede(paciente.getRede());
49         
50         Iterator<NodoPaciente> it = em.createQuery("From NodoPaciente Where paciente.id=:pIdPaciente")
51                                       .setParameter("pIdPaciente", paciente.getId())
52                                       .getResultList()
53                                       .iterator();
54         
55         float pcProbabilidade=0;
56         while(it.hasNext()) {
57             NodoPaciente nodoPac = it.next();
58             
59             if (nodoPac.getNodo().getBogus()) {
60                 if (nodoPac.getNodo().getId() == nodo.getId())
61                     pcProbabilidade = 100;
62
63                 continue;
64             }
65             
66             ProbabilisticNode pn = unBUtil.getNodeByName(nodoPac.getNodo().getNome());
67             unBUtil.ativarNodo(pn);
68         }
69         
70         
71         if (nodo.getBogus()) {
72             if (pcProbabilidade == 0)
73                 pcProbabilidade = (int) (1+Math.random()*50);
74         }
75         else {
76             NodoBean nodoBean = unBUtil.getNodoBeanByNodo(nodo);            
77             pcProbabilidade = nodoBean.getPercentualProbabilidade();
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     @Override
119     protected void executaServico(EntityManager em, HttpServletRequest request, HttpServletResponse response, PrintWriter out) throws Exception
120     {
121         response.setContentType("text/html;charset=UTF-8");
122         Caso caso = em.find(Caso.class, Long.parseLong(request.getParameter("idcaso")));
123
124
125         if (!em.getTransaction().isActive()) {
126             em.getTransaction().begin();
127         }
128
129         // Cria sessao
130         SessaoUsuario sessaoUsuario = new SessaoUsuario();
131         sessaoUsuario.setData(new Date());
132         sessaoUsuario.setCaso(caso);
133         em.persist(sessaoUsuario);
134         em.flush();
135
136         // Logo inicio do caso.
137         Log log = new Log();
138         log.setTipo(em.find(TipoEventoLog.class, TipoEventoLog.INICIO_CASO));
139         log.setCaso(caso);
140         log.setData(new Date());
141         log.setSessaoUsuario(sessaoUsuario);
142
143
144         em.persist(log);
145
146
147         em.getTransaction().commit();
148
149
150         out.println("<caso uid=\"caso-" + caso.getId() + "\" sessao=\"" + sessaoUsuario.getId() + "\" titulo=\"" + caso.getNome() + "\" modelo=\"" + caso.getModelo() + "\" descricaoAmbiente=\"" + caso.getTextoInicial() + "\">");
151
152         Iterator<Paciente> itPac = em.createQuery("From Paciente where caso.id=:pIdCaso").setParameter("pIdCaso", caso.getId()).getResultList().iterator();
153         while (itPac.hasNext()) {
154             Paciente paciente = itPac.next();
155             out.println("    <ator uid=\"" + paciente.getId() + "\" tipo=\"paciente\" nome=\"" + paciente.getNome() + "\" modelo=\"" + paciente.getModelo() + "\" idade=\"" + paciente.getIdade() + "\" peso=\"" + paciente.getPeso() + "\" altura=\"" + paciente.getAltura() + "\" >");
156
157             out.println("        <etapa uid=\"etapa-1\" nome=\"Investigação\" sequencia=\"1\" tipo=\"investigacao\">");
158
159             // Sinais e sintomas
160             out.println("            <perguntar_sintoma uid=\"perguntar-sintoma-" + paciente.getId() + "\" descricao=\"Perguntar Sinais/Sintomas\">");
161             List<NodoPaciente> nodos = em.createQuery("From NodoPaciente Where paciente.id=:pIDPaciente").setParameter("pIDPaciente", paciente.getId()).getResultList();
162             for (NodoPaciente nodo : nodos) {
163                 if (!nodo.getNodo().getTipo().equals(Nodo.SINAL_SINTOMA) && !nodo.getNodo().getTipo().equals(Nodo.HISTORICO)) {
164                     continue;
165                 }
166
167                 out.println("                <sintoma uid=\"sintoma-np-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nomeCientifico=\"" + nodo.getNodo().getNome() + "\" nomePopular=\"" + getPerguntaNodo(nodo.getNodo().getId()) + "\" imagem=\"\" som=\"\" video=\"\" dependencia=\"" + getDependencia(nodo.getNodo().getId()) + "\" falaPaciente=\"" + getRespostaNodo(nodo.getNodo(), paciente) + "\" />");
168             }
169
170             // Sinais e sintomas inativos
171             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();
172             for (Nodo nodo : nodosNaoSelecionados) {
173                 if (!nodo.getTipo().equals(Nodo.SINAL_SINTOMA) && !nodo.getTipo().equals(Nodo.HISTORICO)) {
174                     continue;
175                 }
176
177                 out.println("                <sintoma uid=\"sintoma-nd-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nomeCientifico=\"" + nodo.getNome() + "\" nomePopular=\"" + getPerguntaNodo(nodo.getId()) + "\" imagem=\"\" som=\"\" video=\"\" dependencia=\"" + getDependencia(nodo.getId()) + "\" falaPaciente=\"" + getRespostaNodo(nodo, paciente) + "\" />");
178             }
179
180             out.println("            </perguntar_sintoma>");
181
182             // Exame Físico
183             out.println("            <realiza_exame_fisico uid=\"realiza-exame-fisico-" + paciente.getId() + "\" descricao=\"Realizar Exame Físico\">");
184             for (NodoPaciente nodo : nodos) {
185                 if (!nodo.getNodo().getTipo().equals(Nodo.EXAME_FISICO)) {
186                     continue;
187                 }
188
189                 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=\"\" />");
190             }
191             out.println("            </realiza_exame_fisico>");
192
193             // Exame Complementar
194             out.println("            <solicitar_exames_complementar uid=\"solicitar-exame-complementar-" + paciente.getId() + "\" descricao=\"Solicitar Exame Complementar\">\"");
195             for (NodoPaciente nodo : nodos) {
196                 if (!nodo.getNodo().getTipo().equals(Nodo.EXAME_COMPLEMENTAR)) {
197                     continue;
198                 }
199
200                 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=\"\" />");
201             }
202             out.println("            </solicitar_exames_complementar>");
203             /*
204              * // historico for(NodoPaciente nodo : nodos) { if
205              * (!nodo.getNodo().getTipo().equals(Nodo.HISTORICO)) continue;
206              *
207              * out.println(" <historico_medico uid=\"historico-medico-" +
208              * nodo.getId() + "\" dependencia=\"" +
209              * getDependencia(nodo.getNodo().getId()) + "\"
210              * descricao=\"Histórico Médico\" historico=\"" +
211              * nodo.getNodo().getNomeAmigavel() + "\" imagem=\"\" som=\"\"
212              * video=\"\" />"); }
213              */
214             out.println("        <historico_medico uid=\"historico-medico-1" + ":paciente-" + paciente.getId() + "\" dependencia=\"\" descricao=\"Histórico Médico\" historico=\"" + paciente.getHistorico() + "\" imagem=\"\" som=\"\" video=\"\" />");
215
216
217             out.println("        </etapa>");
218
219             out.println("        <etapa uid=\"etapa-2\" nome=\"Diagnóstico\" sequencia=\"2\" tipo=\"diagnostico\">");
220             Iterator<Nodo> itDiagnosticos = em.createQuery("From Nodo where tipo=:pTipo").setParameter("pTipo", Nodo.DIAGNOSTICO).getResultList().iterator();
221             while (itDiagnosticos.hasNext()) {
222                 Nodo nodo = itDiagnosticos.next();
223                 out.println("            <diagnostico uid=\"diagnostico-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nome=\"" + nodo.getNomeAmigavel() + "\" falaMedico=\"" + getPerguntaNodo(nodo.getId()) + "\" />");
224             }
225             out.println("        </etapa>");
226
227             out.println("        <etapa uid=\"etapa-3\" nome=\"Conduta\" sequencia=\"3\" tipo=\"conduta\">");
228             Iterator<Nodo> itConduta = em.createQuery("From Nodo where tipo=:pTipo").setParameter("pTipo", Nodo.CONDUTA).getResultList().iterator();
229             while (itConduta.hasNext()) {
230                 Nodo nodo = itConduta.next();
231                 out.println("            <conduta uid=\"conduta-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nome=\"" + nodo.getNomeAmigavel() + "\" falaMedico=\"" + getPerguntaNodo(nodo.getId()) + "\" />");
232             }
233             out.println("        </etapa>");
234             out.println("    </ator>");
235         }
236
237
238         out.println("</caso>");
239     }
240
241 }