You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jd...@apache.org on 2010/07/04 16:19:54 UTC
svn commit: r960339 - in /wicket/trunk/wicket/src:
main/java/org/apache/wicket/
main/java/org/apache/wicket/markup/html/internal/
main/java/org/apache/wicket/markup/resolver/
main/java/org/apache/wicket/protocol/http/
test/java/org/apache/wicket/markup...
Author: jdonnerstag
Date: Sun Jul 4 14:19:54 2010
New Revision: 960339
URL: http://svn.apache.org/viewvc?rev=960339&view=rev
Log:
fixed WICKET-2882: IComponentResolver usage with Enclosure
Issue: WICKET-2882
Modified:
wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/ComponentResolvers.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_11.html
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePage_11.java
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosureTest.java
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java?rev=960339&r1=960338&r2=960339&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java Sun Jul 4 14:19:54 2010
@@ -34,6 +34,7 @@ import org.apache.wicket.markup.MarkupSt
import org.apache.wicket.markup.MarkupType;
import org.apache.wicket.markup.RawMarkup;
import org.apache.wicket.markup.WicketTag;
+import org.apache.wicket.markup.html.border.Border;
import org.apache.wicket.markup.resolver.ComponentResolvers;
import org.apache.wicket.model.IComponentInheritedModel;
import org.apache.wicket.model.IModel;
@@ -138,6 +139,24 @@ public abstract class MarkupContainer ex
throw new IllegalArgumentException("argument child may not be null");
}
+ MarkupContainer parent = getParent();
+ while (parent != null)
+ {
+ if (child == parent)
+ {
+ String msg = "You can not add a component's parent as child to the component (loop): Component: " +
+ this.toString(false) + "; parent == child: " + parent.toString(false);
+ if (child instanceof Border.BorderBodyContainer)
+ {
+ msg += ". Please consider using Border.addToBorder(new " +
+ this.getClass().getSimpleName() + "(\"" + this.getId() +
+ "\", ...) instead of add(...)";
+ }
+ throw new WicketRuntimeException(msg);
+ }
+ parent = parent.getParent();
+ }
+
checkHierarchyChange(child);
if (log.isDebugEnabled())
@@ -951,14 +970,10 @@ public abstract class MarkupContainer ex
}
final Page page = findPage();
-
if (page != null)
{
child.initialize();
- }
- if (page != null)
- {
// Tell the page a component has been added
page.componentAdded(child);
}
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java?rev=960339&r1=960338&r2=960339&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java Sun Jul 4 14:19:54 2010
@@ -23,12 +23,14 @@ import org.apache.wicket.application.ICo
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.MarkupException;
import org.apache.wicket.markup.MarkupStream;
-import org.apache.wicket.markup.html.TransparentWebMarkupContainer;
+import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.EnclosureContainer;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.IFormSubmittingComponent;
import org.apache.wicket.markup.parser.filter.EnclosureHandler;
+import org.apache.wicket.markup.resolver.ComponentResolvers;
+import org.apache.wicket.markup.resolver.IComponentResolver;
import org.apache.wicket.request.Response;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.response.NullResponse;
@@ -82,7 +84,7 @@ import org.slf4j.LoggerFactory;
* @author Juergen Donnerstag
* @since 1.3
*/
-public class Enclosure extends TransparentWebMarkupContainer
+public class Enclosure extends WebMarkupContainer implements IComponentResolver
{
private static final long serialVersionUID = 1L;
@@ -114,6 +116,25 @@ public class Enclosure extends Transpare
}
/**
+ * @see org.apache.wicket.Component#onInitialize()
+ */
+ @Override
+ protected void onInitialize()
+ {
+ super.onInitialize();
+
+ // enclosure's parent container
+ MarkupContainer container = getEnclosureParent();
+
+ // clear the cache
+ childComponent = null;
+
+ // get Child Component. If not "added", ask a resolver to find it.
+ childComponent = getChildComponent(new MarkupStream(getMarkup()), container);
+ checkChildComponent(childComponent);
+ }
+
+ /**
* Get the real parent container
*
* @return enclosure's parent markup container
@@ -121,7 +142,7 @@ public class Enclosure extends Transpare
private MarkupContainer getEnclosureParent()
{
MarkupContainer parent = getParent();
- while (parent.isAuto())
+ while ((parent != null) && parent.isAuto())
{
parent = parent.getParent();
}
@@ -139,16 +160,11 @@ public class Enclosure extends Transpare
* org.apache.wicket.markup.ComponentTag)
*/
@Override
- protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag)
+ protected void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag)
{
- // enclosure's parent container
- MarkupContainer container = getEnclosureParent();
-
- Component controller = container.get(childId.toString());
- checkChildComponent(controller);
-
+ // TODO this is where I wish we had something like "enum(TAG, BODY, NONE, ALL) isVisible()"
// set the enclosure visibility
- boolean visible = controller.determineVisibility();
+ boolean visible = childComponent.determineVisibility();
// We want to know which components are rendered inside the enclosure
final IComponentOnAfterRenderListener listener = new EnclosureListener(this);
@@ -186,6 +202,59 @@ public class Enclosure extends Transpare
}
/**
+ * @param markupStream
+ * @param container
+ * @return The component associated with the
+ */
+ private Component getChildComponent(final MarkupStream markupStream, MarkupContainer container)
+ {
+ Component controller = container.get(childId.toString());
+ if (controller == null)
+ {
+ int orgIndex = markupStream.getCurrentIndex();
+ try
+ {
+ while (markupStream.hasMore())
+ {
+ markupStream.next();
+ if (markupStream.skipUntil(ComponentTag.class))
+ {
+ ComponentTag tag = markupStream.getTag();
+ if ((tag != null) && (tag.isOpen() || tag.isOpenClose()))
+ {
+ if (childId.equals(tag.getId()))
+ {
+ controller = ComponentResolvers.resolveByComponentHierarchy(
+ container, markupStream, tag);
+ break;
+ }
+ }
+ }
+ }
+ }
+ finally
+ {
+ markupStream.setCurrentIndex(orgIndex);
+ }
+ }
+ return controller;
+ }
+
+ /**
+ *
+ * @see org.apache.wicket.markup.resolver.IComponentResolver#resolve(org.apache.wicket.MarkupContainer,
+ * org.apache.wicket.markup.MarkupStream, org.apache.wicket.markup.ComponentTag)
+ */
+ public Component resolve(MarkupContainer container, MarkupStream markupStream, ComponentTag tag)
+ {
+ if (childId.equals(tag.getId()))
+ {
+ return childComponent;
+ }
+ return getEnclosureParent().get(tag.getId());
+ }
+
+ /**
*
* @param controller
*/
@@ -218,6 +287,7 @@ public class Enclosure extends Transpare
/**
* @see org.apache.wicket.application.IComponentOnBeforeRenderListener#onBeforeRender(org.apache.wicket.Component)
*/
+ @SuppressWarnings("unchecked")
public void onAfterRender(final Component component)
{
if (log.isWarnEnabled())
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/ComponentResolvers.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/ComponentResolvers.java?rev=960339&r1=960338&r2=960339&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/ComponentResolvers.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/ComponentResolvers.java Sun Jul 4 14:19:54 2010
@@ -50,24 +50,28 @@ public class ComponentResolvers
final MarkupStream markupStream, final ComponentTag tag)
{
// try to resolve using component hierarchy
+ Component component = resolveByComponentHierarchy(container, markupStream, tag);
- Component cursor = container;
- while (cursor != null)
+ if (component == null)
{
- if (cursor instanceof IComponentResolver)
- {
- IComponentResolver resolver = (IComponentResolver)cursor;
- Component component = resolver.resolve(container, markupStream, tag);
- if (component != null)
- {
- return component;
- }
- }
- cursor = cursor.getParent();
+ // fallback to application-level resolvers
+ component = resolveByApplication(container, markupStream, tag);
}
- // fallback to application-level resolvers
+ return component;
+ }
+ /**
+ * Attempts to resolve a component via application registered resolvers.
+ *
+ * @param container
+ * @param markupStream
+ * @param tag
+ * @return Null, if no component was found
+ */
+ public static Component resolveByApplication(final MarkupContainer container,
+ final MarkupStream markupStream, final ComponentTag tag)
+ {
for (final IComponentResolver resolver : Application.get()
.getPageSettings()
.getComponentResolvers())
@@ -81,4 +85,33 @@ public class ComponentResolvers
return null;
}
+
+ /**
+ * Attempts to resolve a component via the component hierarchy using resolvers.
+ *
+ * @param container
+ * @param markupStream
+ * @param tag
+ * @return Null, if no component was found
+ */
+ public static Component resolveByComponentHierarchy(final MarkupContainer container,
+ final MarkupStream markupStream, final ComponentTag tag)
+ {
+ Component cursor = container;
+ while (cursor != null)
+ {
+ if (cursor instanceof IComponentResolver)
+ {
+ IComponentResolver resolver = (IComponentResolver)cursor;
+ Component component = resolver.resolve(container, markupStream, tag);
+ if (component != null)
+ {
+ return component;
+ }
+ }
+ cursor = cursor.getParent();
+ }
+
+ return null;
+ }
}
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java?rev=960339&r1=960338&r2=960339&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java Sun Jul 4 14:19:54 2010
@@ -493,4 +493,13 @@ public class BufferedWebResponse extends
response.write(stream.toByteArray());
}
}
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return charSequenceAction.builder.toString();
+ }
}
Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_11.html
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_11.html?rev=960339&r1=960338&r2=960339&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_11.html (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_11.html Sun Jul 4 14:19:54 2010
@@ -2,10 +2,10 @@
<body>
<wicket:enclosure child="autoCreatedPanel">
<div>
- <span wicket:id="autoCreatedPanel"><span wicket:id="autoCreatedPanel"><wicket:panel>
+ <span wicket:id="autoCreatedPanel"><wicket:panel>
This is a simple test panel.
With this component: <span wicket:id="label">hello world</span>
-</wicket:panel></span></span>
+</wicket:panel></span>
</div>
</wicket:enclosure>
</body>
Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePage_11.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePage_11.java?rev=960339&r1=960338&r2=960339&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePage_11.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePage_11.java Sun Jul 4 14:19:54 2010
@@ -43,12 +43,12 @@ public class EnclosurePage_11 extends We
public Component resolve(MarkupContainer container, MarkupStream markupStream, ComponentTag tag)
{
- if (tag instanceof WicketTag)
+ if ((tag instanceof WicketTag) || !"autoCreatedPanel".equals(tag.getId()))
{
// this resolver does not handle wicket tags
return null;
}
- return "autoCreatedPanel".equals(tag.getId()) ? new SimplePanel(tag.getId()) : null;
+ return new SimplePanel(tag.getId());
}
}
Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosureTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosureTest.java?rev=960339&r1=960338&r2=960339&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosureTest.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosureTest.java Sun Jul 4 14:19:54 2010
@@ -301,6 +301,4 @@ public class EnclosureTest extends Wicke
{
executeTest(EnclosurePage_11.class, "EnclosurePageExpectedResult_11.html");
}
-
-
}