diff options
author | Teemu Suo-Anttila <tsuoanttila@users.noreply.github.com> | 2017-02-22 11:35:19 +0200 |
---|---|---|
committer | Pekka Hyvönen <pekka@vaadin.com> | 2017-02-22 11:35:19 +0200 |
commit | ca1bfa7511e35fad802271604158afd7be6531d0 (patch) | |
tree | f0c68b320cff5051a4a8dc4d5827f55276b1d73c /server/src/main/java/com/vaadin/util | |
parent | e76d2e8953e8bfb80018019dc5497e7760313403 (diff) | |
download | vaadin-framework-ca1bfa7511e35fad802271604158afd7be6531d0.tar.gz vaadin-framework-ca1bfa7511e35fad802271604158afd7be6531d0.zip |
Pick changes from 7.7.7 (#8577)
* Fix java packaging order (#106)
Closes vaadin/archetypes#113
* Use proper UTF-8 encoding for Content-Disposition filenames (#19527) (#6607)
* Enable changing the backing bean for BeanItem (#4302) (#77)
When storing a bean to the database, you typically get a new and updated
bean instance back. By allowing to change the bean instance, we make it
possible to just update the single BeanItem instance which can be used
in many places.
* Make AtmospherePushConnection methods public (#7973)
There is no sensible way to use a custom version of APC, so protected
access does not help in any way to access the underlying resource and/or
connected UI.
* Use correct indexes in multiselect checkboxes after removing rows (#8072)
Fixes #8011
* Fix removal of hidden Grid columns (#8071)
Fixes #8018
* Call error handler for exceptions in UI.init() (#8055)
Fixes #4995
* Render font icon correctly on the 'more' menu item (#8126)
* Render font icon correctly on the 'more' menu item
Fixes #8125
* Reopen Grid details on attach, fixes #8015 (#8074)
Fixes #8015
* Fix broken Grid tests after picking changes from 7.7.7
Removed duplicate setDetailsVisible calls from onDetach
* Correctly detach components in merged cells when a static row is removed (#8142)
Fixes #8140
Diffstat (limited to 'server/src/main/java/com/vaadin/util')
-rw-r--r-- | server/src/main/java/com/vaadin/util/EncodeUtil.java | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/server/src/main/java/com/vaadin/util/EncodeUtil.java b/server/src/main/java/com/vaadin/util/EncodeUtil.java new file mode 100644 index 0000000000..eae0890542 --- /dev/null +++ b/server/src/main/java/com/vaadin/util/EncodeUtil.java @@ -0,0 +1,71 @@ +/* + * Copyright 2000-2016 Vaadin Ltd. + * + * 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 com.vaadin.util; + +import java.nio.charset.Charset; + +/** + * Utilities related to various encoding schemes. + * + * @author Vaadin Ltd + * @since + */ +public final class EncodeUtil { + private static final Charset UTF8 = Charset.forName("UTF-8"); + + private EncodeUtil() { + // Static utils only + } + + /** + * Encodes the given string to UTF-8 <code>value-chars</code> as defined in + * RFC5987 for use in e.g. the <code>Content-Disposition</code> HTTP header. + * + * @param value + * the string to encode, not <code>null</code> + * @return the encoded string + */ + public static String rfc5987Encode(String value) { + StringBuilder builder = new StringBuilder(); + + for (int i = 0; i < value.length();) { + int cp = value.codePointAt(i); + if (cp < 127 && (Character.isLetterOrDigit(cp) || cp == '.')) { + builder.append((char) cp); + } else { + // Create string from a single code point + String cpAsString = new String(new int[] { cp }, 0, 1); + + appendHexBytes(builder, cpAsString.getBytes(UTF8)); + } + + // Advance to the next code point + i += Character.charCount(cp); + } + + return builder.toString(); + } + + private static void appendHexBytes(StringBuilder builder, byte[] bytes) { + for (byte byteValue : bytes) { + // mask with 0xFF to compensate for "negative" values + int intValue = byteValue & 0xFF; + String hexCode = Integer.toString(intValue, 16); + builder.append('%').append(hexCode); + } + } + +} |