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