diff --git a/.gitignore b/.gitignore index e02e5e4..e93c5e2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,58 @@ -.idea/ + +# Created by https://www.toptal.com/developers/gitignore/api/maven,java,intellij +# Edit at https://www.toptal.com/developers/gitignore?templates=maven,java,intellij + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +.idea *.iml -/bin +*.ipr + +# File-based project format +*.iws + +# IntelliJ +out/ + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# End of https://www.toptal.com/developers/gitignore/api/maven,java,intellij + diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..a040cca --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,45 @@ +#!/usr/bin/env groovy +import com.vidal.jenkins.* + +pipeline { + agent { + docker { + image 'ci/mvn-chrome:2.0.0' + args "--volume /data/repository:/tmp/mvn-repo --name=lz-string4java-${BRANCH_NAME}-${env.BUILD_ID} -v /var/run/docker.sock:/var/run/docker.sock --group-add docker-slave" + } + } + options { + disableConcurrentBuilds() + buildDiscarder(logRotator(numToKeepStr: '10', artifactNumToKeepStr: '10')) + } + stages { + stage('Prepare') { + when { + expression { Branches.isPullRequest(BRANCH_NAME) } + } + steps { + cancelPreviousBuild() + } + } + + stage('Build and Tests') { + steps { + mvn 'clean verify' + junit '**/target/surefire-reports/TEST-*.xml' + } + } + + stage('Share (Nexus)') { + when { + anyOf { + branch 'master' + branch 'sprint-*' + } + expression { currentBuild.resultIsBetterOrEqualTo('SUCCESS') } + } + steps { + mvn 'deploy -DskipTests' + } + } + } +} \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..77280be --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 rufushuang + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/pom.xml b/pom.xml index 69905b0..94d3cfa 100644 --- a/pom.xml +++ b/pom.xml @@ -1,11 +1,10 @@ - + 4.0.0 - com.github.wajda - lzstring4java - 0.1 + com.github.softwarevidal + lz-string4java + 1.0.1-SNAPSHOT jar LZ-String @@ -30,21 +29,23 @@ - scm:git:git@github.com:wajda/lz-string4java.git - scm:git:git@github.com:wajda/lz-string4java.git - https://github.com/wajda/lz-string4java.git - + scm:git:git@github.com:softwarevidal/lz-string4java.git + scm:git:git@github.com:softwarevidal/lz-string4java.git + https://github.com/softwarevidal/lz-string4java + HEAD + - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - + + vidal-3rd-party-releases + http://nexus.vidal.net/content/repositories/vidal-3rd-party-releases/ + + + vidal-snapshots + true + http://nexus.vidal.net/content/repositories/vidal-snapshots/ + + @@ -92,7 +93,7 @@ attach-sources - jar + jar-no-fork @@ -101,6 +102,9 @@ org.apache.maven.plugins maven-javadoc-plugin 2.10.3 + + true + attach-javadocs @@ -110,17 +114,6 @@ - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.7 - true - - ossrh - https://oss.sonatype.org/ - true - - diff --git a/src/main/java/rufus/lzstring4java/LZString.java b/src/main/java/rufus/lzstring4java/LZString.java index 1a7dacc..0278522 100644 --- a/src/main/java/rufus/lzstring4java/LZString.java +++ b/src/main/java/rufus/lzstring4java/LZString.java @@ -9,31 +9,24 @@ package rufus.lzstring4java; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; +import java.util.*; public class LZString { private static char[] keyStrBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".toCharArray(); private static char[] keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$".toCharArray(); - private static HashMap> baseReverseDic = new HashMap>(); + private static Map> baseReverseDic = new HashMap>(); - static { - for(char[] alphabet: new char[][]{keyStrBase64, keyStrUriSafe}){ - HashMap map = baseReverseDic.get(alphabet); - if (map == null) { - map = new HashMap(); - baseReverseDic.put(alphabet, map); - for (int i = 0; i < alphabet.length; i++) { - map.put(alphabet[i], i); - } + private static char getBaseValue(char[] alphabet, Character character) { + Map map = baseReverseDic.get(alphabet); + if (map == null) { + map = new HashMap(); + baseReverseDic.put(alphabet, map); + for (int i = 0; i < alphabet.length; i++) { + map.put(alphabet[i], i); } } - } - - private static char getBaseValue(char[] alphabet, Character character) { - return (char) baseReverseDic.get(alphabet).get(character).intValue(); + return (char) map.get(character).intValue(); } public static String compressToBase64(String input) { @@ -41,7 +34,7 @@ public static String compressToBase64(String input) { return ""; String res = LZString._compress(input, 6, new CompressFunctionWrapper() { @Override - public Character doFunc(int a) { + public char doFunc(int a) { return keyStrBase64[a]; } }); @@ -58,18 +51,15 @@ public Character doFunc(int a) { } } - public static String decompressFromBase64(String inputStr) { + public static String decompressFromBase64(final String inputStr) { if (inputStr == null) return ""; - if (inputStr == "") + if (inputStr.equals("")) return null; - final char[] input = inputStr.toCharArray(); - // function(index) { return getBaseValue(keyStrBase64, - // input.charAt(index)); } - return LZString._decompress(input.length, 32, new DecompressFunctionWrapper() { + return LZString._decompress(inputStr.length(), 32, new DecompressFunctionWrapper() { @Override - public Character doFunc(int index) { - return getBaseValue(keyStrBase64, input[index]); + public char doFunc(int index) { + return getBaseValue(keyStrBase64, inputStr.charAt(index)); } }); } @@ -79,22 +69,21 @@ public static String compressToUTF16(String input) { return ""; return LZString._compress(input, 15, new CompressFunctionWrapper() { @Override - public Character doFunc(int a) { + public char doFunc(int a) { return fc(a + 32); } }) + " "; } - public static String decompressFromUTF16(String compressedStr) { + public static String decompressFromUTF16(final String compressedStr) { if (compressedStr == null) return ""; - if (compressedStr == "") + if (compressedStr.isEmpty()) return null; - final char[] compressed = compressedStr.toCharArray(); - return LZString._decompress(compressed.length, 16384, new DecompressFunctionWrapper() { + return LZString._decompress(compressedStr.length(), 16384, new DecompressFunctionWrapper() { @Override - public Character doFunc(int index) { - return (char) (compressed[index] - 32); + public char doFunc(int index) { + return (char) (compressedStr.charAt(index) - 32); } }); } @@ -106,33 +95,32 @@ public static String compressToEncodedURIComponent(String input) { return ""; return LZString._compress(input, 6, new CompressFunctionWrapper() { @Override - public Character doFunc(int a) { + public char doFunc(int a) { return keyStrUriSafe[a]; } - }) + " "; + }); } public static String decompressFromEncodedURIComponent(String inputStr) { if (inputStr == null) return ""; - if (inputStr == "") return null; - inputStr = inputStr.replace(' ', '+'); - final char[] input = inputStr.toCharArray(); - return LZString._decompress(input.length, 32, new DecompressFunctionWrapper() { + if (inputStr.isEmpty()) return null; + final String urlEncodedInputStr = inputStr.replace(' ', '+'); + return LZString._decompress(urlEncodedInputStr.length(), 32, new DecompressFunctionWrapper() { @Override - public Character doFunc(int index) { - return getBaseValue(keyStrUriSafe, input[index]); + public char doFunc(int index) { + return getBaseValue(keyStrUriSafe, urlEncodedInputStr.charAt(index)); } }); } - + private static abstract class CompressFunctionWrapper { - public abstract Character doFunc(int i); + public abstract char doFunc(int i); } public static String compress(String uncompressed) { return LZString._compress(uncompressed, 16, new CompressFunctionWrapper() { @Override - public Character doFunc(int a) { + public char doFunc(int a) { return fc(a); } }); @@ -140,22 +128,21 @@ public Character doFunc(int a) { private static String _compress(String uncompressedStr, int bitsPerChar, CompressFunctionWrapper getCharFromInt) { if (uncompressedStr == null) return ""; int i, value; - HashMap context_dictionary = new HashMap(); - HashSet context_dictionaryToCreate = new HashSet(); + Map context_dictionary = new HashMap(); + Set context_dictionaryToCreate = new HashSet(); String context_c = ""; String context_wc = ""; String context_w = ""; - double context_enlargeIn = 2d; // Compensate for the first entry which should not count + int context_enlargeIn = 2; // Compensate for the first entry which should not count int context_dictSize = 3; int context_numBits = 2; - ArrayList context_data = new ArrayList(uncompressedStr.length() / 3); + StringBuilder context_data = new StringBuilder(uncompressedStr.length() / 3); int context_data_val = 0; int context_data_position = 0; int ii; - char[] uncompressed = uncompressedStr.toCharArray(); - for (ii = 0; ii < uncompressed.length; ii += 1) { - context_c = String.valueOf(uncompressed[ii]); + for (ii = 0; ii < uncompressedStr.length(); ii += 1) { + context_c = String.valueOf(uncompressedStr.charAt(ii)); if (!context_dictionary.containsKey(context_c)) { context_dictionary.put(context_c, context_dictSize++); context_dictionaryToCreate.add(context_c); @@ -171,7 +158,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres context_data_val = (context_data_val << 1); if (context_data_position == bitsPerChar - 1) { context_data_position = 0; - context_data.add(getCharFromInt.doFunc(context_data_val)); + context_data.append(getCharFromInt.doFunc(context_data_val)); context_data_val = 0; } else { context_data_position++; @@ -182,7 +169,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres context_data_val = (context_data_val << 1) | (value & 1); if (context_data_position == bitsPerChar - 1) { context_data_position = 0; - context_data.add(getCharFromInt.doFunc(context_data_val)); + context_data.append(getCharFromInt.doFunc(context_data_val)); context_data_val = 0; } else { context_data_position++; @@ -195,7 +182,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres context_data_val = (context_data_val << 1) | value; if (context_data_position == bitsPerChar - 1) { context_data_position = 0; - context_data.add(getCharFromInt.doFunc(context_data_val)); + context_data.append(getCharFromInt.doFunc(context_data_val)); context_data_val = 0; } else { context_data_position++; @@ -207,7 +194,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres context_data_val = (context_data_val << 1) | (value & 1); if (context_data_position == bitsPerChar - 1) { context_data_position = 0; - context_data.add(getCharFromInt.doFunc(context_data_val)); + context_data.append(getCharFromInt.doFunc(context_data_val)); context_data_val = 0; } else { context_data_position++; @@ -217,7 +204,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres } context_enlargeIn--; if (context_enlargeIn == 0) { - context_enlargeIn = Math.pow(2, context_numBits); + context_enlargeIn = powerOf2(context_numBits); context_numBits++; } context_dictionaryToCreate.remove(context_w); @@ -227,7 +214,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres context_data_val = (context_data_val << 1) | (value & 1); if (context_data_position == bitsPerChar - 1) { context_data_position = 0; - context_data.add(getCharFromInt.doFunc(context_data_val)); + context_data.append(getCharFromInt.doFunc(context_data_val)); context_data_val = 0; } else { context_data_position++; @@ -238,7 +225,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres } context_enlargeIn--; if (context_enlargeIn == 0) { - context_enlargeIn = Math.pow(2, context_numBits); + context_enlargeIn = powerOf2(context_numBits); context_numBits++; } // Add wc to the dictionary. @@ -255,7 +242,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres context_data_val = (context_data_val << 1); if (context_data_position == bitsPerChar - 1) { context_data_position = 0; - context_data.add(getCharFromInt.doFunc(context_data_val)); + context_data.append(getCharFromInt.doFunc(context_data_val)); context_data_val = 0; } else { context_data_position++; @@ -266,7 +253,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres context_data_val = (context_data_val << 1) | (value & 1); if (context_data_position == bitsPerChar - 1) { context_data_position = 0; - context_data.add(getCharFromInt.doFunc(context_data_val)); + context_data.append(getCharFromInt.doFunc(context_data_val)); context_data_val = 0; } else { context_data_position++; @@ -279,7 +266,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres context_data_val = (context_data_val << 1) | value; if (context_data_position == bitsPerChar - 1) { context_data_position = 0; - context_data.add(getCharFromInt.doFunc(context_data_val)); + context_data.append(getCharFromInt.doFunc(context_data_val)); context_data_val = 0; } else { context_data_position++; @@ -291,7 +278,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres context_data_val = (context_data_val << 1) | (value & 1); if (context_data_position == bitsPerChar - 1) { context_data_position = 0; - context_data.add(getCharFromInt.doFunc(context_data_val)); + context_data.append(getCharFromInt.doFunc(context_data_val)); context_data_val = 0; } else { context_data_position++; @@ -301,7 +288,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres } context_enlargeIn--; if (context_enlargeIn == 0) { - context_enlargeIn = Math.pow(2, context_numBits); + context_enlargeIn = powerOf2(context_numBits); context_numBits++; } context_dictionaryToCreate.remove(context_w); @@ -311,7 +298,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres context_data_val = (context_data_val << 1) | (value & 1); if (context_data_position == bitsPerChar - 1) { context_data_position = 0; - context_data.add(getCharFromInt.doFunc(context_data_val)); + context_data.append(getCharFromInt.doFunc(context_data_val)); context_data_val = 0; } else { context_data_position++; @@ -322,7 +309,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres } context_enlargeIn--; if (context_enlargeIn == 0) { - context_enlargeIn = Math.pow(2, context_numBits); + context_enlargeIn = powerOf2(context_numBits); context_numBits++; } } @@ -333,7 +320,7 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres context_data_val = (context_data_val << 1) | (value & 1); if (context_data_position == bitsPerChar - 1) { context_data_position = 0; - context_data.add(getCharFromInt.doFunc(context_data_val)); + context_data.append(getCharFromInt.doFunc(context_data_val)); context_data_val = 0; } else { context_data_position++; @@ -345,20 +332,17 @@ private static String _compress(String uncompressedStr, int bitsPerChar, Compres while (true) { context_data_val = (context_data_val << 1); if (context_data_position == bitsPerChar - 1) { - context_data.add(getCharFromInt.doFunc(context_data_val)); + context_data.append(getCharFromInt.doFunc(context_data_val)); break; } else context_data_position++; } - StringBuilder sb = new StringBuilder(context_data.size()); - for (char c : context_data) - sb.append(c); - return sb.toString(); + return context_data.toString(); } private static abstract class DecompressFunctionWrapper { - public abstract Character doFunc(int i); + public abstract char doFunc(int i); } protected static class DecData { public char val; @@ -369,34 +353,32 @@ protected static class DecData { public static String f(int i) { return String.valueOf((char) i); } - public static Character fc(int i) { - return Character.valueOf((char) i); + public static char fc(int i) { + return (char) i; } public static String decompress(final String compressed) { if (compressed == null) return ""; - if (compressed == "") + if (compressed.isEmpty()) return null; return LZString._decompress(compressed.length(), 32768, new DecompressFunctionWrapper() { - char[] compChars = compressed.toCharArray(); - @Override - public Character doFunc(int i) { - return compChars[i]; + public char doFunc(int i) { + return compressed.charAt(i); } }); } private static String _decompress(int length, int resetValue, DecompressFunctionWrapper getNextValue) { - ArrayList dictionary = new ArrayList(); + List dictionary = new ArrayList(); // TODO: is next an unused variable in original lz-string? @SuppressWarnings("unused") int next; - double enlargeIn = 4d; + int enlargeIn = 4; int dictSize = 4; int numBits = 3; String entry = ""; - ArrayList result = new ArrayList(); + StringBuilder result = new StringBuilder(); String w; int bits, resb; int maxpower, power; String c = null; @@ -410,7 +392,7 @@ private static String _decompress(int length, int resetValue, DecompressFunction } bits = 0; - maxpower = (int) Math.pow(2, 2); + maxpower = (int) powerOf2(2); power = 1; while (power != maxpower) { resb = data.val & data.position; @@ -426,7 +408,7 @@ private static String _decompress(int length, int resetValue, DecompressFunction switch (next = bits) { case 0: bits = 0; - maxpower = (int) Math.pow(2,8); + maxpower = (int) powerOf2(8); power=1; while (power != maxpower) { resb = data.val & data.position; @@ -442,7 +424,7 @@ private static String _decompress(int length, int resetValue, DecompressFunction break; case 1: bits = 0; - maxpower = (int) Math.pow(2,16); + maxpower = powerOf2(16); power=1; while (power!=maxpower) { resb = data.val & data.position; @@ -461,14 +443,14 @@ private static String _decompress(int length, int resetValue, DecompressFunction } dictionary.add(3, c); w = c; - result.add(w); + result.append(w); while (true) { if (data.index > length) { return ""; } bits = 0; - maxpower = (int) Math.pow(2,numBits); + maxpower = powerOf2(numBits); power=1; while (power!=maxpower) { resb = data.val & data.position; @@ -485,7 +467,7 @@ private static String _decompress(int length, int resetValue, DecompressFunction switch (cc = bits) { case 0: bits = 0; - maxpower = (int) Math.pow(2,8); + maxpower = powerOf2(8); power=1; while (power!=maxpower) { resb = data.val & data.position; @@ -504,7 +486,7 @@ private static String _decompress(int length, int resetValue, DecompressFunction break; case 1: bits = 0; - maxpower = (int) Math.pow(2,16); + maxpower = powerOf2(16); power=1; while (power!=maxpower) { resb = data.val & data.position; @@ -521,14 +503,11 @@ private static String _decompress(int length, int resetValue, DecompressFunction enlargeIn--; break; case 2: - StringBuilder sb = new StringBuilder(result.size()); - for (String s : result) - sb.append(s); - return sb.toString(); - } + return result.toString(); + } if (enlargeIn == 0) { - enlargeIn = Math.pow(2, numBits); + enlargeIn = powerOf2(numBits); numBits++; } @@ -541,7 +520,7 @@ private static String _decompress(int length, int resetValue, DecompressFunction return null; } } - result.add(entry); + result.append(entry); // Add w+entry[0] to the dictionary. dictionary.add(dictSize++, w + entry.charAt(0)); @@ -550,12 +529,16 @@ private static String _decompress(int length, int resetValue, DecompressFunction w = entry; if (enlargeIn == 0) { - enlargeIn = Math.pow(2, numBits); + enlargeIn = powerOf2(numBits); numBits++; } } } + + private static int powerOf2(int power) { + return 1 << power; + } }