You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2008/04/23 02:46:42 UTC

svn commit: r650709 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry/ main/java/org/apache/tapestry/internal/services/ test/java/org/apache/tapestry/internal/services/

Author: hlship
Date: Tue Apr 22 17:46:40 2008
New Revision: 650709

URL: http://svn.apache.org/viewvc?rev=650709&view=rev
Log:
TAPESTRY-2378: Add a listener interface for MarkupWriter, to allow code to be notified when elements are started and ended

Added:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriterAdapter.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriterListener.java
Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriter.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/MarkupWriterImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/MarkupWriterImplTest.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriter.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriter.java?rev=650709&r1=650708&r2=650709&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriter.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriter.java Tue Apr 22 17:46:40 2008
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 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.
@@ -138,4 +138,14 @@
      * @return the currently active element
      */
     Element attributeNS(String namespace, String attributeName, String attributeValue);
+
+    /**
+     * Adds a markup writer listener that will be notified as elements are started and ended.
+     */
+    void addListener(MarkupWriterListener listener);
+
+    /**
+     * Removes a previously added listener.
+     */
+    void removeListener(MarkupWriterListener listener);
 }

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriterAdapter.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriterAdapter.java?rev=650709&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriterAdapter.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriterAdapter.java Tue Apr 22 17:46:40 2008
@@ -0,0 +1,31 @@
+// 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.tapestry;
+
+import org.apache.tapestry.dom.Element;
+
+/**
+ * Default, empty implementation of {@link org.apache.tapestry.MarkupWriterListener}.
+ */
+public class MarkupWriterAdapter implements MarkupWriterListener
+{
+    public void elementDidStart(Element element)
+    {
+    }
+
+    public void elementDidEnd(Element element)
+    {
+    }
+}

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriterListener.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriterListener.java?rev=650709&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriterListener.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/MarkupWriterListener.java Tue Apr 22 17:46:40 2008
@@ -0,0 +1,41 @@
+// 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.tapestry;
+
+import org.apache.tapestry.dom.Element;
+
+
+/**
+ * An interface that allows objects to be alerted when after an element is started, and after an element is ended.
+ */
+public interface MarkupWriterListener
+{
+    /**
+     * Invoked just after an element and its initial set of attributes has been written.
+     *
+     * @param element element just created and populated with attributes
+     * @see org.apache.tapestry.MarkupWriter#element(String, Object[])
+     * @see org.apache.tapestry.MarkupWriter#elementNS(String, String)
+     */
+    void elementDidStart(Element element);
+
+    /**
+     * Invoked just after an element has ended.
+     *
+     * @param element just ended
+     * @see org.apache.tapestry.MarkupWriter#end()
+     */
+    void elementDidEnd(Element element);
+}

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/MarkupWriterImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/MarkupWriterImpl.java?rev=650709&r1=650708&r2=650709&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/MarkupWriterImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/MarkupWriterImpl.java Tue Apr 22 17:46:40 2008
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 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.
@@ -15,10 +15,14 @@
 package org.apache.tapestry.internal.services;
 
 import org.apache.tapestry.MarkupWriter;
+import org.apache.tapestry.MarkupWriterListener;
 import org.apache.tapestry.dom.*;
+import org.apache.tapestry.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry.ioc.internal.util.Defense;
 import org.apache.tapestry.ioc.internal.util.InternalUtils;
 
 import java.io.PrintWriter;
+import java.util.List;
 
 public class MarkupWriterImpl implements MarkupWriter
 {
@@ -28,6 +32,8 @@
 
     private Text _currentText;
 
+    private final List<MarkupWriterListener> _listeners = CollectionFactory.newList();
+
     public MarkupWriterImpl()
     {
         this(new DefaultMarkupModel());
@@ -133,6 +139,8 @@
 
         _currentText = null;
 
+        fireElementDidStart();
+
         return _current;
     }
 
@@ -149,6 +157,8 @@
     {
         ensureCurrentElement();
 
+        fireElementDidEnd();
+
         _current = _current.getParent();
 
         _currentText = null;
@@ -190,6 +200,38 @@
 
         _currentText = null;
 
+
+        fireElementDidStart();
+
         return _current;
     }
+
+    public void addListener(MarkupWriterListener listener)
+    {
+        Defense.notNull(listener, "listener");
+
+        _listeners.add(listener);
+    }
+
+    public void removeListener(MarkupWriterListener listener)
+    {
+        _listeners.remove(listener);
+    }
+
+    private void fireElementDidStart()
+    {
+        for (MarkupWriterListener l : _listeners)
+        {
+            l.elementDidStart(_current);
+        }
+    }
+
+    private void fireElementDidEnd()
+    {
+        for (MarkupWriterListener l : _listeners)
+        {
+            l.elementDidEnd(_current);
+        }
+    }
 }
+

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/MarkupWriterImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/MarkupWriterImplTest.java?rev=650709&r1=650708&r2=650709&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/MarkupWriterImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/MarkupWriterImplTest.java Tue Apr 22 17:46:40 2008
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 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.
@@ -15,6 +15,7 @@
 package org.apache.tapestry.internal.services;
 
 import org.apache.tapestry.MarkupWriter;
+import org.apache.tapestry.MarkupWriterListener;
 import org.apache.tapestry.dom.Element;
 import org.apache.tapestry.dom.XMLMarkupModel;
 import org.apache.tapestry.internal.test.InternalBaseTestCase;
@@ -256,5 +257,52 @@
 
         assertEquals(w.toString(),
                      "<?xml version=\"1.0\"?>\n<root>Normal Text <![CDATA[< & >]]>More Normal Text</root>");
+    }
+
+    @Test
+    public void listeners()
+    {
+        MarkupWriter w = new MarkupWriterImpl(new XMLMarkupModel());
+
+        MarkupWriterListener l = new MarkupWriterListener()
+        {
+            public void elementDidStart(Element element)
+            {
+                element.text("[Start: " + element.getName() + "]");
+            }
+
+            public void elementDidEnd(Element element)
+            {
+                element.text("[End: " + element.getName() + "]");
+            }
+        };
+
+        w.element("root");
+        w.element("no-listener");
+
+        w.write("before listener");
+
+        w.addListener(l);
+
+        w.element("listener");
+        w.write("before n-w-l");
+        w.element("nested-with-listener");
+        w.write("n-w-l text");
+        w.end();
+        w.write("after n-w-l");
+        w.end();
+
+        w.removeListener(l);
+
+        w.write("after listener");
+
+        w.end();
+        w.end();
+
+        // Because we are invoking Element.text(), the text added by the listener is appended to the body of the element,
+        // which is correct but may not be what you'd expect.
+
+        assertEquals(w.toString(), "<?xml version=\"1.0\"?>\n" +
+                "<root><no-listener>before listener<listener>[Start: listener]before n-w-l<nested-with-listener>[Start: nested-with-listener]n-w-l text[End: nested-with-listener]</nested-with-listener>after n-w-l[End: listener]</listener>after listener</no-listener></root>");
     }
 }