From 2baae144df429af5a6f8dbf34679fed5eef91216 Mon Sep 17 00:00:00 2001 From: 844392610 <844392610@qq.com> Date: Mon, 6 Sep 2021 19:50:40 +0800 Subject: [PATCH] Improve performance of expandIP, and readable --- .../apache/rocketmq/acl/common/AclUtils.java | 64 +++++-------------- .../rocketmq/acl/common/AclUtilsTest.java | 21 ++++-- 2 files changed, 31 insertions(+), 54 deletions(-) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java index 89733202..a6b25617 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java @@ -206,61 +206,31 @@ public class AclUtils { } public static String expandIP(String netaddress, int part) { - boolean compress = false; - int compressIndex = -1; - String[] strArray = StringUtils.split(netaddress, ":"); - ArrayList indexes = new ArrayList<>(); - for (int i = 0; i < netaddress.length(); i++) { - if (netaddress.charAt(i) == ':') { - if (indexes.size() > 0 && i - indexes.get(indexes.size() - 1) == 1) { - compressIndex = i; - compress = true; - } - indexes.add(i); + // expand netaddress + int separatorCount = StringUtils.countMatches(netaddress, ":"); + int padCount = part - separatorCount; + if(padCount > 0){ + StringBuilder padStr = new StringBuilder(":"); + for(int i = 0; i < padCount; i++){ + padStr.append(":"); } + netaddress = StringUtils.replace(netaddress, "::", padStr.toString()); } + // pad netaddress + String[] strArray = StringUtils.splitPreserveAllTokens(netaddress, ":"); for (int i = 0; i < strArray.length; i++) { - if (strArray[i].length() < 4) { - strArray[i] = "0000".substring(0, 4 - strArray[i].length()) + strArray[i]; + if(strArray[i].length() < 4){ + strArray[i] = StringUtils.leftPad(strArray[i], 4, '0'); } } + // output StringBuilder sb = new StringBuilder(); - if (compress) { - int pos = indexes.indexOf(compressIndex); - int index = 0; - if (!netaddress.startsWith(":")) { - for (int i = 0; i < pos; i++) { - sb.append(strArray[index]).append(":"); - index += 1; - } - } - int zeroNum = part - strArray.length; - if (netaddress.endsWith(":")) { - for (int i = 0; i < zeroNum; i++) { - sb.append("0000"); - if (i != zeroNum - 1) { - sb.append(":"); - } - } - } else { - for (int i = 0; i < zeroNum; i++) { - sb.append("0000").append(":"); - } - for (int i = index; i < strArray.length; i++) { - sb.append(strArray[i]); - if (i != strArray.length - 1) { - sb.append(":"); - } - } - } - } else { - for (int i = 0; i < strArray.length; i++) { - sb.append(strArray[i]); - if (i != strArray.length - 1) { - sb.append(":"); - } + for (int i = 0; i < strArray.length; i++) { + sb.append(strArray[i]); + if (i != strArray.length - 1) { + sb.append(":"); } } return sb.toString().toUpperCase(); diff --git a/acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java b/acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java index 5705b745..4646c6ec 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java @@ -31,10 +31,12 @@ import org.junit.Test; public class AclUtilsTest { + // strArray[i] = StringUtils.leftPad(strArray[i],4, '0'); + @Test - public void getAddreeStrArray() { + public void getAddresses() { String address = "1.1.1.{1,2,3,4}"; - String[] addressArray = AclUtils.getAddreeStrArray(address, "{1,2,3,4}"); + String[] addressArray = AclUtils.getAddresses(address, "{1,2,3,4}"); List newAddressList = new ArrayList<>(); for (String a : addressArray) { newAddressList.add(a); @@ -49,7 +51,7 @@ public class AclUtilsTest { // IPv6 test String ipv6Address = "1:ac41:9987::bb22:666:{1,2,3,4}"; - String[] ipv6AddressArray = AclUtils.getAddreeStrArray(ipv6Address, "{1,2,3,4}"); + String[] ipv6AddressArray = AclUtils.getAddresses(ipv6Address, "{1,2,3,4}"); List newIPv6AddressList = new ArrayList<>(); for (String a : ipv6AddressArray) { newIPv6AddressList.add(a); @@ -181,23 +183,28 @@ public class AclUtilsTest { public void v6ipProcessTest() { String remoteAddr = "5::7:6:1-200:*"; String[] strArray = StringUtils.split(remoteAddr, ":"); - Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0000:0000:0000:0007:0006"); + Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr), "0005:0000:0000:0000:0007:0006"); +// Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0000:0000:0000:0007:0006"); remoteAddr = "5::7:6:1-200"; strArray = StringUtils.split(remoteAddr, ":"); - Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0000:0000:0000:0000:0007:0006"); + Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr), "0005:0000:0000:0000:0000:0007:0006"); +// Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0000:0000:0000:0000:0007:0006"); remoteAddr = "5::7:6:*"; strArray = StringUtils.split(remoteAddr, ":"); - Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0000:0000:0000:0000:0007:0006"); + Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr), "0005:0000:0000:0000:0000:0007:0006"); +// Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0000:0000:0000:0000:0007:0006"); remoteAddr = "5:7:6:*"; strArray = StringUtils.split(remoteAddr, ":"); - Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0007:0006"); + Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr), "0005:0007:0006"); +// Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0007:0006"); } @Test public void expandIPTest() { + Assert.assertEquals(AclUtils.expandIP("::", 8), "0000:0000:0000:0000:0000:0000:0000:0000"); Assert.assertEquals(AclUtils.expandIP("::1", 8), "0000:0000:0000:0000:0000:0000:0000:0001"); Assert.assertEquals(AclUtils.expandIP("3::", 8), "0003:0000:0000:0000:0000:0000:0000:0000"); Assert.assertEquals(AclUtils.expandIP("2::2", 8), "0002:0000:0000:0000:0000:0000:0000:0002"); -- GitLab