You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by gs...@apache.org on 2008/03/28 00:53:27 UTC

svn commit: r642034 - in /wicket/trunk/jdk-1.4/wicket-velocity/src: main/java/org/apache/wicket/velocity/markup/html/VelocityPanel.java test/java/org/apache/wicket/contrib/markup/html/velocity/VelocityWithMarkupParsingPage.java

Author: gseitz
Date: Thu Mar 27 16:53:24 2008
New Revision: 642034

URL: http://svn.apache.org/viewvc?rev=642034&view=rev
Log:
WICKET-1268

Modified:
    wicket/trunk/jdk-1.4/wicket-velocity/src/main/java/org/apache/wicket/velocity/markup/html/VelocityPanel.java
    wicket/trunk/jdk-1.4/wicket-velocity/src/test/java/org/apache/wicket/contrib/markup/html/velocity/VelocityWithMarkupParsingPage.java

Modified: wicket/trunk/jdk-1.4/wicket-velocity/src/main/java/org/apache/wicket/velocity/markup/html/VelocityPanel.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket-velocity/src/main/java/org/apache/wicket/velocity/markup/html/VelocityPanel.java?rev=642034&r1=642033&r2=642034&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket-velocity/src/main/java/org/apache/wicket/velocity/markup/html/VelocityPanel.java (original)
+++ wicket/trunk/jdk-1.4/wicket-velocity/src/main/java/org/apache/wicket/velocity/markup/html/VelocityPanel.java Thu Mar 27 16:53:24 2008
@@ -67,7 +67,7 @@
 	 *            optional model for variable substituation.
 	 * @param templateResource
 	 *            The template resource
-	 * @return
+	 * @return an instance of {@link VelocityPanel}
 	 */
 	public static VelocityPanel forTemplateResource(String id, IModel model,
 			final IStringResourceStream templateResource)
@@ -87,6 +87,23 @@
 	}
 
 	/**
+	 * Is used to cache the evaluated template and is nulled in onDetach().
+	 */
+	private transient String evaluatedTemplate;
+
+	/**
+	 * Is used to store the markupStream parameter in onComponentTagBody and is nulled in
+	 * onDetach().
+	 */
+	private transient MarkupStream currentMarkupStream;
+
+	/**
+	 * Is used to store the markupStream parameter in onComponentTagBody and is nulled in
+	 * onDetach().
+	 */
+	private transient ComponentTag currentOpenTag;
+
+	/**
 	 * Construct.
 	 * 
 	 * @param id
@@ -173,9 +190,44 @@
 	 */
 	protected void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag)
 	{
+		currentMarkupStream = markupStream;
+		currentOpenTag = openTag;
+
 		final Reader templateReader = getTemplateReader();
 		if (templateReader != null)
 		{
+			String result = evaluateVelocityTemplate(templateReader);
+			if (!parseGeneratedMarkup())
+			{
+				// now replace the body of the tag with the velocity merge
+				// result
+				replaceComponentTagBody(markupStream, openTag, result);
+			}
+			else
+			{
+				Markup markup = getMarkup(result);
+				markupStream.skipRawMarkup();
+				renderAll(new MarkupStream(markup));
+			}
+		}
+		else
+		{
+			replaceComponentTagBody(markupStream, openTag, ""); // just empty it
+		}
+	}
+
+
+	/**
+	 * Evaluates the template and returns the result.
+	 * 
+	 * @param templateReader
+	 *            used to read the template
+	 * @return the result of evaluating the velocity template
+	 */
+	private String evaluateVelocityTemplate(Reader templateReader)
+	{
+		if (evaluatedTemplate == null)
+		{
 			// Get model as a map
 			final Map map = (Map)getModelObject();
 
@@ -202,53 +254,62 @@
 					// does not break the rest of the page
 					result = Strings.escapeMarkup(result).toString();
 				}
-
-				if (!parseGeneratedMarkup())
-				{
-					// now replace the body of the tag with the velocity merge
-					// result
-					replaceComponentTagBody(markupStream, openTag, result);
-				}
-				else
-				{
-					// now parse the velocity merge result
-					Markup markup;
-					try
-					{
-						MarkupParser parser = getApplication().getMarkupSettings()
-								.getMarkupParserFactory().newMarkupParser(
-										new MarkupResourceStream(new StringResourceStream(result)));
-						markup = parser.parse();
-					}
-					catch (ResourceStreamNotFoundException e)
-					{
-						throw new RuntimeException("Could not parse resulting markup", e);
-					}
-					markupStream.skipRawMarkup();
-					renderAll(new MarkupStream(markup));
-				}
+				evaluatedTemplate = result;
+				return evaluatedTemplate;
+			}
+			catch (IOException e)
+			{
+				onException(e, currentMarkupStream, currentOpenTag);
 			}
 			catch (ParseErrorException e)
 			{
-				onException(e, markupStream, openTag);
+				onException(e, currentMarkupStream, currentOpenTag);
 			}
 			catch (MethodInvocationException e)
 			{
-				onException(e, markupStream, openTag);
+				onException(e, currentMarkupStream, currentOpenTag);
 			}
 			catch (ResourceNotFoundException e)
 			{
-				onException(e, markupStream, openTag);
-			}
-			catch (IOException e)
-			{
-				onException(e, markupStream, openTag);
+				onException(e, currentMarkupStream, currentOpenTag);
 			}
+			return "";
 		}
 		else
 		{
-			replaceComponentTagBody(markupStream, openTag, ""); // just empty it
+			return evaluatedTemplate;
+		}
+	}
+
+	/**
+	 * @param evaluatedTemplate
+	 *            the evaluated velocity template
+	 * @return the {@link Markup} of the param <code>evaluatedTemplate</code>
+	 */
+	private Markup getMarkup(String evaluatedTemplate)
+	{
+		if (!parseGeneratedMarkup())
+		{
+			return Markup.NO_MARKUP;
+		}
+		// now parse the velocity merge result
+		Markup markup = null;
+		try
+		{
+			MarkupParser parser = getApplication().getMarkupSettings().getMarkupParserFactory()
+					.newMarkupParser(
+							new MarkupResourceStream(new StringResourceStream(evaluatedTemplate)));
+			markup = parser.parse();
+		}
+		catch (ResourceStreamNotFoundException e)
+		{
+			throw new RuntimeException("Could not parse resulting markup", e);
+		}
+		catch (IOException e)
+		{
+			onException(e, currentMarkupStream, currentOpenTag);
 		}
+		return markup;
 	}
 
 	/**
@@ -278,5 +339,37 @@
 	protected boolean throwVelocityExceptions()
 	{
 		return false;
+	}
+
+	/**
+	 * @see org.apache.wicket.MarkupContainer#getAssociatedMarkupStream(boolean)
+	 */
+	public MarkupStream getAssociatedMarkupStream(boolean throwException)
+	{
+		Reader reader = getTemplateReader();
+		if (reader == null)
+		{
+			throw new WicketRuntimeException("could not find velocity template for panel: " + this);
+		}
+
+		// evaluate the template and return a new markupstream
+		String result = evaluateVelocityTemplate(reader);
+		return new MarkupStream(getMarkup(result));
+	}
+
+	/**
+	 * @see org.apache.wicket.MarkupContainer#hasAssociatedMarkup()
+	 */
+	public boolean hasAssociatedMarkup()
+	{
+		return true;
+	}
+
+	protected void onDetach()
+	{
+		super.onDetach();
+		evaluatedTemplate = null;
+		currentMarkupStream = null;
+		currentOpenTag = null;
 	}
 }

Modified: wicket/trunk/jdk-1.4/wicket-velocity/src/test/java/org/apache/wicket/contrib/markup/html/velocity/VelocityWithMarkupParsingPage.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket-velocity/src/test/java/org/apache/wicket/contrib/markup/html/velocity/VelocityWithMarkupParsingPage.java?rev=642034&r1=642033&r2=642034&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket-velocity/src/test/java/org/apache/wicket/contrib/markup/html/velocity/VelocityWithMarkupParsingPage.java (original)
+++ wicket/trunk/jdk-1.4/wicket-velocity/src/test/java/org/apache/wicket/contrib/markup/html/velocity/VelocityWithMarkupParsingPage.java Thu Mar 27 16:53:24 2008
@@ -18,6 +18,7 @@
 
 import java.util.HashMap;
 
+import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.Model;
@@ -27,7 +28,7 @@
 
 /**
  * Test page for <code>VelocityPanel</code>
- * 
+ *
  * @see org.apache.wicket.velocity.markup.html.VelocityPanel
  */
 public class VelocityWithMarkupParsingPage extends WebPage
@@ -43,7 +44,7 @@
 		{
 			protected IStringResourceStream getTemplateResource()
 			{
-				return new UrlResourceStream(this.getClass().getResource("testWithMarkup.html"));
+				return new UrlResourceStream(getClass().getResource("testWithMarkup.html"));
 			}
 
 			public boolean parseGeneratedMarkup()
@@ -51,7 +52,15 @@
 				return true;
 			}
 		};
-		velocityPanel.add(new Label("message", VelocityPage.TEST_STRING));
+		velocityPanel.add(new Label("message", VelocityPage.TEST_STRING)
+		{
+			protected void onComponentTag(ComponentTag tag)
+			{
+				super.onComponentTag(tag);
+				// check whether the markupstream can be located
+				getMarkupAttributes();
+			}
+		});
 		add(velocityPanel);
 	}
 }