From e535dd949db5f6bd3957f9fab22d8cf1e14141bd Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Tue, 12 Dec 2023 10:28:01 +0100 Subject: [PATCH 01/15] [gitflow-maven-plugin] Update for next development version 5.4.5-SNAPSHOT --- core/pom.xml | 2 +- junit4/pom.xml | 6 +++--- junit5/pom.xml | 6 +++--- parent/pom.xml | 4 ++-- pom.xml | 4 ++-- relocate/pom.xml | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 3f6d0b47..815eee94 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -25,7 +25,7 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.4.4 + 5.4.5-SNAPSHOT ../parent/pom.xml diff --git a/junit4/pom.xml b/junit4/pom.xml index 29362736..462d6d55 100644 --- a/junit4/pom.xml +++ b/junit4/pom.xml @@ -25,7 +25,7 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.4.4 + 5.4.5-SNAPSHOT ../parent/pom.xml @@ -54,7 +54,7 @@ io.wcm io.wcm.testing.aem-mock.core - 5.4.4 + 5.4.5-SNAPSHOT compile @@ -87,7 +87,7 @@ io.wcm io.wcm.testing.aem-mock.core - 5.4.4 + 5.4.5-SNAPSHOT tests test diff --git a/junit5/pom.xml b/junit5/pom.xml index f35305ad..8b57fb12 100644 --- a/junit5/pom.xml +++ b/junit5/pom.xml @@ -25,7 +25,7 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.4.4 + 5.4.5-SNAPSHOT ../parent/pom.xml @@ -54,14 +54,14 @@ io.wcm io.wcm.testing.aem-mock.core - 5.4.4 + 5.4.5-SNAPSHOT compile io.wcm io.wcm.testing.aem-mock.core - 5.4.4 + 5.4.5-SNAPSHOT tests test diff --git a/parent/pom.xml b/parent/pom.xml index ddfa5af5..978d6945 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -31,7 +31,7 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.4.4 + 5.4.5-SNAPSHOT pom AEM Mocks @@ -71,7 +71,7 @@ 1.0.0 - 2023-12-12T09:23:37Z + 2023-12-12T09:27:59Z diff --git a/pom.xml b/pom.xml index e6c33a1d..fd46e87b 100644 --- a/pom.xml +++ b/pom.xml @@ -25,14 +25,14 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.4.4 + 5.4.5-SNAPSHOT parent/pom.xml io.wcm io.wcm.testing.aem-mock.root pom - 5.4.4 + 5.4.5-SNAPSHOT AEM Mocks ${site.url}/${site.url.module.prefix}/ diff --git a/relocate/pom.xml b/relocate/pom.xml index ed1fbefd..7c25f55c 100644 --- a/relocate/pom.xml +++ b/relocate/pom.xml @@ -25,7 +25,7 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.4.4 + 5.4.5-SNAPSHOT ../parent/pom.xml From 5fec28f837c55f4fe3e6d98225409029862e9596 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Mon, 18 Dec 2023 12:29:49 +0100 Subject: [PATCH 02/15] update parent dependency --- parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parent/pom.xml b/parent/pom.xml index 978d6945..2c76bfec 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -25,7 +25,7 @@ io.wcm io.wcm.parent_toplevel - 2.2.6 + 2.2.8 From 861850b3e615f673054346bb9612bbb57bbe7060 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Mon, 18 Dec 2023 13:08:30 +0100 Subject: [PATCH 03/15] use commons collections 4 --- core/src/main/java/io/wcm/testing/mock/aem/MockTag.java | 2 +- core/src/main/java/io/wcm/testing/mock/aem/MockTagManager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockTag.java b/core/src/main/java/io/wcm/testing/mock/aem/MockTag.java index 9917a2cd..632ab464 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockTag.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockTag.java @@ -35,7 +35,7 @@ import java.util.Queue; import java.util.function.BinaryOperator; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.jackrabbit.util.ISO9075; import org.apache.sling.api.adapter.SlingAdaptable; diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockTagManager.java b/core/src/main/java/io/wcm/testing/mock/aem/MockTagManager.java index 8a48304b..490d0b65 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockTagManager.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockTagManager.java @@ -38,7 +38,7 @@ import javax.jcr.Session; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.sling.api.resource.ModifiableValueMap; import org.apache.sling.api.resource.PersistenceException; From 310d545ba60fdb87799a3fcca1e3e4150e338907 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Wed, 20 Dec 2023 19:58:30 +0100 Subject: [PATCH 04/15] Switch to AEM 6.5.17 as minimum version. --- changes.xml | 6 ++++++ core/pom.xml | 8 ++++---- junit4/pom.xml | 6 +++--- junit5/pom.xml | 6 +++--- parent/pom.xml | 8 ++++---- pom.xml | 4 ++-- relocate/pom.xml | 2 +- src/site/markdown/index.md | 15 ++++++++------- 8 files changed, 31 insertions(+), 24 deletions(-) diff --git a/changes.xml b/changes.xml index b1ed62c3..0be1564d 100644 --- a/changes.xml +++ b/changes.xml @@ -23,6 +23,12 @@ xsi:schemaLocation="http://maven.apache.org/changes/1.0.0 http://maven.apache.org/plugins/maven-changes-plugin/xsd/changes-1.0.0.xsd"> + + + Switch to AEM 6.5.17 as minimum version. + + + Update to latest Sling Mock. diff --git a/core/pom.xml b/core/pom.xml index 815eee94..d8f08a59 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -25,7 +25,7 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.4.5-SNAPSHOT + 5.5.0-SNAPSHOT ../parent/pom.xml @@ -210,20 +210,20 @@ com.twelvemonkeys.imageio imageio-tiff - 3.7.0 + 3.10.1 test com.twelvemonkeys.imageio imageio-batik - 3.7.0 + 3.10.1 test org.apache.xmlgraphics batik-transcoder - 1.9.1 + 1.17 test diff --git a/junit4/pom.xml b/junit4/pom.xml index 462d6d55..4d324cc8 100644 --- a/junit4/pom.xml +++ b/junit4/pom.xml @@ -25,7 +25,7 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.4.5-SNAPSHOT + 5.5.0-SNAPSHOT ../parent/pom.xml @@ -54,7 +54,7 @@ io.wcm io.wcm.testing.aem-mock.core - 5.4.5-SNAPSHOT + 5.5.0-SNAPSHOT compile @@ -87,7 +87,7 @@ io.wcm io.wcm.testing.aem-mock.core - 5.4.5-SNAPSHOT + 5.5.0-SNAPSHOT tests test diff --git a/junit5/pom.xml b/junit5/pom.xml index 8b57fb12..0ae559cc 100644 --- a/junit5/pom.xml +++ b/junit5/pom.xml @@ -25,7 +25,7 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.4.5-SNAPSHOT + 5.5.0-SNAPSHOT ../parent/pom.xml @@ -54,14 +54,14 @@ io.wcm io.wcm.testing.aem-mock.core - 5.4.5-SNAPSHOT + 5.5.0-SNAPSHOT compile io.wcm io.wcm.testing.aem-mock.core - 5.4.5-SNAPSHOT + 5.5.0-SNAPSHOT tests test diff --git a/parent/pom.xml b/parent/pom.xml index 2c76bfec..908e9c4e 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -25,13 +25,13 @@ io.wcm io.wcm.parent_toplevel - 2.2.8 + 2.3.0-SNAPSHOT io.wcm io.wcm.testing.aem-mock.parent - 5.4.5-SNAPSHOT + 5.5.0-SNAPSHOT pom AEM Mocks @@ -53,7 +53,7 @@ 3.4.0 - 1.6.10 + 1.6.13-SNAPSHOT 1.4.4 @@ -71,7 +71,7 @@ 1.0.0 - 2023-12-12T09:27:59Z + 2023-12-20T18:49:32Z diff --git a/pom.xml b/pom.xml index fd46e87b..eb72b29e 100644 --- a/pom.xml +++ b/pom.xml @@ -25,14 +25,14 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.4.5-SNAPSHOT + 5.5.0-SNAPSHOT parent/pom.xml io.wcm io.wcm.testing.aem-mock.root pom - 5.4.5-SNAPSHOT + 5.5.0-SNAPSHOT AEM Mocks ${site.url}/${site.url.module.prefix}/ diff --git a/relocate/pom.xml b/relocate/pom.xml index 7c25f55c..fa42114c 100644 --- a/relocate/pom.xml +++ b/relocate/pom.xml @@ -25,7 +25,7 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.4.5-SNAPSHOT + 5.5.0-SNAPSHOT ../parent/pom.xml diff --git a/src/site/markdown/index.md b/src/site/markdown/index.md index a844ccb6..a7092954 100644 --- a/src/site/markdown/index.md +++ b/src/site/markdown/index.md @@ -37,13 +37,14 @@ The mock implementation supports: ### Version Support Matrix -|AEM Mock version |AEM version supported |JUnit version supported|Java version required -|-----------------|----------------------|-----------------------|------------------- -|AEM Mock 5.x |AEM 6.5.7+, AEMaaCS |JUnit 4, JUnit 5 |Java 8/Java 11 since 5.2 -|AEM Mock 4.x |AEM 6.4+, AEMaaCS |JUnit 4, JUnit 5 |Java 8 -|AEM Mock 3.x |AEM 6.3+ |JUnit 4, JUnit 5 |Java 8 -|AEM Mock 2.x |AEM 6.2+ |JUnit 4, JUnit 5 |Java 7/Java 8 since 2.2.2 -|AEM Mock 1.x |AEM 6.0+ |JUnit 4 |Java 7 +|AEM Mock version |AEM version supported |JUnit version supported |Java version required +|-------------------------|----------------------|------------------------|---------------------- +|AEM Mock 5.5.x or higher |AEM 6.5.17+, AEMaaCS |JUnit 4, JUnit 5 |Java 11 +|AEM Mock 5.0.x - 5.4.x |AEM 6.5.7+, AEMaaCS |JUnit 4, JUnit 5 |Java 8/Java 11 since 5.2 +|AEM Mock 4.x |AEM 6.4+, AEMaaCS |JUnit 4, JUnit 5 |Java 8 +|AEM Mock 3.x |AEM 6.3+ |JUnit 4, JUnit 5 |Java 8 +|AEM Mock 2.x |AEM 6.2+ |JUnit 4, JUnit 5 |Java 7/Java 8 since 2.2.2 +|AEM Mock 1.x |AEM 6.0+ |JUnit 4 |Java 7 ### Further Resources From a3d58c4833fbcf383fa885db339ca430448eabb4 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Wed, 20 Dec 2023 20:07:54 +0100 Subject: [PATCH 05/15] eliminate code warning: use equals for object comparison --- core/src/main/java/io/wcm/testing/mock/aem/MockTag.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockTag.java b/core/src/main/java/io/wcm/testing/mock/aem/MockTag.java index 632ab464..34a3a167 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockTag.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockTag.java @@ -349,7 +349,7 @@ public String getTitlePath(Locale locale) { while (ancestor != null) { Tag parent = ancestor.getParent(); - if (ancestor != this) { + if (!ancestor.equals(this)) { if (parent == null) { if (DEFAULT_NAMESPACE.equals(ancestor.getName())) { break; From d3123a855448f43aef8e6128a9b242347f4e2a7a Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Thu, 21 Dec 2023 12:51:38 +0100 Subject: [PATCH 06/15] Update to latest JCR Mock, OSGI Mock, ResourceResolver Mock, Sling Mock. --- changes.xml | 3 +++ parent/pom.xml | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/changes.xml b/changes.xml index 0be1564d..9a1e6536 100644 --- a/changes.xml +++ b/changes.xml @@ -24,6 +24,9 @@ + + Update to latest JCR Mock, OSGI Mock, ResourceResolver Mock, Sling Mock. + Switch to AEM 6.5.17 as minimum version. diff --git a/parent/pom.xml b/parent/pom.xml index 908e9c4e..17931715 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -50,22 +50,22 @@ - 3.4.0 + 3.4.1-SNAPSHOT 1.6.13-SNAPSHOT - 1.4.4 + 1.4.5-SNAPSHOT - 3.4.16 + 3.4.17-SNAPSHOT 1.4.6 - 3.1.10-1.44.0 + 3.1.11-1.44.0-SNAPSHOT 1.0.0 From d71b6299b15cde6a53e26fc46986801231f88d2a Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Mon, 15 Jan 2024 12:49:07 +0100 Subject: [PATCH 07/15] eliminate PMD warnings concerning finalize attack --- .../java/io/wcm/testing/mock/aem/MockContentFragment.java | 8 +++++++- core/src/main/java/io/wcm/testing/mock/aem/MockTag.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment.java b/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment.java index 1e54a69b..a9d8431c 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment.java @@ -50,7 +50,7 @@ /** * Mock implementation of {@link ContentFragment}. */ -class MockContentFragment extends MockContentFragment_Versionable implements ContentFragment { +final class MockContentFragment extends MockContentFragment_Versionable implements ContentFragment { private final Resource assetResource; private final Asset asset; @@ -262,35 +262,41 @@ public void removeVariation(String variation) throws ContentFragmentException { } // latest AEM Cloud API + @Override public @Nullable Calendar getLastModifiedDate() { throw new UnsupportedOperationException(); } // latest AEM Cloud API + @Override @SuppressWarnings("unused") public @NotNull Calendar getLastModifiedDeep() throws ContentFragmentException { throw new UnsupportedOperationException(); } // latest AEM Cloud API + @Override @SuppressWarnings("unused") public void setTags(@NotNull Tag[] tags) throws ContentFragmentException { throw new UnsupportedOperationException(); } // latest AEM Cloud API + @Override @SuppressWarnings("unused") public @NotNull Tag[] getTags() throws ContentFragmentException { throw new UnsupportedOperationException(); } // latest AEM Cloud API + @Override @SuppressWarnings("unused") public void setVariationTags(@NotNull Tag[] tags, @NotNull String variationName) throws ContentFragmentException { throw new UnsupportedOperationException(); } // latest AEM Cloud API + @Override @SuppressWarnings("unused") public @NotNull Tag[] getVariationTags(@NotNull String variationName) throws ContentFragmentException { throw new UnsupportedOperationException(); diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockTag.java b/core/src/main/java/io/wcm/testing/mock/aem/MockTag.java index 34a3a167..897fb1ce 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockTag.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockTag.java @@ -58,7 +58,7 @@ * Mock implementation of {@link Tag}. */ @SuppressWarnings("null") -class MockTag extends SlingAdaptable implements Tag, Comparable { +final class MockTag extends SlingAdaptable implements Tag, Comparable { /** resource being represented as a Tag */ private final Resource resource; From 358ee43d5795adbd81f301e757c3adccd3f871d6 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Mon, 15 Jan 2024 14:55:58 +0100 Subject: [PATCH 08/15] Add mock for AssetDelivery OSGi service (#30) --- changes.xml | 3 + .../mock/aem/dam/MockAssetDelivery.java | 113 ++++++++++++++++++ .../testing/mock/aem/dam/package-info.java | 2 +- .../mock/aem/dam/MockAssetDeliveryTest.java | 87 ++++++++++++++ 4 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/io/wcm/testing/mock/aem/dam/MockAssetDelivery.java create mode 100644 core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetDeliveryTest.java diff --git a/changes.xml b/changes.xml index 9a1e6536..1120cc23 100644 --- a/changes.xml +++ b/changes.xml @@ -24,6 +24,9 @@ + + Add mock for AssetDelivery OSGi service (not registered by default). + Update to latest JCR Mock, OSGI Mock, ResourceResolver Mock, Sling Mock. diff --git a/core/src/main/java/io/wcm/testing/mock/aem/dam/MockAssetDelivery.java b/core/src/main/java/io/wcm/testing/mock/aem/dam/MockAssetDelivery.java new file mode 100644 index 000000000..c27cdc6a --- /dev/null +++ b/core/src/main/java/io/wcm/testing/mock/aem/dam/MockAssetDelivery.java @@ -0,0 +1,113 @@ +/* + * #%L + * wcm.io + * %% + * Copyright (C) 2024 wcm.io + * %% + * 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. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ +package io.wcm.testing.mock.aem.dam; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.sling.api.resource.Resource; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.osgi.service.component.annotations.Component; + +import com.adobe.cq.wcm.spi.AssetDelivery; +import com.day.cq.dam.api.Asset; + +/** + * Mock implementation of {@link AssetDelivery}. + *

+ * As Asset ID a md5 hash of the path is used. + *

+ *

+ * This OSGi service is not registered by default in AEM Mocks, as it is not available in all contexts + * (e.g. not in AEM 6.5 and AEMaaCS SDK). + *

+ */ +@Component(service = AssetDelivery.class) +public final class MockAssetDelivery implements AssetDelivery { + + private static final String ASSET_DELIVERY_URL_PREFIX = "/asset/delivery"; + + static final String PARAM_PATH = "path"; + static final String PARAM_SEO_NAME = "seoname"; + static final String PARAM_FORMAT = "format"; + + private static final Set DISALLOWED_URL_PARAMS = Set.of( + PARAM_PATH, PARAM_SEO_NAME, PARAM_FORMAT); + + @Override + public @Nullable String getDeliveryURL(@NotNull Resource resource, @Nullable Map parameterMap) { + if (parameterMap == null) { + throw new IllegalArgumentException("No parameter map given."); + } + String path = getMandatoryStringParam(parameterMap, PARAM_PATH); + String seoname = getMandatoryStringParam(parameterMap, PARAM_SEO_NAME); + String format = getMandatoryStringParam(parameterMap, PARAM_FORMAT); + + String urlParams = parameterMap.entrySet().stream() + .filter(entry -> !DISALLOWED_URL_PARAMS.contains(entry.getKey()) && entry.getValue() != null) + .sorted(Map.Entry.comparingByKey()) + .map(entry -> URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8) + "=" + URLEncoder.encode(entry.getValue().toString(), StandardCharsets.UTF_8)) + .collect(Collectors.joining("&")); + + String assetId = getAssetId(path); + + StringBuilder sb = new StringBuilder(); + sb.append(ASSET_DELIVERY_URL_PREFIX) + .append("/").append(assetId) + .append("/").append(URLEncoder.encode(seoname, StandardCharsets.UTF_8)) + .append(".").append(URLEncoder.encode(format, StandardCharsets.UTF_8)); + if (!urlParams.isEmpty()) { + sb.append("?").append(urlParams); + } + return sb.toString(); + } + + private static @NotNull String getMandatoryStringParam(@NotNull Map parameterMap, @NotNull String paramName) { + Object value = parameterMap.get(paramName); + if (value == null) { + throw new IllegalArgumentException("Missing parameter: " + paramName); + } + return value.toString(); + } + + /** + * Generate Asset ID for given asset. + * @param asset Asset + * @return MD5 hash of asset path + */ + public static String getAssetId(@NotNull Asset asset) { + return getAssetId(asset.getPath()); + } + + /** + * Generate Asset ID for given path. + * @param path Asset path + * @return MD5 hash of asset path + */ + public static String getAssetId(@NotNull String path) { + return DigestUtils.md5Hex(path); + } + +} diff --git a/core/src/main/java/io/wcm/testing/mock/aem/dam/package-info.java b/core/src/main/java/io/wcm/testing/mock/aem/dam/package-info.java index 587a5d38..06e667ad 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/dam/package-info.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/dam/package-info.java @@ -20,5 +20,5 @@ /** * Mock implementation of selected AEM DAM APIs. */ -@org.osgi.annotation.versioning.Version("2.2.0") +@org.osgi.annotation.versioning.Version("2.3.0") package io.wcm.testing.mock.aem.dam; diff --git a/core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetDeliveryTest.java b/core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetDeliveryTest.java new file mode 100644 index 000000000..bd7a7605 --- /dev/null +++ b/core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetDeliveryTest.java @@ -0,0 +1,87 @@ +/* + * #%L + * wcm.io + * %% + * Copyright (C) 2024 wcm.io + * %% + * 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. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ +package io.wcm.testing.mock.aem.dam; + +import static io.wcm.testing.mock.aem.dam.MockAssetDelivery.PARAM_FORMAT; +import static io.wcm.testing.mock.aem.dam.MockAssetDelivery.PARAM_PATH; +import static io.wcm.testing.mock.aem.dam.MockAssetDelivery.PARAM_SEO_NAME; +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.io.FilenameUtils; +import org.apache.sling.api.resource.Resource; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +import com.adobe.cq.wcm.spi.AssetDelivery; +import com.day.cq.dam.api.Asset; + +import io.wcm.testing.mock.aem.context.TestAemContext; +import io.wcm.testing.mock.aem.junit.AemContext; + +public class MockAssetDeliveryTest { + + @Rule + public AemContext context = TestAemContext.newAemContext(); + + private AssetDelivery underTest; + private Asset asset; + private Resource assetResource; + + @Before + public void setUp() throws Exception { + this.underTest = context.registerInjectActivateService(MockAssetDelivery.class); + asset = context.create().asset("/content/dam/test.jpg", 10, 10, "image/jpeg"); + assetResource = asset.adaptTo(Resource.class); + } + + @Test + public void testGetDeliveryURL() { + String assetId = MockAssetDelivery.getAssetId(asset); + assertWithParams("/asset/delivery/" + assetId + "/test.jpg", Map.of()); + assertWithParams("/asset/delivery/" + assetId + "/test.jpg?preferwebp=true&quality=80&width=100", + Map.of("width", 100, + "quality", 80, + "preferwebp", true)); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetDeliveryURL_MissingMandatoryParam() { + underTest.getDeliveryURL(assetResource, Map.of()); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetDeliveryURL_NullMap() { + underTest.getDeliveryURL(assetResource, null); + } + + private void assertWithParams(String expectedUrl, Map parameterMap) { + Map allParams = new HashMap<>(parameterMap); + allParams.put(PARAM_PATH, asset.getPath()); + allParams.put(PARAM_SEO_NAME, FilenameUtils.getBaseName(asset.getName())); + allParams.put(PARAM_FORMAT, "jpg"); + String url = underTest.getDeliveryURL(assetResource, allParams); + assertEquals(expectedUrl, url); + } + +} From 813d3c7c037b13538dfe3eef3446db450276f0c8 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Fri, 19 Jan 2024 10:16:27 +0100 Subject: [PATCH 09/15] asset delivery: change prefix to /adobe/dynamicmedia/deliver --- .../java/io/wcm/testing/mock/aem/dam/MockAssetDelivery.java | 4 ++-- .../io/wcm/testing/mock/aem/dam/MockAssetDeliveryTest.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/io/wcm/testing/mock/aem/dam/MockAssetDelivery.java b/core/src/main/java/io/wcm/testing/mock/aem/dam/MockAssetDelivery.java index c27cdc6a..9145c112 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/dam/MockAssetDelivery.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/dam/MockAssetDelivery.java @@ -35,7 +35,7 @@ import com.day.cq.dam.api.Asset; /** - * Mock implementation of {@link AssetDelivery}. + * Mock implementation of {@link AssetDelivery} for Web-Optimized Image Delivery. *

* As Asset ID a md5 hash of the path is used. *

@@ -47,7 +47,7 @@ @Component(service = AssetDelivery.class) public final class MockAssetDelivery implements AssetDelivery { - private static final String ASSET_DELIVERY_URL_PREFIX = "/asset/delivery"; + private static final String ASSET_DELIVERY_URL_PREFIX = "/adobe/dynamicmedia/deliver"; static final String PARAM_PATH = "path"; static final String PARAM_SEO_NAME = "seoname"; diff --git a/core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetDeliveryTest.java b/core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetDeliveryTest.java index bd7a7605..6c6471f5 100644 --- a/core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetDeliveryTest.java +++ b/core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetDeliveryTest.java @@ -58,8 +58,8 @@ public void setUp() throws Exception { @Test public void testGetDeliveryURL() { String assetId = MockAssetDelivery.getAssetId(asset); - assertWithParams("/asset/delivery/" + assetId + "/test.jpg", Map.of()); - assertWithParams("/asset/delivery/" + assetId + "/test.jpg?preferwebp=true&quality=80&width=100", + assertWithParams("/adobe/dynamicmedia/deliver/" + assetId + "/test.jpg", Map.of()); + assertWithParams("/adobe/dynamicmedia/deliver/" + assetId + "/test.jpg?preferwebp=true&quality=80&width=100", Map.of("width", 100, "quality", 80, "preferwebp", true)); From 3b37eef320e45f74aa9cbcf6f2c9b1731a8e33f0 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Fri, 19 Jan 2024 10:53:12 +0100 Subject: [PATCH 10/15] Add MockNextGenDynamicMediaConfig (#31) --- changes.xml | 5 +- .../aem/dam/{ => ngdm}/MockAssetDelivery.java | 2 +- .../ngdm/MockNextGenDynamicMediaConfig.java | 169 ++++++++++++++++++ .../dam/{ => ngdm}/MockAssetDeliveryTest.java | 8 +- .../MockNextGenDynamicMediaConfigTest.java | 98 ++++++++++ 5 files changed, 276 insertions(+), 6 deletions(-) rename core/src/main/java/io/wcm/testing/mock/aem/dam/{ => ngdm}/MockAssetDelivery.java (98%) create mode 100644 core/src/main/java/io/wcm/testing/mock/aem/dam/ngdm/MockNextGenDynamicMediaConfig.java rename core/src/test/java/io/wcm/testing/mock/aem/dam/{ => ngdm}/MockAssetDeliveryTest.java (90%) create mode 100644 core/src/test/java/io/wcm/testing/mock/aem/dam/ngdm/MockNextGenDynamicMediaConfigTest.java diff --git a/changes.xml b/changes.xml index 1120cc23..5d3d0325 100644 --- a/changes.xml +++ b/changes.xml @@ -25,7 +25,10 @@ - Add mock for AssetDelivery OSGi service (not registered by default). + Add mock for AssetDelivery OSGi service (not registered by default) for Web-Optimized Image Delivery. + + + Add mock for MockNextGenDynamicMediaConfig OSGi service (not registered by default). Update to latest JCR Mock, OSGI Mock, ResourceResolver Mock, Sling Mock. diff --git a/core/src/main/java/io/wcm/testing/mock/aem/dam/MockAssetDelivery.java b/core/src/main/java/io/wcm/testing/mock/aem/dam/ngdm/MockAssetDelivery.java similarity index 98% rename from core/src/main/java/io/wcm/testing/mock/aem/dam/MockAssetDelivery.java rename to core/src/main/java/io/wcm/testing/mock/aem/dam/ngdm/MockAssetDelivery.java index 9145c112..0fa3ab52 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/dam/MockAssetDelivery.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/dam/ngdm/MockAssetDelivery.java @@ -17,7 +17,7 @@ * limitations under the License. * #L% */ -package io.wcm.testing.mock.aem.dam; +package io.wcm.testing.mock.aem.dam.ngdm; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; diff --git a/core/src/main/java/io/wcm/testing/mock/aem/dam/ngdm/MockNextGenDynamicMediaConfig.java b/core/src/main/java/io/wcm/testing/mock/aem/dam/ngdm/MockNextGenDynamicMediaConfig.java new file mode 100644 index 000000000..731e6f9b --- /dev/null +++ b/core/src/main/java/io/wcm/testing/mock/aem/dam/ngdm/MockNextGenDynamicMediaConfig.java @@ -0,0 +1,169 @@ +/* + * #%L + * wcm.io + * %% + * Copyright (C) 2024 wcm.io + * %% + * 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. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ +package io.wcm.testing.mock.aem.dam.ngdm; + +import org.osgi.service.component.annotations.Component; + +import com.adobe.cq.ui.wcm.commons.config.NextGenDynamicMediaConfig; + +/** + * Mock implementation of {@link NextGenDynamicMediaConfig}. + *

+ * This OSGi service is not registered by default in AEM Mocks, as it is not available in all contexts. + *

+ */ +@Component(service = NextGenDynamicMediaConfig.class) +public final class MockNextGenDynamicMediaConfig implements NextGenDynamicMediaConfig { + + @SuppressWarnings("java:S1075") // not a file system path + static final String DEFAULT_IMAGE_DELIVERY_BASE_PATH = "/adobe/dynamicmedia/deliver/{asset-id}/{seo-name}.{format}"; + @SuppressWarnings("java:S1075") // not a file system path + static final String DEFAULT_VIDEO_DELIVERY_PATH = "/adobe/assets/{asset-id}/play?accept-experimental"; + @SuppressWarnings("java:S1075") // not a file system path + static final String DEFAULT_ASSET_ORIGINAL_BINARY_DELIVERY_PATH = "/adobe/assets/deliver/{asset-id}/{seo-name}"; + @SuppressWarnings("java:S1075") // not a file system path + static final String DEFAULT_ASSET_METADATA_PATH = "/adobe/assets/{asset-id}/metadata"; + + static final String DEFAULT_ENV = "PROD"; + static final String DEFAULT_IMS_ENV = "prd"; + static final String DEFAULT_ASSET_SELECTORS_JS_URL = "https://experience.adobe.com/solutions/CQ-assets-selectors/static-assets/resources/assets-selectors.js"; + + private boolean enabled; + private String repositoryId; + private String apiKey; + private String env = DEFAULT_ENV; + private String imsOrg; + private String imsEnv = DEFAULT_IMS_ENV; + private String imsClient; + private String assetSelectorsJsUrl = DEFAULT_ASSET_SELECTORS_JS_URL; + private String imageDeliveryBasePath = DEFAULT_IMAGE_DELIVERY_BASE_PATH; + private String videoDeliveryPath = DEFAULT_VIDEO_DELIVERY_PATH; + private String assetOriginalBinaryDeliveryPath = DEFAULT_ASSET_ORIGINAL_BINARY_DELIVERY_PATH; + private String assetMetadataPath = DEFAULT_ASSET_METADATA_PATH; + + @Override + public boolean enabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + @Override + public String getRepositoryId() { + return repositoryId; + } + + public void setRepositoryId(String repositoryId) { + this.repositoryId = repositoryId; + } + + @Override + public String getApiKey() { + return apiKey; + } + + public void setApiKey(String apiKey) { + this.apiKey = apiKey; + } + + @Override + public String getEnv() { + return env; + } + + public void setEnv(String env) { + this.env = env; + } + + @Override + public String getImsOrg() { + return imsOrg; + } + + public void setImsOrg(String imsOrg) { + this.imsOrg = imsOrg; + } + + @Override + public String getImsEnv() { + return imsEnv; + } + + public void setImsEnv(String imsEnv) { + this.imsEnv = imsEnv; + } + + @Override + public String getImsClient() { + return imsClient; + } + + public void setImsClient(String imsClient) { + this.imsClient = imsClient; + } + + @Override + public String getAssetSelectorsJsUrl() { + return assetSelectorsJsUrl; + } + + public void setAssetSelectorsJsUrl(String assetSelectorsJsUrl) { + this.assetSelectorsJsUrl = assetSelectorsJsUrl; + } + + @Override + public String getImageDeliveryBasePath() { + return imageDeliveryBasePath; + } + + public void setImageDeliveryBasePath(String imageDeliveryBasePath) { + this.imageDeliveryBasePath = imageDeliveryBasePath; + } + + @Override + public String getVideoDeliveryPath() { + return videoDeliveryPath; + } + + public void setVideoDeliveryPath(String videoDeliveryPath) { + this.videoDeliveryPath = videoDeliveryPath; + } + + @Override + public String getAssetOriginalBinaryDeliveryPath() { + return assetOriginalBinaryDeliveryPath; + } + + public void setAssetOriginalBinaryDeliveryPath(String assetOriginalBinaryDeliveryPath) { + this.assetOriginalBinaryDeliveryPath = assetOriginalBinaryDeliveryPath; + } + + @Override + public String getAssetMetadataPath() { + return assetMetadataPath; + } + + public void setAssetMetadataPath(String assetMetadataPath) { + this.assetMetadataPath = assetMetadataPath; + } + +} diff --git a/core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetDeliveryTest.java b/core/src/test/java/io/wcm/testing/mock/aem/dam/ngdm/MockAssetDeliveryTest.java similarity index 90% rename from core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetDeliveryTest.java rename to core/src/test/java/io/wcm/testing/mock/aem/dam/ngdm/MockAssetDeliveryTest.java index 6c6471f5..9f3a3cfe 100644 --- a/core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetDeliveryTest.java +++ b/core/src/test/java/io/wcm/testing/mock/aem/dam/ngdm/MockAssetDeliveryTest.java @@ -17,11 +17,11 @@ * limitations under the License. * #L% */ -package io.wcm.testing.mock.aem.dam; +package io.wcm.testing.mock.aem.dam.ngdm; -import static io.wcm.testing.mock.aem.dam.MockAssetDelivery.PARAM_FORMAT; -import static io.wcm.testing.mock.aem.dam.MockAssetDelivery.PARAM_PATH; -import static io.wcm.testing.mock.aem.dam.MockAssetDelivery.PARAM_SEO_NAME; +import static io.wcm.testing.mock.aem.dam.ngdm.MockAssetDelivery.PARAM_FORMAT; +import static io.wcm.testing.mock.aem.dam.ngdm.MockAssetDelivery.PARAM_PATH; +import static io.wcm.testing.mock.aem.dam.ngdm.MockAssetDelivery.PARAM_SEO_NAME; import static org.junit.Assert.assertEquals; import java.util.HashMap; diff --git a/core/src/test/java/io/wcm/testing/mock/aem/dam/ngdm/MockNextGenDynamicMediaConfigTest.java b/core/src/test/java/io/wcm/testing/mock/aem/dam/ngdm/MockNextGenDynamicMediaConfigTest.java new file mode 100644 index 000000000..da938cab --- /dev/null +++ b/core/src/test/java/io/wcm/testing/mock/aem/dam/ngdm/MockNextGenDynamicMediaConfigTest.java @@ -0,0 +1,98 @@ +/* + * #%L + * wcm.io + * %% + * Copyright (C) 2024 wcm.io + * %% + * 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. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ +package io.wcm.testing.mock.aem.dam.ngdm; + +import static io.wcm.testing.mock.aem.dam.ngdm.MockNextGenDynamicMediaConfig.DEFAULT_ASSET_METADATA_PATH; +import static io.wcm.testing.mock.aem.dam.ngdm.MockNextGenDynamicMediaConfig.DEFAULT_ASSET_ORIGINAL_BINARY_DELIVERY_PATH; +import static io.wcm.testing.mock.aem.dam.ngdm.MockNextGenDynamicMediaConfig.DEFAULT_ASSET_SELECTORS_JS_URL; +import static io.wcm.testing.mock.aem.dam.ngdm.MockNextGenDynamicMediaConfig.DEFAULT_ENV; +import static io.wcm.testing.mock.aem.dam.ngdm.MockNextGenDynamicMediaConfig.DEFAULT_IMAGE_DELIVERY_BASE_PATH; +import static io.wcm.testing.mock.aem.dam.ngdm.MockNextGenDynamicMediaConfig.DEFAULT_IMS_ENV; +import static io.wcm.testing.mock.aem.dam.ngdm.MockNextGenDynamicMediaConfig.DEFAULT_VIDEO_DELIVERY_PATH; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +import io.wcm.testing.mock.aem.context.TestAemContext; +import io.wcm.testing.mock.aem.junit.AemContext; + +public class MockNextGenDynamicMediaConfigTest { + + @Rule + public AemContext context = TestAemContext.newAemContext(); + + private MockNextGenDynamicMediaConfig underTest; + + @Before + public void setUp() throws Exception { + underTest = context.registerInjectActivateService(MockNextGenDynamicMediaConfig.class); + } + + @Test + public void testDefaultProperties() { + assertFalse(underTest.enabled()); + assertNull(underTest.getRepositoryId()); + assertNull(underTest.getApiKey()); + assertEquals(DEFAULT_ENV, underTest.getEnv()); + assertNull(underTest.getImsOrg()); + assertEquals(DEFAULT_IMS_ENV, underTest.getImsEnv()); + assertNull(underTest.getImsClient()); + assertEquals(DEFAULT_ASSET_SELECTORS_JS_URL, underTest.getAssetSelectorsJsUrl()); + assertEquals(DEFAULT_IMAGE_DELIVERY_BASE_PATH, underTest.getImageDeliveryBasePath()); + assertEquals(DEFAULT_VIDEO_DELIVERY_PATH, underTest.getVideoDeliveryPath()); + assertEquals(DEFAULT_ASSET_ORIGINAL_BINARY_DELIVERY_PATH, underTest.getAssetOriginalBinaryDeliveryPath()); + assertEquals(DEFAULT_ASSET_METADATA_PATH, underTest.getAssetMetadataPath()); + } + + @Test + public void testProperties() { + underTest.setEnabled(true); + underTest.setRepositoryId("repository1"); + underTest.setApiKey("key1"); + underTest.setEnv("STAGE"); + underTest.setImsOrg("org1"); + underTest.setImsEnv("stg1"); + underTest.setImsClient("client1"); + underTest.setAssetSelectorsJsUrl("https://selectors1"); + underTest.setImageDeliveryBasePath("/image1"); + underTest.setVideoDeliveryPath("/video1"); + underTest.setAssetOriginalBinaryDeliveryPath("/original1"); + underTest.setAssetMetadataPath("/metadata1"); + + assertTrue(underTest.enabled()); + assertEquals("repository1", underTest.getRepositoryId()); + assertEquals("key1", underTest.getApiKey()); + assertEquals("STAGE", underTest.getEnv()); + assertEquals("org1", underTest.getImsOrg()); + assertEquals("stg1", underTest.getImsEnv()); + assertEquals("client1", underTest.getImsClient()); + assertEquals("https://selectors1", underTest.getAssetSelectorsJsUrl()); + assertEquals("/image1", underTest.getImageDeliveryBasePath()); + assertEquals("/video1", underTest.getVideoDeliveryPath()); + assertEquals("/original1", underTest.getAssetOriginalBinaryDeliveryPath()); + assertEquals("/metadata1", underTest.getAssetMetadataPath()); + } + +} From a3d80bb7574492bbc455dbd37ebdfe2dba7bc35b Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Thu, 25 Jan 2024 13:19:58 +0100 Subject: [PATCH 11/15] Eliminate SonarQube warnings --- .../wcm/testing/mock/aem/MockComponent.java | 8 +++---- .../mock/aem/MockComponentContext.java | 3 ++- .../testing/mock/aem/MockLanguageManager.java | 3 ++- .../wcm/testing/mock/aem/MockTagManager.java | 24 +++++++++---------- .../mock/aem/builder/ContentBuilder.java | 4 ++-- .../MockAemBindingsValuesProvider.java | 3 ++- .../io/wcm/testing/mock/aem/MockPageTest.java | 7 +++--- .../testing/mock/aem/dam/MockAssetTest.java | 5 ++-- .../mock/aem/dam/MockRenditionTest.java | 9 ++++--- .../mock/aem/junit5/AemContextExtension.java | 18 +++++++------- 10 files changed, 44 insertions(+), 40 deletions(-) diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockComponent.java b/core/src/main/java/io/wcm/testing/mock/aem/MockComponent.java index 6838cf45..92438902 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockComponent.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockComponent.java @@ -19,6 +19,8 @@ */ package io.wcm.testing.mock.aem; +import static org.apache.sling.api.resource.ResourceResolver.PROPERTY_RESOURCE_TYPE; + import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -41,8 +43,6 @@ import com.day.cq.wcm.api.components.ComponentEditConfig; import com.day.cq.wcm.api.components.VirtualComponent; -import static org.apache.sling.api.resource.ResourceResolver.PROPERTY_RESOURCE_TYPE; - /** * Mock implementation of {@link Component}. */ @@ -261,12 +261,12 @@ private static class RemoveKeyPrefixMap extends ValueMapDecorator { } @Override - public T get(String name, Class type) { + public T get(@NotNull String name, Class type) { return super.get(removeKeyPrefix(name), type); } @Override - public T get(String name, T defaultValue) { + public T get(@NotNull String name, T defaultValue) { return super.get(removeKeyPrefix(name), defaultValue); } diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockComponentContext.java b/core/src/main/java/io/wcm/testing/mock/aem/MockComponentContext.java index 557fc42a..333e372c 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockComponentContext.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockComponentContext.java @@ -79,6 +79,7 @@ public Resource getResource() { @Override @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE") + @SuppressWarnings("java:S2583") // null check public Component getComponent() { Resource currentResource = getResource(); if (currentResource == null) { @@ -86,7 +87,7 @@ public Component getComponent() { } ComponentManager componentManager = currentResource.getResourceResolver().adaptTo(ComponentManager.class); if (componentManager == null) { - throw new RuntimeException("No component manager."); + throw new IllegalStateException("No component manager."); } return componentManager.getComponentOfResource(currentResource); } diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockLanguageManager.java b/core/src/main/java/io/wcm/testing/mock/aem/MockLanguageManager.java index acd263ce..abfb7898 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockLanguageManager.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockLanguageManager.java @@ -61,7 +61,7 @@ public final class MockLanguageManager implements LanguageManager { @Override - @Deprecated + @Deprecated(forRemoval = true) public Map getAdjacentInfo(final ResourceResolver resourceResolver, final String path) { return Optional.ofNullable(getAdjacentLanguageInfo(resourceResolver, path)) .map(Map::entrySet) @@ -71,6 +71,7 @@ public Map getAdjacentInfo(final ResourceResolver resourceResolver } @Override + @SuppressWarnings("null") public Map getAdjacentLanguageInfo(final ResourceResolver resourceResolver, final String path) { return Optional.ofNullable(LanguageUtil.getLanguageRoot(path)) .map(root -> path.substring(root.length())) diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockTagManager.java b/core/src/main/java/io/wcm/testing/mock/aem/MockTagManager.java index 490d0b65..fa7785a1 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockTagManager.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockTagManager.java @@ -21,7 +21,6 @@ import static com.day.cq.tagging.TagConstants.TAG_ROOT_PATH; -import java.security.AccessControlException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; @@ -149,13 +148,13 @@ public boolean canCreateTag(String tagID) throws InvalidTagFormatException { @Override public Tag createTag(String tagID, String title, String description) - throws AccessControlException, InvalidTagFormatException { + throws InvalidTagFormatException { return createTag(tagID, title, description, true); } @Override public Tag createTag(String tagID, String title, String description, boolean autoSave) - throws AccessControlException, InvalidTagFormatException { + throws InvalidTagFormatException { String tagPath = getPathFromID(tagID); if (!StringUtils.startsWith(tagPath, TAG_ROOT_PATH)) { throw new InvalidTagFormatException("Tag path '" + tagPath + "' does not start with: " + TAG_ROOT_PATH); @@ -196,17 +195,17 @@ public Tag createTag(String tagID, String title, String description, boolean aut } @Override - public Tag createTagByTitle(String titlePath) throws AccessControlException, InvalidTagFormatException { + public Tag createTagByTitle(String titlePath) throws InvalidTagFormatException { return createTagByTitle(titlePath, true); } @Override - public void deleteTag(Tag tag) throws AccessControlException { + public void deleteTag(Tag tag) { deleteTag(tag, true); } @Override - public void deleteTag(Tag tag, boolean autoSave) throws AccessControlException { + public void deleteTag(Tag tag, boolean autoSave) { Resource tagResource = tag.adaptTo(Resource.class); if (tagResource == null) { return; @@ -427,7 +426,7 @@ public void setTags(Resource resource, Tag[] tags) { public void setTags(Resource resource, Tag[] tags, boolean autoSave) { ModifiableValueMap props = resource.adaptTo(ModifiableValueMap.class); if (props == null) { - throw new RuntimeException("Unable to get modifiable value map: " + resource.getPath()); + throw new IllegalStateException("Unable to get modifiable value map: " + resource.getPath()); } if (tags == null) { props.remove(TagConstants.PN_TAGS); @@ -444,7 +443,8 @@ public void setTags(Resource resource, Tag[] tags, boolean autoSave) { if (autoSave) { try { resourceResolver.commit(); - } catch (PersistenceException e) { + } + catch (PersistenceException e) { log.error("failed to commit updates for setting tags", e); } } @@ -470,12 +470,12 @@ public boolean canCreateTagByTitle(String tagTitlePath, Locale locale) throws In } @Override - public Tag createTagByTitle(String titlePath, boolean autoSave) throws AccessControlException, InvalidTagFormatException { + public Tag createTagByTitle(String titlePath, boolean autoSave) throws InvalidTagFormatException { throw new UnsupportedOperationException(); } @Override - public Tag createTagByTitle(String titlePath, Locale locale) throws AccessControlException, InvalidTagFormatException { + public Tag createTagByTitle(String titlePath, Locale locale) throws InvalidTagFormatException { throw new UnsupportedOperationException(); } @@ -490,12 +490,12 @@ public FindResults findByTitle(String title) { } @Override - public void mergeTag(Tag tag, Tag destination) throws AccessControlException, TagException { + public void mergeTag(Tag tag, Tag destination) throws TagException { throw new UnsupportedOperationException(); } @Override - public Tag moveTag(Tag tag, String destination) throws AccessControlException, InvalidTagFormatException, TagException { + public Tag moveTag(Tag tag, String destination) throws InvalidTagFormatException, TagException { throw new UnsupportedOperationException(); } diff --git a/core/src/main/java/io/wcm/testing/mock/aem/builder/ContentBuilder.java b/core/src/main/java/io/wcm/testing/mock/aem/builder/ContentBuilder.java index 91071e96..0a0858b2 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/builder/ContentBuilder.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/builder/ContentBuilder.java @@ -563,13 +563,13 @@ private ContentFragment contentFragmentTextOrStructured(@NotNull String path, resource(path + "/" + JcrConstants.JCR_CONTENT + "/" + DamConstants.METADATA_FOLDER, metadataProps); // store text as original rendition - if (text != null) { + if (text != null && mimeType != null) { try (InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8))) { ContentLoader contentLoader = new ContentLoader(resourceResolver); contentLoader.binaryFile(is, renditionsPath + "/" + DamConstants.ORIGINAL_FILE, mimeType); } catch (IOException ex) { - throw new RuntimeException("Unable to create content fragment at " + path, ex); + throw new IllegalArgumentException("Unable to create content fragment at " + path, ex); } // create model/elements/main node diff --git a/core/src/main/java/io/wcm/testing/mock/aem/context/MockAemBindingsValuesProvider.java b/core/src/main/java/io/wcm/testing/mock/aem/context/MockAemBindingsValuesProvider.java index c77cc4b2..dfa1efe8 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/context/MockAemBindingsValuesProvider.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/context/MockAemBindingsValuesProvider.java @@ -45,7 +45,8 @@ class MockAemBindingsValuesProvider implements BindingsValuesProvider { static final String PROPERTY_CONTEXT = "context"; - private volatile AemContextImpl context; + @SuppressWarnings("java:S1845") // naming + private AemContextImpl context; @Activate private void activate(Map config) { diff --git a/core/src/test/java/io/wcm/testing/mock/aem/MockPageTest.java b/core/src/test/java/io/wcm/testing/mock/aem/MockPageTest.java index d8fe52d8..702c4098 100644 --- a/core/src/test/java/io/wcm/testing/mock/aem/MockPageTest.java +++ b/core/src/test/java/io/wcm/testing/mock/aem/MockPageTest.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -75,7 +76,7 @@ public void testProperties() { assertEquals(3, this.page.getDepth()); assertEquals(false, this.page.isHideInNav()); assertNull(this.page.getVanityUrl()); - assertNotNull(this.page.hashCode()); + assertNotEquals(0, this.page.hashCode()); } @Test @@ -293,8 +294,8 @@ public void testEquals() throws Exception { Page page2 = context.pageManager().getPage("/content/sample/en"); Page page3 = context.pageManager().getPage("/content/sample/en/toolbar/profiles"); - assertTrue(page1.equals(page2)); - assertFalse(page1.equals(page3)); + assertEquals(page1, page2); + assertNotEquals(page1, page3); } } diff --git a/core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetTest.java b/core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetTest.java index 918e5967..1b1802b0 100644 --- a/core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetTest.java +++ b/core/src/test/java/io/wcm/testing/mock/aem/dam/MockAssetTest.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -79,7 +80,7 @@ public void testProperties() { assertEquals(1368001317000L, asset.getLastModified()); assertEquals("admin", asset.getModifier()); assertEquals("image/jpeg", asset.getMimeType()); - assertNotNull(asset.hashCode()); + assertNotEquals(0, asset.hashCode()); } @Test @@ -113,7 +114,7 @@ public void testEquals() throws Exception { Asset asset1 = this.context.resourceResolver().getResource("/content/dam/sample/portraits/scott_reynolds.jpg").adaptTo(Asset.class); Asset asset2 = this.context.resourceResolver().getResource("/content/dam/sample/portraits/scott_reynolds.jpg").adaptTo(Asset.class); - assertTrue(asset1.equals(asset2)); + assertEquals(asset1, asset2); } private void doTestAddRemoveRendition(final String renditionName) { diff --git a/core/src/test/java/io/wcm/testing/mock/aem/dam/MockRenditionTest.java b/core/src/test/java/io/wcm/testing/mock/aem/dam/MockRenditionTest.java index b3e13f9d..ea04b7c4 100644 --- a/core/src/test/java/io/wcm/testing/mock/aem/dam/MockRenditionTest.java +++ b/core/src/test/java/io/wcm/testing/mock/aem/dam/MockRenditionTest.java @@ -20,9 +20,8 @@ package io.wcm.testing.mock.aem.dam; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; import org.apache.sling.api.resource.Resource; import org.junit.Before; @@ -58,7 +57,7 @@ public void testProperties() { assertEquals("/content/dam/sample/portraits/scott_reynolds.jpg/jcr:content/renditions/original", rendition.getPath()); assertEquals("image/jpeg", rendition.getMimeType()); assertEquals("admin", rendition.getProperties().get(JcrConstants.JCR_LAST_MODIFIED_BY, String.class)); - assertNotNull(rendition.hashCode()); + assertNotEquals(0, rendition.hashCode()); } @Test @@ -85,8 +84,8 @@ public void testEquals() throws Exception { Rendition rendition3 = this.context.resourceResolver() .getResource("/content/dam/sample/portraits/scott_reynolds.jpg/jcr:content/renditions/cq5dam.thumbnail.48.48.png").adaptTo(Rendition.class); - assertTrue(rendition1.equals(rendition2)); - assertFalse(rendition1.equals(rendition3)); + assertEquals(rendition1, rendition2); + assertNotEquals(rendition1, rendition3); } } diff --git a/junit5/src/main/java/io/wcm/testing/mock/aem/junit5/AemContextExtension.java b/junit5/src/main/java/io/wcm/testing/mock/aem/junit5/AemContextExtension.java index c5b3f9fd..82c25e18 100644 --- a/junit5/src/main/java/io/wcm/testing/mock/aem/junit5/AemContextExtension.java +++ b/junit5/src/main/java/io/wcm/testing/mock/aem/junit5/AemContextExtension.java @@ -112,32 +112,32 @@ public void beforeAll(ExtensionContext extensionContext) throws Exception { if (aemContextField != null) { setAemContextInStore(extensionContext, aemContextField, null); } - applyAemContext(extensionContext, aemContext -> { + applyAemContext(extensionContext, aemContext -> // call context plugins setup after @BeforeAll methods were called /* please note: in JUnit5 there is no callback to be called after all @BeforeAll methods are called * so we call it before @BeforeAll execution to make sure the plugin code is called at all */ - aemContext.getContextPlugins().executeAfterSetUpCallback(aemContext); - }); + aemContext.getContextPlugins().executeAfterSetUpCallback(aemContext) + ); } } @Override public void beforeEach(ExtensionContext extensionContext) { if (!isBeforeAllContext(extensionContext)) { - applyAemContext(extensionContext, aemContext -> { + applyAemContext(extensionContext, aemContext -> // call context plugins setup after @BeforeEach methods were called - aemContext.getContextPlugins().executeAfterSetUpCallback(aemContext); - }); + aemContext.getContextPlugins().executeAfterSetUpCallback(aemContext) + ); } } @Override public void afterTestExecution(ExtensionContext extensionContext) { if (!isBeforeAllContext(extensionContext)) { - applyAemContext(extensionContext, aemContext -> { + applyAemContext(extensionContext, aemContext -> // call context plugins setup before @AfterEach methods are called - aemContext.getContextPlugins().executeBeforeTearDownCallback(aemContext); - }); + aemContext.getContextPlugins().executeBeforeTearDownCallback(aemContext) + ); } } From e8a533c258dac214a5adfa3fa386277e6d957396 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Fri, 26 Jan 2024 10:59:46 +0100 Subject: [PATCH 12/15] update dependencies --- parent/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/parent/pom.xml b/parent/pom.xml index 17931715..6927402d 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -50,22 +50,22 @@ - 3.4.1-SNAPSHOT + 3.4.2 - 1.6.13-SNAPSHOT + 1.6.14 - 1.4.5-SNAPSHOT + 1.4.6 - 3.4.17-SNAPSHOT + 3.4.18 1.4.6 - 3.1.11-1.44.0-SNAPSHOT + 3.1.10-1.44.0 1.0.0 From 2618ba6ee1b19a880cf5a343bef6b9e3f0ec8e77 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Fri, 26 Jan 2024 12:10:44 +0100 Subject: [PATCH 13/15] update parent dependency --- parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parent/pom.xml b/parent/pom.xml index 6927402d..11f459c6 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -25,7 +25,7 @@ io.wcm io.wcm.parent_toplevel - 2.3.0-SNAPSHOT + 2.3.0 From 8f536224323ef1fe817a9ac132adad34cee184b3 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Fri, 26 Jan 2024 17:09:06 +0100 Subject: [PATCH 14/15] prepare release --- changes.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/changes.xml b/changes.xml index 5d3d0325..4baf7580 100644 --- a/changes.xml +++ b/changes.xml @@ -23,9 +23,9 @@ xsi:schemaLocation="http://maven.apache.org/changes/1.0.0 http://maven.apache.org/plugins/maven-changes-plugin/xsd/changes-1.0.0.xsd"> - + - Add mock for AssetDelivery OSGi service (not registered by default) for Web-Optimized Image Delivery. + Add mock for AssetDelivery OSGi service for Web-Optimized Image Delivery (not registered by default). Add mock for MockNextGenDynamicMediaConfig OSGi service (not registered by default). From 4b96fed32d127a07ca3e40fc2eec41e58148858b Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Fri, 26 Jan 2024 17:09:42 +0100 Subject: [PATCH 15/15] [gitflow-maven-plugin] Update versions for release 5.5.0 --- core/pom.xml | 2 +- junit4/pom.xml | 6 +++--- junit5/pom.xml | 6 +++--- parent/pom.xml | 4 ++-- pom.xml | 4 ++-- relocate/pom.xml | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index d8f08a59..b7add095 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -25,7 +25,7 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.5.0-SNAPSHOT + 5.5.0 ../parent/pom.xml diff --git a/junit4/pom.xml b/junit4/pom.xml index 4d324cc8..0fb5e5fb 100644 --- a/junit4/pom.xml +++ b/junit4/pom.xml @@ -25,7 +25,7 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.5.0-SNAPSHOT + 5.5.0 ../parent/pom.xml @@ -54,7 +54,7 @@ io.wcm io.wcm.testing.aem-mock.core - 5.5.0-SNAPSHOT + 5.5.0 compile @@ -87,7 +87,7 @@ io.wcm io.wcm.testing.aem-mock.core - 5.5.0-SNAPSHOT + 5.5.0 tests test diff --git a/junit5/pom.xml b/junit5/pom.xml index 0ae559cc..21d04599 100644 --- a/junit5/pom.xml +++ b/junit5/pom.xml @@ -25,7 +25,7 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.5.0-SNAPSHOT + 5.5.0 ../parent/pom.xml @@ -54,14 +54,14 @@ io.wcm io.wcm.testing.aem-mock.core - 5.5.0-SNAPSHOT + 5.5.0 compile io.wcm io.wcm.testing.aem-mock.core - 5.5.0-SNAPSHOT + 5.5.0 tests test diff --git a/parent/pom.xml b/parent/pom.xml index 11f459c6..bcee8577 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -31,7 +31,7 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.5.0-SNAPSHOT + 5.5.0 pom AEM Mocks @@ -71,7 +71,7 @@ 1.0.0 - 2023-12-20T18:49:32Z + 2024-01-26T16:09:41Z diff --git a/pom.xml b/pom.xml index eb72b29e..42abf3d1 100644 --- a/pom.xml +++ b/pom.xml @@ -25,14 +25,14 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.5.0-SNAPSHOT + 5.5.0 parent/pom.xml io.wcm io.wcm.testing.aem-mock.root pom - 5.5.0-SNAPSHOT + 5.5.0 AEM Mocks ${site.url}/${site.url.module.prefix}/ diff --git a/relocate/pom.xml b/relocate/pom.xml index fa42114c..30ccd18f 100644 --- a/relocate/pom.xml +++ b/relocate/pom.xml @@ -25,7 +25,7 @@ io.wcm io.wcm.testing.aem-mock.parent - 5.5.0-SNAPSHOT + 5.5.0 ../parent/pom.xml