1 19 20 package org.netbeans.modules.web.monitor.server; 21 22 import java.io.IOException ; 23 import java.io.PrintStream ; 24 import java.io.PrintWriter ; 25 26 import java.net.MalformedURLException ; 27 28 import java.util.Date ; 29 import java.util.Enumeration ; 30 import java.util.Hashtable ; 31 import java.util.ResourceBundle ; 32 import java.util.Stack ; 33 import java.util.StringTokenizer ; 34 import java.util.Vector ; 35 36 import java.text.DateFormat ; 37 38 import javax.servlet.Filter ; 39 import javax.servlet.FilterChain ; 40 import javax.servlet.FilterConfig ; 41 import javax.servlet.Servlet ; 42 import javax.servlet.ServletContext ; 43 import javax.servlet.ServletException ; 44 import javax.servlet.ServletRequest ; 45 import javax.servlet.ServletResponse ; 46 47 import javax.servlet.http.Cookie ; 48 import javax.servlet.http.HttpServletRequest ; 49 import javax.servlet.http.HttpServletRequestWrapper ; 50 import javax.servlet.http.HttpServletResponse ; 51 import javax.servlet.http.HttpServletResponseWrapper ; 52 import javax.servlet.http.HttpSession ; 53 54 import org.netbeans.modules.web.monitor.data.*; 55 56 public class MonitorFilter extends Logger implements Filter { 57 58 public final static String REPLAY = "netbeans.replay"; public final static String PORT = "netbeans.replay.port"; public final static String REPLAYSTATUS = "netbeans.replay.status"; public final static String REPLAYSESSION = "netbeans.replay.session"; 64 private String attribute = null; 67 public final static String PREFIX = "netbeans.monitor"; private final static String attNameRequest = 69 "netbeans.monitor.request"; private final static String attNameResponse = 71 "netbeans.monitor.response"; private final static String attNameFilter = 73 "netbeans.monitor.filter"; private final static String attNameMonData = 75 "netbeans.monitor.monData"; public static final String IDE = "netbeans.monitor.ide"; public static final String IDES = "netbeans.monitor.register"; 81 private static boolean collectData = true; 83 84 private FilterConfig filterConfig = null; 88 89 private final static String className = 90 "org.netbeans.modules.web.monitor.server.Monitor"; 92 private static ResourceBundle statusmsgs = 93 ResourceBundle.getBundle("org.netbeans.modules.web.monitor.server.MonitorBundle"); 95 private static NotifyUtil notifyUtil = null; 96 97 100 private static final String APPSERVER_SYSTEM_WEB_MODULES[] = { 101 "/com_sun_web_ui", "/asadmin", "/web1"}; 105 112 private static final String NETBEANS_INTERNAL_REQUEST_URI = 113 "/netbeans-tomcat-status-test"; 115 private final static boolean debug = false; 117 118 public MonitorFilter() { 119 } 120 121 131 public void doFilter(ServletRequest request, ServletResponse response, 132 FilterChain chain) 133 throws IOException , ServletException { 134 135 138 if(debug) log("doFilter()"); 140 Object obj = getFilterConfig().getServletContext().getAttribute("org.apache.catalina.MBeanServer"); 144 145 boolean internalAppServerRequest = false; 146 boolean internalIDERequest = false; 147 if (request instanceof HttpServletRequest ) { 148 String requestURI = ((HttpServletRequest )request).getRequestURI(); 152 for (int i = 0; i < APPSERVER_SYSTEM_WEB_MODULES.length; i++) { 153 if (requestURI.startsWith(APPSERVER_SYSTEM_WEB_MODULES[i])) { 154 internalAppServerRequest = true; 155 break; 156 } 157 } 158 159 if (requestURI.startsWith(NETBEANS_INTERNAL_REQUEST_URI)) { 163 internalIDERequest = true; 164 } 165 } 166 167 if(!collectData || !(request instanceof HttpServletRequest ) || 168 obj != null || internalAppServerRequest || internalIDERequest) { 169 170 if(debug) log("not collecting data"); try { 174 chain.doFilter(request, response); 175 } 176 catch(Throwable t) { 177 rethrow(t); 178 } 179 return; 180 } 181 182 HttpServletRequest req = (HttpServletRequest )request; 183 if(debug) log("Request for: " + req.getRequestURI()); 185 boolean outermost = true; 194 195 HttpServletRequestWrapper requestWrapper = null; 196 HttpServletResponseWrapper responseWrapper = null; 197 198 DataRecord dr = null; 205 206 if(request instanceof HttpServletRequestWrapper && 207 response instanceof HttpServletResponseWrapper ) { 208 209 Object o = req.getAttribute(attNameRequest); 210 if(o instanceof MonitorRequestWrapper) { 211 212 if(debug) 213 log("Request previously processed by the monitor"); outermost = false; 215 216 requestWrapper = (HttpServletRequestWrapper )req; 220 responseWrapper = (HttpServletResponseWrapper )response; 221 222 dr = setupDispatchDataRecord((MonitorRequestWrapper)o); 225 226 if(dr == null) { 232 if(debug) 233 log("failed to link to parent data record"); try { chain.doFilter(request, response); } 235 catch(Throwable t) { rethrow (t); } 236 return; 237 } 238 } 239 240 252 if(requestWrapper == null) log(ResourceBundle.getBundle("org.netbeans.modules.web.monitor.server.Bundle").getString("MON_Deploy_first")); } 254 255 if(requestWrapper == null) { 256 257 if(debug) log("request just entered container"); 261 String query = req.getQueryString(); 269 270 if(query != null && query.startsWith(REPLAY)) { 271 272 if(debug) log("received replay request"); 274 try { 275 requestWrapper = getReplayRequest(req); 276 } 277 catch(IOException ioex) { 278 try { chain.doFilter(request, response); } 285 catch(Throwable t) { rethrow (t); } 286 return; 287 } 288 } 289 else { 290 if(debug) log("wrapping the request"); requestWrapper = new MonitorRequestWrapper(req); 292 } 293 294 requestWrapper.setAttribute(attNameRequest, requestWrapper); 304 305 dr = setupDataRecord(requestWrapper); 307 308 if(debug) log(" Replace Response"); HttpServletResponse res = (HttpServletResponse )response; 311 312 responseWrapper = 318 new MonitorResponseWrapper(res, requestWrapper); 319 320 requestWrapper.setAttribute(attNameResponse, responseWrapper); 324 325 requestWrapper.setAttribute(attNameFilter, this); 330 } 331 332 Throwable processingError = null; 333 boolean cntnue = true; 334 335 if(debug) log("doFilter(): Collect data before"); 338 try { 339 getDataBefore(dr, requestWrapper); 340 341 } 342 catch(StackOverflowError soe) { 343 351 if(debug) 352 log(" StackOverflow before processing the request"); processingError = soe; 354 cntnue = false; 355 } 356 357 catch(Throwable t) { 358 if(debug) log(getStackTrace(t)); 360 } 361 362 if(cntnue) { 363 364 try { 368 chain.doFilter(requestWrapper, responseWrapper); 369 } 370 371 catch(StackOverflowError soe) { 372 380 if(debug) 381 log(" StackOverflow while processing the request"); processingError = soe; 383 cntnue = false; 384 } 385 386 catch(Throwable t) { 387 processingError = t; 388 } 389 413 } 414 415 if(cntnue) { 416 417 if(debug) log("doFilter(): Collect data after"); 424 try { 425 getDataAfter(dr, requestWrapper); 426 } 427 catch(Throwable t) { 428 if(debug) log(getStackTrace(t)); 429 } 430 } 431 432 if(outermost) { 434 if(debug) log("Final, send data to server"); disposeDataRecord(requestWrapper); 436 } 437 else { 438 if(debug) log("Non-final, continue processing"); disposeDispatchedDataRecord(requestWrapper); 440 ((MonitorRequestWrapper)(requestWrapper.getAttribute(attNameRequest))).popExtraParameters(); 442 } 443 444 if(processingError != null) { 445 rethrow(processingError); 449 } 450 451 } 455 456 private DataRecord setupDataRecord(ServletRequest req) { 457 458 if(debug) log("setupDataRecord()"); MonitorData md = new MonitorData(); 460 Stack dataStack = new Stack (); 461 dataStack.push(md); 462 if(debug) log(" created MonData stack & set attribute"); req.setAttribute(attNameMonData, dataStack); 464 return md; 465 } 466 467 479 private DataRecord setupDispatchDataRecord(MonitorRequestWrapper req) { 480 481 485 487 req.pushExtraParameters(); 488 if(debug) log("Pushed the wrapper parameters"); 490 Stack dataStack = null; 491 try { 492 dataStack = (Stack )(req.getAttribute(attNameMonData)); 493 } 494 catch(Throwable t){ 495 if(debug) log("MonitorFilter - this request had no stack"); return null; 498 } 499 500 if(dataStack.empty()) { 501 if(debug) log("process dispatched ERROR - stack is empty"); return null; 503 } 504 505 Object obj = dataStack.peek(); 506 Dispatches disp = null; 507 508 if(!(obj instanceof DataRecord)) { 509 if(debug) log("ERROR - obj on stack is not DataRecord"); return null; 511 } 512 513 DataRecord dr = (DataRecord)obj; 514 515 537 538 disp = dr.getDispatches(); 539 if(disp == null) { 540 if(debug) log("Data record had no dispatches yet"); disp = new Dispatches(); 542 dr.setDispatches(disp); 543 } 544 545 DispatchData disData = new DispatchData(); 546 disp.addDispatchData(disData); 547 if(debug) log("Added new data record to existing one"); 549 dataStack.push(disData); 550 if(debug) log("pushed the data record onto the stack"); return disData; 552 } 553 554 private void disposeDataRecord(ServletRequest req) { 555 556 if(debug) log("disposeDataRecord()"); 558 req.removeAttribute(attNameRequest); 561 req.removeAttribute(attNameResponse); 562 req.removeAttribute(attNameFilter); 563 564 MonitorData monData = null; 565 566 Stack stack = (Stack )(req.getAttribute(attNameMonData)); 567 req.removeAttribute(attNameMonData); 568 569 if(stack != null && !stack.empty()) { 570 if(debug) { 571 log("found mondata stack"); log("stack size=" + stack.size()); } 574 Object o = stack.pop(); 575 if(o instanceof MonitorData) 576 monData = (MonitorData)o; 577 else if(debug) { 578 log(o.toString()); 579 log("ERROR - wrong type object on stack"); } 581 } 582 else if(debug) { 583 log("ERROR - mondata stack empty"); } 585 586 if(monData == null) { 587 return; 588 } 589 590 StringBuffer buf = 591 new StringBuffer (monData.getAttributeValue("id")); buf.append(Constants.Punctuation.itemSep); 593 buf.append(monData.getAttributeValue("method")); buf.append(Constants.Punctuation.itemSep); 595 buf.append(monData.getAttributeValue("resource")); 597 if(debug) { 598 log(" Notify client"); log(" Query string is " + buf.toString()); 601 log("Notify util is " + notifyUtil.toString()); 603 String file = 604 monData.createTempFile("filter-send.xml"); log("Wrote data to " + file); } 607 608 notifyUtil.sendRecord(monData, buf.toString()); 609 if(debug) log("Notify util has terminated"); 611 } 612 613 private DataRecord disposeDispatchedDataRecord(ServletRequest req) { 614 615 Stack stack = (Stack )(req.getAttribute(attNameMonData)); 616 Object o = null; 617 if(stack != null && !stack.empty()) 618 o = stack.pop(); 619 if(o instanceof DataRecord) return (DataRecord)o; 620 return null; 621 } 622 623 629 public void handleDispatchedBefore(ServletRequest req) { 630 631 634 if(debug) log ("handleDispatchBefore: start"); 636 Object w = req.getAttribute(attNameRequest); 637 if(w == null || !(w instanceof MonitorRequestWrapper)) { 638 return; 639 } 640 DataRecord dr = setupDispatchDataRecord((MonitorRequestWrapper)w); 642 644 if(dr == null) return; 645 646 getDataBefore(dr, (HttpServletRequest )req); 648 649 654 return; 655 } 656 657 658 664 public void handleDispatchedAfter(ServletRequest req) { 665 666 668 if(debug) log ("handleDispatchedAfter()"); 670 Object w = req.getAttribute(attNameRequest); 671 if(w == null || !(w instanceof MonitorRequestWrapper)) { 672 return; 673 } 674 675 DataRecord dr = disposeDispatchedDataRecord((MonitorRequestWrapper)w); 676 if(dr == null) return; 677 678 701 702 getDataAfter(dr, (HttpServletRequest )req); 704 if(debug) log ("collected data"); 706 ((MonitorRequestWrapper)w).popExtraParameters(); 708 709 714 return; 715 } 716 717 721 private void getDataBefore(DataRecord dataRecord, 722 HttpServletRequest request) { 723 724 if(dataRecord instanceof MonitorData) { 725 String timestamp = String.valueOf(System.currentTimeMillis()); 726 String method = request.getMethod(); 727 String uri = request.getRequestURI(); 728 729 String resource = new String (uri); 732 733 String id = new String (timestamp); 735 736 if(debug) { 737 log(" id: " + id); log(" uri: " + request.getRequestURI()); } 740 dataRecord.setAttributeValue("id", id); dataRecord.setAttributeValue("timestamp", timestamp); dataRecord.setAttributeValue("resource", resource); dataRecord.setAttributeValue("method", method); } 745 else if(dataRecord instanceof DispatchData) { 746 String resource = 747 (String )request.getAttribute("javax.servlet.include.request_uri"); if(resource == null || resource.equals("")) resource = request.getRequestURI(); 750 751 dataRecord.setAttributeValue("resource", resource); } 753 754 if(debug) log(" Client Data"); ClientData cd = new ClientData(); 760 recordClientData(cd, request); 761 dataRecord.setClientData(cd); 762 763 if(debug) log(" Context data"); ContextData cond = new ContextData(); 765 recordContextData(cond, request); 766 dataRecord.setContextData(cond); 767 768 if(debug) log(" Servlet engine data"); EngineData ed = new EngineData(); 770 recordEngineData(ed, request); 771 dataRecord.setEngineData(ed); 772 774 if(debug) log(" Session Data"); SessionData sd = new SessionData(); 776 getSessionIn(sd, request); 777 dataRecord.setSessionData(sd); 778 779 if(debug) log(" Request Data"); RequestData rd = new RequestData(); 781 recordRequestData(rd, request); 782 if(debug) log(" Set Request Data"); dataRecord.setRequestData(rd); 784 785 if(debug) log(" Cookie Data"); CookiesData cookiesData = new CookiesData(); 788 recordCookiesIn(cookiesData, request); 789 dataRecord.setCookiesData(cookiesData); 790 791 if(debug) log("getDataBefore(): done"); } 793 794 795 private void getDataAfter(DataRecord dataRecord, 796 HttpServletRequest request) { 797 798 if(debug) log("getDataAfter(DataRecord, HttpServletRequest)"); 800 MonitorResponseWrapper monResponse = 801 (MonitorResponseWrapper)request.getAttribute(attNameResponse); 802 803 if(debug) log(" Get status"); int status = monResponse.getStatus(); 805 RequestData rd = dataRecord.getRequestData(); 806 if (status == 0) { 808 if(debug) log(ResourceBundle.getBundle("org.netbeans.modules.web.monitor.server.Bundle").getString("MON_Unknown_exit_status")); 809 rd.setAttributeValue("status", ResourceBundle.getBundle("org.netbeans.modules.web.monitor.server.Bundle").getString("MON_Unknown_exit_status")); 811 } else { 812 String statusStr = "sc".concat(String.valueOf(status)); if(debug) log("Status string is " + statusStr); 814 815 if(debug) log(String.valueOf(statusmsgs.getString(statusStr))); 816 817 rd.setAttributeValue("status", statusmsgs.getString(statusStr)); } 820 821 if(debug) log(" request attributes out"); RequestAttributesOut reqattrout = new RequestAttributesOut(); 823 reqattrout.setParam(recordRequestAttributes(request)); 824 825 rd.setRequestAttributesOut(reqattrout); 826 827 if(debug) log(" add request parameter"); addRequestParameters(rd, request); 829 830 if(debug) log(" Cookies out"); recordCookiesOut(dataRecord.getCookiesData(), monResponse); 832 833 if(debug) log(" Session out"); addSessionOut(dataRecord.getSessionData(), request); 835 } 836 837 838 841 private void recordClientData(ClientData cd, 842 HttpServletRequest request) { 843 844 String protocol = request.getProtocol(); 845 while(protocol.endsWith("\n")) protocol = protocol.substring(0, protocol.length()-2); 847 848 cd.setAttributeValue("protocol", protocol); cd.setAttributeValue("remoteAddress", request.getRemoteAddr()); 851 852 Enumeration hvals; 853 StringBuffer valueBuf; 854 int counter; 855 856 valueBuf = new StringBuffer (128); 858 counter = 0; 859 hvals = request.getHeaders(Constants.Http.userAgent); 860 if(hvals != null) { 861 while(hvals.hasMoreElements()) { 862 if(counter > 0) valueBuf.append(", "); valueBuf.append((String )hvals.nextElement()); 864 ++counter; 865 } 866 } 867 cd.setAttributeValue("software", valueBuf.toString()); 869 valueBuf = new StringBuffer (128); 871 counter = 0; 872 hvals = request.getHeaders(Constants.Http.acceptLang); 873 if(hvals != null) { 874 while(hvals.hasMoreElements()) { 875 if(counter > 0) valueBuf.append(", "); valueBuf.append((String )hvals.nextElement()); 877 ++counter; 878 } 879 } 880 cd.setAttributeValue("locale", valueBuf.toString()); 882 valueBuf = new StringBuffer (128); 884 counter = 0; 885 hvals = request.getHeaders(Constants.Http.accept); 886 if(hvals != null) { 887 while(hvals.hasMoreElements()) { 888 if(counter > 0) valueBuf.append(", "); valueBuf.append((String )hvals.nextElement()); 890 ++counter; 891 } 892 } 893 cd.setAttributeValue("formatsAccepted", valueBuf.toString()); 895 valueBuf = new StringBuffer (128); 897 counter = 0; 898 hvals = request.getHeaders(Constants.Http.acceptEncoding); 899 if(hvals != null) { 900 while(hvals.hasMoreElements()) { 901 if(counter > 0) valueBuf.append(", "); valueBuf.append((String )hvals.nextElement()); 903 ++counter; 904 } 905 } 906 cd.setAttributeValue("encodingsAccepted", valueBuf.toString()); valueBuf = new StringBuffer (128); 909 counter = 0; 910 hvals = request.getHeaders(Constants.Http.acceptCharset); 911 if(hvals != null) { 912 while(hvals.hasMoreElements()) { 913 if(counter > 0) valueBuf.append(", "); valueBuf.append((String )hvals.nextElement()); 915 ++counter; 916 } 917 } 918 cd.setAttributeValue("charsetsAccepted", valueBuf.toString()); 920 } 921 922 private void recordCookiesIn(CookiesData cd, 923 HttpServletRequest request) { 924 925 Cookie cks[] = null; 926 927 try { 928 cks = request.getCookies(); 929 } 930 catch(Exception ex) { 931 } 933 934 if(cks == null || cks.length == 0) { 935 if(debug) log(" no incoming cookies"); cd.setCookieIn(new CookieIn[0]); 937 return; 938 } 939 940 if(debug) log(" found incoming cookies"); CookieIn[] theCookies = new CookieIn[cks.length]; 942 for (int i = 0; i < theCookies.length; i++) { 943 theCookies[i] = new CookieIn(cks[i]); 944 if(debug) log("cookie: " + theCookies[i].toString()); 946 } 947 cd.setCookieIn(theCookies); 948 } 949 950 private void recordCookiesOut(CookiesData cd, 951 MonitorResponseWrapper response) { 952 953 if(debug) log(" Cookies out"); 955 Enumeration e = response.getCookies(); 956 int numCookies = 0; 957 while(e.hasMoreElements()) { 958 e.nextElement(); 959 ++numCookies; 960 } 961 962 if(numCookies == 0) { 963 if(debug) log(" no cookies"); cd.setCookieOut(new CookieOut[0]); 965 return; 966 } 967 968 if(debug) log(" number of cookies is " + String.valueOf(numCookies)); e = response.getCookies(); 971 CookieOut[] theCookies = null; 972 try { 973 theCookies = new CookieOut[numCookies]; 974 for (int i = 0; i < theCookies.length; i++) { 975 theCookies[i] = new CookieOut((Cookie )e.nextElement()); 976 if(debug) log("cookie: " + theCookies[i].toString()); 978 } 979 } 980 catch(NullPointerException ne) { 981 theCookies = new CookieOut[0]; 982 } 983 cd.setCookieOut(theCookies); 984 } 985 986 987 private void getSessionIn(SessionData sess, 988 HttpServletRequest request) { 989 990 HttpSession sessIn = null; 991 try { 992 sessIn = request.getSession(false); 993 } 994 catch(Exception ne) {} 995 996 if(sessIn == null) { 997 sess.setAttributeValue("before", "false"); return; 999 } 1000 1001 sess.setAttributeValue("before", "true"); 1003 sess.setAttributeValue("id", sessIn.getId()); DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, 1005 DateFormat.SHORT); 1006 Date date = new Date (sessIn.getCreationTime()); 1007 sess.setAttributeValue("created", df.format(date)); 1009 SessionIn si = new SessionIn(); 1010 int maxint = 0; 1011 try { 1012 maxint = sessIn.getMaxInactiveInterval(); 1013 if(maxint != 0) 1014 si.setAttributeValue("inactiveInterval", String.valueOf(maxint) ); 1017 } 1018 catch(NumberFormatException ne) {} 1019 1020 try { 1021 date = new Date (sessIn.getLastAccessedTime()); 1022 si.setAttributeValue("lastAccessed", df.format(date)); } 1024 catch(Exception ex) {} 1025 1026 si.setParam(getSessionAttributes(sessIn)); 1027 sess.setSessionIn(si); 1028 } 1029 1030 private void addSessionOut(SessionData sess, HttpServletRequest request) { 1031 1032 HttpSession sessOut = null; 1033 try { 1034 sessOut = request.getSession(false); 1035 } 1036 catch(Exception ne) {} 1037 1038 if(sessOut == null) { 1039 sess.setAttributeValue("after", "false"); return; 1041 } 1042 1043 DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, 1044 DateFormat.SHORT); 1045 1046 sess.setAttributeValue("after", "true"); Date date = null; 1048 1049 if(sess.getAttributeValue("before").equals("false")) { sess.setAttributeValue("id", sessOut.getId()); date = new Date (sessOut.getCreationTime()); 1052 sess.setAttributeValue("created", df.format(date)); } 1054 1055 SessionOut so = new SessionOut(); 1056 int maxint = 0; 1057 try { 1058 maxint = sessOut.getMaxInactiveInterval(); 1059 if(maxint != 0) 1060 so.setAttributeValue("inactiveInterval", String.valueOf(maxint)); 1062 } 1063 catch(NumberFormatException ne) {} 1064 try { 1065 date = new Date (sessOut.getLastAccessedTime()); 1066 so.setAttributeValue("lastAccessed", df.format(date)); } 1068 catch(Exception ex) {} 1069 1070 Param[] params = getSessionAttributes(sessOut); 1071 so.setParam(params); 1072 sess.setSessionOut(so); 1073 } 1074 1075 1076 private Param[] getSessionAttributes(HttpSession session) { 1077 1078 Enumeration names = null; 1079 try { 1080 names = session.getAttributeNames(); 1081 } 1082 catch(Exception e) {} 1083 1084 if(names == null || !names.hasMoreElements()) 1085 return new Param[0]; 1086 1087 Vector v = new Vector (); 1088 while (names.hasMoreElements()) { 1089 String name = (String )names.nextElement(); 1090 Object value = session.getAttribute(name); 1091 String valueRep = null; 1092 try { 1093 if(value == null) { 1094 valueRep = ResourceBundle.getBundle("org.netbeans.modules.web.monitor.server.Bundle").getString("MON_Warning_attributes"); } else { 1096 valueRep = value.toString(); 1097 if (valueRep == null) { 1098 valueRep = ResourceBundle.getBundle("org.netbeans.modules.web.monitor.server.Bundle").getString("MON_Warning_toString_null"); } 1100 } 1101 } catch (Throwable t) { 1102 valueRep = ResourceBundle.getBundle("org.netbeans.modules.web.monitor.server.Bundle").getString("MON_Warning_toString_exception"); } 1106 Param p = new Param(); 1107 p.setAttributeValue("name", name); p.setAttributeValue("value", valueRep); v.add(p); 1110 } 1111 int size = v.size(); 1112 Param[] params = new Param[size]; 1113 for(int i=0; i<size; ++i) 1114 params[i] = (Param)v.elementAt(i); 1115 return params; 1116 } 1117 1118 1119 1122 private void recordRequestData(RequestData rd, 1123 HttpServletRequest request) { 1124 1125 if(debug) log(" recordRequestData()"); 1127 String method = request.getMethod(); 1129 1130 rd.setAttributeValue("uri", request.getRequestURI()); rd.setAttributeValue("method", method); 1133 String protocol = request.getProtocol(); 1134 while(protocol.endsWith("\n")) protocol = protocol.substring(0, protocol.length()-2); 1136 rd.setAttributeValue("protocol", protocol); 1138 rd.setAttributeValue("ipaddress", request.getRemoteAddr()); 1140 if(debug) log(" doing query string"); 1142 String queryString = request.getQueryString(); 1143 if(queryString == null || queryString.trim().equals("")) { queryString = ""; } 1146 1147 if(debug) log("Query string is: " + queryString); 1149 rd.setAttributeValue("queryString", queryString); 1152 rd.setAttributeValue("scheme", request.getScheme()); 1155 if(debug) log(" doing headers"); Headers headers = new Headers(); 1157 headers.setParam(recordHeaders(request)); 1158 rd.setHeaders(headers); 1159 1160 if(debug) log(" doing request attributes...in"); RequestAttributesIn reqattrin = new RequestAttributesIn(); 1162 reqattrin.setParam(recordRequestAttributes(request)); 1163 rd.setRequestAttributesIn(reqattrin); 1164 } 1165 1166 1169 private void recordContextData(ContextData cd, 1170 HttpServletRequest request) 1171 { 1172 ServletContext context = filterConfig.getServletContext(); 1173 1174 if(debug) log(" Getting servlet context props"); cd.setAttributeValue("absPath", context.getRealPath("/")); cd.setAttributeValue("contextName", context.getServletContextName()); 1179 if(debug) log(" context attributes"); ContextAttributes ctxtattr = new ContextAttributes(); 1181 ctxtattr.setParam(recordContextAttributes(context)); 1182 cd.setContextAttributes(ctxtattr); 1183 1184 if(debug) log(" Getting context init parameters"); Enumeration e = context.getInitParameterNames(); 1186 Vector v = new Vector (); 1187 1188 while (e.hasMoreElements()) { 1189 String name = (String )e.nextElement(); 1190 String value = context.getInitParameter(name); 1191 Param p = new Param(); 1192 p.setAttributeValue("name", name); p.setAttributeValue("value", value); v.add(p); 1195 } 1196 1197 int size = v.size(); 1198 Param[] params = new Param[size]; 1199 for(int i=0; i< size; ++i) 1200 params[i] = (Param)v.elementAt(i); 1201 cd.setParam(params); 1202 } 1203 1204 1205 1206 1209 private void recordEngineData(EngineData ed, 1210 HttpServletRequest request) 1211 { 1212 ServletContext context = filterConfig.getServletContext(); 1213 ed.setAttributeValue("serverName", request.getServerName()); ed.setAttributeValue("serverPort", String.valueOf(request.getServerPort())); 1216 ed.setAttributeValue("jre", String.valueOf(context.getMajorVersion())); 1218 ed.setAttributeValue("platform", context.getServerInfo()); } 1220 1221 1224 private Param[] recordHeaders(HttpServletRequest request) { 1225 1226 if(debug) log(" Doing headers"); 1228 Vector v = new Vector (); 1229 Vector names = new Vector (); 1230 1231 Enumeration e = request.getHeaderNames(); 1232 1233 while (e.hasMoreElements()) { 1234 String name = (String )e.nextElement(); 1235 if(debug) log(" Header name: " + name); if(names.contains(name)) continue; 1237 if(debug) log(" Get enumeration of header values"); Enumeration value = request.getHeaders(name); 1239 int counter = 0; 1240 while(value.hasMoreElements()) { 1241 if(debug) log(" Adding new parameter"); v.add(new Param(name, (String )value.nextElement())); 1243 ++counter; 1244 } 1245 if(counter > 1) names.add(name); 1246 } 1247 int size = v.size(); 1248 Param[] params = new Param[size]; 1249 for(int i=0; i< size; ++i) 1250 params[i] = (Param)v.elementAt(i); 1251 1252 return params; 1253 } 1254 1255 1258 private void addRequestParameters(RequestData rd, 1259 HttpServletRequest request) { 1260 1261 String method = rd.getAttributeValue("method"); 1263 1267 boolean urlencoded = true; 1268 if(debug) log(" doing parameters"); if(method.equals("POST")) { 1271 Headers headers = rd.getHeaders(); 1272 String urlencodedS = "application/x-www-form-urlencoded"; String typeS = "Content-type"; 1275 if(headers.containsHeader(typeS) && 1276 !(headers.getHeader(typeS).equalsIgnoreCase(urlencodedS))) 1277 urlencoded = false; 1278 } 1279 rd.setAttributeValue("urlencoded", String.valueOf(urlencoded)); 1281 1282 1283 if(method.equals("GET")) { 1285 if(debug) log("GET"); 1287 try { 1288 Enumeration e = request.getParameterNames(); 1289 while(e.hasMoreElements()) { 1290 String name = (String )e.nextElement(); 1291 if(debug) log("Parameter name: " + name); 1293 String [] vals = request.getParameterValues(name); 1294 for(int i=0; i<vals.length; ++i) 1295 rd.addParam(new Param(name, vals[i])); 1296 } 1297 } 1298 catch(Exception ex) { 1299 if(debug) log("Non parameterized query string"); } 1305 1306 1307 if(debug) log("GET end"); } 1309 1310 else if (method.equals("POST") && urlencoded) { 1312 if(debug) log("POST"); Enumeration e = null; 1314 1315 try { 1316 e = request.getParameterNames(); 1317 while(e.hasMoreElements()) { 1318 String name = (String )e.nextElement(); 1319 if(debug) log("Parameter name: " + name); 1321 String [] vals = request.getParameterValues(name); 1322 for(int i=0; i<vals.length; ++i) 1323 rd.addParam(new Param(name, vals[i])); 1324 } 1325 } 1326 catch(Exception ex) { 1327 rd.setAttributeValue("urlencoded", "bad"); } 1332 1333 if(debug) log("POST"); } 1335 } 1336 1337 1340 private Param[] recordRequestAttributes(HttpServletRequest request) { 1341 1342 if(debug) log("recordRequestAttributes(): start"); 1344 Vector v = new Vector (); 1345 1346 Enumeration e = request.getAttributeNames(); 1347 1348 while (e.hasMoreElements()) { 1349 String name = (String )e.nextElement(); 1350 if(debug) log(" name: " + name); Object value = request.getAttribute(name); 1352 String valueRep = null; 1353 try { 1354 valueRep = value.toString(); 1355 if (valueRep == null) { 1356 valueRep = ResourceBundle.getBundle("org.netbeans.modules.web.monitor.server.Bundle").getString("MON_Warning_toString_null"); } 1358 } catch (Throwable t) { 1359 valueRep = ResourceBundle.getBundle("org.netbeans.modules.web.monitor.server.Bundle").getString("MON_Warning_toString_exception"); } 1363 Param p = new Param(); 1364 p.setAttributeValue("name", name); p.setAttributeValue("value", valueRep); v.add(p); 1367 } 1368 if(debug) log("Got all request attributes"); 1370 int size = v.size(); 1371 1372 Param[] params = new Param[size]; 1373 for(int i=0; i< size; ++i) 1374 params[i] = (Param)v.elementAt(i); 1375 1376 if(debug) log("recordRequestAttributes(): end"); return params; 1378 } 1379 1380 1381 1384 private Param[] recordContextAttributes(ServletContext context) { 1385 1386 if(debug) log("recordContextAttributes"); 1388 Vector v = new Vector (); 1389 1390 Enumeration e = context.getAttributeNames(); 1391 1392 while (e.hasMoreElements()) { 1393 String name = (String )e.nextElement(); 1394 if(debug) log(" name: " + name); Object value = context.getAttribute(name); 1396 String valueRep = null; 1397 try { 1398 if(value == null) { 1399 valueRep = ResourceBundle.getBundle("org.netbeans.modules.web.monitor.server.Bundle").getString("MON_Warning_attributes"); } else if (value.getClass().isArray()) { 1401 Object [] valueItems = (Object [])value; 1402 StringBuffer sb = new StringBuffer (valueItems.length * 16); 1403 if (valueItems.length > 0) sb.append(valueItems[0]); 1404 for(int i=1; i < valueItems.length; i++) { 1405 sb.append(", "); sb.append(valueItems[i]); 1407 } 1408 valueRep = sb.toString(); 1409 } else { 1410 valueRep = value.toString(); 1411 if (valueRep == null) { 1412 valueRep = ResourceBundle.getBundle("org.netbeans.modules.web.monitor.server.Bundle").getString("MON_Warning_toString_null"); } 1414 } 1415 } catch (Throwable t) { 1416 valueRep = ResourceBundle.getBundle("org.netbeans.modules.web.monitor.server.Bundle").getString("MON_Warning_toString_exception"); } 1420 Param p = new Param(); 1421 p.setAttributeValue("name", name); p.setAttributeValue("value", valueRep); v.add(p); 1424 } 1425 int size = v.size(); 1426 Param[] params = new Param[size]; 1427 for(int i=0; i< size; ++i) 1428 params[i] = (Param)v.elementAt(i); 1429 1430 return params; 1431 } 1432 1433 1434 private MonitorRequestWrapper getReplayRequest(HttpServletRequest req) 1436 throws IOException { 1437 1438 String status = req.getParameter(REPLAYSTATUS); 1440 if (status == null) { 1441 String msg = " replay request corrupted"; if(debug) log(msg); 1443 throw new IOException (msg); 1444 } 1445 1446 1447 String id = req.getParameter(REPLAY); 1448 String portS = req.getParameter(PORT); 1449 int port = 0; 1450 try { 1451 port = Integer.parseInt(portS); 1452 } 1453 catch(NumberFormatException nfe) { 1454 String msg = " Request did not provide a port number"; if(debug) log(msg); 1457 throw new IOException (msg); 1458 } 1459 1460 String ipaddress = req.getRemoteAddr(); 1461 RequestData rd = notifyUtil.getRecord(id, status, ipaddress, port); 1462 1463 if(rd == null) { 1464 String msg = "Failed to get the request"; if(debug) log(msg); 1466 throw new IOException (msg); 1467 } 1468 1469 if(debug) log("Got requestdata as we should"); 1471 boolean replaceSessionID = false; 1472 try { 1473 String sessionID = req.getParameter(REPLAYSESSION); 1474 if(sessionID != null) { 1475 if(debug) log("User asked for new session " + sessionID); 1477 replaceSessionID = true; 1478 } 1479 else if(debug) log("User wants browser's session"); } 1481 catch(NullPointerException npe) { 1482 log("NPE when getting " + REPLAYSESSION); } 1484 1485 1486 MonitorRequestWrapper requestWrapper = 1487 new MonitorRequestWrapper(req); 1488 if(debug) log("Created wrapper"); requestWrapper.populate(rd, replaceSessionID); 1490 if(debug) log("Populated wrapper"); return requestWrapper; 1493 } 1494 1495 1496 1499 public FilterConfig getFilterConfig() { 1500 return (this.filterConfig); 1501 } 1502 1503 1504 1509 public void setFilterConfig(FilterConfig filterConfig) { 1510 1511 this.filterConfig = filterConfig; 1512 if (filterConfig != null) 1513 this.attribute = filterConfig.getInitParameter("attribute"); else 1515 this.attribute = null; 1516 } 1517 1518 1522 public void destroy() { 1523 } 1524 1525 1526 1530 public void init(FilterConfig filterConfig) { 1531 1532 if(debug) System.out.println("init()"); 1534 this.filterConfig = filterConfig; 1535 1536 notifyUtil = new NotifyUtil(); 1537 1538 boolean noIDE = true; 1539 String ide = filterConfig.getInitParameter(IDE); 1540 if(ide != null && !ide.equals("")) { 1542 if(debug) log("trying to start the IDE with " + ide); try { 1544 notifyUtil.setIDE(ide); 1545 collectData = true; 1546 if(debug) log("Starting server with ide " + ide); } 1548 catch(MalformedURLException mux) { 1549 log("IDE init parameter has an invalid value:"); log(ide); 1551 log("starting anyway"); } 1553 } 1554 else { 1555 log("IDE init parameter has an invalid value:"); log(ide); 1557 log("starting anyway"); } 1559 1560 String ides = filterConfig.getInitParameter(IDES); 1561 if(ides != null && !ides.trim().equals("")) { 1563 StringTokenizer st = new StringTokenizer (ides, ","); String name; 1565 while(st.hasMoreTokens()) { 1566 1567 name = (String )(st.nextToken()); 1568 try { 1569 notifyUtil.setIDE(name.trim()); 1570 collectData = true; 1571 if(debug) log("Starting server with name " + name); } 1573 catch(MalformedURLException mux) { 1574 log("additional IDE includes an invalid server declaration:"); log(name); 1576 log("starting anyway"); } 1578 } 1579 } 1580 if(debug) 1581 log("We're collecting data " + String.valueOf(collectData)); 1583 } 1584 1585 1588 public String toString() { 1589 1590 if (filterConfig == null) return ("MonitorFilter()"); StringBuffer sb = new StringBuffer ("MonitorFilter("); sb.append(filterConfig); 1593 sb.append(")"); return (sb.toString()); 1595 1596 } 1597 1598 1602 public static boolean getCollectData() { 1603 return collectData; 1604 } 1605 1606 1610 public static void setCollectData(boolean v) { 1611 collectData = v; 1612 } 1613 1614 private void rethrow(Throwable t) throws IOException , 1615 ServletException { 1616 1617 if(debug) log(" rethrow(" + t.getMessage() + ")"); if(t instanceof StackOverflowError ) { 1619 String message = 1620 ResourceBundle.getBundle("org.netbeans.modules.web.monitor.server.Bundle").getString("MON_overflow"); 1621 filterConfig.getServletContext().log(message); 1622 System.out.println(message); 1623 throw new ServletException (message, t); 1624 } 1625 if(t instanceof RuntimeException ) throw (RuntimeException )t; 1626 if(t instanceof ServletException ) throw (ServletException )t; 1627 if(t instanceof IOException ) throw (IOException )t; 1628 else { 1629 String message = 1630 ResourceBundle.getBundle("org.netbeans.modules.web.monitor.server.Bundle").getString("MON_Rethrow"); 1631 throw new ServletException (message, t); 1632 } 1633 } 1634 1635 public void log(String msg) { 1636 System.out.println("MonitorFilter::" + msg); } 1639 1640 public void log(Throwable t) { 1641 log(getStackTrace(t)); 1642 } 1643} 1644 1645 1646 | Popular Tags |