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/19 19:11:43 UTC

svn commit: r530490 - in /incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup: ContainerInfo.java html/border/MarkupComponentBorder.java

Author: ivaynberg
Date: Thu Apr 19 10:11:42 2007
New Revision: 530490

URL: http://svn.apache.org/viewvc?view=rev&rev=530490
Log:
markup component border cleanup wip

Modified:
    incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/ContainerInfo.java
    incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/border/MarkupComponentBorder.java

Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/ContainerInfo.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/ContainerInfo.java?view=diff&rev=530490&r1=530489&r2=530490
==============================================================================
--- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/ContainerInfo.java (original)
+++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/ContainerInfo.java Thu Apr 19 10:11:42 2007
@@ -54,6 +54,24 @@
 	}
 
 	/**
+	 * Construct.
+	 * @param containerClass
+	 * @param locale
+	 * @param style
+	 * @param variation
+	 * @param fileExtension
+	 */
+	public ContainerInfo(final Class containerClass, final Locale locale, final String style, final String variation, final String fileExtension)
+	{
+		super();
+		this.containerClass = containerClass;
+		this.locale = locale;
+		this.style = style;
+		this.variation = variation;
+		this.fileExtension = fileExtension;
+	}
+
+	/**
 	 * 
 	 * @return The container class
 	 */

Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/border/MarkupComponentBorder.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/border/MarkupComponentBorder.java?view=diff&rev=530490&r1=530489&r2=530490
==============================================================================
--- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/border/MarkupComponentBorder.java (original)
+++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/border/MarkupComponentBorder.java Thu Apr 19 10:11:42 2007
@@ -16,11 +16,24 @@
  */
 package org.apache.wicket.markup.html.border;
 
+import java.util.Locale;
+
+import org.apache.wicket.Application;
 import org.apache.wicket.Component;
 import org.apache.wicket.IComponentBorder;
 import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.markup.MarkupFragment;
+import org.apache.wicket.Response;
+import org.apache.wicket.Session;
+import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.markup.ContainerInfo;
+import org.apache.wicket.markup.Markup;
+import org.apache.wicket.markup.MarkupElement;
+import org.apache.wicket.markup.MarkupResourceStream;
+import org.apache.wicket.markup.MarkupStream;
+import org.apache.wicket.markup.WicketTag;
 import org.apache.wicket.markup.parser.filter.WicketTagIdentifier;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.locator.IResourceStreamLocator;
 
 /**
  * @TODO Comment
@@ -38,101 +51,150 @@
 
 	private static final long serialVersionUID = 1L;
 
+	// markup stream associated with this border. bonus of keeping a reference
+	// is that when renderAfter starts the stream will be very close to its
+	// needed position because renderBefore has executed
+	private transient MarkupStream markupStream;
+
 	/**
 	 * 
-	 * @see wicket.IComponentBorder#renderAfter(wicket.Component)
+	 * @see wicket.IComponentBorder#renderBefore(wicket.Component)
 	 */
-	public void renderAfter(Component component)
+	public void renderBefore(Component component)
 	{
-		final String extension;
-		if (component instanceof MarkupContainer)
-		{
-			extension = ((MarkupContainer)component).getMarkupType();
-		}
-		else
-		{
-			extension = component.getParent().getMarkupId();
-		}
-/*		MarkupFragment markupFragment = findMarkup(extension);
-		MarkupFragment childFragment = markupFragment.getWicketFragment(Border.BORDER, true);
-		List allElementsFlat = childFragment.getAllElementsFlat();
-		Response response = component.getResponse();
-		boolean render = false;
-		for (MarkupElement markupElement : allElementsFlat)
+		final MarkupStream stream = getMarkupStream(component);
+		final Response response = component.getResponse();
+		stream.setCurrentIndex(0);
+
+		boolean insideBorderMarkup = false;
+		while (stream.hasMore())
 		{
-			if (markupElement instanceof ComponentTag)
+			MarkupElement e = stream.next();
+			if (e instanceof WicketTag)
 			{
-				ComponentTag tag = (ComponentTag)markupElement;
-				if (tag.isWicketBodyTag())
+				WicketTag wt = (WicketTag)e;
+				if (!insideBorderMarkup)
 				{
-					render = true;
-					continue;
+					if (wt.isBorderTag() && wt.isOpen())
+					{
+						insideBorderMarkup = true;
+					}
+					else
+					{
+						throw new WicketRuntimeException(
+								"Unexpected tag encountered in markup of component border "
+										+ getClass().getName() + ". Tag: " + wt.toString()
+										+ ", expected tag: <wicket:border>");
+					}
 				}
-				else if (tag.isBorderTag())
+				else
 				{
-					continue;
+					if (wt.isBodyTag())
+					{
+						break;
+					}
+					else
+					{
+						throw new WicketRuntimeException(
+								"Unexpected tag encountered in markup of component border "
+										+ getClass().getName() + ". Tag: " + wt.toString()
+										+ ", expected tag: <wicket:body> or </wicket:body>");
+					}
 				}
 			}
-			if (render)
+			if (insideBorderMarkup)
 			{
-				response.write(markupElement.toCharSequence());
+				response.write(e.toCharSequence());
 			}
 		}
-*/
+
+		if (!stream.hasMore())
+		{
+			throw new WicketRuntimeException("Markup for component border " + getClass().getName()
+					+ " ended prematurely, was expecting </wicket:border>");
+		}
 	}
 
 	/**
 	 * 
-	 * @see wicket.IComponentBorder#renderBefore(wicket.Component)
+	 * @see wicket.IComponentBorder#renderAfter(wicket.Component)
 	 */
-	public void renderBefore(Component component)
+	public void renderAfter(Component component)
 	{
-		final String extension;
-		if (component instanceof MarkupContainer)
-		{
-			extension = ((MarkupContainer)component).getMarkupType();
-		}
-		else
-		{
-			extension = component.getParent().getMarkupId();
-		}
-/*		
-		MarkupFragment markupFragment = findMarkup(extension);
-		MarkupFragment childFragment = markupFragment.getWicketFragment(Border.BORDER, true);
-		
-		List allElementsFlat = childFragment.getAllElementsFlat();
-		Response response = component.getResponse();
-		
-		for (MarkupElement markupElement : allElementsFlat)
+		final MarkupStream stream = getMarkupStream(component);
+		final Response response = component.getResponse();
+
+		boolean insideBorderMarkup = false;
+		boolean complete = false;
+		while (stream.hasMore())
 		{
-			if (markupElement instanceof ComponentTag)
+			MarkupElement e = stream.next();
+			if (e instanceof WicketTag)
 			{
-				ComponentTag ct = (ComponentTag)markupElement;
-				if (ct.isWicketBodyTag())
+				WicketTag wt = (WicketTag)e;
+				if (!insideBorderMarkup)
 				{
-					break;
+					if (wt.isBodyTag() && (wt.isClose() || wt.isOpenClose()))
+					{
+						insideBorderMarkup = true;
+					}
+					else if (!(wt.isBorderTag() && wt.isOpen() || wt.isBodyTag()))
+					{
+						throw new WicketRuntimeException(
+								"Unexpected tag encountered in markup of component border "
+										+ getClass().getName() + ". Tag: " + wt.toString()
+										+ ", expected tag: <wicket:border> or <wicket:body>");
+					}
 				}
-				else if (ct.isBorderTag())
+				else
 				{
-					continue;
+					if (wt.isBorderTag() && wt.isClose())
+					{
+						complete = true;
+						break;
+					}
+					else
+					{
+						throw new WicketRuntimeException(
+								"Unexpected tag encountered in markup of component border "
+										+ getClass().getName() + ". Tag: " + wt.toString()
+										+ ", expected tag: </wicket:border>");
+					}
 				}
 			}
-			response.write(markupElement.toCharSequence());
+			if (insideBorderMarkup)
+			{
+				response.write(e.toCharSequence());
+			}
+		}
+		if (!complete)
+		{
+			throw new WicketRuntimeException(
+					"Missing </wicket:border> tag in markup of markup component border: "
+							+ getClass().getName());
 		}
-*/
 	}
 
-	/**
-	 * 
-	 * @param extension
-	 * @return MarkupFragment
-	 */
-	private MarkupFragment findMarkup(final String extension)
+	private MarkupStream getMarkupStream(Component component)
 	{
-/*
+		if (markupStream == null)
+		{
+			markupStream = findMarkupStream(component);
+		}
+		return markupStream;
+	}
+
+	private MarkupStream findMarkupStream(Component owner)
+	{
+		// TODO we should open up the api to do this for any class
+		// not just a
+		// MarkupContainer so all this logic does not have to be duplicated here
+		final String markupType = getMarkupType(owner);
+
 		// Get locator to search for the resource
-		final IResourceStreamFactory locator = Application.get().getResourceSettings()
-				.getResourceStreamFactory();
+		final IResourceStreamLocator locator = Application.get().getResourceSettings()
+				.getResourceStreamLocator();
+
 
 		final Session session = Session.get();
 		final String style = session.getStyle();
@@ -141,37 +203,58 @@
 		MarkupResourceStream markupResourceStream = null;
 		Class containerClass = getClass();
 
-		while (containerClass != MarkupComponentBorder.class)
+		while (!(containerClass.equals(MarkupComponentBorder.class)))
 		{
 			String path = containerClass.getName().replace('.', '/');
-			IResourceStream resourceStream = locator.newResourceStream(containerClass, path, style, locale,
-					extension);
+			IResourceStream resourceStream = locator.locate(containerClass, path, style, locale,
+					markupType);
 
 			// Did we find it already?
 			if (resourceStream != null)
 			{
 				ContainerInfo ci = new ContainerInfo(containerClass, locale, style, null,
-						extension, null);
+						markupType);
 				markupResourceStream = new MarkupResourceStream(resourceStream, ci, containerClass);
+
+				break; // TODO jcompagner: was this break missing here on
+				// purpose?
 			}
 
 			// Walk up the class hierarchy one level, if markup has not
 			// yet been found
 			containerClass = containerClass.getSuperclass();
 		}
-		MarkupFragment markup;
+
+		if (markupResourceStream == null)
+		{
+			throw new WicketRuntimeException("Could not find markup for component border `"
+					+ getClass().getName() + "`");
+		}
+
 		try
 		{
-			markup = Application.get().getMarkupSettings().getMarkupParserFactory()
-					.newMarkupParser(markupResourceStream).readAndParse();
+			Markup markup = Application.get().getMarkupSettings().getMarkupParserFactory()
+					.newMarkupParser().readAndParse(markupResourceStream);
+			return new MarkupStream(markup);
 		}
 		catch (Exception e)
 		{
-			throw new WicketRuntimeException(e);
+			throw new WicketRuntimeException("Could not parse markup from markup resource stream: "
+					+ markupResourceStream.toString());
 		}
+	}
 
-		return markup;
-*/
-		return null;
+	private String getMarkupType(Component component)
+	{
+		String extension;
+		if (component instanceof MarkupContainer)
+		{
+			extension = ((MarkupContainer)component).getMarkupType();
+		}
+		else
+		{
+			extension = component.getParent().getMarkupId();
+		}
+		return extension;
 	}
 }