diff --git a/bundles/core/src/main/java/com/adobe/cq/wcm/core/components/internal/models/v3/ImageImpl.java b/bundles/core/src/main/java/com/adobe/cq/wcm/core/components/internal/models/v3/ImageImpl.java index f4a9edb26c..e3042cd4f1 100644 --- a/bundles/core/src/main/java/com/adobe/cq/wcm/core/components/internal/models/v3/ImageImpl.java +++ b/bundles/core/src/main/java/com/adobe/cq/wcm/core/components/internal/models/v3/ImageImpl.java @@ -331,6 +331,7 @@ private void initNextGenerationDynamicMedia() { properties = resource.getValueMap(); String fileReference = properties.get("fileReference", String.class); String smartCrop = properties.get("smartCropRendition", String.class); + String modifiers = properties.get("imageModifiers", String.class); if (isNgdmImageReference(fileReference)) { int width = currentStyle.get(PN_DESIGN_RESIZE_WIDTH, DEFAULT_NGDM_ASSET_WIDTH); NextGenDMImageURIBuilder builder = new NextGenDMImageURIBuilder(nextGenDynamicMediaConfig, fileReference) @@ -339,6 +340,9 @@ private void initNextGenerationDynamicMedia() { if(StringUtils.isNotEmpty(smartCrop) && !StringUtils.equals(smartCrop, SMART_CROP_AUTO)) { builder.withSmartCrop(smartCrop); } + if (StringUtils.isNotEmpty(modifiers)) { + builder.withImageModifiers(modifiers); + } src = builder.build(); ngdmImage = true; hasContent = true; diff --git a/bundles/core/src/main/java/com/adobe/cq/wcm/core/components/internal/models/v3/NextGenDMImageURIBuilder.java b/bundles/core/src/main/java/com/adobe/cq/wcm/core/components/internal/models/v3/NextGenDMImageURIBuilder.java index ef8176ec3d..d944c064a9 100644 --- a/bundles/core/src/main/java/com/adobe/cq/wcm/core/components/internal/models/v3/NextGenDMImageURIBuilder.java +++ b/bundles/core/src/main/java/com/adobe/cq/wcm/core/components/internal/models/v3/NextGenDMImageURIBuilder.java @@ -42,6 +42,8 @@ public class NextGenDMImageURIBuilder { private int height; private boolean preferWebp = true; + private String modifiers; + public NextGenDMImageURIBuilder(NextGenDynamicMediaConfig config, String fileReference) { this.config = config; this.fileReference = fileReference; @@ -84,6 +86,15 @@ public NextGenDMImageURIBuilder withPreferWebp(boolean preferWebp) { return this; } + /** + * Set extra image modifiers. + * @param modifiersStr + */ + public NextGenDMImageURIBuilder withImageModifiers(String modifiersStr) { + this.modifiers = modifiersStr; + return this; + } + /** * Use this to create a NextGen Dynamic Media Image URI. * @return a uri. @@ -124,6 +135,13 @@ public String build() { } uriBuilder.deleteCharAt(uriBuilder.length() - 1); } + if(StringUtils.isNotEmpty(this.modifiers)) { + if (this.modifiers.startsWith("&")) { + uriBuilder.append(this.modifiers); + } else { + uriBuilder.append("&" + this.modifiers); + } + } return uriBuilder.toString(); } LOGGER.info("Invalid fileReference or NGDMConfig. fileReference = {}", this.fileReference); diff --git a/bundles/core/src/test/java/com/adobe/cq/wcm/core/components/internal/models/v3/ImageImplTest.java b/bundles/core/src/test/java/com/adobe/cq/wcm/core/components/internal/models/v3/ImageImplTest.java index e2e3da1c75..374a845972 100644 --- a/bundles/core/src/test/java/com/adobe/cq/wcm/core/components/internal/models/v3/ImageImplTest.java +++ b/bundles/core/src/test/java/com/adobe/cq/wcm/core/components/internal/models/v3/ImageImplTest.java @@ -96,6 +96,8 @@ class ImageImplTest extends com.adobe.cq.wcm.core.components.internal.models.v2. private static final String PAGE3_IMAGE0_PATH = PAGE3 + "/jcr:content/root/page3_image0"; private static final String NGDM_IMAGE1_PATH = "/content/ngdm_test_page/jcr:content/root/ngdm_test_page_image1"; private static final String NGDM_SMARTCROP_IMAGE_PATH = "/content/ngdm_test_page/jcr:content/root/ngdm_test_page_smartcrop_image"; + + private static final String NGDM_MODIFIERS_IMAGE_PATH = "/content/ngdm_test_page/jcr:content/root/ngdm_test_page_modifiers_image"; private static final String NGDM_SMARTCROP_AUTO_IMAGE_PATH = "/content/ngdm_test_page/jcr:content/root/ngdm_test_page_smartcrop_image_auto"; @@ -731,6 +733,19 @@ void testNgdmImageWithSmartCropRendition() { Utils.testJSONExport(image, Utils.getTestExporterJSONPath(testBase, NGDM_SMARTCROP_IMAGE_PATH)); } + @Test + void testNgdmImageWithModifiers() { + MockNextGenDynamicMediaConfig config = new MockNextGenDynamicMediaConfig(); + config.setEnabled(true); + config.setRepositoryId("testrepo"); + config.setAssetMetadataPath("/adobe/assets/{asset-id}/metadata"); + context.registerInjectActivateService(config); + + Image image = getImageUnderTest(NGDM_MODIFIERS_IMAGE_PATH); + Utils.testJSONExport(image, Utils.getTestExporterJSONPath(testBase, NGDM_MODIFIERS_IMAGE_PATH)); + assertTrue(image.getSrc().contains("&width=100&height=200")); + } + @Test void testNgdmImageWithAutoSmartCropRendition() throws Exception { String expectedMetadataAPIResponseJSON = "{\"assetId\":\"urn:aaid:aem:33b6255d-a978-43ad-8e2e-ef5677c64715\",\"repositoryMetadata\":{\"smartcrops\":{\"Large\":{\"height\":\"1200\",\"left\":\"0.0\",\"manualCrop\":\"false\",\"width\":\"800\",\"top\":\"0.16\"},\"Medium\":{\"height\":\"800\",\"left\":\"0.0\",\"manualCrop\":\"false\",\"width\":\"600\",\"top\":\"0.0\"}}}}"; diff --git a/bundles/core/src/test/resources/image/v3/exporter-ngdm_test_page_modifiers_image.json b/bundles/core/src/test/resources/image/v3/exporter-ngdm_test_page_modifiers_image.json new file mode 100644 index 0000000000..a9cc6927a9 --- /dev/null +++ b/bundles/core/src/test/resources/image/v3/exporter-ngdm_test_page_modifiers_image.json @@ -0,0 +1,12 @@ +{ + "id": "image-06acc3dd21", + "src": "https://testrepo/adobe/dynamicmedia/deliver/urn:aaid:aem:e82c3c87-1453-48f5-844b-1822fb610911/cutfruits.png?width=640&preferwebp=true&width=100&height=200", + "lazyEnabled": true, + "sizes": "", + "dataLayer": { + "image-06acc3dd21": { + "@type": "core/wcm/components/image/v3/image" + } + }, + ":type": "core/wcm/components/image/v3/image" +} diff --git a/bundles/core/src/test/resources/image/v3/test-content.json b/bundles/core/src/test/resources/image/v3/test-content.json index 680c169062..b772412c15 100644 --- a/bundles/core/src/test/resources/image/v3/test-content.json +++ b/bundles/core/src/test/resources/image/v3/test-content.json @@ -965,6 +965,13 @@ "fileReference": "/urn:aaid:aem:e82c3c87-1453-48f5-844b-1822fb610911/cutfruits.png", "smartCropRendition": "Medium" }, + "ngdm_test_page_modifiers_image": { + "jcr:primaryType": "nt:unstructured", + "jcr:createdBy": "admin", + "sling:resourceType": "core/wcm/components/image/v3/image", + "fileReference": "/urn:aaid:aem:e82c3c87-1453-48f5-844b-1822fb610911/cutfruits.png", + "imageModifiers": "&width=100&height=200" + }, "ngdm_test_page_smartcrop_image_auto": { "jcr:primaryType": "nt:unstructured", "jcr:createdBy": "admin",