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/09/07 08:20:46 UTC

svn commit: r573473 - in /wicket/trunk/jdk-1.4/wicket/src: main/java/org/apache/wicket/markup/resolver/WicketMessageResolver.java test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_7.html

Author: ivaynberg
Date: Thu Sep  6 23:20:45 2007
New Revision: 573473

URL: http://svn.apache.org/viewvc?rev=573473&view=rev
Log:
WICKET-936: Wicket:message texts do not change when session locale chages. http://issues.apache.org/jira/browse/WICKET-936

Modified:
    wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/resolver/WicketMessageResolver.java
    wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_7.html

Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/resolver/WicketMessageResolver.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/resolver/WicketMessageResolver.java?rev=573473&r1=573472&r2=573473&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/resolver/WicketMessageResolver.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/resolver/WicketMessageResolver.java Thu Sep  6 23:20:45 2007
@@ -16,25 +16,25 @@
  */
 package org.apache.wicket.markup.resolver;
 
-import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.markup.MarkupElement;
 import org.apache.wicket.markup.MarkupException;
 import org.apache.wicket.markup.MarkupStream;
+import org.apache.wicket.markup.RawMarkup;
 import org.apache.wicket.markup.WicketTag;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.WebComponent;
 import org.apache.wicket.markup.parser.XmlTag;
 import org.apache.wicket.markup.parser.filter.WicketTagIdentifier;
+import org.apache.wicket.model.Model;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
 /**
- * This is a tag resolver which handles <wicket:message
- * key="myKey">Default Text</wicket:message>. The resolver
- * will replace the whole tag with the message found in the properties file
- * associated with the Page. If no message is found, the default body text will
+ * This is a tag resolver which handles <wicket:message key="myKey">Default
+ * Text</wicket:message>. The resolver will replace the whole tag with the message found in
+ * the properties file associated with the Page. If no message is found, the default body text will
  * remain.
  * 
  * @author Juergen Donnerstag
@@ -43,6 +43,13 @@
 {
 	private static final Logger log = LoggerFactory.getLogger(WicketMessageResolver.class);
 
+	/**
+	 * If the key can't be resolved and the default is null, an exception will be thrown. Instead,
+	 * we default to a unique string and check against this later. Don't just use an empty string
+	 * here, as people might want to override wicket:messages to empty strings.
+	 */
+	private static final String DEFAULT_VALUE = "DEFAULT_WICKET_MESSAGE_RESOLVER_VALUE";
+
 	static
 	{
 		// register "wicket:message"
@@ -53,8 +60,7 @@
 	private static final long serialVersionUID = 1L;
 
 	/**
-	 * Try to resolve the tag, then create a component, add it to the container
-	 * and render it.
+	 * Try to resolve the tag, then create a component, add it to the container and render it.
 	 * 
 	 * @see org.apache.wicket.markup.resolver.IComponentResolver#resolve(MarkupContainer,
 	 *      MarkupStream, ComponentTag)
@@ -82,32 +88,11 @@
 							"Wrong format of <wicket:message key='xxx'>: attribute 'key' is missing");
 				}
 
-				// If the key can't be resolved and the default is null, an
-				// exception will be thrown. Instead, we default to a unique
-				// string and check against this later. Don't just use an empty
-				// string here, as people might want to override wicket:messages
-				// to empty strings.
-				final String defaultValue = "DEFAULT_WICKET_MESSAGE_RESOLVER_VALUE";
-				
-				final String value = container.getApplication().getResourceSettings()
-						.getLocalizer().getString(messageKey, container, defaultValue);
-
 				final String id = "_message_" + container.getPage().getAutoIndex();
-				Component component = null;
-				if (value != null && !defaultValue.equals(value))
-				{
-					component = new MyLabel(id, value.trim());
-				}
-				else
-				{
-					log.info("No value found for message key: " + messageKey);
-					component = new WebMarkupContainer(id);
-				}
-
-				component.setRenderBodyOnly(container.getApplication().getMarkupSettings()
+				MessageLabel label = new MessageLabel(id, messageKey);
+				label.setRenderBodyOnly(container.getApplication().getMarkupSettings()
 						.getStripWicketTags());
-
-				container.autoAdd(component, markupStream);
+				container.autoAdd(label, markupStream);
 
 				// Yes, we handled the tag
 				return true;
@@ -121,7 +106,7 @@
 	/**
 	 * A Label with expands open-close tags to open-body-close if required
 	 */
-	public static class MyLabel extends Label
+	public static class MessageLabel extends WebComponent
 	{
 		private static final long serialVersionUID = 1L;
 
@@ -129,22 +114,51 @@
 		 * Construct.
 		 * 
 		 * @param id
-		 * @param value
+		 * @param messageKey
 		 */
-		public MyLabel(final String id, final String value)
+		public MessageLabel(final String id, final String messageKey)
 		{
-			super(id, value);
+			super(id, new Model(messageKey));
 			setEscapeModelStrings(false);
 		}
 
+		protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag)
+		{
+			final String key = getModelObjectAsString();
+			final String value = getLocalizer().getString(key, this, DEFAULT_VALUE);
+			if (value != null && !DEFAULT_VALUE.equals(value))
+			{
+				replaceComponentTagBody(markupStream, openTag, value.trim());
+			}
+			else
+			{
+				log.debug("No value found for wicket:message tag with key: {}", key);
+
+				// get original tag from markup because we modified this one to always be open
+				markupStream.setCurrentIndex(markupStream.getCurrentIndex() - 1);
+				ComponentTag tag = markupStream.getTag();
+				markupStream.next();
+
+				// if the tag is of form <wicket:message>{foo}</wicket:message> use {foo} as
+				// default value for the message, otherwise do nothing
+				if (!tag.isOpenClose())
+				{
+					MarkupElement body = markupStream.get();
+					if (body instanceof RawMarkup)
+					{
+						replaceComponentTagBody(markupStream, openTag, body.toCharSequence());
+					}
+				}
+			}
+		}
+
 		/**
 		 * 
 		 * @see org.apache.wicket.Component#onComponentTag(org.apache.wicket.markup.ComponentTag)
 		 */
 		protected void onComponentTag(ComponentTag tag)
 		{
-			// Convert <wicket:message /> into
-			// <wicket:message>...</wicket:message>
+			// Convert <wicket:message /> into <wicket:message>...</wicket:message>
 			if (tag.isOpenClose())
 			{
 				tag.setType(XmlTag.OPEN);

Modified: wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_7.html
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_7.html?rev=573473&r1=573472&r2=573473&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_7.html (original)
+++ wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_7.html Thu Sep  6 23:20:45 2007
@@ -2,7 +2,7 @@
 <body>
   <wicket:message key="myKeyNotExsts">Default Text</wicket:message>
   <wicket:message key="myKey">myValue</wicket:message>
-  <wicket:message key="myKeyNotExsts"/>
+  <wicket:message key="myKeyNotExsts"></wicket:message>
   <wicket:message key="myKey">myValue</wicket:message>
   <span wicket:id="message">here it goes</span>
   <span attr-name="my i18n key" wicket:message="attr-name:i18n-key">test 2</span>