智能工厂.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();
}
}