diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f969b5..d6b7965 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # OSGL Tool Change Log +1.26.1 - 26/Dec/2020 +* Drop `javax.xml.bind` dependency #242 +* OS util cannot detect `Mac OS X` #241 + 1.26.0 - 21/Dec/2020 * XML to JSON conversion - convert attributes #240 diff --git a/src/main/java/org/osgl/util/Codec.java b/src/main/java/org/osgl/util/Codec.java index e2c4c37..acd5f18 100644 --- a/src/main/java/org/osgl/util/Codec.java +++ b/src/main/java/org/osgl/util/Codec.java @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2013 The Java Tool project * Gelin Luo * @@ -8,15 +8,15 @@ * 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. -*/ + */ package org.osgl.util; /*- @@ -28,9 +28,9 @@ * Licensed 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. @@ -47,7 +47,6 @@ import java.nio.charset.Charset; import java.security.MessageDigest; import java.util.UUID; -import javax.xml.bind.DatatypeConverter; /** * Utility class for encoding and decoding @@ -66,6 +65,7 @@ public static String UUID() { /** * Alias of {@link #UUID()} + * * @return an UUID string */ public static String uuid() { @@ -96,6 +96,7 @@ public static String encodeBase64(String value) { /** * Encode a String to base64 using variant URL safe encode scheme + * * @param value the plain string * @return the base64 encoded String that is URL safe */ @@ -108,7 +109,7 @@ public static String encodeUrlSafeBase64(String value) { * * @param value The binary data * @return The base64 encoded String - * @deprecated Use {@link #encodeBase64(byte[])} instead + * @deprecated Use {@link #encodeBase64(byte[])} instead */ @Deprecated public static String encodeBASE64(byte[] value) { @@ -203,21 +204,65 @@ public static String hexSHA1(String value) { } } + private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray(); + + public static int hexToByte(char ch) { + if ('0' <= ch && ch <= '9') return ch - '0'; + if ('A' <= ch && ch <= 'F') return ch - 'A' + 10; + if ('a' <= ch && ch <= 'f') return ch - 'a' + 10; + return -1; + } + + private static final String[] byteToHexTable = new String[]{ + "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F", + "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B", "1C", "1D", "1E", "1F", + "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", + "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", "3C", "3D", "3E", "3F", + "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4A", "4B", "4C", "4D", "4E", "4F", + "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D", "5E", "5F", + "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6A", "6B", "6C", "6D", "6E", "6F", + "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E", "7F", + "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8A", "8B", "8C", "8D", "8E", "8F", + "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9A", "9B", "9C", "9D", "9E", "9F", + "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF", + "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF", + "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF", + "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF", + "E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF", + "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF" + }; + /** * Write a byte array as hexadecimal String. + * * @return bytes */ public static String byteToHexString(byte[] bytes) { - return DatatypeConverter.printHexBinary(bytes); + if (bytes == null || bytes.length == 0) { + return ""; + } + S.Buffer sb = S.buffer(); + for (byte b : bytes) { + sb.append(byteToHexTable[b & 0xFF]); + } + return sb.toString(); } /** * Transform an hexadecimal String to a byte array. + * * @param hexString the string * @return the byte array of the hex string */ public static byte[] hexStringToByte(String hexString) { - return DatatypeConverter.parseHexBinary(hexString); + if (hexString == null || hexString.length() == 0) { + return new byte[]{}; + } + byte[] byteArray = new byte[hexString.length() / 2]; + for (int i = 0; i < hexString.length(); i += 2) { + byteArray[i / 2] = (byte) (hexToByte(hexString.charAt(i)) * 16 + hexToByte(hexString.charAt(i + 1))); + } + return byteArray; } public static String encodeUrl(String s, Charset enc) { diff --git a/src/main/java/org/osgl/util/OS.java b/src/main/java/org/osgl/util/OS.java index 7adb911..8143d26 100644 --- a/src/main/java/org/osgl/util/OS.java +++ b/src/main/java/org/osgl/util/OS.java @@ -24,10 +24,79 @@ * Operating system enum */ public enum OS { - WINDOWS, MAC_OS_X, LINUX, OS2, HP_UX, AIX, IRIX, SOLARIS, SUN_OS, MPE_IX, OS_390, FREEBSD, DIGITAL_UNIX, OSF1, UNKNOWN; + WINDOWS, + MAC_OS() { + @Override + public String toString() { + return "macOS"; + } + }, + LINUX, + OS_2() { + @Override + public String toString() { + return "OS/2"; + } + }, + HP_UX() { + @Override + public String toString() { + return "HP-UX"; + } + }, + AIX() { + @Override + public String toString() { + return "AIX"; + } + }, + IRIX() { + @Override + public String toString() { + return "IRIX"; + } + }, + SOLARIS, + SUN_OS() { + @Override + public String toString() { + return "SunOS"; + } + }, + MPE_IX() { + @Override + public String toString() { + return "MPE/iX"; + } + }, + OS_390() { + @Override + public String toString() { + return "OS/390"; + } + }, + FREEBSD() { + @Override + public String toString() { + return "FreeBSD"; + } + }, + DIGITAL_UNIX() { + @Override + public String toString() { + return "Digital UNIX"; + } + }, + OSF_1() { + @Override + public String toString() { + return "OSF/1"; + } + }, + UNKNOWN; private static OS os = null; static { - String s = System.getProperty("os.name").toUpperCase(); + String s = Keyword.of(System.getProperty("os.name")).snakeCase().toUpperCase(); for (OS x: OS.values()) { if (s.startsWith(x.name())) { os = x; @@ -35,15 +104,7 @@ public enum OS { } } if (null == os) { - if (s.startsWith("OS/2")) { - os = OS2; - } else if (s.startsWith("OS/390")) { - os = OS_390; - } else if (s.startsWith("DIGITAL UNIX")) { - os = DIGITAL_UNIX; - } else { - os = UNKNOWN; - } + os = UNKNOWN; } } @@ -55,7 +116,7 @@ public boolean isWindows() { return WINDOWS == this; } public boolean isMacOsX() { - return MAC_OS_X == this; + return MAC_OS == this; } public boolean isLinux() { return LINUX == this; @@ -76,6 +137,10 @@ public String fileSeparator() { return fileSeparator; } + public String toString() { + return Keyword.of(name()).readable(); + } + public static OS get() { return os; }