智能工厂.apk(点击下载) / UrlBeaconUrlCompressor.java


package org.altbeacon.beacon.utils;

import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UrlBeaconUrlCompressor {
    private static final byte EDDYSTONE_URL_BIZ = 12;
    private static final byte EDDYSTONE_URL_BIZ_SLASH = 5;
    private static final byte EDDYSTONE_URL_COM = 7;
    private static final byte EDDYSTONE_URL_COM_SLASH = 0;
    private static final byte EDDYSTONE_URL_EDU = 9;
    private static final byte EDDYSTONE_URL_EDU_SLASH = 2;
    private static final int EDDYSTONE_URL_FQDN_GROUP = 3;
    private static final byte EDDYSTONE_URL_GOV = 13;
    private static final byte EDDYSTONE_URL_GOV_SLASH = 6;
    private static final byte EDDYSTONE_URL_INFO = 11;
    private static final byte EDDYSTONE_URL_INFO_SLASH = 4;
    private static final byte EDDYSTONE_URL_NET = 10;
    private static final byte EDDYSTONE_URL_NET_SLASH = 3;
    private static final byte EDDYSTONE_URL_ORG = 8;
    private static final byte EDDYSTONE_URL_ORG_SLASH = 1;
    private static final int EDDYSTONE_URL_PATH_GROUP = 5;
    private static final int EDDYSTONE_URL_PROTOCOL_GROUP = 1;
    private static final byte EDDYSTONE_URL_PROTOCOL_HTTP = 2;
    private static final byte EDDYSTONE_URL_PROTOCOL_HTTPS = 3;
    private static final byte EDDYSTONE_URL_PROTOCOL_HTTPS_WWW = 1;
    private static final byte EDDYSTONE_URL_PROTOCOL_HTTP_WWW = 0;
    private static final String EDDYSTONE_URL_REGEX = "^((?i)http|https):\\/\\/((?i)www\\.)?((?:[0-9a-zA-Z_-]+\\.?)+)(/?)([./0-9a-zA-Z_-]*)";
    private static final int EDDYSTONE_URL_SLASH_GROUP = 4;
    private static final int EDDYSTONE_URL_WWW_GROUP = 2;
    private static final byte TLD_NOT_ENCODABLE = -1;
    private static final String URL_HOST_WWW = "www.";
    private static final String URL_PROTOCOL_HTTP = "http";
    private static final String URL_PROTOCOL_HTTPS_COLON_SLASH_SLASH = "https://";
    private static final String URL_PROTOCOL_HTTPS_WWW_DOT = "https://www.";
    private static final String URL_PROTOCOL_HTTP_COLON_SLASH_SLASH = "http://";
    private static final String URL_PROTOCOL_HTTP_WWW_DOT = "http://www.";
    private static final String URL_TLD_DOT_BIZ = ".biz";
    private static final String URL_TLD_DOT_BIZ_SLASH = ".biz/";
    private static final String URL_TLD_DOT_COM = ".com";
    private static final String URL_TLD_DOT_COM_SLASH = ".com/";
    private static final String URL_TLD_DOT_EDU = ".edu";
    private static final String URL_TLD_DOT_EDU_SLASH = ".edu/";
    private static final String URL_TLD_DOT_GOV = ".gov";
    private static final String URL_TLD_DOT_GOV_SLASH = ".gov/";
    private static final String URL_TLD_DOT_INFO = ".info";
    private static final String URL_TLD_DOT_INFO_SLASH = ".info/";
    private static final String URL_TLD_DOT_NET = ".net";
    private static final String URL_TLD_DOT_NET_SLASH = ".net/";
    private static final String URL_TLD_DOT_ORG = ".org";
    private static final String URL_TLD_DOT_ORG_SLASH = ".org/";
    private static List<TLDMapEntry> tldMap = new ArrayList();

    /* access modifiers changed from: private */
    public static class TLDMapEntry {
        public final byte encodedByte;
        public final String tld;

        public TLDMapEntry(String str, byte b) {
            this.tld = str;
            this.encodedByte = b;
        }
    }

    static {
        tldMap.add(new TLDMapEntry(URL_TLD_DOT_COM_SLASH, (byte) 0));
        tldMap.add(new TLDMapEntry(URL_TLD_DOT_ORG_SLASH, (byte) 1));
        tldMap.add(new TLDMapEntry(URL_TLD_DOT_EDU_SLASH, (byte) 2));
        tldMap.add(new TLDMapEntry(URL_TLD_DOT_NET_SLASH, (byte) 3));
        tldMap.add(new TLDMapEntry(URL_TLD_DOT_INFO_SLASH, EDDYSTONE_URL_INFO_SLASH));
        tldMap.add(new TLDMapEntry(URL_TLD_DOT_BIZ_SLASH, EDDYSTONE_URL_BIZ_SLASH));
        tldMap.add(new TLDMapEntry(URL_TLD_DOT_GOV_SLASH, EDDYSTONE_URL_GOV_SLASH));
        tldMap.add(new TLDMapEntry(URL_TLD_DOT_COM, EDDYSTONE_URL_COM));
        tldMap.add(new TLDMapEntry(URL_TLD_DOT_ORG, EDDYSTONE_URL_ORG));
        tldMap.add(new TLDMapEntry(URL_TLD_DOT_EDU, EDDYSTONE_URL_EDU));
        tldMap.add(new TLDMapEntry(URL_TLD_DOT_NET, EDDYSTONE_URL_NET));
        tldMap.add(new TLDMapEntry(URL_TLD_DOT_INFO, EDDYSTONE_URL_INFO));
        tldMap.add(new TLDMapEntry(URL_TLD_DOT_BIZ, EDDYSTONE_URL_BIZ));
        tldMap.add(new TLDMapEntry(URL_TLD_DOT_GOV, EDDYSTONE_URL_GOV));
    }

    private static byte encodedByteForTopLevelDomain(String str) {
        Iterator<TLDMapEntry> it = tldMap.iterator();
        byte b = -1;
        boolean z = false;
        while (!z && it.hasNext()) {
            TLDMapEntry next = it.next();
            boolean equalsIgnoreCase = next.tld.equalsIgnoreCase(str);
            if (equalsIgnoreCase) {
                b = next.encodedByte;
            }
            z = equalsIgnoreCase;
        }
        return b;
    }

    private static String topLevelDomainForByte(Byte b) {
        Iterator<TLDMapEntry> it = tldMap.iterator();
        String str = null;
        boolean z = false;
        while (!z && it.hasNext()) {
            TLDMapEntry next = it.next();
            boolean z2 = next.encodedByte == b.byteValue();
            if (z2) {
                str = next.tld;
            }
            z = z2;
        }
        return str;
    }

    public static byte[] compress(String str) throws MalformedURLException {
        int i;
        String group;
        if (str != null) {
            byte[] bArr = new byte[str.length()];
            Arrays.fill(bArr, (byte) 0);
            Matcher matcher = Pattern.compile(EDDYSTONE_URL_REGEX).matcher(str);
            if (matcher.matches()) {
                byte b = 2;
                boolean z = true;
                boolean z2 = matcher.group(2) != null;
                if (matcher.group(1).toLowerCase().equalsIgnoreCase(URL_PROTOCOL_HTTP)) {
                    if (z2) {
                        b = 0;
                    }
                    bArr[0] = b;
                } else {
                    bArr[0] = z2 ? (byte) 1 : 3;
                }
                String[] split = new String(matcher.group(3).getBytes()).toLowerCase().split(Pattern.quote("."));
                if (split != null) {
                    byte[] bArr2 = {46};
                    int length = split.length == 1 ? 1 : split.length - 1;
                    int i2 = 1;
                    for (int i3 = 0; i3 < length; i3++) {
                        if (i3 > 0) {
                            System.arraycopy(bArr2, 0, bArr, i2, bArr2.length);
                            i2 += bArr2.length;
                        }
                        byte[] bytes = split[i3].getBytes();
                        int length2 = bytes.length;
                        System.arraycopy(bytes, 0, bArr, i2, length2);
                        i2 += length2;
                    }
                    if (split.length > 1) {
                        String str2 = "." + split[split.length - 1];
                        String group2 = matcher.group(4);
                        byte encodedByteForTopLevelDomain = encodedByteForTopLevelDomain(group2 == null ? str2 : str2 + group2);
                        if (encodedByteForTopLevelDomain != -1) {
                            i = i2 + 1;
                            bArr[i2] = encodedByteForTopLevelDomain;
                            if (group2 == null) {
                                z = false;
                            }
                        } else {
                            byte[] bytes2 = str2.getBytes();
                            int length3 = bytes2.length;
                            System.arraycopy(bytes2, 0, bArr, i2, length3);
                            i = length3 + i2;
                            z = false;
                        }
                    } else {
                        i = i2;
                        z = false;
                    }
                } else {
                    i = 1;
                    z = false;
                }
                if (!z && (group = matcher.group(4)) != null) {
                    int length4 = group.length();
                    System.arraycopy(group.getBytes(), 0, bArr, i, length4);
                    i += length4;
                }
                String group3 = matcher.group(5);
                if (group3 != null) {
                    int length5 = group3.length();
                    System.arraycopy(group3.getBytes(), 0, bArr, i, length5);
                    i += length5;
                }
                byte[] bArr3 = new byte[i];
                System.arraycopy(bArr, 0, bArr3, 0, bArr3.length);
                return bArr3;
            }
            throw new MalformedURLException();
        }
        throw new MalformedURLException();
    }

    public static String uncompress(byte[] bArr) {
        StringBuffer stringBuffer = new StringBuffer();
        switch (bArr[0] & 15) {
            case 0:
                stringBuffer.append(URL_PROTOCOL_HTTP_WWW_DOT);
                break;
            case 1:
                stringBuffer.append(URL_PROTOCOL_HTTPS_WWW_DOT);
                break;
            case 2:
                stringBuffer.append("http://");
                break;
            case 3:
                stringBuffer.append("https://");
                break;
        }
        byte b = -1;
        int i = 1;
        while (i < bArr.length) {
            byte b2 = bArr[i];
            if (b == 0 && b2 == 0) {
                return stringBuffer.toString();
            }
            String str = topLevelDomainForByte(Byte.valueOf(b2));
            if (str != null) {
                stringBuffer.append(str);
            } else {
                stringBuffer.append((char) b2);
            }
            i++;
            b = b2;
        }
        return stringBuffer.toString();
    }
}