You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2010/03/17 00:49:41 UTC
svn commit: r924061 - in /tapestry/tapestry5/trunk/tapestry-core/src:
main/java/org/apache/tapestry5/internal/services/
main/java/org/apache/tapestry5/internal/services/messages/
main/java/org/apache/tapestry5/services/ main/java/org/apache/tapestry5/s...
Author: hlship
Date: Tue Mar 16 23:49:40 2010
New Revision: 924061
URL: http://svn.apache.org/viewvc?rev=924061&view=rev
Log:
TAP5-1055: Add a service used to read a properties file, used by MessagesSource
Added:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/messages/
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/messages/PropertiesFileParserImpl.java (with props)
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/messages/
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/messages/PropertiesFileParser.java (with props)
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/messages/
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/messages/PropertiesFileParserImplTest.java (with props)
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/messages/
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/messages/utf8.properties (contents, props changed)
- copied, changed from r924060, tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/utf8.properties
Removed:
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/MessagesSourceImplTest.java
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/utf8.properties
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MessagesSourceImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImplTest.java
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImplTest.java
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImpl.java?rev=924061&r1=924060&r2=924061&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImpl.java Tue Mar 16 23:49:40 2010
@@ -1,10 +1,10 @@
-// Copyright 2006, 2007, 2008, 2009 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2009, 2010 The Apache Software Foundation
//
// Licensed 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
+// 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,
@@ -23,6 +23,7 @@ import org.apache.tapestry5.ioc.services
import org.apache.tapestry5.model.ComponentModel;
import org.apache.tapestry5.services.InvalidationEventHub;
import org.apache.tapestry5.services.UpdateListener;
+import org.apache.tapestry5.services.messages.PropertiesFileParser;
import java.util.Locale;
@@ -58,26 +59,28 @@ public class ComponentMessagesSourceImpl
{
ComponentModel parentModel = model.getParentModel();
- if (parentModel == null) return rootBundle;
+ if (parentModel == null)
+ return rootBundle;
return new ComponentModelBundle(parentModel, rootBundle);
}
}
- public ComponentMessagesSourceImpl(
- @Symbol(SymbolConstants.APPLICATION_CATALOG)
- Resource appCatalogResource,
+ public ComponentMessagesSourceImpl(@Symbol(SymbolConstants.APPLICATION_CATALOG)
+ Resource appCatalogResource,
- ClasspathURLConverter classpathURLConverter)
+ PropertiesFileParser parser,
+
+ ClasspathURLConverter classpathURLConverter)
{
- this(appCatalogResource, new URLChangeTracker(classpathURLConverter));
+ this(appCatalogResource, parser, new URLChangeTracker(classpathURLConverter));
}
- ComponentMessagesSourceImpl(Resource appCatalogResource, URLChangeTracker tracker)
+ ComponentMessagesSourceImpl(Resource appCatalogResource, PropertiesFileParser parser, URLChangeTracker tracker)
{
this.appCatalogResource = appCatalogResource;
- messagesSource = new MessagesSourceImpl(tracker);
+ messagesSource = new MessagesSourceImpl(tracker, parser);
}
public void checkForUpdates()
@@ -89,8 +92,7 @@ public class ComponentMessagesSourceImpl
{
// If the application catalog exists, set it up as the root, otherwise use null.
- MessagesBundle appCatalogBundle = !appCatalogResource.exists() ? null
- : rootBundle();
+ MessagesBundle appCatalogBundle = !appCatalogResource.exists() ? null : rootBundle();
MessagesBundle bundle = new ComponentModelBundle(componentModel, appCatalogBundle);
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MessagesSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MessagesSourceImpl.java?rev=924061&r1=924060&r2=924061&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MessagesSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MessagesSourceImpl.java Tue Mar 16 23:49:40 2010
@@ -1,10 +1,10 @@
-// Copyright 2006, 2007, 2008 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2010 The Apache Software Foundation
//
// Licensed 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
+// 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,
@@ -14,22 +14,25 @@
package org.apache.tapestry5.internal.services;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
import org.apache.tapestry5.internal.event.InvalidationEventHubImpl;
import org.apache.tapestry5.internal.util.MultiKey;
import org.apache.tapestry5.internal.util.URLChangeTracker;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.Resource;
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
-import org.apache.tapestry5.ioc.internal.util.InternalUtils;
import org.apache.tapestry5.ioc.internal.util.LocalizedNameGenerator;
-
-import java.io.*;
-import java.util.*;
+import org.apache.tapestry5.services.messages.PropertiesFileParser;
/**
* A utility class that encapsulates all the logic for reading properties files and assembling {@link Messages} from
- * them, in accordance with extension rules and locale. This represents code that was refactored out of {@link
- * ComponentMessagesSourceImpl}. This class can be used as a base class, though the existing code base uses it as a
+ * them, in accordance with extension rules and locale. This represents code that was refactored out of
+ * {@link ComponentMessagesSourceImpl}. This class can be used as a base class, though the existing code base uses it as
+ * a
* utility. Composition trumps inheritance!
* <p/>
* The message catalog for a component is the combination of all appropriate properties files for the component, plus
@@ -43,13 +46,15 @@ public class MessagesSourceImpl extends
{
private final URLChangeTracker tracker;
+ private final PropertiesFileParser propertiesFileParser;
+
/**
* Keyed on bundle id and locale.
*/
private final Map<MultiKey, Messages> messagesByBundleIdAndLocale = CollectionFactory.newConcurrentMap();
/**
- * Keyed on bundle id and locale, the coooked properties include properties inherited from less locale-specific
+ * Keyed on bundle id and locale, the cooked properties include properties inherited from less locale-specific
* properties files, or inherited from parent bundles.
*/
private final Map<MultiKey, Map<String, String>> cookedProperties = CollectionFactory.newConcurrentMap();
@@ -61,19 +66,10 @@ public class MessagesSourceImpl extends
private final Map<String, String> emptyMap = Collections.emptyMap();
- /**
- * Charset used when reading a properties file.
- */
- private static final String CHARSET = "UTF-8";
-
- /**
- * Buffer size used when reading a properties file.
- */
- private static final int BUFFER_SIZE = 2000;
-
- public MessagesSourceImpl(URLChangeTracker tracker)
+ public MessagesSourceImpl(URLChangeTracker tracker, PropertiesFileParser propertiesFileParser)
{
this.tracker = tracker;
+ this.propertiesFileParser = propertiesFileParser;
}
public void checkForUpdates()
@@ -119,13 +115,15 @@ public class MessagesSourceImpl extends
*/
private Map<String, String> findBundleProperties(MessagesBundle bundle, Locale locale)
{
- if (bundle == null) return emptyMap;
+ if (bundle == null)
+ return emptyMap;
MultiKey key = new MultiKey(bundle.getId(), locale);
Map<String, String> existing = cookedProperties.get(key);
- if (existing != null) return existing;
+ if (existing != null)
+ return existing;
// What would be cool is if we could maintain a cache of bundle id + locale -->
// Resource. That would optimize quite a bit of this; may need to use an alternative to
@@ -172,7 +170,8 @@ public class MessagesSourceImpl extends
*/
private Map<String, String> extend(Map<String, String> base, Map<String, String> rawProperties)
{
- if (rawProperties.isEmpty()) return base;
+ if (rawProperties.isEmpty())
+ return base;
// Make a copy of the base Map
@@ -204,13 +203,14 @@ public class MessagesSourceImpl extends
*/
private Map<String, String> readProperties(Resource resource)
{
- if (!resource.exists()) return emptyMap;
+ if (!resource.exists())
+ return emptyMap;
tracker.add(resource.toURL());
try
{
- return readPropertiesFromStream(resource.openStream());
+ return propertiesFileParser.parsePropertiesFile(resource);
}
catch (Exception ex)
{
@@ -218,80 +218,4 @@ public class MessagesSourceImpl extends
}
}
- static Map<String, String> readPropertiesFromStream(InputStream propertiesFileStream) throws IOException
- {
- Map<String, String> result = CollectionFactory.newCaseInsensitiveMap();
-
- Properties p = new Properties();
- InputStream is = null;
-
- try
- {
-
- is = readUTFStreamToEscapedASCII(propertiesFileStream);
-
- // Ok, now we have the content read into memory as UTF-8, not ASCII.
-
- p.load(is);
-
- is.close();
-
- is = null;
- }
- finally
- {
- InternalUtils.close(is);
- }
-
- for (Map.Entry e : p.entrySet())
- {
- String key = e.getKey().toString();
-
- String value = p.getProperty(key);
-
- result.put(key, value);
- }
-
- return result;
- }
-
-
- /**
- * Reads a UTF-8 stream, performing a conversion to ASCII (i.e., ISO8859-1 encoding). Characters outside the normal
- * range for ISO8859-1 are converted to unicode escapes. In effect, Tapestry is performing native2ascii on the
- * files, on the fly.
- */
- private static InputStream readUTFStreamToEscapedASCII(InputStream is) throws IOException
- {
- Reader reader = new InputStreamReader(is, CHARSET);
-
- StringBuilder builder = new StringBuilder(BUFFER_SIZE);
- char[] buffer = new char[BUFFER_SIZE];
-
- while (true)
- {
- int length = reader.read(buffer);
-
- if (length < 0) break;
-
- for (int i = 0; i < length; i++)
- {
- char ch = buffer[i];
-
- if (ch <= '\u007f')
- {
- builder.append(ch);
- continue;
- }
-
- builder.append(String.format("\\u%04x", (int) ch));
- }
- }
-
- reader.close();
-
- byte[] resourceContent = builder.toString().getBytes();
-
- return new ByteArrayInputStream(resourceContent);
- }
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java?rev=924061&r1=924060&r2=924061&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java Tue Mar 16 23:49:40 2010
@@ -4,7 +4,7 @@
// 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
+// 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,
@@ -22,6 +22,7 @@ import org.apache.tapestry5.ioc.internal
import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
import org.apache.tapestry5.services.UpdateListener;
import org.apache.tapestry5.services.ValidationMessagesSource;
+import org.apache.tapestry5.services.messages.PropertiesFileParser;
import java.util.List;
import java.util.Locale;
@@ -108,14 +109,16 @@ public class ValidationMessagesSourceImp
}
}
- public ValidationMessagesSourceImpl(List<String> bundles, Resource classpathRoot, ClasspathURLConverter classpathURLConverter)
+ public ValidationMessagesSourceImpl(List<String> bundles, Resource classpathRoot, PropertiesFileParser parser,
+ ClasspathURLConverter classpathURLConverter)
{
- this(bundles, classpathRoot, new URLChangeTracker(classpathURLConverter));
+ this(bundles, classpathRoot, parser, new URLChangeTracker(classpathURLConverter));
}
- ValidationMessagesSourceImpl(List<String> bundles, Resource classpathRoot, URLChangeTracker tracker)
+ ValidationMessagesSourceImpl(List<String> bundles, Resource classpathRoot, PropertiesFileParser parser,
+ URLChangeTracker tracker)
{
- messagesSource = new MessagesSourceImpl(tracker);
+ messagesSource = new MessagesSourceImpl(tracker, parser);
MessagesBundle parent = null;
Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/messages/PropertiesFileParserImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/messages/PropertiesFileParserImpl.java?rev=924061&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/messages/PropertiesFileParserImpl.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/messages/PropertiesFileParserImpl.java Tue Mar 16 23:49:40 2010
@@ -0,0 +1,118 @@
+// Copyright 2010 The Apache Software Foundation
+//
+// Licensed 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.tapestry5.internal.services.messages;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.tapestry5.ioc.Resource;
+import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry5.ioc.internal.util.InternalUtils;
+import org.apache.tapestry5.services.messages.PropertiesFileParser;
+
+public class PropertiesFileParserImpl implements PropertiesFileParser
+{
+ /**
+ * Charset used when reading a properties file.
+ */
+ private static final String CHARSET = "UTF-8";
+
+ /**
+ * Buffer size used when reading a properties file.
+ */
+ private static final int BUFFER_SIZE = 2000;
+
+ public Map<String, String> parsePropertiesFile(Resource resource) throws IOException
+ {
+ Map<String, String> result = CollectionFactory.newCaseInsensitiveMap();
+
+ Properties p = new Properties();
+ InputStream is = null;
+
+ try
+ {
+
+ is = readUTFStreamToEscapedASCII(resource.openStream());
+
+ // Ok, now we have the content read into memory as UTF-8, not ASCII.
+
+ p.load(is);
+
+ is.close();
+
+ is = null;
+ }
+ finally
+ {
+ InternalUtils.close(is);
+ }
+
+ for (Map.Entry e : p.entrySet())
+ {
+ String key = e.getKey().toString();
+
+ String value = p.getProperty(key);
+
+ result.put(key, value);
+ }
+
+ return result;
+ }
+
+ /**
+ * Reads a UTF-8 stream, performing a conversion to ASCII (i.e., ISO8859-1 encoding). Characters outside the normal
+ * range for ISO8859-1 are converted to unicode escapes. In effect, Tapestry is performing native2ascii on the
+ * files, on the fly.
+ */
+ private static InputStream readUTFStreamToEscapedASCII(InputStream is) throws IOException
+ {
+ Reader reader = new InputStreamReader(is, CHARSET);
+
+ StringBuilder builder = new StringBuilder(BUFFER_SIZE);
+ char[] buffer = new char[BUFFER_SIZE];
+
+ while (true)
+ {
+ int length = reader.read(buffer);
+
+ if (length < 0)
+ break;
+
+ for (int i = 0; i < length; i++)
+ {
+ char ch = buffer[i];
+
+ if (ch <= '\u007f')
+ {
+ builder.append(ch);
+ continue;
+ }
+
+ builder.append(String.format("\\u%04x", (int) ch));
+ }
+ }
+
+ reader.close();
+
+ byte[] resourceContent = builder.toString().getBytes();
+
+ return new ByteArrayInputStream(resourceContent);
+ }
+}
Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/messages/PropertiesFileParserImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=924061&r1=924060&r2=924061&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java Tue Mar 16 23:49:40 2010
@@ -74,6 +74,7 @@ import org.apache.tapestry5.internal.ren
import org.apache.tapestry5.internal.renderers.RequestRenderer;
import org.apache.tapestry5.internal.services.*;
import org.apache.tapestry5.internal.services.javascript.JavascriptSupportImpl;
+import org.apache.tapestry5.internal.services.messages.PropertiesFileParserImpl;
import org.apache.tapestry5.internal.transform.*;
import org.apache.tapestry5.internal.translator.NumericTranslator;
import org.apache.tapestry5.internal.translator.NumericTranslatorSupport;
@@ -99,6 +100,7 @@ import org.apache.tapestry5.runtime.Rend
import org.apache.tapestry5.runtime.RenderQueue;
import org.apache.tapestry5.services.ajax.MultiZoneUpdateEventResultProcessor;
import org.apache.tapestry5.services.javascript.JavascriptSupport;
+import org.apache.tapestry5.services.messages.PropertiesFileParser;
import org.apache.tapestry5.util.StringToEnumCoercion;
import org.apache.tapestry5.validator.Email;
import org.apache.tapestry5.validator.Max;
@@ -353,6 +355,7 @@ public final class TapestryModule
binder.bind(AssetPathAuthorizer.class, WhitelistAuthorizer.class).withId("WhitelistAuthorizer");
binder.bind(AssetPathAuthorizer.class, RegexAuthorizer.class).withId("RegexAuthorizer");
binder.bind(ValidatorMacro.class, ValidatorMacroImpl.class);
+ binder.bind(PropertiesFileParser.class, PropertiesFileParserImpl.class);
}
// ========================================================================
@@ -1271,10 +1274,12 @@ public final class TapestryModule
@ClasspathProvider
AssetFactory classpathAssetFactory,
+ PropertiesFileParser parser,
+
ClasspathURLConverter classpathURLConverter)
{
ValidationMessagesSourceImpl service = new ValidationMessagesSourceImpl(configuration, classpathAssetFactory
- .getRootResource(), classpathURLConverter);
+ .getRootResource(), parser, classpathURLConverter);
updateListenerHub.addUpdateListener(service);
return service;
Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/messages/PropertiesFileParser.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/messages/PropertiesFileParser.java?rev=924061&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/messages/PropertiesFileParser.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/messages/PropertiesFileParser.java Tue Mar 16 23:49:40 2010
@@ -0,0 +1,38 @@
+// Copyright 2010 The Apache Software Foundation
+//
+// Licensed 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.tapestry5.services.messages;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.tapestry5.ioc.Messages;
+import org.apache.tapestry5.ioc.Resource;
+import org.apache.tapestry5.ioc.util.CaseInsensitiveMap;
+
+/**
+ * Used when constructing a component's {@link Messages} object. Responsible for reading the
+ * contents of an individual {@link Resource}.
+ *
+ * @since 5.2.0
+ */
+public interface PropertiesFileParser
+{
+ /**
+ * Read the contents of the file (which is expected to exist) and return it as
+ * a Map of string keys and values (as {@link CaseInsensitiveMap} should be used. The implementation should not
+ * attempt to cache any values (caching occurs at a higher level, as does reload logic).
+ */
+ Map<String, String> parsePropertiesFile(Resource resource) throws IOException;
+}
Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/messages/PropertiesFileParser.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml?rev=924061&r1=924060&r2=924061&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml Tue Mar 16 23:49:40 2010
@@ -39,6 +39,7 @@
<package name="org.apache.tapestry5.internal.model"/>
<package name="org.apache.tapestry5.internal.pageload"/>
<package name="org.apache.tapestry5.internal.services"/>
+ <package name="org.apache.tapestry5.internal.services.messages"/>
<package name="org.apache.tapestry5.internal.structure"/>
<package name="org.apache.tapestry5.internal.test"/>
<package name="org.apache.tapestry5.internal.transform"/>
Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImplTest.java?rev=924061&r1=924060&r2=924061&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImplTest.java Tue Mar 16 23:49:40 2010
@@ -1,10 +1,10 @@
-// Copyright 2006, 2007, 2009 The Apache Software Foundation
+// Copyright 2006, 2007, 2009, 2010 The Apache Software Foundation
//
// Licensed 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
+// 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,
@@ -14,6 +14,9 @@
package org.apache.tapestry5.internal.services;
+import java.util.Locale;
+
+import org.apache.tapestry5.internal.services.messages.PropertiesFileParserImpl;
import org.apache.tapestry5.internal.test.InternalBaseTestCase;
import org.apache.tapestry5.internal.util.URLChangeTracker;
import org.apache.tapestry5.ioc.Messages;
@@ -24,13 +27,11 @@ import org.apache.tapestry5.ioc.services
import org.apache.tapestry5.model.ComponentModel;
import org.testng.annotations.Test;
-import java.util.Locale;
-
/**
* Tests {@link ComponentMessagesSourceImpl} as well as {@link MessagesSourceImpl} (which contains code refactored out
* of CMSI).
*/
-@Test(sequential = true)
+@Test
public class ComponentMessagesSourceImplTest extends InternalBaseTestCase
{
// With control of the tracker, we can force changes as if underlying files were changed.
@@ -44,8 +45,8 @@ public class ComponentMessagesSourceImpl
private final Resource simpleComponentResource = new ClasspathResource(
"org/apache/tapestry5/internal/services/SimpleComponent.class");
- private final ComponentMessagesSourceImpl source = new ComponentMessagesSourceImpl(
- simpleComponentResource.forFile("AppCatalog.properties"), tracker);
+ private final ComponentMessagesSourceImpl source = new ComponentMessagesSourceImpl(simpleComponentResource
+ .forFile("AppCatalog.properties"), new PropertiesFileParserImpl(), tracker);
@Test
public void simple_component()
@@ -145,9 +146,7 @@ public class ComponentMessagesSourceImpl
ComponentModel model = mockComponentModel();
ComponentModel parent = mockComponentModel();
- train_getComponentClassName(
- model,
- "org.apache.tapestry5.internal.services.SubclassComponent");
+ train_getComponentClassName(model, "org.apache.tapestry5.internal.services.SubclassComponent");
train_getBaseResource(model, new ClasspathResource(
"org/apache/tapestry5/internal/services/SubclassComponent.class"));
@@ -189,9 +188,7 @@ public class ComponentMessagesSourceImpl
ComponentModel model = mockComponentModel();
ComponentModel parent = mockComponentModel();
- train_getComponentClassName(
- model,
- "org.apache.tapestry5.internal.services.SubclassComponent");
+ train_getComponentClassName(model, "org.apache.tapestry5.internal.services.SubclassComponent");
train_getBaseResource(model, new ClasspathResource(
"org/apache/tapestry5/internal/services/SubclassComponent.class"));
@@ -208,8 +205,8 @@ public class ComponentMessagesSourceImpl
forceCacheClear();
- ComponentMessagesSource source = new ComponentMessagesSourceImpl(
- simpleComponentResource.forFile("NoSuchAppCatalog.properties"), converter);
+ ComponentMessagesSource source = new ComponentMessagesSourceImpl(simpleComponentResource
+ .forFile("NoSuchAppCatalog.properties"), new PropertiesFileParserImpl(), converter);
Messages messages = source.getMessages(model, Locale.ENGLISH);
Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImplTest.java?rev=924061&r1=924060&r2=924061&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImplTest.java Tue Mar 16 23:49:40 2010
@@ -1,10 +1,10 @@
-// Copyright 2006, 2008 The Apache Software Foundation
+// Copyright 2006, 2008, 2010 The Apache Software Foundation
//
// Licensed 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
+// 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,
@@ -14,6 +14,7 @@
package org.apache.tapestry5.internal.services;
+import org.apache.tapestry5.internal.services.messages.PropertiesFileParserImpl;
import org.apache.tapestry5.ioc.MessageFormatter;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.Resource;
@@ -35,10 +36,8 @@ public class ValidationMessagesSourceImp
public void setup()
{
Resource rootResource = new ClasspathResource("/");
- source = new ValidationMessagesSourceImpl(Arrays.asList(
- "org/apache/tapestry5/internal/ValidationMessages",
- "org/apache/tapestry5/internal/ValidationTestMessages"),
- rootResource,
+ source = new ValidationMessagesSourceImpl(Arrays.asList("org/apache/tapestry5/internal/ValidationMessages",
+ "org/apache/tapestry5/internal/ValidationTestMessages"), rootResource, new PropertiesFileParserImpl(),
new ClasspathURLConverterImpl());
}
@@ -47,12 +46,9 @@ public class ValidationMessagesSourceImp
{
Messages messages = source.getValidationMessages(Locale.ENGLISH);
- assertEquals(
- messages.format("required", "My Field"),
- "You must provide a value for My Field.");
+ assertEquals(messages.format("required", "My Field"), "You must provide a value for My Field.");
}
-
@Test
public void overriden_message()
{
@@ -74,9 +70,7 @@ public class ValidationMessagesSourceImp
{
Messages messages = source.getValidationMessages(Locale.ENGLISH);
- assertEquals(
- messages.get("contributed"),
- "This message was contributed inside ValidationTestMessages.");
+ assertEquals(messages.get("contributed"), "This message was contributed inside ValidationTestMessages.");
}
@Test
Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/messages/PropertiesFileParserImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/messages/PropertiesFileParserImplTest.java?rev=924061&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/messages/PropertiesFileParserImplTest.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/messages/PropertiesFileParserImplTest.java Tue Mar 16 23:49:40 2010
@@ -0,0 +1,39 @@
+// Copyright 2008, 2010 The Apache Software Foundation
+//
+// Licensed 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.tapestry5.internal.services.messages;
+
+import java.util.Map;
+
+import org.apache.tapestry5.internal.test.InternalBaseTestCase;
+import org.apache.tapestry5.ioc.Resource;
+import org.apache.tapestry5.ioc.internal.util.ClasspathResource;
+import org.apache.tapestry5.services.messages.PropertiesFileParser;
+import org.testng.annotations.Test;
+
+public class PropertiesFileParserImplTest extends InternalBaseTestCase
+{
+ @Test
+ public void read_utf() throws Exception
+ {
+ Resource utf8 = new ClasspathResource("org/apache/tapestry5/internal/services/messages/utf8.properties");
+
+ PropertiesFileParser parser = getService(PropertiesFileParser.class);
+
+ Map<String, String> properties = parser.parsePropertiesFile(utf8);
+
+ assertEquals(properties.get("tapestry"), "\u30bf\u30da\u30b9\u30c8\u30ea\u30fc");
+ assertEquals(properties.get("version"), "5");
+ }
+}
Propchange: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/messages/PropertiesFileParserImplTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Copied: tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/messages/utf8.properties (from r924060, tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/utf8.properties)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/messages/utf8.properties?p2=tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/messages/utf8.properties&p1=tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/utf8.properties&r1=924060&r2=924061&rev=924061&view=diff
==============================================================================
(empty)
Propchange: tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/messages/utf8.properties
------------------------------------------------------------------------------
svn:eol-style = native