Is there a reason this fix only went into trunk and not 1.0-M5? Are we planning on recutting M5 once all the TCKs pass?
-Donald --- [EMAIL PROTECTED] wrote: > Author: ammulder > Date: Mon Sep 19 21:55:54 2005 > New Revision: 290359 > > URL: http://svn.apache.org/viewcvs?rev=290359&view=rev > Log: > Management API for web log (GERONIMO-1015) > - Interface & helpers > - Jetty Implementation (Tomcat maybe tomorrow) > - Make access log search go faster > Don't blow up on weird Jetty manageable property type > (treats the symptom for GERONIMO-1017) > > Added: > > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyLogManager.java > > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyLogManagerImpl.java > > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyRequestLog.java > > geronimo/trunk/modules/management/src/java/org/apache/geronimo/management/geronimo/WebAccessLog.java > Modified: > > geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/KernelManagementHelper.java > > geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/ManagementHelper.java > > geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/logmanager/WebAccessLogViewerPortlet.java > > geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/util/PortletManager.java > > geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/webaccesslogmanager/view.jsp > geronimo/trunk/modules/assembly/src/plan/j2ee-jetty-plan.xml > > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyContainerImpl.java > > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyManagerImpl.java > > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/NCSARequestLog.java > > geronimo/trunk/modules/management/src/java/org/apache/geronimo/management/geronimo/WebManager.java > > geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/logging/SystemLog.java > > geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatManagerImpl.java > > Modified: > geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/KernelManagementHelper.java > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/KernelManagementHelper.java?rev=290359&r1=290358&r2=290359&view=diff > ============================================================================== > --- > geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/KernelManagementHelper.java > (original) > +++ > geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/KernelManagementHelper.java > Mon Sep 19 21:55:54 2005 > @@ -21,17 +21,8 @@ > import java.util.List; > import javax.management.ObjectName; > import javax.management.MalformedObjectNameException; > -import org.apache.geronimo.management.geronimo.JVM; > -import org.apache.geronimo.management.geronimo.J2EEApplication; > -import org.apache.geronimo.management.geronimo.WebContainer; > -import org.apache.geronimo.management.geronimo.J2EEServer; > -import org.apache.geronimo.management.geronimo.WebConnector; > -import org.apache.geronimo.management.geronimo.EJBManager; > -import org.apache.geronimo.management.geronimo.EJBConnector; > -import org.apache.geronimo.management.geronimo.JMSManager; > -import org.apache.geronimo.management.geronimo.JMSBroker; > -import org.apache.geronimo.management.geronimo.JMSConnector; > -import org.apache.geronimo.management.geronimo.WebManager; > + > +import org.apache.geronimo.management.geronimo.*; > import org.apache.geronimo.management.J2EEDomain; > import org.apache.geronimo.management.J2EEDeployedObject; > import org.apache.geronimo.management.AppClientModule; > @@ -258,6 +249,23 @@ > Object[] temp = pm.createProxies(names, > KernelManagementHelper.class.getClassLoader()); > result = new WebManager[temp.length]; > System.arraycopy(temp, 0, result, 0, temp.length); > + } catch (Exception e) { > + log.error("Unable to look up related GBean", e); > + } > + return result; > + } > + > + public WebAccessLog getWebAccessLog(WebManager manager, > WebContainer container) { > + return getWebAccessLog(manager, > kernel.getObjectNameFor(container).getCanonicalName()); > + } > + > + public WebAccessLog getWebAccessLog(WebManager manager, String > container) { > + WebAccessLog result = null; > + try { > +log.warn("Checking access log for > "+kernel.getObjectNameFor(manager)+" / "+container); > + String name = manager.getAccessLog(container); > + Object temp = > pm.createProxy(ObjectName.getInstance(name), > KernelManagementHelper.class.getClassLoader()); > + result = (WebAccessLog) temp; > } catch (Exception e) { > log.error("Unable to look up related GBean", e); > } > > Modified: > geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/ManagementHelper.java > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/ManagementHelper.java?rev=290359&r1=290358&r2=290359&view=diff > ============================================================================== > --- > geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/ManagementHelper.java > (original) > +++ > geronimo/trunk/applications/console-core/src/java/org/apache/geronimo/console/util/ManagementHelper.java > Mon Sep 19 21:55:54 2005 > @@ -34,17 +34,7 @@ > import org.apache.geronimo.management.EJB; > import org.apache.geronimo.management.Servlet; > import org.apache.geronimo.management.ResourceAdapter; > -import org.apache.geronimo.management.geronimo.JVM; > -import org.apache.geronimo.management.geronimo.J2EEApplication; > -import org.apache.geronimo.management.geronimo.J2EEServer; > -import org.apache.geronimo.management.geronimo.WebContainer; > -import org.apache.geronimo.management.geronimo.WebConnector; > -import org.apache.geronimo.management.geronimo.EJBConnector; > -import org.apache.geronimo.management.geronimo.EJBManager; > -import org.apache.geronimo.management.geronimo.JMSManager; > -import org.apache.geronimo.management.geronimo.JMSConnector; > -import org.apache.geronimo.management.geronimo.JMSBroker; > -import org.apache.geronimo.management.geronimo.WebManager; > +import org.apache.geronimo.management.geronimo.*; > import org.apache.geronimo.system.logging.SystemLog; > import org.apache.geronimo.pool.GeronimoExecutor; > > @@ -75,6 +65,8 @@ > JMSResource[] getJMSResources(J2EEServer server); > JVM[] getJavaVMs(J2EEServer server); > WebManager[] getWebManagers(J2EEServer server); > + WebAccessLog getWebAccessLog(WebManager manager, WebContainer > container); > + WebAccessLog getWebAccessLog(WebManager manager, String > containerObjectName); > WebContainer[] getWebContainers(WebManager manager); > WebConnector[] getWebConnectorsForContainer(WebManager > manager, WebContainer container, String protocol); > WebConnector[] getWebConnectorsForContainer(WebManager > manager, WebContainer container); > > Modified: > geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/logmanager/WebAccessLogViewerPortlet.java > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/logmanager/WebAccessLogViewerPortlet.java?rev=290359&r1=290358&r2=290359&view=diff > ============================================================================== > --- > geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/logmanager/WebAccessLogViewerPortlet.java > (original) > +++ > geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/logmanager/WebAccessLogViewerPortlet.java > Mon Sep 19 21:55:54 2005 > @@ -25,6 +25,7 @@ > import org.apache.geronimo.console.BasePortlet; > import org.apache.geronimo.console.util.PortletManager; > import org.apache.geronimo.management.geronimo.WebContainer; > +import org.apache.geronimo.management.geronimo.WebAccessLog; > import org.apache.commons.logging.Log; > import org.apache.commons.logging.LogFactory; > > @@ -46,112 +47,104 @@ > return; > } > > - String server = getWebServerType(renderRequest); > - if(server.equals(WEB_SERVER_JETTY)) { > + String[] names = > PortletManager.getWebManagerNames(renderRequest); //todo: handle > multiple > + if (names != null) { > + String managerName = names[0]; //todo: handle > multiple > + String[] containers = > PortletManager.getWebContainerNames(renderRequest, managerName); > //todo: handle multiple > + if (containers != null) { > + String containerName = containers[0]; //todo: > handle multiple > + WebAccessLog log = > PortletManager.getWebAccessLog(renderRequest, managerName, > containerName); > > - String action = renderRequest.getParameter("action"); > - if ("refresh".equals(action)) { > - WebAccessLogHelper.refresh(); > - } > + String action = > renderRequest.getParameter("action"); > + if ("refresh".equals(action)) { > + //todo: currently refreshes on every request; > that's pretty slow. > + } > > - String startDate = (String) > renderRequest.getParameter("startDate"); > - String startMonth = (String) > renderRequest.getParameter("startMonth"); > - String startYear = (String) > renderRequest.getParameter("startYear"); > - String endDate = (String) > renderRequest.getParameter("endDate"); > - String endMonth = (String) > renderRequest.getParameter("endMonth"); > - String endYear = (String) > renderRequest.getParameter("endYear"); > - > - Calendar cal1 = Calendar.getInstance(), cal2 = > Calendar.getInstance(); > - // If no dates were passed we assume than no fields > were passed and just > - // filter on the current date. > - if (startDate == null || startMonth == null || > startYear == null > - || endDate == null || endMonth == null || > endYear == null) { > - // just keep the month date and year > - cal1.clear(Calendar.MILLISECOND); > - cal1.clear(Calendar.MINUTE); > - cal1.clear(Calendar.SECOND); > - // Weird java bug. calling > calendar.clear(Calendar.HOUR) does not > - // clear the hour but this works. > - cal1.clear(Calendar.HOUR_OF_DAY); > - cal1.clear(Calendar.HOUR); > > - renderRequest.setAttribute("logs", > WebAccessLogHelper.getLogsByDate(cal1.getTime())); > - renderRequest.setAttribute("toDate", > cal1.getTime()); > - } else { > - int sdt = Integer.parseInt(startDate), > - smnth = Integer.parseInt(startMonth), > - syr = Integer.parseInt(startYear), > - edt = Integer.parseInt(endDate), > - emnth = Integer.parseInt(endMonth), > - eyr = Integer.parseInt(endYear); > - boolean ignoreDates = > renderRequest.getParameter("ignoreDates") == null; > - String requestHost = (String) > renderRequest.getParameter("requestHost"); > - String authUser = (String) > renderRequest.getParameter("authUser"); > - String requestMethod = (String) > renderRequest.getParameter("requestMethod"); > - String requestedURI = (String) > renderRequest.getParameter("requestedURI"); > - if (ignoreDates) { > - cal1.clear(); > - cal2.clear(); > - cal1.set(Calendar.DATE, sdt); > - cal1.set(Calendar.MONTH, smnth); > - cal1.set(Calendar.YEAR, syr); > - cal2.set(Calendar.DATE, edt); > - cal2.set(Calendar.MONTH, emnth); > - cal2.set(Calendar.YEAR, eyr); > - renderRequest.setAttribute("logs", > WebAccessLogHelper > - .searchLogs(requestHost, authUser, > requestMethod, > - requestedURI, cal1.getTime(), > cal2.getTime())); > + //todo: completely revamp this argument processing > + String startDate = (String) > renderRequest.getParameter("startDate"); > + String startMonth = (String) > renderRequest.getParameter("startMonth"); > + String startYear = (String) > renderRequest.getParameter("startYear"); > + String endDate = (String) > renderRequest.getParameter("endDate"); > + String endMonth = (String) > renderRequest.getParameter("endMonth"); > + String endYear = (String) > renderRequest.getParameter("endYear"); > + > + Calendar cal1 = Calendar.getInstance(), cal2 = > Calendar.getInstance(); > + // If not all dates were passed we assume than no > fields were passed and just > + // filter on the current date. > + if (startDate == null || startMonth == null || > startYear == null > + || endDate == null || endMonth == null || > endYear == null) { > + // just keep the month date and year > + cal1.set(Calendar.MILLISECOND, 0); > + cal1.set(Calendar.MINUTE, 0); > + cal1.set(Calendar.SECOND, 0); > + cal1.clear(Calendar.HOUR_OF_DAY); > + cal2.setTime(cal1.getTime()); > + cal2.add(Calendar.DAY_OF_YEAR, 1); > + > + WebAccessLog.SearchResults matchingItems = > log.getMatchingItems(log.getLogFileNames()[0], //todo: handle > multiple > + null, null, null, > null, cal1.getTime(), cal2.getTime(), null, null); > + renderRequest.setAttribute("logs", > matchingItems.getResults()); > + renderRequest.setAttribute("logLength", new > Integer(matchingItems.getLineCount())); > } else { > - renderRequest.setAttribute("logs", > WebAccessLogHelper > - .searchLogs(requestHost, authUser, > requestMethod, > - requestedURI)); > + int sdt = Integer.parseInt(startDate), > + smnth = Integer.parseInt(startMonth), > + syr = Integer.parseInt(startYear), > + edt = Integer.parseInt(endDate), > + emnth = Integer.parseInt(endMonth), > + eyr = Integer.parseInt(endYear); > + boolean ignoreDates = > renderRequest.getParameter("ignoreDates") == null; > + String requestHost = (String) > renderRequest.getParameter("requestHost"); > + String authUser = (String) > renderRequest.getParameter("authUser"); > + String requestMethod = (String) > renderRequest.getParameter("requestMethod"); > + String requestedURI = (String) > renderRequest.getParameter("requestedURI"); > + if (ignoreDates) { > + cal1.clear(); > + cal2.clear(); > + cal1.set(Calendar.DATE, sdt); > + cal1.set(Calendar.MONTH, smnth); > + cal1.set(Calendar.YEAR, syr); > + cal2.set(Calendar.DATE, edt); > + cal2.set(Calendar.MONTH, emnth); > + cal2.set(Calendar.YEAR, eyr); > + WebAccessLog.SearchResults matchingItems = > log.getMatchingItems(log.getLogFileNames()[0], //todo: handle > multiple > + > requestHost, authUser, requestMethod, requestedURI, cal1.getTime(), > cal2.getTime(), null, null); > + renderRequest.setAttribute("logs", > matchingItems.getResults()); > + renderRequest.setAttribute("logLength", > new Integer(matchingItems.getLineCount())); > + } else { > + WebAccessLog.SearchResults matchingItems = > log.getMatchingItems(log.getLogFileNames()[0], //todo: handle > multiple > + > requestHost, authUser, requestMethod, requestedURI, null, null, > null, null); > + renderRequest.setAttribute("logs", > matchingItems.getResults()); > + renderRequest.setAttribute("logLength", > new Integer(matchingItems.getLineCount())); > + } > + renderRequest.setAttribute("ignoreDates", new > Boolean(ignoreDates)); > + renderRequest.setAttribute("requestHost", > requestHost); > + renderRequest.setAttribute("authUser", > authUser); > + renderRequest.setAttribute("requestMethod", > requestMethod); > + renderRequest.setAttribute("requestedURI", > requestedURI); > + > } > renderRequest.setAttribute("toDate", > cal2.getTime()); > - renderRequest.setAttribute("ignoreDates", new > Boolean(ignoreDates)); > - renderRequest.setAttribute("requestHost", > requestHost); > - renderRequest.setAttribute("authUser", authUser); > - renderRequest.setAttribute("requestMethod", > requestMethod); > - renderRequest.setAttribute("requestedURI", > requestedURI); > - > - } > - renderRequest.setAttribute("fromDate", > cal1.getTime()); > - searchView.include(renderRequest, renderRespose); > - } else if(server.equals(WEB_SERVER_TOMCAT)) { > - log.warn("Web server logs not handled for Tomcat > yet"); //todo - Handle tomcat logs > - } else { > - log.warn("Web server logs not handled for server type > "+server); > - } > - } > - > - protected final static String getWebServerType(PortletRequest > request) { > - String[] names = > PortletManager.getWebManagerNames(request); //todo: handle > multiple > - if (names != null) { > - String managerName = names[0]; //todo: handle > multiple > - String[] containers = > PortletManager.getWebContainerNames(request, managerName); //todo: > handle multiple > - if (containers != null) { > - String containerName = containers[0]; //todo: > handle multiple > - WebContainer container = > PortletManager.getWebContainer(request, containerName); > - return getWebServerType(container.getClass()); > + renderRequest.setAttribute("fromDate", > cal1.getTime()); > + searchView.include(renderRequest, renderRespose); > } else { > - log.error("No web containers for manager > "+managerName); > + log.error("No web containers found"); > } > } else { > - log.error("No web managers present in server > environment"); > + log.error("No web managers found"); > } > - return WEB_SERVER_GENERIC; > } > > public void init(PortletConfig portletConfig) throws > PortletException { > PortletContext pc = portletConfig.getPortletContext(); > - searchView = pc > - > .getRequestDispatcher("/WEB-INF/view/webaccesslogmanager/view.jsp"); > - helpView = pc > - > .getRequestDispatcher("/WEB-INF/view/webaccesslogmanager/help.jsp"); > + searchView = > pc.getRequestDispatcher("/WEB-INF/view/webaccesslogmanager/view.jsp"); > + helpView = > pc.getRequestDispatcher("/WEB-INF/view/webaccesslogmanager/help.jsp"); > super.init(portletConfig); > } > > public void processAction(ActionRequest actionRequest, > ActionResponse actionResponse) throws > PortletException, IOException { > + //todo: according to portlet spec, all forms should submit > to Action not Render > } > > } > > Modified: > geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/util/PortletManager.java > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/util/PortletManager.java?rev=290359&r1=290358&r2=290359&view=diff > ============================================================================== > --- > geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/util/PortletManager.java > (original) > +++ > geronimo/trunk/applications/console-standard/src/java/org/apache/geronimo/console/util/PortletManager.java > Mon Sep 19 21:55:54 2005 > @@ -25,15 +25,7 @@ > import org.apache.geronimo.kernel.Kernel; > import org.apache.geronimo.kernel.proxy.GeronimoManagedBean; > import org.apache.geronimo.management.J2EEDomain; > -import org.apache.geronimo.management.geronimo.JVM; > -import org.apache.geronimo.management.geronimo.J2EEServer; > -import org.apache.geronimo.management.geronimo.WebContainer; > -import org.apache.geronimo.management.geronimo.WebConnector; > -import org.apache.geronimo.management.geronimo.EJBManager; > -import org.apache.geronimo.management.geronimo.JMSManager; > -import org.apache.geronimo.management.geronimo.JMSConnector; > -import org.apache.geronimo.management.geronimo.WebManager; > -import org.apache.geronimo.management.geronimo.JMSBroker; > +import org.apache.geronimo.management.geronimo.*; > import org.apache.geronimo.system.logging.SystemLog; > import org.apache.geronimo.pool.GeronimoExecutor; > import org.apache.commons.logging.Log; > @@ -132,6 +124,12 @@ > ManagementHelper helper = getManagementHelper(request); > WebManager manager = (WebManager) > helper.getObject(managerObjectName); > return manager.getContainers(); > + } > + > + public static WebAccessLog getWebAccessLog(PortletRequest > request, String managerObjectName, String containerObjectName) { > + ManagementHelper helper = getManagementHelper(request); > + WebManager manager = (WebManager) > helper.getObject(managerObjectName); > + return helper.getWebAccessLog(manager, > containerObjectName); > } > > public static WebContainer getWebContainer(PortletRequest > request, String containerObjectName) { > > Modified: > geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/webaccesslogmanager/view.jsp > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/webaccesslogmanager/view.jsp?rev=290359&r1=290358&r2=290359&view=diff > ============================================================================== > --- > geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/webaccesslogmanager/view.jsp > (original) > +++ > geronimo/trunk/applications/console-standard/src/webapp/WEB-INF/view/webaccesslogmanager/view.jsp > Mon Sep 19 21:55:54 2005 > @@ -148,15 +148,15 @@ > </tr> > <c:forEach var="line" items="${logs}"> > <tr> > - <td class="Smaller"> > - ${line} > + <td class="Smaller"> > +${line.lineNumber} ${line.lineContent} > </td> > </tr> > </c:forEach> > </table> > </c:when> > <c:otherwise> > - No logs found. > + No log entries found. > </c:otherwise> > </c:choose> > </td> > > Modified: > geronimo/trunk/modules/assembly/src/plan/j2ee-jetty-plan.xml > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/modules/assembly/src/plan/j2ee-jetty-plan.xml?rev=290359&r1=290358&r2=290359&view=diff > ============================================================================== > --- geronimo/trunk/modules/assembly/src/plan/j2ee-jetty-plan.xml > (original) > +++ geronimo/trunk/modules/assembly/src/plan/j2ee-jetty-plan.xml > Mon Sep 19 21:55:54 2005 > @@ -31,10 +31,21 @@ > > <uri>geronimo/jars/geronimo-jetty-${geronimo_version}.jar</uri> > </dependency> > > - <!-- david jencks is not convinced that this gbean should be > in this plan and thinks it might > - belong in the console plan --> > - <gbean name="JettyWebManager" > class="org.apache.geronimo.jetty.JettyManagerImpl"> > + <!-- david jencks is not convinced that these 2 gbeans should > be in this > + plan and thinks they might belong in the console plan. > Aaron thinks > + they definitely don't belong in the console plan, but > could go into > + a management layer plan. --> > + <gbean name="JettyWebManager" > class="org.apache.geronimo.jetty.JettyManagerImpl"/> > + > + <gbean name="JettyAccessLogManager" > class="org.apache.geronimo.jetty.requestlog.JettyLogManagerImpl"> > + <references name="LogGBeans"> > + <pattern> > + <!-- This is lame and should be replaced by an > interface reference --> > + > <gbean-name>geronimo.server:name=JettyRequestLog,*</gbean-name> > + </pattern> > + </references> > </gbean> > + > > <!-- default WAR container using Jetty --> > <gbean name="JettyWebContainer" > class="org.apache.geronimo.jetty.JettyContainerImpl"> > > Modified: > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyContainerImpl.java > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyContainerImpl.java?rev=290359&r1=290358&r2=290359&view=diff > ============================================================================== > --- > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyContainerImpl.java > (original) > +++ > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyContainerImpl.java > Mon Sep 19 21:55:54 2005 > @@ -196,7 +196,7 @@ > infoBuilder.addAttribute("requestsDurationMax", Long.TYPE, > false); > infoBuilder.addOperation("resetStatistics"); > > - infoBuilder.addAttribute("requestLog", RequestLog.class, > false); > + infoBuilder.addAttribute("requestLog", RequestLog.class, > false, false); > > infoBuilder.addOperation("addListener", new > Class[]{HttpListener.class}); > infoBuilder.addOperation("removeListener", new > Class[]{HttpListener.class}); > > Modified: > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyManagerImpl.java > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyManagerImpl.java?rev=290359&r1=290358&r2=290359&view=diff > ============================================================================== > --- > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyManagerImpl.java > (original) > +++ > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyManagerImpl.java > Mon Sep 19 21:55:54 2005 > @@ -34,6 +34,7 @@ > import org.apache.geronimo.jetty.connector.HTTPSConnector; > import org.apache.geronimo.jetty.connector.AJP13Connector; > import org.apache.geronimo.jetty.connector.JettyConnector; > +import org.apache.geronimo.jetty.requestlog.JettyLogManager; > import org.apache.geronimo.system.serverinfo.ServerInfo; > import org.apache.geronimo.j2ee.management.impl.Util; > import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; > @@ -174,6 +175,17 @@ > } > } > return (String[]) result.toArray(new > String[result.size()]); > + } > + > + public String getAccessLog(String containerObjectName) { > + GBeanQuery query = new GBeanQuery(null, > JettyLogManager.class.getName()); > + Set names = kernel.listGBeans(query); > + if(names.size() == 0) { > + return null; > + } else if(names.size() > 1) { > + throw new IllegalStateException("Should not be more > than one Jetty access log manager"); > + } > + return > ((ObjectName)names.iterator().next()).getCanonicalName(); > } > > /** > > Added: > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyLogManager.java > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyLogManager.java?rev=290359&view=auto > ============================================================================== > --- > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyLogManager.java > (added) > +++ > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyLogManager.java > Mon Sep 19 21:55:54 2005 > @@ -0,0 +1,27 @@ > +/** > + * > + * Copyright 2005 The Apache Software Foundation > + * > + * Licensed under the Apache License, Version 2.0 (the > "License"); > + * you may not use this file except in compliance with the > License. > + * You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, > software > + * distributed under the License is distributed on an "AS IS" > BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express > or implied. > + * See the License for the specific language governing > permissions and > + * limitations under the License. > + */ > +package org.apache.geronimo.jetty.requestlog; > + > +import org.apache.geronimo.management.geronimo.WebAccessLog; > + > +/** > + * Token interface to distinguish Jetty implementations. > + * > + * @version $Rev: 46019 $ $Date: 2004-09-14 05:56:06 -0400 (Tue, > 14 Sep 2004) $ > + */ > +public interface JettyLogManager extends WebAccessLog { > +} > > Added: > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyLogManagerImpl.java > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyLogManagerImpl.java?rev=290359&view=auto > ============================================================================== > --- > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyLogManagerImpl.java > (added) > +++ > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyLogManagerImpl.java > Mon Sep 19 21:55:54 2005 > @@ -0,0 +1,216 @@ > +/** > + * > + * Copyright 2005 The Apache Software Foundation > + * > + * Licensed under the Apache License, Version 2.0 (the > "License"); > + * you may not use this file except in compliance with the > License. > + * You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, > software > + * distributed under the License is distributed on an "AS IS" > BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express > or implied. > + * See the License for the specific language governing > permissions and > + * limitations under the License. > + */ > +package org.apache.geronimo.jetty.requestlog; > + > +import org.apache.geronimo.gbean.GBeanInfo; > +import org.apache.geronimo.gbean.GBeanInfoBuilder; > +import org.apache.commons.logging.Log; > +import org.apache.commons.logging.LogFactory; > + > +import java.util.*; > +import java.util.regex.Pattern; > +import java.util.regex.Matcher; > +import java.io.File; > +import java.io.RandomAccessFile; > +import java.nio.channels.FileChannel; > +import java.nio.MappedByteBuffer; > +import java.nio.CharBuffer; > +import java.nio.charset.Charset; > +import java.text.SimpleDateFormat; > +import java.text.ParseException; > + > +/** > + * Jetty implementation of the WebAccessLog management interface. > + * > + * @version $Rev: 46019 $ $Date: 2004-09-14 05:56:06 -0400 (Tue, > 14 Sep 2004) $ > + */ > +public class JettyLogManagerImpl implements JettyLogManager { > + private final static Log log = > LogFactory.getLog(JettyLogManagerImpl.class); > + // Pattern that matches a single line (used to calculate line > numbers) > + private final static Pattern FULL_LINE_PATTERN = > Pattern.compile("^.*", Pattern.MULTILINE); > + private final static Pattern ACCESS_LOG_PATTERN = > Pattern.compile("(\\S*) (\\S*) (\\S*) \\[(.*)\\] \\\"(\\S*) > (\\S*).*?\\\" (\\S*) (\\S*).*"); > + private final static int GROUP_HOST = 1; > + private final static int GROUP_USER = 3; > + private final static int GROUP_DATE = 4; > + private final static int GROUP_METHOD = 5; > + private final static int GROUP_URI = 6; > + private final static int GROUP_RESPONSE_CODE = 7; > + private final static int GROUP_RESPONSE_LENGTH = 8; > + private final static String ACCESS_LOG_DATE_FORMAT = > "dd/MMM/yyyy:HH:mm:ss ZZZZ"; > + private Collection logGbeans; > + > + public JettyLogManagerImpl(Collection logGbeans) { > + this.logGbeans = logGbeans; > + } > + > + public String[] getLogFileNames() { > + List files = new ArrayList(); > + for (Iterator it = logGbeans.iterator(); it.hasNext();) { > + JettyRequestLog log = (JettyRequestLog) it.next(); > + if(log.getFilename() != null) { > + files.add(log.getFilename()); > + } > + } > + return (String[]) files.toArray(new String[files.size()]); > + } > + > + public SearchResults getMatchingItems(String logFile, String > host, String user, String method, String uri, > + Date startDate, Date > endDate, Integer skipResults, Integer maxResults) { > + File log = null; > + for (Iterator it = logGbeans.iterator(); it.hasNext();) { > + JettyRequestLog logger = (JettyRequestLog) it.next(); > + if(logger.getFilename() != null && > logger.getFilename().equals(logFile)) { > + log = new File(logger.getAbsoluteFilePath()); > + break; > + } > + } > + if(log == null) { > + throw new IllegalArgumentException("Unknown log file > '"+logFile+"'"); > + } > + > + return search(log, host, user, method, uri, startDate, > endDate, skipResults, maxResults); > + } > + > + private SearchResults search(File file, String host, String > user, String method, String uri, Date startDate, > + Date endDate, Integer > skipResults, Integer maxResults) { > + // Clean up the arguments so we know what we've really got > + if(host != null && host.equals("")) host = null; > + if(user != null && user.equals("")) user = null; > + if(method != null && method.equals("")) method = null; > + if(uri != null && uri.equals("")) uri = null; > + // Do the search > + List list = new LinkedList(); > + boolean capped = false; > + int lineCount = 0; > + try { > + RandomAccessFile raf = new RandomAccessFile(file, > "r"); > + FileChannel fc = raf.getChannel(); > + MappedByteBuffer bb = > fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()); > + CharBuffer cb = > Charset.forName("US-ASCII").decode(bb); //todo: does Jetty use a > different charset on a foreign PC? > + Matcher lines = FULL_LINE_PATTERN.matcher(cb); > + Matcher target = ACCESS_LOG_PATTERN.matcher(""); > + long start = startDate == null ? 0 : > startDate.getTime(); > + long end = endDate == null ? 0 : endDate.getTime(); > + SimpleDateFormat format = (start == 0 && end == 0) ? > null : new SimpleDateFormat(ACCESS_LOG_DATE_FORMAT); > + int max = maxResults == null ? MAX_SEARCH_RESULTS : > Math.min(maxResults.intValue(), MAX_SEARCH_RESULTS); > +log.warn("CRITERIA: "+file.getAbsolutePath()+" "+host+" "+user+" > "+method+" "+uri+" "+start+" "+end+" "+skipResults+" "+max); > + while(lines.find()) { > + ++lineCount; > + if(capped) { > + continue; > + } > + CharSequence line = cb.subSequence(lines.start(), > lines.end()); > + target.reset(line); > + if(target.find()) { > + if(host != null && > !host.equals(target.group(GROUP_HOST))) { > + continue; > + } > + if(user != null && > !user.equals(target.group(GROUP_USER))) { > + continue; > + } > + if(method != null && > !method.equals(target.group(GROUP_METHOD))) { > + continue; > + } > + if(uri != null && > !target.group(GROUP_URI).startsWith(uri)) { > + continue; > + } > + if(format != null) { > + try { > + long entry = > format.parse(target.group(GROUP_DATE)).getTime(); > + if(start > entry) { > + continue; > + } > + if(end > 0 && end < entry) { > + continue; > + } > + } catch (ParseException e) { > + // can't read the date, guess this > record counts. > + } > + } > + if(skipResults != null && > skipResults.intValue() > lineCount) { > + continue; > + } > + if(list.size() > max) { > + capped = true; > + continue; > + } > + list.add(new > LogMessage(lineCount,line.toString())); > + } > + } > + fc.close(); > + raf.close(); > + } catch (Exception e) { > + log.error("Unexpected error processing logs", e); > + } > + return new SearchResults(lineCount, (LogMessage[]) > list.toArray(new LogMessage[list.size()]), capped); > + } > + > + > + public static final GBeanInfo GBEAN_INFO; > + > + static { > + GBeanInfoBuilder infoFactory = new GBeanInfoBuilder("Jetty > Log Manager", JettyLogManagerImpl.class); > + infoFactory.addReference("LogGBeans", > JettyRequestLog.class); > + infoFactory.addInterface(JettyLogManager.class); > + > + infoFactory.setConstructor(new String[]{"LogGBeans"}); > + GBEAN_INFO = infoFactory.getBeanInfo(); > + } > + > + public static GBeanInfo getGBeanInfo() { > + return GBEAN_INFO; > + } > +/* > + public static void main(String[] args) { > + String jetty = "127.0.0.1 - - [07/Sep/2005:19:54:41 +0000] > \"GET /console/ HTTP/1.1\" 302 0 \"-\" \"Mozilla/5.0 (X11; U; Linux > i686; en-US; rv:1.7.10) Gecko/20050715 Firefox/1.0.6 > SUSE/1.0.6-4.1\" -"; > + String tomcat = "127.0.0.1 - - [07/Sep/2005:15:51:18 > -0500] \"GET /console/portal/server/server_info HTTP/1.1\" 200 > 11708"; > + > + SimpleDateFormat format = new > SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss ZZZZ"); > + try { > + Pattern p = Pattern.compile("(\\S*) (\\S*) (\\S*) > \\[(.*)\\] \\\"(\\S*) (\\S*).*?\\\" (\\S*) (\\S*).*"); > + Matcher m = p.matcher(jetty); > + if(m.matches()) { > + System.out.println("Group 1: "+m.group(1)); // > client > + System.out.println("Group 2: "+m.group(2)); // ?? > server host? > + System.out.println("Group 3: "+m.group(3)); // > username > + System.out.println("Group 4: > "+format.parse(m.group(4))); // date > + System.out.println("Group 5: "+m.group(5)); // > method > + System.out.println("Group 5: "+m.group(6)); // URI > + System.out.println("Group 6: "+m.group(7)); // > response code > + System.out.println("Group 7: "+m.group(8)); // > response length > + } else { > + System.out.println("No match"); > + } > + m = p.matcher(tomcat); > + if(m.matches()) { > + System.out.println("Group 1: "+m.group(1)); > + System.out.println("Group 2: "+m.group(2)); > + System.out.println("Group 3: "+m.group(3)); > + System.out.println("Group 4: > "+format.parse(m.group(4))); > + System.out.println("Group 5: "+m.group(5)); // > method > + System.out.println("Group 5: "+m.group(6)); // URI > + System.out.println("Group 6: "+m.group(7)); // > response code > + System.out.println("Group 7: "+m.group(8)); // > response length > + } else { > + System.out.println("No match"); > + } > + } catch (ParseException e) { > + e.printStackTrace(); > + } > + } > +*/ > +} > > Added: > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyRequestLog.java > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyRequestLog.java?rev=290359&view=auto > ============================================================================== > --- > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyRequestLog.java > (added) > +++ > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/JettyRequestLog.java > Mon Sep 19 21:55:54 2005 > @@ -0,0 +1,58 @@ > +/** > + * > + * Copyright 2005 The Apache Software Foundation > + * > + * Licensed under the Apache License, Version 2.0 (the > "License"); > + * you may not use this file except in compliance with the > License. > + * You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, > software > + * distributed under the License is distributed on an "AS IS" > BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express > or implied. > + * See the License for the specific language governing > permissions and > + * limitations under the License. > + */ > +package org.apache.geronimo.jetty.requestlog; > + > +/** > + * Interface for the NCSARequestLog GBean > + * > + * @version $Rev: 46019 $ $Date: 2004-09-14 05:56:06 -0400 (Tue, > 14 Sep 2004) $ > + */ > +public interface JettyRequestLog { > + void setFilename(String filename); > + > + String getFilename(); > + > + String getAbsoluteFilePath(); > + > + void setLogDateFormat(String format); > + > + String getLogDateFormat(); > + > + void setLogTimeZone(String tz); > + > + String getLogTimeZone(); > + > + int getRetainDays(); > + > + void setRetainDays(int retainDays); > + > + boolean isExtended(); > + > + void setExtended(boolean e); > + > + boolean isAppend(); > + > + void setAppend(boolean a); > + > + void setIgnorePaths(String[] ignorePaths); > + > + String[] getIgnorePaths(); > + > + void setPreferProxiedForAddress(boolean value); > + > + boolean isPreferProxiedForAddress(); > +} > > Modified: > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/NCSARequestLog.java > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/NCSARequestLog.java?rev=290359&r1=290358&r2=290359&view=diff > ============================================================================== > --- > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/NCSARequestLog.java > (original) > +++ > geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/requestlog/NCSARequestLog.java > Mon Sep 19 21:55:54 2005 > @@ -26,7 +26,7 @@ > /** > * @version $Rev$ $Date$ > */ > -public class NCSARequestLog implements GBeanLifecycle { > +public class NCSARequestLog implements GBeanLifecycle, > JettyRequestLog { > private final JettyContainer container; > private final ServerInfo serverInfo; > private final org.mortbay.http.NCSARequestLog requestLog; > @@ -104,6 +104,10 @@ > return preferProxiedForAddress; > } > > + public String getAbsoluteFilePath() { > + return requestLog == null ? null : > requestLog.getDatedFilename(); > + } > + > public void doStart() throws Exception { > requestLog.setFilename(serverInfo.resolvePath(filename)); > container.setRequestLog(requestLog); > @@ -127,14 +131,8 @@ > infoFactory.addReference("JettyContainer", > JettyContainer.class, NameFactory.GERONIMO_SERVICE); > infoFactory.addReference("ServerInfo", ServerInfo.class, > NameFactory.GERONIMO_SERVICE); > > - infoFactory.addAttribute("filename", String.class, true); > - infoFactory.addAttribute("logDateFormat", String.class, > true); > - infoFactory.addAttribute("logTimeZone", String.class, > true); > - infoFactory.addAttribute("retainDays", int.class, true); > - infoFactory.addAttribute("extended", boolean.class, true); > - infoFactory.addAttribute("append", boolean.class, true); > - infoFactory.addAttribute("ignorePaths", String[].class, > true); > - infoFactory.addAttribute("preferProxiedForAddress", > boolean.class, true); > + infoFactory.addInterface(JettyRequestLog.class, new > String[]{"filename", "logDateFormat", "logTimeZone", > + "retainDays", "extended", "append", "ignorePaths", > "preferProxiedForAddress", }); > > infoFactory.setConstructor(new String[]{"JettyContainer", > "ServerInfo"}); > GBEAN_INFO = infoFactory.getBeanInfo(); > > Added: > geronimo/trunk/modules/management/src/java/org/apache/geronimo/management/geronimo/WebAccessLog.java > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/modules/management/src/java/org/apache/geronimo/management/geronimo/WebAccessLog.java?rev=290359&view=auto > ============================================================================== > --- > geronimo/trunk/modules/management/src/java/org/apache/geronimo/management/geronimo/WebAccessLog.java > (added) > +++ > geronimo/trunk/modules/management/src/java/org/apache/geronimo/management/geronimo/WebAccessLog.java > Mon Sep 19 21:55:54 2005 > @@ -0,0 +1,92 @@ > +/** > + * > + * Copyright 2005 The Apache Software Foundation > + * > + * Licensed under the Apache License, Version 2.0 (the > "License"); > + * you may not use this file except in compliance with the > License. > + * You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, > software > + * distributed under the License is distributed on an "AS IS" > BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express > or implied. > + * See the License for the specific language governing > permissions and > + * limitations under the License. > + */ > +package org.apache.geronimo.management.geronimo; > + > +import java.io.Serializable; > +import java.util.Date; > + > +/** > + * A web container access log manager. > + * > + * @version $Rev: 46019 $ $Date: 2004-09-14 05:56:06 -0400 (Tue, > 14 Sep 2004) $ > + */ > +public interface WebAccessLog { > + /** > + * The most search lines that will ever be returned, no matter > what you > + * ask for. This is to conserve memory and transfer > bandwidth. > + */ > + public final static int MAX_SEARCH_RESULTS = 1000; > + > + /** > + * Gets the name of all log files used by this log system. > Typically there > + * is only one, but specialized cases may use more. > + */ > + String[] getLogFileNames(); > + > + /** > + * Searches the log for records matching the specified > parameters. The > + * maximum results returned will be the lesser of 1000 and the > + * provided maxResults argument. > + * > + * @see #MAX_SEARCH_RESULTS > + */ > + SearchResults getMatchingItems(String logFile, String host, > String user, String method, > + String uri, Date startDate, > Date endDate, > + Integer skipResults, Integer > maxResults); > + > + public static class LogMessage implements Serializable { > + private final int lineNumber; > + private final String lineContent; > + > + public LogMessage(int lineNumber, String lineContent) { > + this.lineNumber = lineNumber; > + this.lineContent = lineContent; > + } > + > + public int getLineNumber() { > + return lineNumber; > + } > + > + public String getLineContent() { > + return lineContent; > + } > + } > + > + public static class SearchResults implements Serializable { > + private final int lineCount; // total lines in log file > + private final LogMessage[] results; > + private final boolean capped; // whether there were more > matched than are returned here > + > + public SearchResults(int lineCount, LogMessage[] results, > boolean capped) { > + this.lineCount = lineCount; > + this.results = results; > + this.capped = capped; > + } > + > + public int getLineCount() { > + return lineCount; > + } > + > + public LogMessage[] getResults() { > + return results; > + } > + > + public boolean isCapped() { > + return capped; > + } > + } > +} > > Modified: > geronimo/trunk/modules/management/src/java/org/apache/geronimo/management/geronimo/WebManager.java > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/modules/management/src/java/org/apache/geronimo/management/geronimo/WebManager.java?rev=290359&r1=290358&r2=290359&view=diff > ============================================================================== > --- > geronimo/trunk/modules/management/src/java/org/apache/geronimo/management/geronimo/WebManager.java > (original) > +++ > geronimo/trunk/modules/management/src/java/org/apache/geronimo/management/geronimo/WebManager.java > Mon Sep 19 21:55:54 2005 > @@ -44,4 +44,14 @@ > * @return The ObjectName of the new connector. > */ > public String addConnector(String containerObjectName, String > uniqueName, String protocol, String host, int port); > + > + /** > + * Gets the ObjectName of the WebAccessLog implementation for > a web > + * container. May be null if the access log cannot be > managed. > + * > + * @param containerObjectName The ObjectName of the container > whose access > + * log you're interested in. > + * > + */ > + public String getAccessLog(String containerObjectName); > } > > Modified: > geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/logging/SystemLog.java > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/logging/SystemLog.java?rev=290359&r1=290358&r2=290359&view=diff > ============================================================================== > --- > geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/logging/SystemLog.java > (original) > +++ > geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/logging/SystemLog.java > Mon Sep 19 21:55:54 2005 > @@ -89,7 +89,7 @@ > } > > public static class SearchResults implements Serializable { > - private final int lineCount; > + private final int lineCount; // total lines in file > private final LogMessage[] results; > private final boolean capped; > > > Modified: > geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatManagerImpl.java > URL: > http://svn.apache.org/viewcvs/geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatManagerImpl.java?rev=290359&r1=290358&r2=290359&view=diff > ============================================================================== > --- > geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatManagerImpl.java > (original) > +++ > geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatManagerImpl.java > Mon Sep 19 21:55:54 2005 > @@ -177,6 +177,18 @@ > return (String[]) result.toArray(new > String[result.size()]); > } > > + public String getAccessLog(String containerObjectName) { > +// GBeanQuery query = new GBeanQuery(null, > TomcatLogManager.class.getName()); > +// Set names = kernel.listGBeans(query); > +// if(names.size() == 0) { > +// return null; > +// } else if(names.size() > 1) { > +// throw new IllegalStateException("Should not be more > than one Jetty access log manager"); > +// } > +// return > ((ObjectName)names.iterator().next()).getCanonicalName(); > + return null; > + } > + > /** > * Gets the ObjectNames of any existing connectors associated > with this network technology. > */ > > > __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com
