You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2008/09/11 20:44:11 UTC

svn commit: r694410 - in /tapestry/tapestry5/trunk: quickstart/ tapestry-core/src/main/java/org/apache/tapestry5/ tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/ tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/ ta...

Author: hlship
Date: Thu Sep 11 11:44:08 2008
New Revision: 694410

URL: http://svn.apache.org/viewvc?rev=694410&view=rev
Log:
TAPESTRY-2474: Define and use a standard set of SL4J Markers for logging, to make it easier to filter output

Added:
    tapestry/tapestry5/trunk/quickstart/quickstart.iml
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/TapestryMarkers.java
Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/ComponentActionSink.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassTransformerImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EventImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderQueueImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventImplTest.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RenderQueueImplTest.java
    tapestry/tapestry5/trunk/tapestry-hibernate/pom.xml
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/util/Stack.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/util/StackTest.java

Added: tapestry/tapestry5/trunk/quickstart/quickstart.iml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/quickstart/quickstart.iml?rev=694410&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/quickstart/quickstart.iml (added)
+++ tapestry/tapestry5/trunk/quickstart/quickstart.iml Thu Sep 11 11:44:08 2008
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module relativePaths="true" MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <exclude-output />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntryProperties />
+  </component>
+</module>
+

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/TapestryMarkers.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/TapestryMarkers.java?rev=694410&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/TapestryMarkers.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/TapestryMarkers.java Thu Sep 11 11:44:08 2008
@@ -0,0 +1,65 @@
+//  Copyright 2008 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.tapestry5;
+
+import org.slf4j.Marker;
+import org.slf4j.MarkerFactory;
+
+import java.util.Arrays;
+
+/**
+ * A set of markers used internally by Tapestry when logging in code related to paqes and components. Most logging
+ * toolkits, including Log4J, do not incorporate markers, but  <a href="http://logback.qos.ch/">LOGBack</a> does.
+ */
+public class TapestryMarkers
+{
+    /**
+     * A root marker for all things Tapestry related. The remaining markers are children of the TAPESTRY marker.
+     */
+    public static final Marker TAPESTRY = MarkerFactory.getMarker("TAPESTRY");
+
+    /**
+     * Logs the final version of the class transformation. This is useful when debugging {@link
+     * org.apache.tapestry5.services.ComponentClassTransformWorker}s, as it shows exactly what transformation operations
+     * occured, at the Java code level.
+     */
+    public static final Marker CLASS_TRANSFORMATION = MarkerFactory.getMarker("CLASS_TRANSFORMATION");
+
+    /**
+     * Marker for a debug log that occurs just before invocation of a event handler method.
+     */
+    public static final Marker EVENT_HANDLER_METHOD = MarkerFactory.getMarker("EVENT_HANDLER_METHOD");
+
+    /**
+     * Marker for logging related to component event dispatch.
+     */
+    public static final Marker EVENT_DISPATCH = MarkerFactory.getMarker("EVENT_DISPATCH");
+
+    /**
+     * Marker for logging, at trace level verbose details about each individual {@link
+     * org.apache.tapestry5.runtime.RenderCommand} involved in rendering the page, as well as a final (debug level)
+     * summary of command count and elapsed time.
+     */
+
+    public static final Marker RENDER_COMMANDS = MarkerFactory.getMarker("RENDER_COMMANDS");
+
+    static
+    {
+        for (Marker child : Arrays.asList(CLASS_TRANSFORMATION, EVENT_HANDLER_METHOD, EVENT_DISPATCH, RENDER_COMMANDS))
+        {
+            TAPESTRY.add(child);
+        }
+    }
+}

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java?rev=694410&r1=694409&r2=694410&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java Thu Sep 11 11:44:08 2008
@@ -271,7 +271,6 @@
         writer.end(); // div
 
         environment.peek(Heartbeat.class).begin();
-
     }
 
     void afterRender(MarkupWriter writer)
@@ -396,8 +395,7 @@
 
         for (String actionsBase64 : values)
         {
-            if (logger.isDebugEnabled())
-                logger.debug(String.format("Processing actions: %s", actionsBase64));
+            logger.debug("Processing actions: {}", actionsBase64);
 
             ObjectInputStream ois = null;
 
@@ -414,9 +412,7 @@
 
                     component = source.getComponent(componentId);
 
-                    if (logger.isDebugEnabled())
-                        logger.debug(String.format("Processing: %s  %s", componentId, action));
-
+                    logger.debug("Processing: {} {}", componentId, action);
 
                     action.execute(component);
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/ComponentActionSink.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/ComponentActionSink.java?rev=694410&r1=694409&r2=694410&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/ComponentActionSink.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/ComponentActionSink.java Thu Sep 11 11:44:08 2008
@@ -53,8 +53,7 @@
 
         String completeId = castComponent.getComponentResources().getCompleteId();
 
-        if (logger.isDebugEnabled())
-            logger.debug(String.format("Storing action: %s %s", completeId, action));
+        logger.debug("Storing action: {} {}", completeId, action);
 
         try
         {

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassTransformerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassTransformerImpl.java?rev=694410&r1=694409&r2=694410&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassTransformerImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassTransformerImpl.java Thu Sep 11 11:44:08 2008
@@ -17,6 +17,7 @@
 import javassist.CtClass;
 import javassist.CtConstructor;
 import javassist.NotFoundException;
+import org.apache.tapestry5.TapestryMarkers;
 import org.apache.tapestry5.internal.InternalConstants;
 import org.apache.tapestry5.internal.events.InvalidationListener;
 import org.apache.tapestry5.internal.model.MutableComponentModelImpl;
@@ -174,7 +175,7 @@
             throw new TransformationException(transformation, ex);
         }
 
-        if (logger.isDebugEnabled()) logger.debug("Finished class transformation: " + transformation);
+        logger.debug(TapestryMarkers.CLASS_TRANSFORMATION, "Finished class transformation: {}", transformation);
 
         nameToClassTransformation.put(classname, transformation);
         nameToComponentModel.put(classname, model);

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EventImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EventImpl.java?rev=694410&r1=694409&r2=694410&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EventImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EventImpl.java Thu Sep 11 11:44:08 2008
@@ -15,6 +15,7 @@
 package org.apache.tapestry5.internal.services;
 
 import org.apache.tapestry5.ComponentEventCallback;
+import org.apache.tapestry5.TapestryMarkers;
 import static org.apache.tapestry5.ioc.internal.util.Defense.notNull;
 import org.apache.tapestry5.runtime.Event;
 import org.slf4j.Logger;
@@ -46,8 +47,7 @@
 
     public void setMethodDescription(String methodDescription)
     {
-        if (logger.isDebugEnabled())
-            logger.debug("Invoking: " + methodDescription);
+        logger.debug(TapestryMarkers.EVENT_HANDLER_METHOD, "Invoking: {}", methodDescription);
 
         this.methodDescription = methodDescription;
     }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderQueueImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderQueueImpl.java?rev=694410&r1=694409&r2=694410&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderQueueImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderQueueImpl.java Thu Sep 11 11:44:08 2008
@@ -16,6 +16,7 @@
 
 import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.MarkupWriter;
+import org.apache.tapestry5.TapestryMarkers;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.internal.util.Defense;
 import org.apache.tapestry5.ioc.util.Stack;
@@ -25,7 +26,7 @@
 
 public class RenderQueueImpl implements RenderQueue
 {
-    private static final int INITIAL_QUEUE_DEPTH = 100;
+    private static final int INITIAL_QUEUE_DEPTH = 200;
 
     private final Stack<RenderCommand> queue = CollectionFactory.newStack(INITIAL_QUEUE_DEPTH);
 
@@ -47,10 +48,11 @@
     {
         RenderCommand command = null;
 
-        boolean traceEnabled = logger.isTraceEnabled();
+        boolean traceEnabled = logger.isTraceEnabled(TapestryMarkers.RENDER_COMMANDS);
 
         long startNanos = System.nanoTime();
         int commandCount = 0;
+        int maxDepth = 0;
 
         // Seems to make sense to use one try/finally around the whole process, rather than
         // around each call to render() since the end result (in a failure scenario) is the same.
@@ -59,11 +61,13 @@
         {
             while (!queue.isEmpty())
             {
+                maxDepth = Math.max(maxDepth, queue.getDepth());
+
                 command = queue.pop();
 
                 commandCount++;
 
-                if (traceEnabled) logger.trace(String.format("Executing: %s", command));
+                if (traceEnabled) logger.trace(TapestryMarkers.RENDER_COMMANDS, "Executing: {}", command);
 
                 command.render(writer, this);
             }
@@ -82,17 +86,14 @@
 
         long endNanos = System.nanoTime();
 
-        if (logger.isDebugEnabled())
-        {
-
-            long elapsedNanos = endNanos - startNanos;
-            double elapsedSeconds = ((float) elapsedNanos) / 1000000000F;
-
-            logger.debug(String.format("Executed %,d rendering commands in %.3f seconds",
-                                       commandCount,
-                                       elapsedSeconds));
-        }
+        long elapsedNanos = endNanos - startNanos;
+        double elapsedSeconds = ((float) elapsedNanos) / 1000000000F;
 
+        logger.debug(TapestryMarkers.RENDER_COMMANDS,
+                     String.format("Executed %,d rendering commands (max queue depth: %,d) in %.3f seconds",
+                                   commandCount,
+                                   maxDepth,
+                                   elapsedSeconds));
     }
 
     public void startComponent(ComponentResources resources)

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java?rev=694410&r1=694409&r2=694410&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java Thu Sep 11 11:44:08 2008
@@ -1044,8 +1044,7 @@
                 ComponentEvent event = new ComponentEventImpl(currentEventType, componentId, currentContext, wrapped,
                                                               pageResources, logger);
 
-                if (logger.isDebugEnabled())
-                    logger.debug("Dispatch event: " + event);
+                logger.debug(TapestryMarkers.EVENT_DISPATCH, "Dispatch event: {}", event);
 
                 result |= component.dispatchEvent(event);
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventImplTest.java?rev=694410&r1=694409&r2=694410&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventImplTest.java Thu Sep 11 11:44:08 2008
@@ -16,10 +16,14 @@
 
 import org.apache.tapestry5.ComponentEventCallback;
 import org.apache.tapestry5.EventContext;
+import org.apache.tapestry5.TapestryMarkers;
 import org.apache.tapestry5.internal.structure.PageResources;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
 import org.apache.tapestry5.ioc.services.TypeCoercer;
 import org.apache.tapestry5.runtime.ComponentEvent;
+import org.easymock.EasyMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.isA;
 import org.slf4j.Logger;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -141,7 +145,7 @@
         EventContext context = mockEventContext();
         Logger logger = mockLogger();
 
-        train_isDebugEnabled(logger, false);
+        logger.debug(eq(TapestryMarkers.EVENT_HANDLER_METHOD), isA(String.class), isA(String.class));
 
         train_getCount(context, 0);
 
@@ -172,7 +176,7 @@
         PageResources resources = mockPageResources();
         Logger logger = mockLogger();
 
-        train_isDebugEnabled(logger, false);
+        logger.debug(eq(TapestryMarkers.EVENT_HANDLER_METHOD), isA(String.class), isA(String.class));
 
         train_toClass(resources, Integer.class.getName(), Integer.class);
 
@@ -209,7 +213,7 @@
         String methodDescription = "foo.Bar.baz()";
         Logger logger = mockLogger();
 
-        train_isDebugEnabled(logger, false);
+        logger.debug(eq(TapestryMarkers.EVENT_HANDLER_METHOD), isA(String.class), isA(String.class));
 
         ComponentEventCallback handler = mockComponentEventHandler();
 
@@ -238,7 +242,7 @@
         ComponentEventCallback handler = mockComponentEventHandler();
         Logger logger = mockLogger();
 
-        train_isDebugEnabled(logger, false);
+        logger.debug(eq(TapestryMarkers.EVENT_HANDLER_METHOD), isA(String.class), isA(String.class));
 
         train_handleResult(handler, result, false);
 
@@ -261,7 +265,7 @@
         ComponentEventCallback handler = mockComponentEventHandler();
         Logger logger = mockLogger();
 
-        train_isDebugEnabled(logger, false);
+        logger.debug(eq(TapestryMarkers.EVENT_HANDLER_METHOD), isA(String.class), isA(String.class));
 
         replay();
 
@@ -284,7 +288,9 @@
         ComponentEventCallback handler = mockComponentEventHandler();
         Logger logger = mockLogger();
 
-        expect(logger.isDebugEnabled()).andStubReturn(false);
+        logger.debug(eq(TapestryMarkers.EVENT_HANDLER_METHOD), isA(String.class), isA(String.class));
+
+        EasyMock.expectLastCall().atLeastOnce();
 
         expect(handler.handleResult(result)).andReturn(true);
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RenderQueueImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RenderQueueImplTest.java?rev=694410&r1=694409&r2=694410&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RenderQueueImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RenderQueueImplTest.java Thu Sep 11 11:44:08 2008
@@ -16,9 +16,12 @@
 
 import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.MarkupWriter;
+import org.apache.tapestry5.TapestryMarkers;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
 import org.apache.tapestry5.runtime.RenderCommand;
 import org.apache.tapestry5.runtime.RenderQueue;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.isA;
 import org.slf4j.Logger;
 import org.testng.annotations.Test;
 
@@ -42,8 +45,9 @@
 
         // There's only one check for trace enabled now.
 
-        train_isTraceEnabled(logger, false);
-        train_isDebugEnabled(logger, false);
+        expect(logger.isTraceEnabled(TapestryMarkers.RENDER_COMMANDS)).andReturn(false);
+
+        logger.debug(eq(TapestryMarkers.RENDER_COMMANDS), isA(String.class));
 
         command2.render(writer, queue);
 
@@ -82,7 +86,7 @@
         Logger logger = mockLogger();
         MarkupWriter writer = mockMarkupWriter();
 
-        train_isTraceEnabled(logger, false);
+        expect(logger.isTraceEnabled(TapestryMarkers.RENDER_COMMANDS)).andReturn(false);
 
         logger.error("Render queue error in FailedCommand: Oops.", t);
 
@@ -106,10 +110,9 @@
         {
             assertSame(ex.getCause(), t);
 
-            assertArraysEqual(ex.getActiveComponents(), new Object[] { foo, baz });
+            assertArraysEqual(ex.getActiveComponents(), new Object[] {foo, baz});
         }
 
         verify();
     }
-
 }

Modified: tapestry/tapestry5/trunk/tapestry-hibernate/pom.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/pom.xml?rev=694410&r1=694409&r2=694410&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-hibernate/pom.xml (original)
+++ tapestry/tapestry5/trunk/tapestry-hibernate/pom.xml Thu Sep 11 11:44:08 2008
@@ -65,6 +65,11 @@
                     <groupId>javax.transaction</groupId>
                     <artifactId>jta</artifactId>
                 </exclusion>
+                <!-- Make sure we use the version defined by tapestry-ioc. -->
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
             </exclusions>
         </dependency>
 
@@ -80,6 +85,13 @@
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-annotations</artifactId>
             <version>3.4.0.GA</version>
+            <exclusions>
+                <!-- Make sure we use the version defined by tapestry-ioc. -->
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/util/Stack.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/util/Stack.java?rev=694410&r1=694409&r2=694410&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/util/Stack.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/util/Stack.java Thu Sep 11 11:44:08 2008
@@ -58,6 +58,14 @@
     }
 
     /**
+     * Returns the number of items currently in the stack.
+     */
+    public int getDepth()
+    {
+        return index + 1;
+    }
+
+    /**
      * Clears the stack, the same as popping off all elements.
      */
     public void clear()

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/util/StackTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/util/StackTest.java?rev=694410&r1=694409&r2=694410&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/util/StackTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/util/StackTest.java Thu Sep 11 11:44:08 2008
@@ -71,9 +71,11 @@
 
         assertEquals(stack.toString(), "Stack[barney, fred]");
 
+        assertEquals(stack.getDepth(), 2);
+
         Object[] snapshot = stack.getSnapshot();
 
-        assertArraysEqual(snapshot, new Object[] { fred, barney });
+        assertArraysEqual(snapshot, new Object[] {fred, barney});
 
         assertEquals(stack.pop(), barney);
         assertEquals(stack.peek(), fred);