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 2009/10/11 15:56:17 UTC

svn commit: r824076 - in /wicket/trunk/wicket/src: main/java/org/apache/wicket/ main/java/org/apache/wicket/markup/html/ main/java/org/apache/wicket/markup/html/border/ main/java/org/apache/wicket/markup/html/form/ main/java/org/apache/wicket/markup/pa...

Author: jdonnerstag
Date: Sun Oct 11 13:56:16 2009
New Revision: 824076

URL: http://svn.apache.org/viewvc?rev=824076&view=rev
Log:
First step towards using MarkupFragment for the render process

Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/HeaderPartContainer.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/border/Border.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/parser/filter/WicketLinkTagHandler.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/HtmlHeaderResolver.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/WicketMessageResolver.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/util/lang/Checks.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/form/border/CommonModelPage.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/panel/InlinePanelPage_5.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/markupFragments/MarkupFragmentTest.java

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java?rev=824076&r1=824075&r2=824076&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java Sun Oct 11 13:56:16 2009
@@ -2363,15 +2363,29 @@
 	 * 
 	 * @param markupStream
 	 */
-	public final void render(final MarkupStream markupStream)
+	public final void render(MarkupStream markupStream)
 	{
 		if (getApplication().getMarkupFragmentEnabled())
 		{
+			// Step 1: Make sure there is a markup available for the Component
 			IMarkupFragment markup = getMarkup();
 			if (!(this instanceof Page) && (markup == null))
 			{
 				throw new IllegalArgumentException("jdo: Markup not found: " + toString());
 			}
+
+			// Step 2: A markup stream based on the markup should yield the same result.
+			if (markupStream != null)
+			{
+				MarkupStream ms = new MarkupStream(markup);
+
+				// We need to skip the component in the original markup stream to avoid
+				// exceptions later on.
+				markupStream.skipComponent();
+
+				// We want to use the new markup stream
+				markupStream = ms;
+			}
 		}
 
 		// We need to know the index before we do the visibility check.
@@ -3722,6 +3736,10 @@
 	 */
 	protected MarkupStream locateMarkupStream()
 	{
+		if (getApplication().getMarkupFragmentEnabled())
+		{
+			return new MarkupStream(getMarkup());
+		}
 		return new MarkupFragmentFinder().find(this);
 	}
 

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/HeaderPartContainer.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/HeaderPartContainer.java?rev=824076&r1=824075&r2=824076&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/HeaderPartContainer.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/HeaderPartContainer.java Sun Oct 11 13:56:16 2009
@@ -98,6 +98,13 @@
 	@Override
 	public IMarkupFragment getMarkup()
 	{
-		return container.getAssociatedMarkup().find(null, "_head", 0);
+		return getMarkupStream().getMarkupFragment();
+// IMarkupFragment markup = container.getAssociatedMarkup();
+// if (markup == null)
+// {
+// return null;
+// }
+//
+// return markup.find(null, "_head", 0);
 	}
 }
\ No newline at end of file

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/border/Border.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/border/Border.java?rev=824076&r1=824075&r2=824076&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/border/Border.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/border/Border.java Sun Oct 11 13:56:16 2009
@@ -27,6 +27,7 @@
 import org.apache.wicket.markup.MarkupFragment;
 import org.apache.wicket.markup.MarkupStream;
 import org.apache.wicket.markup.WicketTag;
+import org.apache.wicket.markup.html.WebComponent;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.WebMarkupContainerWithAssociatedMarkup;
 import org.apache.wicket.markup.html.internal.HtmlHeaderContainer;
@@ -508,24 +509,32 @@
 		}
 
 		/**
-		 * The implementation is against the rule that getMarkup() returns the components markup
-		 * which in this case would be something like <code>&lt;wicket:body/&gt;</code>. But that
-		 * doesn't work if the body container has been added to some kind of wrapper (e.g. Form,
-		 * another Border, etc.). Such a parent would not be able to find the body. The reason is
-		 * that the body container's id and the tag id are different. The tag's id is always "_body"
-		 * where as the body's id must be unique per parent and thus is something like border.id +
-		 * "_body". Since the Page object is not yet available in the constructor,
-		 * Page#getAutoIndex() can not be used. So Border.BorderBodyContainer is an exception in
-		 * that it returns what you would expect from getMarkup(null). Via
-		 * <code>getBodyContainer().getParent().getMarkup(new WebComponent("_body"));</code> you can
-		 * still access the <code>&lt;wicket:body/&gt;</code> markup if really needed.
-		 * 
 		 * @see org.apache.wicket.Component#getMarkup()
 		 */
 		@Override
 		public IMarkupFragment getMarkup()
 		{
-			return Border.this.getMarkup();
+			return getParent().getMarkup(new WebComponent(BODY_ID));
+		}
+
+		/**
+		 * @see org.apache.wicket.MarkupContainer#getMarkup(org.apache.wicket.Component)
+		 */
+		@Override
+		public IMarkupFragment getMarkup(final Component child)
+		{
+			IMarkupFragment markup = Border.this.getMarkup();
+			if (markup == null)
+			{
+				return null;
+			}
+
+			if (child == null)
+			{
+				return markup;
+			}
+
+			return markup.find(null, child.getId(), 0);
 		}
 	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java?rev=824076&r1=824075&r2=824076&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java Sun Oct 11 13:56:16 2009
@@ -1643,6 +1643,10 @@
 		}
 	}
 
+	/**
+	 * @see org.apache.wicket.Component#renderPlaceholderTag(org.apache.wicket.markup.ComponentTag,
+	 *      org.apache.wicket.Response)
+	 */
 	@Override
 	protected void renderPlaceholderTag(ComponentTag tag, Response response)
 	{

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java?rev=824076&r1=824075&r2=824076&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java Sun Oct 11 13:56:16 2009
@@ -28,7 +28,6 @@
 import org.apache.wicket.markup.MarkupElement;
 import org.apache.wicket.markup.MarkupStream;
 import org.apache.wicket.markup.WicketTag;
-import org.apache.wicket.markup.html.WebComponent;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.resolver.IComponentResolver;
 import org.apache.wicket.request.IRequestCodingStrategy;
@@ -151,15 +150,15 @@
 	{
 		if ((tag != null) && (tag.getId().startsWith(WICKET_RELATIVE_PATH_PREFIX_CONTAINER_ID)))
 		{
-			final Component wc;
-
 			String id = WICKET_RELATIVE_PATH_PREFIX_CONTAINER_ID +
 				container.getPage().getAutoIndex();
 
+			final IMarkupFragment markup = markupStream.getMarkupFragment();
+
 			// we do not want to mess with the hierarchy, so the container has to be
 			// transparent as it may have wicket components inside. for example a raw anchor tag
 			// that contains a label.
-			wc = new WebMarkupContainer(id)
+			final Component wc = new WebMarkupContainer(id)
 			{
 				private static final long serialVersionUID = 1L;
 
@@ -169,11 +168,7 @@
 				@Override
 				public IMarkupFragment getMarkup()
 				{
-					// This is a small trick. We can not find markup fragments by ID, only by
-					// Component. To search for an ID we simply need to create a dummy component
-					// with that ID.
-					return getParent().getMarkup(
-						new WebComponent(WICKET_RELATIVE_PATH_PREFIX_CONTAINER_ID));
+					return markup;
 				}
 
 				@Override

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/parser/filter/WicketLinkTagHandler.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/parser/filter/WicketLinkTagHandler.java?rev=824076&r1=824075&r2=824076&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/parser/filter/WicketLinkTagHandler.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/parser/filter/WicketLinkTagHandler.java Sun Oct 11 13:56:16 2009
@@ -214,6 +214,8 @@
 				final String id = tag.getId() + container.getPage().getAutoIndex();
 				tag.setId(id);
 
+				final IMarkupFragment markup = markupStream.getMarkupFragment();
+
 				final Component component = new WebMarkupContainer(id)
 				{
 					private static final long serialVersionUID = 1L;
@@ -233,7 +235,7 @@
 					@Override
 					public IMarkupFragment getMarkup()
 					{
-						return markupStream.getMarkupFragment();
+						return markup;
 					}
 				};
 

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/HtmlHeaderResolver.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/HtmlHeaderResolver.java?rev=824076&r1=824075&r2=824076&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/HtmlHeaderResolver.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/HtmlHeaderResolver.java Sun Oct 11 13:56:16 2009
@@ -20,6 +20,7 @@
 import org.apache.wicket.Page;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.markup.IMarkupFragment;
 import org.apache.wicket.markup.MarkupException;
 import org.apache.wicket.markup.MarkupStream;
 import org.apache.wicket.markup.WicketTag;
@@ -89,6 +90,8 @@
 			// head first.
 			if (container instanceof WebPage)
 			{
+				final IMarkupFragment markup = markupStream.getMarkupFragment();
+
 				// Create a special header component which will gather
 				// additional input the <head> from 'contributors'.
 				final MarkupContainer header = newHtmlHeaderContainer(HtmlHeaderSectionHandler.HEADER_ID +
@@ -108,6 +111,12 @@
 					{
 						return true;
 					}
+
+					@Override
+					public IMarkupFragment getMarkup()
+					{
+						return markup;
+					}
 				};
 
 				header2.setRenderBodyOnly(true);
@@ -118,6 +127,8 @@
 			}
 			else if (container instanceof HtmlHeaderContainer)
 			{
+				final IMarkupFragment markup = markupStream.getMarkupFragment();
+
 				// It is <wicket:head>. Because they do not provide any
 				// additional functionality there are merely a means of surrounding
 				// relevant markup. Thus we simply create a WebMarkupContainer to handle
@@ -132,6 +143,12 @@
 					{
 						return true;
 					}
+
+					@Override
+					public IMarkupFragment getMarkup()
+					{
+						return markup;
+					}
 				};
 				header.setRenderBodyOnly(true);
 

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/WicketMessageResolver.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/WicketMessageResolver.java?rev=824076&r1=824075&r2=824076&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/WicketMessageResolver.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/WicketMessageResolver.java Sun Oct 11 13:56:16 2009
@@ -31,7 +31,6 @@
 import org.apache.wicket.markup.MarkupException;
 import org.apache.wicket.markup.MarkupStream;
 import org.apache.wicket.markup.WicketTag;
-import org.apache.wicket.markup.html.internal.MarkupTagIterator;
 import org.apache.wicket.markup.parser.XmlTag;
 import org.apache.wicket.markup.parser.filter.WicketTagIdentifier;
 import org.apache.wicket.model.Model;
@@ -141,7 +140,9 @@
 				}
 
 				final String id = "_message_" + container.getPage().getAutoIndex();
-				MessageContainer label = new MessageContainer(id, messageKey);
+				MessageContainer label = new MessageContainer(id, messageKey,
+					markupStream.getMarkupFragment());
+
 				label.setRenderBodyOnly(container.getApplication()
 					.getMarkupSettings()
 					.getStripWicketTags());
@@ -178,17 +179,23 @@
 	{
 		private static final long serialVersionUID = 1L;
 
+		private final IMarkupFragment markupFragment;
+
 		/**
 		 * Construct.
 		 * 
 		 * @param id
 		 * @param messageKey
+		 * @param markupFragment
 		 */
-		public MessageContainer(final String id, final String messageKey)
+		public MessageContainer(final String id, final String messageKey,
+			final IMarkupFragment markupFragment)
 		{
 			// The message key becomes the model
 			super(id, new Model<String>(messageKey));
 
+			this.markupFragment = markupFragment;
+
 			setEscapeModelStrings(false);
 		}
 
@@ -414,28 +421,7 @@
 		@Override
 		public IMarkupFragment getMarkup()
 		{
-			String key = getDefaultModelObjectAsString();
-			if (Strings.isEmpty(key))
-			{
-				throw new WicketRuntimeException(
-					"Expected the model object to contain the message key. But the model object was null");
-			}
-
-			// Get the parent markup. Make sure that in case of Border and Panel you get the
-			// associated markup
-			IMarkupFragment markup = getParent().getMarkup(null);
-			MarkupTagIterator iter = new MarkupTagIterator(markup).setWicketTagsOnly(true)
-				.setOpenTagOnly(true);
-			while (iter.hasNext())
-			{
-				WicketTag tag = iter.nextWicketTag();
-				if (tag.isMessageTag() && key.equals(tag.getAttribute("key")))
-				{
-					return iter.getMarkupFragment();
-				}
-			}
-
-			return null;
+			return markupFragment;
 		}
 	}
 }
\ No newline at end of file

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/util/lang/Checks.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/util/lang/Checks.java?rev=824076&r1=824075&r2=824076&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/util/lang/Checks.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/util/lang/Checks.java Sun Oct 11 13:56:16 2009
@@ -1,45 +1,62 @@
+/*
+ * 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.lang;
 
 import org.apache.wicket.util.string.Strings;
 
 public class Checks
 {
-    public static void argumentNotNull(Object argument, String name)
-    {
-        if (argument == null)
-        {
-            throw new IllegalArgumentException("Argument '" + name + "' may not be null.");
-        }
-    }
+	public static void argumentNotNull(Object argument, String name)
+	{
+		if (argument == null)
+		{
+			throw new IllegalArgumentException("Argument '" + name + "' may not be null.");
+		}
+	}
 
-    public static void argumentNotEmpty(String argument, String name)
-    {
-        if (Strings.isEmpty(argument))
-        {
-            throw new IllegalArgumentException("Argument '" + name +
-                    "' may not be null or empty string.");
-        }
-    }
+	public static void argumentNotEmpty(String argument, String name)
+	{
+		if (Strings.isEmpty(argument))
+		{
+			throw new IllegalArgumentException("Argument '" + name +
+				"' may not be null or empty string.");
+		}
+	}
 
-    /**
-     * TODO javadoc and unit test
-     * @param <T>
-     * @param min
-     * @param max
-     * @param value
-     * @param name
-     */
-    public static <T extends Comparable<T>> void argumentWithinRange(T min, T max, T value,
-            String name)
-    {
-        // TODO nullchecks
-        if (value.compareTo(min) < 0 || value.compareTo(max) > 0)
-        {
-            throw new IllegalArgumentException(String.format(
-                    "Argument '%s' must have a value within [%s,%s], but was %s", name, min, max,
-                    value));
-        }
+	/**
+	 * TODO javadoc and unit test
+	 * 
+	 * @param <T>
+	 * @param min
+	 * @param max
+	 * @param value
+	 * @param name
+	 */
+	public static <T extends Comparable<T>> void argumentWithinRange(T min, T max, T value,
+		String name)
+	{
+		// TODO nullchecks
+		if (value.compareTo(min) < 0 || value.compareTo(max) > 0)
+		{
+			throw new IllegalArgumentException(
+				String.format("Argument '%s' must have a value within [%s,%s], but was %s", name,
+					min, max, value));
+		}
 
-        return;
-    }
+		return;
+	}
 }

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/form/border/CommonModelPage.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/form/border/CommonModelPage.java?rev=824076&r1=824075&r2=824076&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/form/border/CommonModelPage.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/form/border/CommonModelPage.java Sun Oct 11 13:56:16 2009
@@ -40,12 +40,12 @@
 		add(border);
 
 		Form form1 = new Form("form1");
-		border.addToBorderBody(form1);
+		border.add(form1);
 
 		form1.add(new TextField("quantity1", new PropertyModel(this, "quantity1")));
 
 		Form form2 = new Form("form2");
-		border.addToBorderBody(form2);
+		border.add(form2);
 
 		form2.add(new TextField("quantity2", new PropertyModel(this, "quantity2")));
 	}

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/panel/InlinePanelPage_5.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/panel/InlinePanelPage_5.java?rev=824076&r1=824075&r2=824076&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/panel/InlinePanelPage_5.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/panel/InlinePanelPage_5.java Sun Oct 11 13:56:16 2009
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.markup.html.panel;
 
+import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.markup.IMarkupFragment;
 import org.apache.wicket.markup.MarkupStream;
@@ -65,13 +66,21 @@
 			return getAssociatedMarkupStream(false);
 		}
 
-		/**
-		 * @see org.apache.wicket.markup.html.panel.Fragment#getMarkup()
-		 */
 		@Override
-		public IMarkupFragment getMarkup()
+		public IMarkupFragment getMarkup(Component child)
 		{
-			return getAssociatedMarkup();
+			IMarkupFragment markup = getAssociatedMarkup();
+			if (markup == null)
+			{
+				return null;
+			}
+
+			if (child == null)
+			{
+				return markup;
+			}
+
+			return markup.find(null, child.getId(), 0);
 		}
 	}
 }

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/markupFragments/MarkupFragmentTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markupFragments/MarkupFragmentTest.java?rev=824076&r1=824075&r2=824076&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/markupFragments/MarkupFragmentTest.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/markupFragments/MarkupFragmentTest.java Sun Oct 11 13:56:16 2009
@@ -158,6 +158,9 @@
 		assertNull(border.getBodyContainer().getAssociatedMarkup());
 
 		markup = border.getBodyContainer().getMarkup();
+		compare(markup, "<wicket:body/>");
+
+		markup = border.getBodyContainer().getMarkup(null);
 		compare(markup, "<span wicket:id=\"border\">test</span>");
 
 		markup = border.getBodyContainer().getParent().getMarkup(new WebComponent("_body"));
@@ -196,6 +199,9 @@
 		compare(markup, "<wicket:body>333</wicket:body>");
 
 		markup = border.getBodyContainer().getMarkup();
+		compare(markup, "<wicket:body>333</wicket:body>");
+
+		markup = border.getBodyContainer().getMarkup(null);
 		compare(markup, "<span wicket:id=\"border2\">test</span>");
 
 		// getMarkup(null) returns the markup which is used to find a child component