Repository: wicket Updated Branches: refs/heads/master b8d6c23c6 -> bec52515f
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/bec52515 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/bec52515 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/bec52515 Branch: refs/heads/master Commit: bec52515f1bb2570f09140ba6f457c369f3a56b1 Parents: b8d6c23 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:46 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/bec52515/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/bec52515/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/bec52515/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 3821750..58475d4 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 @@ -1311,10 +1311,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
