You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2007/04/20 00:11:23 UTC
svn commit: r530567 - in
/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket:
markup/html/list/ markup/repeater/ util/collections/
Author: ivaynberg
Date: Thu Apr 19 15:11:22 2007
New Revision: 530567
URL: http://svn.apache.org/viewvc?view=rev&rev=530567
Log:
extracted AbstractRepeater that all repeaters now implement. besides the obvious benefits this should make it easier to identify them and forbid their addition into ajax request target.
Added:
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/repeater/AbstractRepeater.java
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/collections/ReadOnlyIterator.java
Modified:
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/list/ListView.java
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/list/Loop.java
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/repeater/RepeatingView.java
Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/list/ListView.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/list/ListView.java?view=diff&rev=530567&r1=530566&r2=530567
==============================================================================
--- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/list/ListView.java (original)
+++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/list/ListView.java Thu Apr 19 15:11:22 2007
@@ -22,11 +22,11 @@
import java.util.List;
import org.apache.wicket.Component;
-import org.apache.wicket.markup.MarkupStream;
-import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.markup.repeater.AbstractRepeater;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
+import org.apache.wicket.util.collections.ReadOnlyIterator;
import org.apache.wicket.version.undo.Change;
@@ -34,7 +34,8 @@
* A ListView is a repeater that makes it easy to display/work with {@link List}s.
* However, there are situations where it is necessary to work with other
* collection types, for repeaters that might work better with non-list or
- * database-driven collections see the org.apache.wicket.markup.repeater package.
+ * database-driven collections see the org.apache.wicket.markup.repeater
+ * package.
*
* Also notice that in a list the item's uniqueness/primary key/id is identified
* as its index in the list. If this is not the case you should either override
@@ -105,7 +106,7 @@
* @author Johan Compagner
* @author Eelco Hillenius
*/
-public abstract class ListView extends WebMarkupContainer
+public abstract class ListView extends AbstractRepeater
{
/** Index of the first item to show */
private int firstIndex = 0;
@@ -643,38 +644,28 @@
}
/**
- *
- * @see org.apache.wicket.Component#onRender(org.apache.wicket.markup.MarkupStream)
+ * @see org.apache.wicket.markup.repeater.AbstractRepeater#renderIterator()
*/
- protected void onRender(final MarkupStream markupStream)
+ protected Iterator renderIterator()
{
- // Save position in markup stream
- final int markupStart = markupStream.getCurrentIndex();
- // Get number of items to be displayed
final int size = getViewSize();
- if (size > 0)
+ return new ReadOnlyIterator()
{
- // Loop through the markup in this container for each item
- for (int i = 0; i < size; i++)
- {
- // Get index
- final int index = firstIndex + i;
+ private int index = 0;
- // Get list item for index
- ListItem item = (ListItem)get(Integer.toString(index));
-
- // Rewind to start of markup for kids
- markupStream.setCurrentIndex(markupStart);
+ public boolean hasNext()
+ {
+ return index < size;
+ }
- // Render
- renderItem(item);
+ public Object next()
+ {
+ final String id = Integer.toString(firstIndex + index);
+ index++;
+ return get(id);
}
- }
- else
- {
- markupStream.skipComponent();
- }
+ };
}
/**
@@ -698,6 +689,15 @@
* The item to populate
*/
protected abstract void populateItem(final ListItem item);
+
+
+ /**
+ * @see org.apache.wicket.markup.repeater.AbstractRepeater#renderChild(org.apache.wicket.Component)
+ */
+ protected final void renderChild(Component child)
+ {
+ renderItem((ListItem)child);
+ }
/**
* Render a single item.
Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/list/Loop.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/list/Loop.java?view=diff&rev=530567&r1=530566&r2=530567
==============================================================================
--- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/list/Loop.java (original)
+++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/list/Loop.java Thu Apr 19 15:11:22 2007
@@ -16,11 +16,14 @@
*/
package org.apache.wicket.markup.html.list;
-import org.apache.wicket.WicketRuntimeException;
-import org.apache.wicket.markup.MarkupStream;
+import java.util.Iterator;
+
+import org.apache.wicket.Component;
import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.repeater.AbstractRepeater;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
+import org.apache.wicket.util.collections.ReadOnlyIterator;
/**
* A very simple loop component whose model is an Integer defining the number of
@@ -34,7 +37,7 @@
* @author Eelco Hillenius
* @author Jonathan Locke
*/
-public abstract class Loop extends WebMarkupContainer
+public abstract class Loop extends AbstractRepeater
{
/**
* Item container for a Loop iteration.
@@ -44,7 +47,7 @@
public static final class LoopItem extends WebMarkupContainer
{
private static final long serialVersionUID = 1L;
-
+
/** The iteration number */
private final int iteration;
@@ -111,7 +114,7 @@
protected void onAttach()
{
super.onAttach();
-
+
// Remove any previous loop contents
removeAll();
@@ -145,42 +148,27 @@
}
/**
- *
- * @see org.apache.wicket.Component#onRender(org.apache.wicket.markup.MarkupStream)
+ * @see org.apache.wicket.markup.repeater.AbstractRepeater#renderIterator()
*/
- protected final void onRender(final MarkupStream markupStream)
+ protected Iterator renderIterator()
{
- // Save position in markup stream
- final int markupStart = markupStream.getCurrentIndex();
-
- // Get number of iterations
final int iterations = getIterations();
- if (iterations > 0)
- {
- // Loop through the markup in this container for each item
- for (int iteration = 0; iteration < iterations; iteration++)
- {
- // Get item for iteration
- final LoopItem item = (LoopItem)get(Integer.toString(iteration));
- // Item should have been constructed in internalOnBeginRequest
- if (item == null)
- {
- throw new WicketRuntimeException(
- "Loop item is null. Probably the number of loop iterations were changed between onBeginRequest and render time.");
- }
+ return new ReadOnlyIterator()
+ {
+ private int index = 0;
- // Rewind to start of markup for kids
- markupStream.setCurrentIndex(markupStart);
+ public boolean hasNext()
+ {
+ return index < iterations;
+ }
- // Render iteration
- renderItem(item);
+ public Object next()
+ {
+ return get(Integer.toString(index++));
}
- }
- else
- {
- markupStream.skipComponent();
- }
+
+ };
}
/**
@@ -190,6 +178,14 @@
* The iteration of the loop
*/
protected abstract void populateItem(LoopItem item);
+
+ /**
+ * @param child
+ */
+ protected final void renderChild(Component child)
+ {
+ renderItem((LoopItem)child);
+ }
/**
* Renders this loop iteration.
Added: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/repeater/AbstractRepeater.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/repeater/AbstractRepeater.java?view=auto&rev=530567
==============================================================================
--- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/repeater/AbstractRepeater.java (added)
+++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/repeater/AbstractRepeater.java Thu Apr 19 15:11:22 2007
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.wicket.markup.repeater;
+
+import java.util.Iterator;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.markup.MarkupStream;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.model.IModel;
+
+/**
+ * Base class for repeaters. This container renders each of its children using
+ * its own markup.
+ *
+ * The children are collected using {@link #renderIterator()} method. This class
+ * will take care of properly positioning and rewinding its markup stream so
+ * before each child renders it points to the beginning of this component. Each
+ * child is rendered by a call to {@link #renderChild(Component)}. A typical
+ * implementation simply does <code>child.render(getMarkupStream());</code>.
+ *
+ * @author Igor Vaynberg (ivaynberg)
+ */
+public abstract class AbstractRepeater extends WebMarkupContainer
+{
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Constructor
+ *
+ * @param id
+ */
+ public AbstractRepeater(String id)
+ {
+ super(id);
+ }
+
+ /**
+ * Constructor
+ *
+ * @param id
+ * @param model
+ */
+ public AbstractRepeater(String id, IModel model)
+ {
+ super(id, model);
+ }
+
+ /**
+ * Returns an iterator for the collection of child components to be
+ * rendered. Users can override this to change order of rendered children.
+ *
+ * @return iterator over child components to be rendered
+ */
+ protected abstract Iterator renderIterator();
+
+ /**
+ * Renders all child items in no specified order
+ *
+ * @param markupStream
+ * The markup stream
+ */
+ protected final void onRender(final MarkupStream markupStream)
+ {
+ final int markupStart = markupStream.getCurrentIndex();
+
+ Iterator it = renderIterator();
+ if (it.hasNext())
+ {
+ do
+ {
+ markupStream.setCurrentIndex(markupStart);
+ renderChild((Component)it.next());
+ }
+ while (it.hasNext());
+ }
+ else
+ {
+ markupStream.skipComponent();
+ }
+ }
+
+ /**
+ * Render a single child. This method can be overridden to modify how a
+ * single child component is rendered.
+ *
+ * @param child
+ * Child component to be rendered
+ */
+ protected void renderChild(final Component child)
+ {
+ child.render(getMarkupStream());
+ }
+
+}
Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/repeater/RepeatingView.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/repeater/RepeatingView.java?view=diff&rev=530567&r1=530566&r2=530567
==============================================================================
--- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/repeater/RepeatingView.java (original)
+++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/repeater/RepeatingView.java Thu Apr 19 15:11:22 2007
@@ -19,8 +19,6 @@
import java.util.Iterator;
import org.apache.wicket.Component;
-import org.apache.wicket.markup.MarkupStream;
-import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.IModel;
@@ -73,7 +71,7 @@
* @author Igor Vaynberg ( ivaynberg )
*
*/
-public class RepeatingView extends WebMarkupContainer
+public class RepeatingView extends AbstractRepeater
{
/**
*
@@ -116,59 +114,11 @@
}
/**
- * Renders all child items in no specified order
- *
- * @param markupStream
- * The markup stream
- */
- protected void onRender(final MarkupStream markupStream)
- {
- final int markupStart = markupStream.getCurrentIndex();
-
- Iterator it = renderIterator();
- if (it.hasNext())
- {
- do
- {
- markupStream.setCurrentIndex(markupStart);
- renderChild((Component)it.next());
- }
- while (it.hasNext());
- }
- else
- {
- markupStream.skipComponent();
- }
- }
-
- /**
- * Returns an iterator for the collection of child components to be
- * rendered.
- *
- * Child component are rendered in the order they are in the iterator. Since
- * we use the iterator returned by wicket's
- * <code>MarkupContainer#iterator()</code> method and that method does not
- * guarantee any kind of ordering neither do we. This method can be
- * overridden by subclasses to create an ordering scheme, see
- * <code>OrderedRepeatingView#renderIterator()</code>.
- *
- * @return iterator over child components to be rendered
+ * @see org.apache.wicket.markup.repeater.AbstractRepeater#renderIterator()
*/
protected Iterator renderIterator()
{
return iterator();
- }
-
- /**
- * Render a single child. This method can be overridden to modify how a
- * single child component is rendered.
- *
- * @param child
- * Child component to be rendered
- */
- protected void renderChild(final Component child)
- {
- child.render(getMarkupStream());
}
}
Added: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/collections/ReadOnlyIterator.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/collections/ReadOnlyIterator.java?view=auto&rev=530567
==============================================================================
--- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/collections/ReadOnlyIterator.java (added)
+++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/collections/ReadOnlyIterator.java Thu Apr 19 15:11:22 2007
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.wicket.util.collections;
+
+import java.util.Iterator;
+
+/**
+ * Base class for read-only iterators. Calls to {@link #remove()} will result in
+ * an {@link UnsupportedOperationException}
+ *
+ * @author Igor Vaynberg (ivaynberg)
+ */
+public abstract class ReadOnlyIterator implements Iterator
+{
+ public final void remove()
+ {
+ throw new UnsupportedOperationException("Iterator " + getClass().getName()
+ + " is a read-only iterator. Calls to remove() are not allowed");
+ }
+}