--- /dev/null
+/*******************************************************************************
+ * Copyright © Igor Barma, Alexandre Desoubeaux, Christian Martel, Eric Brun, Mathieu Amblard, Gwenael Gevet, Pierre Guillot, 2012
+ *
+ * This file is part of the work and learning management system Pentila Nero.
+ *
+ * Pentila Nero is free software. You can redistribute it and/or modify since
+ * you respect the terms of either (at least one of the both license) :
+ * - under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ * - the CeCILL-C as published by CeCILL-C; either version 1 of the
+ * License, or any later version
+ * - the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the license,
+ * or (at your option) any later version.
+ *
+ * There are special exceptions to the terms and conditions of the
+ * licenses as they are applied to this software. View the full text of
+ * the exception in file LICENSE-PROJECT.txt in the directory of this software
+ * distribution.
+ *
+ * Pentila Nero is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * Licenses for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * and the CeCILL-C and the GNU Lesser General Public License along with
+ * Pentila Nero. If not, see :
+ * <http://www.gnu.org/licenses/> and
+ * <http://www.cecill.info/licences.fr.html>.
+ ******************************************************************************/
+package com.pentila.entSavoie.utils;
+
+import java.io.UnsupportedEncodingException;
+
+public class URIFormat {
+
+ public static final String ALLOWED_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!~*'()";
+
+ public static String encodeURIComponent(String input) {
+ if(input.isEmpty()) {
+ return input;
+ }
+
+ int l = input.length();
+ StringBuilder o = new StringBuilder(l * 3);
+ try {
+ for (int i = 0; i < l; i++) {
+ String e = input.substring(i, i + 1);
+ if (ALLOWED_CHARS.indexOf(e) == -1) {
+ byte[] b = e.getBytes("utf-8");
+ o.append(getHex(b));
+ continue;
+ }
+ o.append(e);
+ }
+ return o.toString();
+ } catch(UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ return input;
+ }
+
+ private static String getHex(byte buf[]) {
+ StringBuilder o = new StringBuilder(buf.length * 3);
+ for (int i = 0; i < buf.length; i++) {
+ int n = (int) buf[i] & 0xff;
+ o.append("%");
+ if (n < 0x10) {
+ o.append("0");
+ }
+ o.append(Long.toString(n, 16).toUpperCase());
+ }
+ return o.toString();
+ }
+
+ public static String decodeURIComponent(String encodedURI) {
+ char actualChar;
+
+ StringBuffer buffer = new StringBuffer();
+
+ int bytePattern, sumb = 0;
+
+ for (int i = 0, more = -1; i < encodedURI.length(); i++) {
+ actualChar = encodedURI.charAt(i);
+
+ switch (actualChar) {
+ case '%': {
+ actualChar = encodedURI.charAt(++i);
+ int hb = (Character.isDigit(actualChar) ? actualChar - '0'
+ : 10 + Character.toLowerCase(actualChar) - 'a') & 0xF;
+ actualChar = encodedURI.charAt(++i);
+ int lb = (Character.isDigit(actualChar) ? actualChar - '0'
+ : 10 + Character.toLowerCase(actualChar) - 'a') & 0xF;
+ bytePattern = (hb << 4) | lb;
+ break;
+ }
+ case '+': {
+ bytePattern = ' ';
+ break;
+ }
+ default: {
+ bytePattern = actualChar;
+ }
+ }
+
+ if ((bytePattern & 0xc0) == 0x80) { // 10xxxxxx
+ sumb = (sumb << 6) | (bytePattern & 0x3f);
+ if (--more == 0)
+ buffer.append((char) sumb);
+ } else if ((bytePattern & 0x80) == 0x00) { // 0xxxxxxx
+ buffer.append((char) bytePattern);
+ } else if ((bytePattern & 0xe0) == 0xc0) { // 110xxxxx
+ sumb = bytePattern & 0x1f;
+ more = 1;
+ } else if ((bytePattern & 0xf0) == 0xe0) { // 1110xxxx
+ sumb = bytePattern & 0x0f;
+ more = 2;
+ } else if ((bytePattern & 0xf8) == 0xf0) { // 11110xxx
+ sumb = bytePattern & 0x07;
+ more = 3;
+ } else if ((bytePattern & 0xfc) == 0xf8) { // 111110xx
+ sumb = bytePattern & 0x03;
+ more = 4;
+ } else { // 1111110x
+ sumb = bytePattern & 0x01;
+ more = 5;
+ }
+ }
+ return buffer.toString();
+ }
+
+}