aboutsummaryrefslogtreecommitdiffstats
path: root/server/src/main/java/com/vaadin/util
diff options
context:
space:
mode:
authorTeemu Suo-Anttila <tsuoanttila@users.noreply.github.com>2017-02-22 11:35:19 +0200
committerPekka Hyvönen <pekka@vaadin.com>2017-02-22 11:35:19 +0200
commitca1bfa7511e35fad802271604158afd7be6531d0 (patch)
treef0c68b320cff5051a4a8dc4d5827f55276b1d73c /server/src/main/java/com/vaadin/util
parente76d2e8953e8bfb80018019dc5497e7760313403 (diff)
downloadvaadin-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.java71
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);
+ }
+ }
+
+}