All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.abdera.i18n.text.UrlEncoding Maven / Gradle / Ivy

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  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.  For additional information regarding
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */
package org.apache.abdera.i18n.text;

import java.io.ByteArrayInputStream;
import java.io.FilterInputStream;
import java.io.FilterOutputStream;
import java.io.FilterReader;
import java.io.FilterWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.nio.CharBuffer;

/**
 *  Performs URL Percent Encoding
 *
 * @deprecated This API is deprecated as Apache Abdera is a retired project since 2017.
 */
@Deprecated(since = "2021-07-29")
public final class UrlEncoding {

    private static final String DEFAULT_ENCODING = "UTF-8";

    public final static char[] HEX = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

    private UrlEncoding() {
    }

    private static void encode(Appendable sb, byte... bytes) {
        encode(sb, 0, bytes.length, bytes);
    }

    private static void encode(Appendable sb, int offset, int length, byte... bytes) {
        try {
            for (int n = offset, i = 0; n < bytes.length && i < length; n++, i++) {
                byte c = bytes[n];
                sb.append("%");
                sb.append(HEX[(c >> 4) & 0x0f]);
                sb.append(HEX[(c >> 0) & 0x0f]);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static String encode(char... chars) {
        return encode(chars, 0, chars.length, DEFAULT_ENCODING, new Filter[0]);
    }

    public static String encode(char[] chars, Filter Filter) {
        return encode(chars, 0, chars.length, DEFAULT_ENCODING, new Filter[] { Filter });
    }

    public static String encode(char[] chars, Filter... filters) {
        return encode(chars, 0, chars.length, DEFAULT_ENCODING, filters);
    }

    public static String encode(char[] chars, String enc) {
        return encode(chars, 0, chars.length, enc, new Filter[0]);
    }

    public static String encode(char[] chars, String enc, Filter Filter) {
        return encode(chars, 0, chars.length, enc, new Filter[] { Filter });
    }

    public static String encode(char[] chars, String enc, Filter... filters) {
        return encode(chars, 0, chars.length, enc, filters);
    }

    public static String encode(char[] chars, int offset, int length) {
        return encode(chars, offset, length, DEFAULT_ENCODING, new Filter[0]);
    }

    public static String encode(char[] chars, int offset, int length, String enc) {
        return encode(chars, offset, length, enc, new Filter[0]);
    }

    public static String encode(char[] chars, int offset, int length, Filter Filter) {
        return encode(chars, offset, length, DEFAULT_ENCODING, new Filter[] { Filter });
    }

    public static String encode(char[] chars, int offset, int length, Filter... filters) {
        return encode(chars, offset, length, DEFAULT_ENCODING, filters);
    }

    public static String encode(char[] chars, int offset, int length, String enc, Filter Filter) {
        return encode(chars, offset, length, enc, new Filter[] { Filter });
    }

    public static String encode(char[] chars, int offset, int length, String enc, Filter... filters) {
        try {
            return encode((CharSequence) CharBuffer.wrap(chars, offset, length), enc, filters);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static String encode(InputStream in) throws IOException {
        StringBuilder buf = new StringBuilder();
        byte[] chunk = new byte[1024];
        int r = -1;
        while ((r = in.read(chunk)) > -1) encode(buf, 0, r, chunk);
        return buf.toString();
    }

    public static String encode(InputStream in, String charset) throws IOException {
        return encode(in, charset, DEFAULT_ENCODING, new Filter[0]);
    }

    public static String encode(InputStream in, String charset, Filter Filter) throws IOException {
        return encode(in, charset, DEFAULT_ENCODING, new Filter[] { Filter });
    }

    public static String encode(InputStream in, String charset, String enc) throws IOException {
        return encode(in, charset, enc, new Filter[0]);
    }

    public static String encode(InputStream in, String charset, String enc, Filter Filter) throws IOException {
        return encode(in, charset, enc, new Filter[] { Filter });
    }

    public static String encode(InputStream in, String charset, String enc, Filter... filters) throws IOException {
        return encode(new InputStreamReader(in, charset), enc, filters);
    }

    public static String encode(InputStream in, String charset, Filter... filters) throws IOException {
        return encode(new InputStreamReader(in, charset), DEFAULT_ENCODING, filters);
    }

    public static String encode(Reader reader) throws IOException {
        return encode(reader, DEFAULT_ENCODING, new Filter[0]);
    }

    public static String encode(Readable readable) throws IOException {
        return encode(readable, DEFAULT_ENCODING, new Filter[0]);
    }

    public static String encode(Reader reader, String enc) throws IOException {
        return encode(reader, enc, new Filter[0]);
    }

    public static String encode(Readable readable, String enc) throws IOException {
        return encode(readable, enc, new Filter[0]);
    }

    public static String encode(Reader reader, String enc, Filter Filter) throws IOException {
        return encode(reader, enc, new Filter[] { Filter });
    }

    public static String encode(Reader reader, Filter Filter) throws IOException {
        return encode(reader, DEFAULT_ENCODING, new Filter[] { Filter });
    }

    public static String encode(Reader reader, Filter... filters) throws IOException {
        return encode(reader, DEFAULT_ENCODING, filters);
    }

    public static String encode(Readable readable, String enc, Filter Filter) throws IOException {
        return encode(readable, enc, new Filter[] { Filter });
    }

    public static String encode(Readable readable, Filter Filter) throws IOException {
        return encode(readable, DEFAULT_ENCODING, new Filter[] { Filter });
    }

    public static String encode(Readable readable, Filter... filters) throws IOException {
        return encode(readable, DEFAULT_ENCODING, filters);
    }

    private static void processChars(StringBuilder sb, CharBuffer chars, String enc, Filter... filters) throws IOException {
        for (int n = 0; n < chars.length(); n++) {
            char c = chars.charAt(n);
            if (!CharUtils.isHighSurrogate(c) && check(c, filters)) {
                encode(sb, String.valueOf(c).getBytes(enc));
            } else if (CharUtils.isHighSurrogate(c)) {
                if (check(c, filters)) {
                    StringBuilder buf = new StringBuilder();
                    buf.append(c);
                    buf.append(chars.charAt(++n));
                    byte[] b = buf.toString().getBytes(enc);
                    encode(sb, b);
                } else {
                    sb.append(c);
                    sb.append(chars.charAt(++n));
                }
            } else {
                sb.append(c);
            }
        }
    }

    public static String encode(Readable readable, String enc, Filter... filters) throws IOException {
        StringBuilder sb = new StringBuilder();
        CharBuffer chars = CharBuffer.allocate(1024);
        while (readable.read(chars) > -1) {
            chars.flip();
            processChars(sb, chars, enc, filters);
        }
        return sb.toString();
    }

    public static String encode(Reader reader, String enc, Filter... filters) throws IOException {
        StringBuilder sb = new StringBuilder();
        char[] chunk = new char[1024];
        int r = -1;
        while ((r = reader.read(chunk)) > -1) processChars(sb, CharBuffer.wrap(chunk, 0, r), enc, filters);
        return sb.toString();
    }

    public static String encode(byte... bytes) {
        StringBuilder buf = new StringBuilder();
        encode(buf, bytes);
        return buf.toString();
    }

    public static String encode(byte[] bytes, int off, int len) {
        StringBuilder buf = new StringBuilder();
        encode(buf, off, len, bytes);
        return buf.toString();
    }

    public static String encode(CharSequence s) {
        return encode(s, Filter.NONOPFILTER);
    }

    public static String encode(CharSequence s, Filter Filter) {
        return encode(s, new Filter[] { Filter });
    }

    public static String encode(CharSequence s, Filter... filters) {
        try {
            if (s == null)
                return null;
            return encode(s, "utf-8", filters);
        } catch (UnsupportedEncodingException e) {
            // shouldn't happen
            return null;
        }
    }

    public static String encode(CharSequence s, int offset, int length) {
        return encode(s, offset, length, Filter.NONOPFILTER);
    }

    public static String encode(CharSequence s, int offset, int length, Filter Filter) {
        return encode(s, offset, length, new Filter[] { Filter });
    }

    public static String encode(CharSequence s, int offset, int length, Filter... filters) {
        try {
            if (s == null)
                return null;
            return encode(s, offset, length, "utf-8", filters);
        } catch (UnsupportedEncodingException e) {
            // shouldn't happen
            return null;
        }
    }

    private static boolean check(int codepoint, Filter... filters) {
        for (Filter Filter : filters) {
            if (Filter.accept(codepoint))
                return true;
        }
        return false;
    }

    public static String encode(CharSequence s, int offset, int length, String enc, Filter... filters) throws UnsupportedEncodingException {
        int end = Math.min(s.length(), offset + length);
        CharSequence seq = s.subSequence(offset, end);
        return encode(seq, enc, filters);
    }

    public static String encode(CharSequence s, String enc, Filter... filters) throws UnsupportedEncodingException {
        if (s == null)
            return null;
        StringBuilder sb = new StringBuilder();
        for (int n = 0; n < s.length(); n++) {
            char c = s.charAt(n);
            if (!CharUtils.isHighSurrogate(c) && check(c, filters)) {
                encode(sb, String.valueOf(c).getBytes(enc));
            } else if (CharUtils.isHighSurrogate(c)) {
                if (check(c, filters)) {
                    StringBuilder buf = new StringBuilder();
                    buf.append(c);
                    buf.append(s.charAt(++n));
                    byte[] b = buf.toString().getBytes(enc);
                    encode(sb, b);
                } else {
                    sb.append(c);
                    sb.append(s.charAt(++n));
                }
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

    public static String decode(String e, String enc) throws UnsupportedEncodingException {
        DecodingReader r = new DecodingReader(e.getBytes(enc), enc);
        char[] buf = new char[e.length()];
        try {
            int l = r.read(buf);
            e = new String(buf, 0, l);
        } catch (Exception ex) {
        }
        return e;
    }

    public static String decode(String e) {
        try {
            return decode(e, "utf-8");
        } catch (Exception ex) {
            return e;
        }
    }

    // @deprecated This API is deprecated as Apache Abdera is a retired project since 2017.
    @Deprecated(since = "2021-07-29")
    public static class EncodingOutputStream extends FilterOutputStream {

        public EncodingOutputStream(OutputStream out) {
            super(out);
        }

        @Override
        public void write(byte[] b, int off, int len) throws IOException {
            String enc = encode(b, off, len);
            out.write(enc.getBytes(DEFAULT_ENCODING));
        }

        @Override
        public void write(byte[] b) throws IOException {
            String enc = encode(b);
            out.write(enc.getBytes(DEFAULT_ENCODING));
        }

        @Override
        public void write(int b) throws IOException {
            String enc = encode((byte) b);
            out.write(enc.getBytes(DEFAULT_ENCODING));
        }
    }

    // @deprecated This API is deprecated as Apache Abdera is a retired project since 2017.
    @Deprecated(since = "2021-07-29")
    public static class EncodingWriter extends FilterWriter {

        private final Filter[] filters;

        public EncodingWriter(OutputStream out) {
            this(new OutputStreamWriter(out));
        }

        public EncodingWriter(OutputStream out, Filter Filter) {
            this(new OutputStreamWriter(out), Filter);
        }

        public EncodingWriter(OutputStream out, Filter... filters) {
            this(new OutputStreamWriter(out), filters);
        }

        public EncodingWriter(Writer out) {
            this(out, new Filter[0]);
        }

        public EncodingWriter(Writer out, Filter Filter) {
            this(out, new Filter[] { Filter });
        }

        public EncodingWriter(Writer out, Filter... filters) {
            super(out);
            this.filters = filters;
        }

        @Override
        public void write(char[] b, int off, int len) throws IOException {
            String enc = encode(b, off, len, filters);
            out.write(enc.toCharArray());
        }

        @Override
        public void write(char[] b) throws IOException {
            String enc = encode(b, filters);
            out.write(enc.toCharArray());
        }

        @Override
        public void write(int b) throws IOException {
            String enc = encode(new char[] { (char) b }, filters);
            out.write(enc.toCharArray());
        }

        @Override
        public void write(String str, int off, int len) throws IOException {
            String enc = encode(str, off, len, filters);
            out.write(enc.toCharArray());
        }
    }

    // @deprecated This API is deprecated as Apache Abdera is a retired project since 2017.
    @Deprecated(since = "2021-07-29")
    public static class DecodingInputStream extends FilterInputStream {

        public DecodingInputStream(InputStream in) {
            super(in);
        }

        public DecodingInputStream(byte[] in) {
            super(new ByteArrayInputStream(in));
        }

        public int read() throws IOException {
            int c = super.read();
            if (c == '%') {
                int c1 = super.read();
                int c2 = super.read();
                return decode((char) c1, (char) c2);
            } else {
                return c;
            }
        }

        @Override
        public synchronized int read(byte[] b, int off, int len) throws IOException {
            int n = off;
            int i = -1;
            while ((i = read()) != -1 && n < off + len) {
                b[n++] = (byte) i;
            }
            return n - off;
        }

        @Override
        public int read(byte[] b) throws IOException {
            return read(b, 0, b.length);
        }

        @Override
        public long skip(long n) throws IOException {
            long i = 0;
            for (; i < n; i++) read();
            return i;
        }
    }

    // @deprecated This API is deprecated as Apache Abdera is a retired project since 2017.
    @Deprecated(since = "2021-07-29")
    public static class DecodingReader extends FilterReader {

        public DecodingReader(byte[] buf) throws UnsupportedEncodingException {
            this(new ByteArrayInputStream(buf));
        }

        public DecodingReader(byte[] buf, String enc) throws UnsupportedEncodingException {
            this(new ByteArrayInputStream(buf), enc);
        }

        public DecodingReader(InputStream in) throws UnsupportedEncodingException {
            this(in, DEFAULT_ENCODING);
        }

        public DecodingReader(InputStream in, String enc) throws UnsupportedEncodingException {
            this(new InputStreamReader(in, enc));
        }

        public DecodingReader(Reader in) {
            super(in);
        }

        public int read() throws IOException {
            int c = super.read();
            if (c == '%') {
                int c1 = super.read();
                int c2 = super.read();
                return decode((char) c1, (char) c2);
            } else {
                return c;
            }
        }

        @Override
        public synchronized int read(char[] b, int off, int len) throws IOException {
            int n = off;
            int i = -1;
            while ((i = read()) != -1 && n < off + len) {
                b[n++] = (char) i;
            }
            return n - off;
        }

        @Override
        public int read(char[] b) throws IOException {
            return read(b, 0, b.length);
        }

        @Override
        public long skip(long n) throws IOException {
            long i = 0;
            for (; i < n; i++) read();
            return i;
        }
    }

    private static byte decode(char c, int shift) {
        return (byte) ((((c >= '0' && c <= '9') ? c - '0' : (c >= 'A' && c <= 'F') ? c - 'A' + 10 : (c >= 'a' && c <= 'f') ? c - 'a' + 10 : -1) & 0xf) << shift);
    }

    private static byte decode(char c1, char c2) {
        return (byte) (decode(c1, 4) | decode(c2, 0));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy