From c1036676d8c9d384c4d5a395484da688bdcf8b70 Mon Sep 17 00:00:00 2001 From: Simon Jiang Date: Tue, 7 Nov 2023 00:13:42 +0800 Subject: [PATCH 01/12] BLADE-738 add new regex patter for dxp-2023.q3.1 --- .../validator/WorkspaceProductComparator.java | 67 +++++++++++++++++-- .../com/liferay/blade/cli/util/BladeUtil.java | 3 +- .../WorkspaceProductComparatorTest.java | 19 +++++- 3 files changed, 83 insertions(+), 6 deletions(-) diff --git a/cli/src/main/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparator.java b/cli/src/main/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparator.java index e672f587e..2ea953147 100644 --- a/cli/src/main/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparator.java +++ b/cli/src/main/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparator.java @@ -43,7 +43,55 @@ else if (aKey.startsWith("portal") && bKey.startsWith("commerce")) { else if (aKey.startsWith("commerce") && !bKey.startsWith("commerce")) { return 1; } - else if (!StringUtil.equals(_getProductMainVersion(aKey), _getProductMainVersion(bKey))) { + else if (!StringUtil.isNullOrEmpty(_getProductQuarterVersion(aKey, 1)) && + StringUtil.isNullOrEmpty(_getProductQuarterVersion(bKey, 1))) { + + return -1; + } + else if (!StringUtil.isNullOrEmpty(_getProductQuarterVersion(aKey, 1)) && + !StringUtil.isNullOrEmpty(_getProductQuarterVersion(bKey, 1))) { + + if (!StringUtil.equals(_getProductQuarterVersion(aKey, 1), _getProductQuarterVersion(bKey, 1))) { + Version aYearVersion = Version.parseVersion(_getProductQuarterVersion(aKey, 1)); + Version bYearVersion = Version.parseVersion(_getProductQuarterVersion(bKey, 1)); + + return -1 * aYearVersion.compareTo(bYearVersion); + } + + String aProductQuarterVersion = _getProductQuarterVersion(aKey, 2); + String bProductQuarterVersion = _getProductQuarterVersion(bKey, 2); + + if (BladeUtil.isEmpty(aProductQuarterVersion)) { + return 1; + } + else if (BladeUtil.isEmpty(bProductQuarterVersion)) { + return -1; + } + else if (!StringUtil.equals(aProductQuarterVersion, bProductQuarterVersion)) { + Version aQuarterVersion = Version.parseVersion(aProductQuarterVersion); + Version bQuarterVersion = Version.parseVersion(bProductQuarterVersion); + + return -1 * aQuarterVersion.compareTo(bQuarterVersion); + } + + String aProductQuarterMicroVersion = _getProductQuarterVersion(aKey, 3); + String bProductQuarterMicroVersion = _getProductQuarterVersion(bKey, 3); + + if (BladeUtil.isEmpty(aProductQuarterMicroVersion)) { + return 1; + } + else if (BladeUtil.isEmpty(bProductQuarterMicroVersion)) { + return -1; + } + else if (!StringUtil.equals(aProductQuarterMicroVersion, bProductQuarterMicroVersion)) { + Version aMicroVersion = Version.parseVersion(aProductQuarterMicroVersion); + Version bMicroVersion = Version.parseVersion(bProductQuarterMicroVersion); + + return -1 * aMicroVersion.compareTo(bMicroVersion); + } + } + + if (!StringUtil.equals(_getProductMainVersion(aKey), _getProductMainVersion(bKey))) { Version aProductMainVersion = Version.parseVersion(_getProductMainVersion(aKey)); Version bProductMainVersion = Version.parseVersion(_getProductMainVersion(bKey)); @@ -103,15 +151,26 @@ private String _getProductMainVersion(String productKey) { } private String _getProductMicroVersion(String productKey) { - String[] prodcutKeyArrays = StringUtil.split(productKey, "-"); + String[] productKeyArrays = StringUtil.split(productKey, "-"); - if (prodcutKeyArrays.length > 2) { - return prodcutKeyArrays[2]; + if (productKeyArrays.length > 2) { + return productKeyArrays[2]; } return null; } + private String _getProductQuarterVersion(String productKey, int pos) { + Matcher aMatcher = _versionQuaterPattern.matcher(productKey.substring(productKey.indexOf('-') + 1)); + + if (aMatcher.find()) { + return aMatcher.group(pos); + } + + return ""; + } + private static final Pattern _versionPattern = Pattern.compile("([0-9\\.]+).*"); + private static final Pattern _versionQuaterPattern = Pattern.compile("(\\d{4})\\.[qQ](\\d)\\.(\\d)"); } \ No newline at end of file diff --git a/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java b/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java index 8d0dfb2d7..42a753d24 100644 --- a/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java +++ b/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java @@ -904,7 +904,8 @@ private static Path _downloadFile( "^(commerce)-([1-9]\\d|[0-9])\\.([0-9]\\d|\\d).([0-9]\\d|\\d)(-(([1-9]\\d|[0-9])\\.([1-9]\\d|[0-9])$)+)*"); private static Map _productInfoMap = Collections.emptyMap(); private static final Pattern _productPortalDXPVersionPattern = Pattern.compile( - "^(portal|dxp)-([1-9]\\d|[0-9])\\.([0-9]\\d|\\d)-(((([efsd])([pe]))|u|ga)([0-9]\\d*)$)+"); + "^(portal|dxp)-((([1-9]\\d|[0-9])\\.([0-9]\\d|\\d))-(((([efsd])([pe]))|u|ga)([0-9]\\d*)$)+)|" + + "((\\d{4})\\.([qQ]\\d)\\.\\d)"); private static final File _workspaceCacheDir = new File( System.getProperty("user.home"), _DEFAULT_WORKSPACE_CACHE_DIR_NAME); diff --git a/cli/src/test/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparatorTest.java b/cli/src/test/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparatorTest.java index a966814a6..1fcac526b 100644 --- a/cli/src/test/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparatorTest.java +++ b/cli/src/test/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparatorTest.java @@ -62,6 +62,22 @@ public void testSortByReleaseDate() throws Exception { pairs.add(new Pair<>("portal-7.3-ga1", new ProductInfo(map))); + map.put("releaseDate", "6/29/2022"); + + pairs.add(new Pair<>("dxp-2022.q3.1", new ProductInfo(map))); + + map.put("releaseDate", "6/29/2023"); + + pairs.add(new Pair<>("dxp-2023.q2.1", new ProductInfo(map))); + + map.put("releaseDate", "7/29/2023"); + + pairs.add(new Pair<>("dxp-2023.q3.1", new ProductInfo(map))); + + map.put("releaseDate", "8/29/2023"); + + pairs.add(new Pair<>("dxp-2023.q3.2", new ProductInfo(map))); + String[] actuals = pairs.stream( ).sorted( new WorkspaceProductComparator() @@ -74,7 +90,8 @@ public void testSortByReleaseDate() throws Exception { ); String[] expecteds = { - "dxp-7.2-sp1", "dxp-7.2-sp3", "dxp-7.2-sp2", "portal-7.3-ga1", "portal-7.1-ga2", "portal-7.1-ga1" + "dxp-2023.q3.2", "dxp-2023.q3.1", "dxp-2023.q2.1", "dxp-2022.q3.1", "dxp-7.2-sp1", "dxp-7.2-sp3", + "dxp-7.2-sp2", "portal-7.3-ga1", "portal-7.1-ga2", "portal-7.1-ga1" }; Assert.assertArrayEquals(expecteds, actuals); From 293d5435347006360003cb1c7cb76f4094cab93b Mon Sep 17 00:00:00 2001 From: drewbrokke Date: Fri, 10 Nov 2023 13:05:55 -0600 Subject: [PATCH 02/12] BLADE-738 cli: adds ProductKeyInfo and ProductKeyVersion models to hold comparisons --- .../blade/cli/util/ProductKeyInfo.java | 88 +++++++++++++++++++ .../blade/cli/util/ProductKeyVersion.java | 47 ++++++++++ 2 files changed, 135 insertions(+) create mode 100644 cli/src/main/java/com/liferay/blade/cli/util/ProductKeyInfo.java create mode 100644 cli/src/main/java/com/liferay/blade/cli/util/ProductKeyVersion.java diff --git a/cli/src/main/java/com/liferay/blade/cli/util/ProductKeyInfo.java b/cli/src/main/java/com/liferay/blade/cli/util/ProductKeyInfo.java new file mode 100644 index 000000000..15f13c4a9 --- /dev/null +++ b/cli/src/main/java/com/liferay/blade/cli/util/ProductKeyInfo.java @@ -0,0 +1,88 @@ +/** + * SPDX-FileCopyrightText: (c) 2023 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.blade.cli.util; + +import java.util.Comparator; + +/** + * @author Drew Brokke + */ +public class ProductKeyInfo implements Comparable { + + @Override + public int compareTo(final ProductKeyInfo keyInfo) { + return Comparator.comparing( + ProductKeyInfo::getProductRank + ).thenComparing( + ProductKeyInfo::isQuarterly + ).thenComparing( + ProductKeyInfo::getMajorProductKeyVersion + ).thenComparing( + ProductKeyInfo::getMinorProductKeyVersion + ).thenComparing( + ProductKeyInfo::getMicroProductKeyVersion + ).reversed( + ).compare( + this, keyInfo + ); + } + + public ProductKeyVersion getMajorProductKeyVersion() { + return _majorProductKeyVersion; + } + + public ProductKeyVersion getMicroProductKeyVersion() { + return _microProductKeyVersion; + } + + public ProductKeyVersion getMinorProductKeyVersion() { + return _minorProductKeyVersion; + } + + public String getProduct() { + return _product; + } + + public int getProductRank() { + return _productRank; + } + + public boolean isQuarterly() { + return _quarterly; + } + + public void setMajorProductKeyVersion(ProductKeyVersion majorProductKeyVersion) { + _majorProductKeyVersion = majorProductKeyVersion; + } + + public void setMicroProductKeyVersion(ProductKeyVersion microProductKeyVersion) { + _microProductKeyVersion = microProductKeyVersion; + } + + public void setMinorProductKeyVersion(ProductKeyVersion minorProductKeyVersion) { + _minorProductKeyVersion = minorProductKeyVersion; + } + + public void setProduct(String product) { + _product = product; + } + + public void setProductRank(int productRank) { + _productRank = productRank; + } + + public void setQuarterly(boolean quarterly) { + _quarterly = quarterly; + } + + private ProductKeyVersion _majorProductKeyVersion = ProductKeyVersion.BLANK; + private ProductKeyVersion _microProductKeyVersion = ProductKeyVersion.BLANK; + private ProductKeyVersion _minorProductKeyVersion = ProductKeyVersion.BLANK; + private String _product; + private int _productRank = -1; + private boolean _quarterly = false; + +} \ No newline at end of file diff --git a/cli/src/main/java/com/liferay/blade/cli/util/ProductKeyVersion.java b/cli/src/main/java/com/liferay/blade/cli/util/ProductKeyVersion.java new file mode 100644 index 000000000..38b7f32ca --- /dev/null +++ b/cli/src/main/java/com/liferay/blade/cli/util/ProductKeyVersion.java @@ -0,0 +1,47 @@ +/** + * SPDX-FileCopyrightText: (c) 2023 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.blade.cli.util; + +import java.util.Comparator; + +/** + * @author Drew Brokke + */ +public class ProductKeyVersion implements Comparable { + + public static final ProductKeyVersion BLANK = new ProductKeyVersion(); + + @Override + public int compareTo(final ProductKeyVersion version) { + return Comparator.comparingInt( + ProductKeyVersion::getNumber + ).thenComparing( + ProductKeyVersion::getType + ).compare( + this, version + ); + } + + public int getNumber() { + return _number; + } + + public String getType() { + return _type; + } + + public void setNumber(int number) { + _number = number; + } + + public void setType(String type) { + _type = type; + } + + private int _number = 0; + private String _type; + +} \ No newline at end of file From 1fca7b63bcf061fa3a93cb046f35078d1fde28e1 Mon Sep 17 00:00:00 2001 From: drewbrokke Date: Fri, 10 Nov 2023 13:06:29 -0600 Subject: [PATCH 03/12] BLADE-738 cli: adds ProductKeyUtil to handle parsing and validation of product key strings --- .../blade/cli/util/ProductKeyUtil.java | 149 ++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 cli/src/main/java/com/liferay/blade/cli/util/ProductKeyUtil.java diff --git a/cli/src/main/java/com/liferay/blade/cli/util/ProductKeyUtil.java b/cli/src/main/java/com/liferay/blade/cli/util/ProductKeyUtil.java new file mode 100644 index 000000000..8011dbb6c --- /dev/null +++ b/cli/src/main/java/com/liferay/blade/cli/util/ProductKeyUtil.java @@ -0,0 +1,149 @@ +/** + * SPDX-FileCopyrightText: (c) 2023 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.blade.cli.util; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author Drew Brokke + */ +public class ProductKeyUtil { + + public static final Comparator comparator = ProductKeyUtil::compare; + public static final Pattern productKeyCommercePattern = Pattern.compile( + "^(?commerce)-(?[1-9]\\.\\d\\.\\d)(?:-(?[1-9]\\.\\d))?$"); + public static final Pattern productKeyDXPNonquarterlyPattern = Pattern.compile( + "^(?dxp)-(?[1-9]\\.\\d)-(?(?:de|ep|fp|ga|sp|u)\\d+)$"); + public static final Pattern productKeyDXPQuarterlyPattern = Pattern.compile( + "^(?dxp)-(?2\\d{3})\\.(?q[1234])\\.(?\\d+)$"); + public static final Pattern productKeyPortalPattern = Pattern.compile( + "^(?portal)-(?[1-9]\\.\\d)-(?ga\\d+)$"); + + public static int compare(String productKey1, String productKey2) { + ProductKeyInfo keyInfo1 = createProductKeyInfo(productKey1); + + return keyInfo1.compareTo(createProductKeyInfo(productKey2)); + } + + public static ProductKeyInfo createProductKeyInfo(String productKey) { + Matcher matcher = _getFirstMatchingMatcher( + productKey, productKeyDXPQuarterlyPattern, productKeyDXPNonquarterlyPattern, productKeyPortalPattern, + productKeyCommercePattern); + + if (matcher == null) { + throw new IllegalArgumentException(String.format("%s is not a valid Liferay product key\n", productKey)); + } + + ProductKeyInfo productKeyInfo = new ProductKeyInfo(); + + _withGroup( + matcher, "product", + group -> { + productKeyInfo.setProduct(group); + + productKeyInfo.setProductRank(_getProductRank(group)); + }); + _withGroup(matcher, "major", group -> productKeyInfo.setMajorProductKeyVersion(createProductKeyVersion(group))); + _withGroup( + matcher, "minor", + group -> { + ProductKeyVersion minorProductKeyVersion = createProductKeyVersion(group); + + productKeyInfo.setMinorProductKeyVersion(minorProductKeyVersion); + + if (Objects.equals(productKeyInfo.getProduct(), "dxp") && + Objects.equals(minorProductKeyVersion.getType(), "q")) { + + productKeyInfo.setQuarterly(true); + } + }); + _withGroup(matcher, "micro", group -> productKeyInfo.setMicroProductKeyVersion(createProductKeyVersion(group))); + + return productKeyInfo; + } + + public static ProductKeyVersion createProductKeyVersion(String versionString) { + ProductKeyVersion productKeyVersion = new ProductKeyVersion(); + + StringBuilder numberStringBuilder = new StringBuilder(); + StringBuilder typeStringBuilder = new StringBuilder(); + + for (char c : versionString.toCharArray()) { + if (Character.isDigit(c)) { + numberStringBuilder.append(c); + } + else if (Character.isAlphabetic(c)) { + typeStringBuilder.append(c); + } + } + + if (numberStringBuilder.length() > 0) { + productKeyVersion.setNumber(Integer.parseInt(numberStringBuilder.toString())); + } + + productKeyVersion.setType(typeStringBuilder.toString()); + + return productKeyVersion; + } + + public static boolean verifyCommerceWorkspaceProduct(String product) { + return _matchesAny(product, productKeyCommercePattern); + } + + public static boolean verifyPortalDxpWorkspaceProduct(String product) { + return _matchesAny( + product, productKeyDXPQuarterlyPattern, productKeyDXPNonquarterlyPattern, productKeyPortalPattern); + } + + private static Matcher _getFirstMatchingMatcher(String s, Pattern... patterns) { + for (Pattern pattern : patterns) { + Matcher matcher = pattern.matcher(s); + + if (matcher.matches()) { + return matcher; + } + } + + return null; + } + + private static int _getProductRank(String name) { + return _orderedProducts.size() - _orderedProducts.indexOf(name); + } + + private static boolean _matchesAny(String s, Pattern... patterns) { + Matcher matcher = _getFirstMatchingMatcher(s, patterns); + + if (matcher != null) { + return true; + } + + return false; + } + + private static void _withGroup(Matcher matcher, String groupName, Consumer consumer) { + try { + String group = matcher.group(groupName); + + if (group != null) { + consumer.accept(group); + } + } + catch (Exception exception) { + } + } + + private static final List _orderedProducts = Collections.unmodifiableList( + Arrays.asList("dxp", "portal", "commerce")); + +} \ No newline at end of file From afbd31a9b01c89ad387becd5ada1b4b9cf5ff391 Mon Sep 17 00:00:00 2001 From: drewbrokke Date: Fri, 10 Nov 2023 15:20:31 -0600 Subject: [PATCH 04/12] BLADE-738 cli: adds ProductKeyUtilTest to test the comparator --- .../blade/cli/util/ProductKeyUtilTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 cli/src/test/java/com/liferay/blade/cli/util/ProductKeyUtilTest.java diff --git a/cli/src/test/java/com/liferay/blade/cli/util/ProductKeyUtilTest.java b/cli/src/test/java/com/liferay/blade/cli/util/ProductKeyUtilTest.java new file mode 100644 index 000000000..0dc4c22da --- /dev/null +++ b/cli/src/test/java/com/liferay/blade/cli/util/ProductKeyUtilTest.java @@ -0,0 +1,46 @@ +/** + * SPDX-FileCopyrightText: (c) 2023 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.blade.cli.util; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Assert; +import org.junit.Test; + +/** + * @author Gregory Amerson + * @author Drew Brokke + */ +public class ProductKeyUtilTest { + + @Test + public void testComparator() throws Exception { + List expectedKeys = Arrays.asList( + "dxp-2023.q3.2", "dxp-2023.q2.1", "dxp-2022.q3.1", "dxp-7.2-sp3", "dxp-7.2-sp2", "dxp-7.2-sp1", + "portal-7.3-ga1", "portal-7.1-ga2", "portal-7.1-ga1", "commerce-2.0.7-7.2", "commerce-2.0.7-7.1", + "commerce-2.0.6"); + + List actualKeys = new ArrayList<>(expectedKeys); + + actualKeys.sort(null); + + actualKeys.sort(ProductKeyUtil.comparator); + + Assert.assertEquals( + expectedKeys.stream( + ).collect( + Collectors.joining(System.lineSeparator()) + ), + actualKeys.stream( + ).collect( + Collectors.joining(System.lineSeparator()) + )); + } + +} \ No newline at end of file From 89384a380ee40c2bd5deac5366c6853b97c79911 Mon Sep 17 00:00:00 2001 From: drewbrokke Date: Fri, 10 Nov 2023 15:21:55 -0600 Subject: [PATCH 05/12] BLADE-738 cli: LiferayMoreVersionValidator: uses new ProductKeyUtil validators --- .../cli/command/validator/LiferayMoreVersionValidator.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cli/src/main/java/com/liferay/blade/cli/command/validator/LiferayMoreVersionValidator.java b/cli/src/main/java/com/liferay/blade/cli/command/validator/LiferayMoreVersionValidator.java index 530c81f37..b43158c1c 100644 --- a/cli/src/main/java/com/liferay/blade/cli/command/validator/LiferayMoreVersionValidator.java +++ b/cli/src/main/java/com/liferay/blade/cli/command/validator/LiferayMoreVersionValidator.java @@ -9,6 +9,7 @@ import com.liferay.blade.cli.WorkspaceConstants; import com.liferay.blade.cli.util.BladeUtil; +import com.liferay.blade.cli.util.ProductKeyUtil; import com.liferay.project.templates.extensions.util.VersionUtil; import java.util.ArrayList; @@ -34,8 +35,8 @@ public void validate(String name, String value) throws ParameterException { possibleValues.addAll(WorkspaceConstants.originalLiferayVersions); if ((!possibleValues.contains(value) && !allTargetPlatformVersions.contains(value)) || - (!BladeUtil.verifyPortalDxpWorkspaceProduct(value) && !VersionUtil.isLiferayVersion(value) && - !BladeUtil.verifyCommerceWorkspaceProduct(value))) { + (!ProductKeyUtil.verifyPortalDxpWorkspaceProduct(value) && !VersionUtil.isLiferayVersion(value) && + !ProductKeyUtil.verifyCommerceWorkspaceProduct(value))) { throw new ParameterException(value + " is not a valid value."); } From 5ccaca532d4d5dee94d29afc81c818c6808a2cf7 Mon Sep 17 00:00:00 2001 From: drewbrokke Date: Fri, 10 Nov 2023 15:22:23 -0600 Subject: [PATCH 06/12] BLADE-738 cli: LiferayMoreVersionValidatorTest: uses ProductKeyUtil.comparator --- .../validator/LiferayMoreVersionValidatorTest.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/cli/src/test/java/com/liferay/blade/cli/command/validator/LiferayMoreVersionValidatorTest.java b/cli/src/test/java/com/liferay/blade/cli/command/validator/LiferayMoreVersionValidatorTest.java index 34dae99ca..9cec6d28c 100644 --- a/cli/src/test/java/com/liferay/blade/cli/command/validator/LiferayMoreVersionValidatorTest.java +++ b/cli/src/test/java/com/liferay/blade/cli/command/validator/LiferayMoreVersionValidatorTest.java @@ -6,11 +6,9 @@ package com.liferay.blade.cli.command.validator; import com.liferay.blade.cli.util.FileUtil; -import com.liferay.blade.cli.util.Pair; -import com.liferay.blade.cli.util.ProductInfo; +import com.liferay.blade.cli.util.ProductKeyUtil; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Scanner; import java.util.stream.Collectors; @@ -65,12 +63,8 @@ public void testWithRandom() throws Exception { } List sorted = randomLines.stream( - ).map( - line -> new Pair(line, new ProductInfo(Collections.emptyMap())) ).sorted( - new WorkspaceProductComparator() - ).map( - Pair::first + ProductKeyUtil.comparator ).collect( Collectors.toList() ); From f71505e2778aa4351493bb5f6fe251cd798fa678 Mon Sep 17 00:00:00 2001 From: drewbrokke Date: Fri, 10 Nov 2023 15:23:08 -0600 Subject: [PATCH 07/12] BLADE-738 cli: BladeUtil: uses ProductKeyUtil.comparator --- .../com/liferay/blade/cli/util/BladeUtil.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java b/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java index 42a753d24..492765082 100644 --- a/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java +++ b/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java @@ -8,7 +8,6 @@ import com.liferay.blade.cli.BladeCLI; import com.liferay.blade.cli.Extensions; import com.liferay.blade.cli.command.SamplesCommand; -import com.liferay.blade.cli.command.validator.WorkspaceProductComparator; import com.liferay.project.templates.ProjectTemplates; import com.liferay.project.templates.extensions.util.ProjectTemplatesUtil; @@ -428,19 +427,22 @@ public static List getWorkspaceProductKeys(boolean promoted) { ).stream( ).filter( key -> Objects.nonNull(productInfos.get(key)) - ).map( - key -> new Pair<>(key, new ProductInfo((Map)productInfos.get(key))) ).filter( - pair -> { - ProductInfo productInfo = pair.second(); + key -> { + ProductInfo productInfo = new ProductInfo((Map)productInfos.get(key)); + + if (productInfo.getTargetPlatformVersion() == null) { + return false; + } - return Objects.nonNull(productInfo.getTargetPlatformVersion()) && - (!promoted || productInfo.isPromoted()); + if (promoted && !productInfo.isPromoted()) { + return false; + } + + return true; } ).sorted( - new WorkspaceProductComparator() - ).map( - Pair::first + ProductKeyUtil.comparator ).collect( Collectors.toList() ); From 17d275e8d08593467f86d99cb709ad856bd8f96a Mon Sep 17 00:00:00 2001 From: drewbrokke Date: Fri, 10 Nov 2023 15:23:49 -0600 Subject: [PATCH 08/12] BLADE-738 cli: updates test resources to account for new quarterly keys --- .../com/liferay/blade/cli/command/validator/random.txt | 5 +++++ .../com/liferay/blade/cli/command/validator/sorted.txt | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/cli/src/test/resources/com/liferay/blade/cli/command/validator/random.txt b/cli/src/test/resources/com/liferay/blade/cli/command/validator/random.txt index f6a0180cf..9c2c735f0 100644 --- a/cli/src/test/resources/com/liferay/blade/cli/command/validator/random.txt +++ b/cli/src/test/resources/com/liferay/blade/cli/command/validator/random.txt @@ -1,10 +1,13 @@ +dxp-2023.q2.1 dxp-7.0-sp8 commerce-2.0.7-7.2 dxp-7.0-sp10 +dxp-2023.q1.1 portal-7.3-ga3 dxp-7.1-sp2 commerce-2.0.7-7.1 portal-7.3-ga2 +dxp-2023.q2.2 commerce-2.0.2 dxp-7.0-sp5 dxp-7.2-ga1 @@ -17,6 +20,7 @@ commerce-1.1.3 portal-7.1-ga4 dxp-7.0-sp3 portal-7.0-ga5 +dxp-2024.q1.10 commerce-2.0.5 commerce-2.0.6 commerce-1.1.4 @@ -30,6 +34,7 @@ commerce-1.0.2 commerce-2.0.4 commerce-2.0.1 dxp-7.0-sp9 +dxp-2024.q1.2 commerce-2.0.7 portal-7.2-ga2 commerce-1.1.6 diff --git a/cli/src/test/resources/com/liferay/blade/cli/command/validator/sorted.txt b/cli/src/test/resources/com/liferay/blade/cli/command/validator/sorted.txt index 85caa044f..add45002b 100644 --- a/cli/src/test/resources/com/liferay/blade/cli/command/validator/sorted.txt +++ b/cli/src/test/resources/com/liferay/blade/cli/command/validator/sorted.txt @@ -1,3 +1,8 @@ +dxp-2024.q1.10 +dxp-2024.q1.2 +dxp-2023.q2.2 +dxp-2023.q2.1 +dxp-2023.q1.1 dxp-7.2-sp1 dxp-7.2-ga1 dxp-7.1-sp4 From 0a54e425148d06b02925c09a0e5593cb6dc8c181 Mon Sep 17 00:00:00 2001 From: drewbrokke Date: Fri, 10 Nov 2023 15:24:25 -0600 Subject: [PATCH 09/12] BLADE-738 cli: BladeUtil: simplify entry usage --- cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java b/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java index 492765082..07dab9e16 100644 --- a/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java +++ b/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java @@ -457,7 +457,7 @@ public static Set getWorkspaceProductTargetPlatformVersions(boolean prom ).filter( entry -> Objects.nonNull(productInfos.get(entry.getKey())) ).map( - entry -> new ProductInfo((Map)productInfos.get(entry.getKey())) + entry -> new ProductInfo((Map)entry.getValue()) ).filter( product -> Objects.nonNull(product.getTargetPlatformVersion()) && (!promoted || product.isPromoted()) ).map( From 3de6c562fcb619dd1caf0f6e503561b2a2fe0f77 Mon Sep 17 00:00:00 2001 From: drewbrokke Date: Fri, 10 Nov 2023 15:24:39 -0600 Subject: [PATCH 10/12] BLADE-738 cli: BladeUtil: removes unused fields and methods --- .../com/liferay/blade/cli/util/BladeUtil.java | 47 ------------------- 1 file changed, 47 deletions(-) diff --git a/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java b/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java index 07dab9e16..a749b28d5 100644 --- a/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java +++ b/cli/src/main/java/com/liferay/blade/cli/util/BladeUtil.java @@ -85,8 +85,6 @@ import org.gradle.internal.impldep.com.google.common.base.Strings; -import org.osgi.framework.Version; - /** * @author Gregory Amerson * @author David Truong @@ -115,34 +113,6 @@ public static boolean canConnect(String host, int port) { return _canConnect(localAddress, remoteAddress); } - public static int compareVersions(Version v1, Version v2) { - if (v2 == v1) { - return 0; - } - - int result = v1.getMajor() - v2.getMajor(); - - if (result != 0) { - return result; - } - - result = v1.getMinor() - v2.getMinor(); - - if (result != 0) { - return result; - } - - result = v1.getMicro() - v2.getMicro(); - - if (result != 0) { - return result; - } - - String s1 = v1.getQualifier(); - - return s1.compareTo(v2.getQualifier()); - } - public static Path downloadFile(String urlString, Path cacheDirPath, String targetFileName) throws Exception { URL downladURL = new URL(urlString); @@ -747,18 +717,6 @@ public static void tail(Path path, PrintStream printStream) throws IOException { } } - public static boolean verifyCommerceWorkspaceProduct(String product) { - Matcher matcher = _productCommerceVersionPattern.matcher(product); - - return matcher.matches(); - } - - public static boolean verifyPortalDxpWorkspaceProduct(String product) { - Matcher matcher = _productPortalDXPVersionPattern.matcher(product); - - return matcher.matches(); - } - public static void writePropertyValue(File propertyFile, String key, String value) throws Exception { String property = System.lineSeparator() + key + "=" + value; @@ -902,12 +860,7 @@ private static Path _downloadFile( private static final String _PRODUCT_INFO_URL = "https://releases.liferay.com/tools/workspace/.product_info.json"; private static final Pattern _microPattern = Pattern.compile("((([efs])p)|(ga)|(u))([0-9]+)(-[0-9]+)?"); - private static final Pattern _productCommerceVersionPattern = Pattern.compile( - "^(commerce)-([1-9]\\d|[0-9])\\.([0-9]\\d|\\d).([0-9]\\d|\\d)(-(([1-9]\\d|[0-9])\\.([1-9]\\d|[0-9])$)+)*"); private static Map _productInfoMap = Collections.emptyMap(); - private static final Pattern _productPortalDXPVersionPattern = Pattern.compile( - "^(portal|dxp)-((([1-9]\\d|[0-9])\\.([0-9]\\d|\\d))-(((([efsd])([pe]))|u|ga)([0-9]\\d*)$)+)|" + - "((\\d{4})\\.([qQ]\\d)\\.\\d)"); private static final File _workspaceCacheDir = new File( System.getProperty("user.home"), _DEFAULT_WORKSPACE_CACHE_DIR_NAME); From 9ebf5ac8a9d0801e53af8a2890d45652ef7e26c2 Mon Sep 17 00:00:00 2001 From: drewbrokke Date: Fri, 10 Nov 2023 15:25:07 -0600 Subject: [PATCH 11/12] BLADE-738 cli: removes WorkspaceProductComparator and WorkspaceProductComparatorTest --- .../validator/WorkspaceProductComparator.java | 176 ------------------ .../WorkspaceProductComparatorTest.java | 100 ---------- 2 files changed, 276 deletions(-) delete mode 100644 cli/src/main/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparator.java delete mode 100644 cli/src/test/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparatorTest.java diff --git a/cli/src/main/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparator.java b/cli/src/main/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparator.java deleted file mode 100644 index 2ea953147..000000000 --- a/cli/src/main/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparator.java +++ /dev/null @@ -1,176 +0,0 @@ -/** - * SPDX-FileCopyrightText: (c) 2023 Liferay, Inc. https://liferay.com - * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 - */ - -package com.liferay.blade.cli.command.validator; - -import aQute.bnd.version.Version; - -import com.liferay.blade.cli.util.BladeUtil; -import com.liferay.blade.cli.util.Pair; -import com.liferay.blade.cli.util.ProductInfo; -import com.liferay.blade.cli.util.StringUtil; - -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; - -import java.util.Comparator; -import java.util.Locale; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @author Simon Jiang - * @author Gregory Amerson - */ -public class WorkspaceProductComparator implements Comparator> { - - @Override - public int compare(Pair aPair, Pair bPair) { - String aKey = aPair.first(); - String bKey = bPair.first(); - - if (aKey.startsWith("dxp") && !bKey.startsWith("dxp")) { - return -1; - } - else if (aKey.startsWith("portal") && bKey.startsWith("dxp")) { - return 1; - } - else if (aKey.startsWith("portal") && bKey.startsWith("commerce")) { - return -1; - } - else if (aKey.startsWith("commerce") && !bKey.startsWith("commerce")) { - return 1; - } - else if (!StringUtil.isNullOrEmpty(_getProductQuarterVersion(aKey, 1)) && - StringUtil.isNullOrEmpty(_getProductQuarterVersion(bKey, 1))) { - - return -1; - } - else if (!StringUtil.isNullOrEmpty(_getProductQuarterVersion(aKey, 1)) && - !StringUtil.isNullOrEmpty(_getProductQuarterVersion(bKey, 1))) { - - if (!StringUtil.equals(_getProductQuarterVersion(aKey, 1), _getProductQuarterVersion(bKey, 1))) { - Version aYearVersion = Version.parseVersion(_getProductQuarterVersion(aKey, 1)); - Version bYearVersion = Version.parseVersion(_getProductQuarterVersion(bKey, 1)); - - return -1 * aYearVersion.compareTo(bYearVersion); - } - - String aProductQuarterVersion = _getProductQuarterVersion(aKey, 2); - String bProductQuarterVersion = _getProductQuarterVersion(bKey, 2); - - if (BladeUtil.isEmpty(aProductQuarterVersion)) { - return 1; - } - else if (BladeUtil.isEmpty(bProductQuarterVersion)) { - return -1; - } - else if (!StringUtil.equals(aProductQuarterVersion, bProductQuarterVersion)) { - Version aQuarterVersion = Version.parseVersion(aProductQuarterVersion); - Version bQuarterVersion = Version.parseVersion(bProductQuarterVersion); - - return -1 * aQuarterVersion.compareTo(bQuarterVersion); - } - - String aProductQuarterMicroVersion = _getProductQuarterVersion(aKey, 3); - String bProductQuarterMicroVersion = _getProductQuarterVersion(bKey, 3); - - if (BladeUtil.isEmpty(aProductQuarterMicroVersion)) { - return 1; - } - else if (BladeUtil.isEmpty(bProductQuarterMicroVersion)) { - return -1; - } - else if (!StringUtil.equals(aProductQuarterMicroVersion, bProductQuarterMicroVersion)) { - Version aMicroVersion = Version.parseVersion(aProductQuarterMicroVersion); - Version bMicroVersion = Version.parseVersion(bProductQuarterMicroVersion); - - return -1 * aMicroVersion.compareTo(bMicroVersion); - } - } - - if (!StringUtil.equals(_getProductMainVersion(aKey), _getProductMainVersion(bKey))) { - Version aProductMainVersion = Version.parseVersion(_getProductMainVersion(aKey)); - Version bProductMainVersion = Version.parseVersion(_getProductMainVersion(bKey)); - - return -1 * aProductMainVersion.compareTo(bProductMainVersion); - } - - String aProductMicroVersion = _getProductMicroVersion(aKey); - String bProductMicroVersion = _getProductMicroVersion(bKey); - - if (BladeUtil.isEmpty(aProductMicroVersion)) { - return 1; - } - else if (BladeUtil.isEmpty(bProductMicroVersion)) { - return -1; - } - else if (Version.isVersion(aProductMicroVersion) && Version.isVersion(bProductMicroVersion)) { - Version aMicroVersion = Version.parseVersion(aProductMicroVersion); - Version bMicroVersion = Version.parseVersion(bProductMicroVersion); - - return -1 * aMicroVersion.compareTo(bMicroVersion); - } - - ProductInfo aProductInfo = aPair.second(); - ProductInfo bProductInfo = bPair.second(); - - try { - DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M/d/yyyy", Locale.ENGLISH); - - LocalDate aDate = LocalDate.parse(aProductInfo.getReleaseDate(), dateTimeFormatter); - LocalDate bDate = LocalDate.parse(bProductInfo.getReleaseDate(), dateTimeFormatter); - - return bDate.compareTo(aDate); - } - catch (Exception exception) { - String aMicroVersionPrefix = aProductMicroVersion.substring(0, 2); - String bMicroVersionPrefix = bProductMicroVersion.substring(0, 2); - - if (!aMicroVersionPrefix.equalsIgnoreCase(bMicroVersionPrefix)) { - return -1 * aMicroVersionPrefix.compareTo(bMicroVersionPrefix); - } - - String aMicroVersionString = aProductMicroVersion.substring(2); - String bMicroVersionString = bProductMicroVersion.substring(2); - - return Integer.parseInt(bMicroVersionString) - Integer.parseInt(aMicroVersionString); - } - } - - private String _getProductMainVersion(String productKey) { - Matcher aMatcher = _versionPattern.matcher(productKey.substring(productKey.indexOf('-') + 1)); - - if (aMatcher.find()) { - return aMatcher.group(1); - } - - return ""; - } - - private String _getProductMicroVersion(String productKey) { - String[] productKeyArrays = StringUtil.split(productKey, "-"); - - if (productKeyArrays.length > 2) { - return productKeyArrays[2]; - } - - return null; - } - - private String _getProductQuarterVersion(String productKey, int pos) { - Matcher aMatcher = _versionQuaterPattern.matcher(productKey.substring(productKey.indexOf('-') + 1)); - - if (aMatcher.find()) { - return aMatcher.group(pos); - } - - return ""; - } - - private static final Pattern _versionPattern = Pattern.compile("([0-9\\.]+).*"); - private static final Pattern _versionQuaterPattern = Pattern.compile("(\\d{4})\\.[qQ](\\d)\\.(\\d)"); - -} \ No newline at end of file diff --git a/cli/src/test/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparatorTest.java b/cli/src/test/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparatorTest.java deleted file mode 100644 index 1fcac526b..000000000 --- a/cli/src/test/java/com/liferay/blade/cli/command/validator/WorkspaceProductComparatorTest.java +++ /dev/null @@ -1,100 +0,0 @@ -/** - * SPDX-FileCopyrightText: (c) 2023 Liferay, Inc. https://liferay.com - * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 - */ - -package com.liferay.blade.cli.command.validator; - -import com.liferay.blade.cli.util.Pair; -import com.liferay.blade.cli.util.ProductInfo; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import org.junit.Assert; -import org.junit.Test; - -/** - * @author Gregory Amerson - */ -public class WorkspaceProductComparatorTest { - - @Test - public void testSortByReleaseDate() throws Exception { - List> pairs = new ArrayList<>(); - - Map map = new HashMap<>(); - - map.put("releaseDate", "10/4/2019"); - - pairs.add(new Pair<>("dxp-7.2-sp1", new ProductInfo(map))); - - map = new HashMap<>(); - - map.put("releaseDate", "12/22/2018"); - - pairs.add(new Pair<>("dxp-7.2-sp2", new ProductInfo(map))); - - map = new HashMap<>(); - - map.put("releaseDate", "5/31/2019"); - - pairs.add(new Pair<>("dxp-7.2-sp3", new ProductInfo(map))); - - map = new HashMap<>(); - - map.put("releaseDate", "1/31/2011"); - - pairs.add(new Pair<>("portal-7.1-ga1", new ProductInfo(map))); - - map = new HashMap<>(); - - map.put("releaseDate", "1/31/2012"); - - pairs.add(new Pair<>("portal-7.1-ga2", new ProductInfo(map))); - - map = new HashMap<>(); - - map.put("releaseDate", "6/29/2020"); - - pairs.add(new Pair<>("portal-7.3-ga1", new ProductInfo(map))); - - map.put("releaseDate", "6/29/2022"); - - pairs.add(new Pair<>("dxp-2022.q3.1", new ProductInfo(map))); - - map.put("releaseDate", "6/29/2023"); - - pairs.add(new Pair<>("dxp-2023.q2.1", new ProductInfo(map))); - - map.put("releaseDate", "7/29/2023"); - - pairs.add(new Pair<>("dxp-2023.q3.1", new ProductInfo(map))); - - map.put("releaseDate", "8/29/2023"); - - pairs.add(new Pair<>("dxp-2023.q3.2", new ProductInfo(map))); - - String[] actuals = pairs.stream( - ).sorted( - new WorkspaceProductComparator() - ).map( - Pair::first - ).collect( - Collectors.toList() - ).toArray( - new String[0] - ); - - String[] expecteds = { - "dxp-2023.q3.2", "dxp-2023.q3.1", "dxp-2023.q2.1", "dxp-2022.q3.1", "dxp-7.2-sp1", "dxp-7.2-sp3", - "dxp-7.2-sp2", "portal-7.3-ga1", "portal-7.1-ga2", "portal-7.1-ga1" - }; - - Assert.assertArrayEquals(expecteds, actuals); - } - -} \ No newline at end of file From a394703a9373510bac9b58aa19a2e1126f418b69 Mon Sep 17 00:00:00 2001 From: drewbrokke Date: Fri, 10 Nov 2023 17:17:50 -0600 Subject: [PATCH 12/12] BLADE-738 cli: LiferayDefaultVersionValidatorTest: updates assertion based on latest product info --- .../command/validator/LiferayDefaultVersionValidatorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/test/java/com/liferay/blade/cli/command/validator/LiferayDefaultVersionValidatorTest.java b/cli/src/test/java/com/liferay/blade/cli/command/validator/LiferayDefaultVersionValidatorTest.java index 5cb30b6f0..06de3e3b6 100644 --- a/cli/src/test/java/com/liferay/blade/cli/command/validator/LiferayDefaultVersionValidatorTest.java +++ b/cli/src/test/java/com/liferay/blade/cli/command/validator/LiferayDefaultVersionValidatorTest.java @@ -40,7 +40,7 @@ public void testSort() throws Exception { String last = vals.get(vals.size() - 1); - Assert.assertTrue(last, last.startsWith("commerce")); + Assert.assertTrue(last, last.startsWith("portal")); } } \ No newline at end of file