Repository: wicket
Updated Branches:
  refs/heads/wicket-7.x 73ff3da38 -> d8c5ad387


WICKET-6227 CharSequenceResource calculates wrong length when there are unicode 
symbols


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/d8c5ad38
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/d8c5ad38
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/d8c5ad38

Branch: refs/heads/wicket-7.x
Commit: d8c5ad3871a7fb3ece7d087bb67738e393da3b7b
Parents: 73ff3da
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Tue Aug 16 14:11:36 2016 +0200
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Tue Aug 16 14:12:30 2016 +0200

----------------------------------------------------------------------
 .../request/resource/CharSequenceResource.java  | 29 ++++++++++-
 .../resource/CharSequenceResourceTest.java      | 53 ++++++++++++++++++++
 .../org/apache/wicket/util/string/Strings.java  |  5 +-
 3 files changed, 82 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/d8c5ad38/wicket-core/src/main/java/org/apache/wicket/request/resource/CharSequenceResource.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/request/resource/CharSequenceResource.java
 
b/wicket-core/src/main/java/org/apache/wicket/request/resource/CharSequenceResource.java
index eeb9055..f590289 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/request/resource/CharSequenceResource.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/request/resource/CharSequenceResource.java
@@ -16,7 +16,10 @@
  */
 package org.apache.wicket.request.resource;
 
+import java.nio.charset.Charset;
+
 import org.apache.wicket.request.Response;
+import org.apache.wicket.util.string.Strings;
 
 /**
  * An {@link org.apache.wicket.request.resource.IResource} for CharSequences.
@@ -27,6 +30,9 @@ public class CharSequenceResource extends 
BaseDataResource<CharSequence>
 {
        private static final long serialVersionUID = 1L;
 
+       /** Charset name for resource */
+       private String charsetName;
+
        /**
         * Creates a {@link 
org.apache.wicket.request.resource.CharSequenceResource} which will provide its 
data dynamically with
         * {@link 
#getData(org.apache.wicket.request.resource.IResource.Attributes)}
@@ -76,6 +82,27 @@ public class CharSequenceResource extends 
BaseDataResource<CharSequence>
        @Override
        protected Long getLength(CharSequence data)
        {
-               return (long) data.length();
+               return (long) Strings.lengthInBytes(data.toString(), 
getCharset());
+       }
+
+       /**
+        * @return Charset for resource
+        */
+       protected Charset getCharset()
+       {
+               return (charsetName != null) ? Charset.forName(charsetName) : 
null;
        }
+
+       /**
+        * Sets the character set used for reading this resource.
+        *
+        * @param charset
+        *            Charset for component
+        */
+       public void setCharset(final Charset charset)
+       {
+               // java.nio.Charset itself is not serializable so we can only 
store the name
+               charsetName = (charset != null) ? charset.name() : null;
+       }
+
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/d8c5ad38/wicket-core/src/test/java/org/apache/wicket/request/resource/CharSequenceResourceTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/request/resource/CharSequenceResourceTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/request/resource/CharSequenceResourceTest.java
new file mode 100644
index 0000000..0fdbb00
--- /dev/null
+++ 
b/wicket-core/src/test/java/org/apache/wicket/request/resource/CharSequenceResourceTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.request.resource;
+
+import static org.hamcrest.Matchers.is;
+
+import java.nio.charset.Charset;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests for {@link CharSequenceResource}
+ */
+public class CharSequenceResourceTest extends Assert
+{
+       @Test
+       public void getLength_whenNoUnicodeSymbols_thenReturnTheStringLength() 
throws Exception
+       {
+               CharSequenceResource resource = new 
CharSequenceResource("plain/text");
+               assertThat(resource.getLength("abcd"), is(4L));
+       }
+
+       @Test
+       public void 
getLength_UTF8_whenUnicodeSymbols_thenReturnTheBytesLength() throws Exception
+       {
+               CharSequenceResource resource = new 
CharSequenceResource("plain/text");
+               resource.setCharset(Charset.forName("UTF-8"));
+               assertThat(resource.getLength("a\u1234d"), is(5L));
+       }
+
+       @Test
+       public void 
getLength_UTF16_whenUnicodeSymbols_thenReturnTheBytesLength() throws Exception
+       {
+               CharSequenceResource resource = new 
CharSequenceResource("plain/text");
+               resource.setCharset(Charset.forName("UTF-16"));
+               assertThat(resource.getLength("a\u1234d"), is(8L));
+       }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/d8c5ad38/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java
----------------------------------------------------------------------
diff --git 
a/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java 
b/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java
index 01240a6..3c805a7 100755
--- a/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java
@@ -1317,10 +1317,7 @@ public final class Strings
         */
        public static int lengthInBytes(final String string, final Charset 
charset)
        {
-               if (string == null)
-               {
-                       throw new NullPointerException("Argument `string` 
cannot be null");
-               }
+               Args.notNull(string, "string");
                if (charset != null)
                {
                        try

Reply via email to