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>");
}
}