Bug fixing and error detection
This topic can be broken down into two major segments.
- Understanding xml error messages displayed to the users
- Reading the detailed SHR adapter error logs
Understanding xml error messages displayed to the users
GET or POST request made by the user may return in error conditions due to various reasons. In such an event, an appopriate xml message containing the cause of the error will be displayed to the user.
1. User inputs an patient identifier type other than ECID
HTTP/1.1 400 Bad Request Expires: Thu, 01 Jan 1970 00:00:00 GMT Set-Cookie: JSESSIONID=pvuaqamw4jxe;Path=/openmrs Content-Type: text/xml; charset=utf-8 Content-Length: 153 Server: Jetty(6.1.10) <?xml version="1.0"?><error><error_code>400</error_code><error_msg>ID type not recognized. Currently, RHEA Supports only ID type ECID</error_msg></err or>
2. Patient does not exsist in the system
HTTP/1.1 400 Bad Request Expires: Thu, 01 Jan 1970 00:00:00 GMT Set-Cookie: JSESSIONID=1tzifjq4qoi0k;Path=/openmrs Content-Type: text/xml; charset=utf-8 Content-Length: 120 Server: Jetty(6.1.10) <?xml version="1.0"?><error><error_code>400</error_code><error_msg>Error : failed to resolve patient</error_msg></error>
3. Date specified in the requests is incorrect (cannot be parsed)
HTTP/1.1 400 Bad Request Expires: Thu, 01 Jan 1970 00:00:00 GMT Set-Cookie: JSESSIONID=9ihmy7i776rl;Path=/openmrs Content-Type: text/xml; charset=utf-8 Content-Length: 136 Server: Jetty(6.1.10) <?xml version="1.0"?><error><error_code>400</error_code><error_msg>java.text.ParseException: Unparseable date: "2-2"</error_msg></error>
4. In the event of some other internal server error during processing, a short defenition of the error message will be displayed to the user in the above format.
In addition to the error message displayed to the user, a detailed stack trace for the error will also be stored in the database. Two seperate log tables have been created to store GET and POST request errors.
A sample entry (a single data row) of the error log table for GET will be as follows -
GET_request_id, patient_id, encounter_unique_id, enterprise_location_id, date_start, date_end, log_time, result, error, 'java.lang.ClassCastException: org.openmrs.Person$$EnhancerByCGLIB$$5ba7d262 cannot be cast to org.openmrs.Patient at org.jembi.rhea.module.rheashradapter.util.GenerateORU_R01.createOBREnc(GenerateORU_R01.java:236) at org.jembi.rhea.module.rheashradapter.util.GenerateORU_R01.generateORU_R01Message(GenerateORU_R01.java:164) at org.jembi.rhea.module.web.controller.RHEApatientController.getEncounters(RHEApatientController.java:287) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093) at org.openmrs.module.web.filter.ForcePasswordChangeFilter.doFilter(ForcePasswordChangeFilter.java:65) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at org.openmrs.module.web.filter.ModuleFilterChain.doFilter(ModuleFilterChain.java:76) at org.openmrs.module.web.filter.ModuleFilter.doFilter(ModuleFilter.java:58) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at org.openmrs.web.filter.OpenmrsFilter.doFilterInternal(OpenmrsFilter.java:112) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at org.openmrs.web.filter.StartupFilter.doFilter(StartupFilter.java:83) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at org.openmrs.web.filter.StartupFilter.doFilter(StartupFilter.java:83) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at org.openmrs.web.filter.StartupFilter.doFilter(StartupFilter.java:83) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206) at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:324) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:829) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488) '
To understand the structure of the logging tables, and what data it records, look here