1 23 24 30 31 package com.sun.enterprise.admin.monitor.callflow; 32 33 import org.apache.catalina.Wrapper; 34 import org.apache.catalina.InstanceEvent; 35 import org.apache.catalina.InstanceListener; 36 import org.apache.catalina.ContainerEvent; 37 import org.apache.catalina.ContainerListener; 38 import org.apache.catalina.core.StandardContext; 39 import org.apache.coyote.Adapter; 40 import org.apache.jasper.Constants; 41 import org.apache.jasper.servlet.JspServlet; 42 43 import javax.servlet.Filter ; 44 import javax.servlet.Servlet ; 45 import javax.servlet.ServletConfig ; 46 import javax.servlet.http.HttpServletRequest ; 47 48 import com.sun.enterprise.Switch; 49 55 public class WebContainerListener 56 implements InstanceListener, ContainerListener { 57 58 private static final String JSP_SERVLET = JspServlet.class.getName(); 59 81 private static final ThreadLocal <AgentImpl.FlowStack<Boolean >> threadLocal = 82 new ThreadLocal () { 83 protected AgentImpl.FlowStack<Boolean > initialValue() { 84 return new AgentImpl.FlowStack<Boolean >(); 85 } 86 }; 87 88 89 private static final ThreadLocal <Boolean > requestStartTls = 90 new ThreadLocal () { 91 protected Boolean initialValue(){ 92 return Boolean.FALSE; 93 } 94 }; 95 96 private Agent callFlowAgent; 97 98 public WebContainerListener() { 99 this.callFlowAgent = Switch.getSwitch().getCallFlowAgent(); 100 } 101 102 public void instanceEvent(InstanceEvent event) { 103 104 if (!callFlowAgent.isEnabled()) { 105 return; 106 } 107 108 if (!requestStartTls.get ()) 109 return; 110 111 if (event.getType().equals(InstanceEvent.BEFORE_SERVICE_EVENT)) { 112 AgentImpl.FlowStack<Boolean > flowStack = threadLocal.get(); 113 if (flowStack.size() == 0) { 114 processBeforeDispatchEvent(event); 117 } 118 flowStack.push(Boolean.TRUE); 119 processBeforeServiceEvent(event); 120 } else if (event.getType().equals(InstanceEvent.AFTER_SERVICE_EVENT)) { 121 processAfterServiceEvent(event); 122 AgentImpl.FlowStack<Boolean > flowStack = threadLocal.get(); 123 flowStack.pop(); 124 if (flowStack.size() == 0) { 125 processAfterDispatchEvent(event); 128 } 129 } else if (event.getType().equals(InstanceEvent.BEFORE_FILTER_EVENT)) { 130 AgentImpl.FlowStack<Boolean > flowStack = threadLocal.get(); 131 if (flowStack.size() == 0) { 132 processBeforeDispatchEvent(event); 135 } 136 flowStack.push(Boolean.TRUE); 137 processBeforeFilterEvent(event); 138 } else if (event.getType().equals(InstanceEvent.AFTER_FILTER_EVENT)) { 139 processAfterFilterEvent(event); 140 AgentImpl.FlowStack<Boolean > flowStack = threadLocal.get(); 141 flowStack.pop(); 142 if (flowStack.size() == 0) { 143 processAfterDispatchEvent(event); 146 } 147 } else if (event.getType(). 148 equals(InstanceEvent.BEFORE_DISPATCH_EVENT)) { 149 processBeforeDispatchEvent(event); 150 } else if (event.getType().equals(InstanceEvent.AFTER_DISPATCH_EVENT)) { 151 processAfterDispatchEvent(event); 152 } 153 } 154 155 private void processBeforeServiceEvent(InstanceEvent event) { 156 157 Servlet servlet = event.getServlet(); 158 ServletConfig servletConfig = servlet.getServletConfig(); 159 String servletName = "UNKNOWN"; 160 if (servletConfig != null) { 161 servletName = servletConfig.getServletName(); 162 } 163 164 HttpServletRequest req = (HttpServletRequest ) event.getRequest(); 165 String methodName = req.getRequestURI() + ":"; 166 if (!servlet.getClass().getName().equalsIgnoreCase(JSP_SERVLET)){ 167 methodName += servlet.getClass().getName() + ".service"; 168 } else { 169 methodName += extractJSPName(req) +":" + JSP_SERVLET + ".service"; 171 } 172 String callerPrincipal = req.getRemoteUser(); 173 if (callerPrincipal == null) { 174 if (req.getUserPrincipal() != null) { 175 callerPrincipal = req.getUserPrincipal().getName(); 176 } else { 177 callerPrincipal = "anonymous"; 178 } 179 } 180 181 Wrapper wrapper = event.getWrapper(); 182 String applicationName = 183 ((StandardContext)wrapper.getParent()).getJ2EEApplication(); 184 if ((applicationName == null) || (applicationName.equals("null"))) { 185 applicationName = "URI:" + req.getRequestURI(); 186 } 187 String moduleName = wrapper.getParent().getName(); 188 189 callFlowAgent.webMethodStart( 190 methodName, applicationName, moduleName, 191 servletName, ComponentType.SERVLET, 192 callerPrincipal); 193 } 194 195 private void processAfterServiceEvent(InstanceEvent event) { 196 Throwable exception = event.getException(); 197 callFlowAgent.webMethodEnd(exception); 198 } 199 200 private void processBeforeFilterEvent(InstanceEvent event) { 201 202 Filter filter = event.getFilter(); 203 204 HttpServletRequest req = (HttpServletRequest ) event.getRequest(); 205 String methodName = req.getRequestURI() + ":" + 206 filter.getClass().getName() + ".doFilter"; 207 String callerPrincipal = req.getRemoteUser(); 208 if (callerPrincipal == null) { 209 if (req.getUserPrincipal() != null) { 210 callerPrincipal = req.getUserPrincipal().getName(); 211 } else { 212 callerPrincipal = "anonymous"; 213 } 214 } 215 216 Wrapper wrapper = event.getWrapper(); 217 String applicationName = 218 ((StandardContext)wrapper.getParent()).getJ2EEApplication(); 219 if ((applicationName == null) || (applicationName.equals("null"))) { 220 applicationName = "URI:" + req.getRequestURI(); 221 } 222 String moduleName = wrapper.getParent().getName(); 223 224 callFlowAgent.webMethodStart( 225 methodName, applicationName, moduleName, 226 filter.getClass().getName(), 227 ComponentType.SERVLET_FILTER, callerPrincipal); 228 } 229 230 private void processAfterFilterEvent(InstanceEvent event) { 231 Throwable exception = event.getException(); 232 callFlowAgent.webMethodEnd(exception); 233 } 234 235 private void processBeforeDispatchEvent(InstanceEvent event) { 236 callFlowAgent.startTime(ContainerTypeOrApplicationType.WEB_CONTAINER); 237 } 238 239 private void processAfterDispatchEvent(InstanceEvent event) { 240 callFlowAgent.endTime(); 241 } 242 243 249 public void containerEvent(ContainerEvent event) { 250 251 if (!callFlowAgent.isEnabled()) { 252 return; 253 } 254 255 Object obj = event.getData(); 256 if (!(obj instanceof org.apache.coyote.RequestInfo)) { 257 return; 258 } 259 org.apache.coyote.RequestInfo 260 requestInfo = (org.apache.coyote.RequestInfo) obj; 261 if (Adapter.CONNECTION_PROCESSING_STARTED.equals(event.getType())) { 262 requestStartTls.set (Boolean.TRUE); 263 callFlowAgent.requestStart(RequestType.REMOTE_WEB); 264 callFlowAgent.addRequestInfo( 265 RequestInfo.CALLER_IP_ADDRESS, 266 requestInfo.getRemoteAddr()); 267 } else if (Adapter.REQUEST_PROCESSING_COMPLETED. 268 equals(event.getType())) { 269 callFlowAgent.requestEnd(); 270 } 271 } 272 273 private String extractJSPName (HttpServletRequest request){ 274 275 String jspUri = null; 276 277 String jspFile = (String ) request.getAttribute(Constants.JSP_FILE); 278 if (jspFile != null) { 279 jspUri = jspFile; 281 } else { 282 286 jspUri = (String ) request.getAttribute(Constants.INC_SERVLET_PATH); 287 if (jspUri != null) { 288 293 String pathInfo = (String ) request.getAttribute( 294 "javax.servlet.include.path_info"); 295 if (pathInfo != null) { 296 jspUri += pathInfo; 297 } 298 } else { 299 304 jspUri = request.getServletPath(); 305 String pathInfo = request.getPathInfo(); 306 if (pathInfo != null) { 307 jspUri += pathInfo; 308 } 309 } 310 } 311 return jspUri; 312 } 313 } 314 | Popular Tags |