use of com.adobe.cq.wcm.core.components.models.Image in project aem-core-wcm-components by Adobe-Marketing-Cloud.
the class ImageImplTest method testImageWithTwoOrMoreSmartSizes.
@Test
@SuppressWarnings("deprecation")
@Override
protected void testImageWithTwoOrMoreSmartSizes() {
context.contentPolicyMapping(resourceType, "allowedRenditionWidths", new int[] { 600, 700, 800, 2000, 2500 });
String escapedResourcePath = AbstractImageTest.IMAGE0_PATH.replace("jcr:content", "_jcr_content");
Image image = getImageUnderTest(AbstractImageTest.IMAGE0_PATH);
assertEquals("Adobe Systems Logo and Wordmark in PNG format", image.getAlt());
assertEquals("Adobe Systems Logo and Wordmark", image.getTitle());
assertEquals(IMAGE_FILE_REFERENCE, image.getFileReference());
String expectedJson = "{\"smartImages\":[\"/core/content/test/_jcr_content/root/image0." + selector + "." + JPEG_QUALITY + ".600.png/1490005239000/" + ASSET_NAME + ".png\",\"/core/content/test/_jcr_content/root/image0." + selector + "." + JPEG_QUALITY + ".700.png/1490005239000/" + ASSET_NAME + ".png\",\"/core/content/test/_jcr_content/root/image0" + "." + selector + "." + JPEG_QUALITY + ".800.png/1490005239000/" + ASSET_NAME + ".png\",\"/core/content/test/_jcr_content/root/image0." + selector + "." + JPEG_QUALITY + ".2000.png/1490005239000/" + ASSET_NAME + ".png\", \"/core/content/test/_jcr_content/root/image0." + selector + "." + JPEG_QUALITY + ".2500.png/1490005239000/" + ASSET_NAME + ".png\"],\"smartSizes\":[600,700,800,2000,2500],\"lazyEnabled\":false}";
compareJSON(expectedJson, image.getJson());
assertTrue(image.displayPopupTitle());
assertEquals(CONTEXT_PATH + "/content/test-image.html", image.getLink());
assertEquals(CONTEXT_PATH + escapedResourcePath + "." + selector + ".png/1490005239000/" + ASSET_NAME + ".png", image.getSrc());
Utils.testJSONExport(image, Utils.getTestExporterJSONPath(testBase, AbstractImageTest.IMAGE0_PATH));
}
use of com.adobe.cq.wcm.core.components.models.Image in project aem-core-wcm-components by Adobe-Marketing-Cloud.
the class ImageImplTest method testImageFromTemplateStructure.
@Test
@SuppressWarnings("deprecation")
@Override
protected void testImageFromTemplateStructure() {
context.contentPolicyMapping(resourceType, "allowedRenditionWidths", new int[] { 600, 700, 800, 2000, 2500 });
com.adobe.cq.wcm.core.components.models.Image image = getImageUnderTest(TEMPLATE_IMAGE_PATH);
assertEquals(CONTEXT_PATH + "/conf/coretest/settings/wcm/templates/testtemplate/structure." + selector + ".png/structure/jcr%3acontent/root/image_template/1490005239000/" + ASSET_NAME + ".png", image.getSrc());
assertEquals("Adobe Systems Logo and Wordmark in PNG format", image.getAlt());
assertEquals("Adobe Systems Logo and Wordmark", image.getTitle());
assertEquals(IMAGE_FILE_REFERENCE, image.getFileReference());
String expectedJson = "{" + "\"smartImages\":[" + "\"/core/conf/coretest/settings/wcm/templates/testtemplate/structure." + selector + "." + JPEG_QUALITY + ".600.png/structure/jcr%3acontent/root/image_template/1490005239000/" + ASSET_NAME + ".png\",\"/core/conf/coretest/settings/wcm/templates/testtemplate/structure." + selector + "." + JPEG_QUALITY + ".700.png/structure/jcr%3acontent/root/image_template/1490005239000/" + ASSET_NAME + ".png\", \"/core/conf/coretest/settings/wcm/templates/testtemplate/structure." + selector + "." + JPEG_QUALITY + ".800.png/structure/jcr%3acontent/root/image_template/1490005239000/" + ASSET_NAME + ".png\"," + "\"/core/conf/coretest/settings/wcm/templates/testtemplate/structure." + selector + "." + JPEG_QUALITY + "." + "2000.png/structure/jcr%3acontent/root/image_template/1490005239000/" + ASSET_NAME + ".png\"," + "\"/core/conf/coretest/settings/wcm/templates/testtemplate/structure." + selector + "." + JPEG_QUALITY + ".2500.png/structure/jcr%3acontent/root/image_template/1490005239000/" + ASSET_NAME + ".png\"" + "]," + "\"smartSizes\":[600,700,800,2000,2500]," + "\"lazyEnabled\":false" + "}";
compareJSON(expectedJson, image.getJson());
assertTrue(image.displayPopupTitle());
assertEquals(CONTEXT_PATH + "/content/test-image.html", image.getLink());
Utils.testJSONExport(image, Utils.getTestExporterJSONPath(testBase, TEMPLATE_IMAGE_PATH));
}
use of com.adobe.cq.wcm.core.components.models.Image in project aem-core-wcm-components by Adobe-Marketing-Cloud.
the class ImageImplTest method testSimpleDecorativeImage.
@Test
@SuppressWarnings("deprecation")
@Override
protected void testSimpleDecorativeImage() {
context.contentPolicyMapping(resourceType, "uuidDisabled", true);
String escapedResourcePath = AbstractImageTest.IMAGE4_PATH.replace("jcr:content", "_jcr_content");
com.adobe.cq.wcm.core.components.models.Image image = getImageUnderTest(AbstractImageTest.IMAGE4_PATH);
assertNull(image.getAlt(), "Did not expect a value for the alt attribute, since the image is marked as decorative.");
assertEquals("Adobe Systems Logo and Wordmark", image.getTitle());
assertTrue(image.displayPopupTitle(), "Image should display a caption popup.");
assertNull(image.getLink(), "Did not expect a link for this image, since it's marked as decorative.");
assertEquals(CONTEXT_PATH + escapedResourcePath + "." + selector + ".png/1494867377756/" + ASSET_NAME + ".png", image.getSrc());
compareJSON("{\"" + com.adobe.cq.wcm.core.components.models.Image.JSON_SMART_IMAGES + "\":[], \"" + com.adobe.cq.wcm.core.components.models.Image.JSON_SMART_SIZES + "\":[], \"" + com.adobe.cq.wcm.core.components.models.Image.JSON_LAZY_ENABLED + "\":false}", image.getJson());
Utils.testJSONExport(image, Utils.getTestExporterJSONPath(testBase, AbstractImageTest.IMAGE4_PATH));
}
use of com.adobe.cq.wcm.core.components.models.Image in project aem-core-wcm-components by Adobe-Marketing-Cloud.
the class AdaptiveImageServlet method doGet.
@Override
protected void doGet(@NotNull SlingHttpServletRequest request, @NotNull SlingHttpServletResponse response) throws IOException {
Timer.Context requestDuration = metrics.startDurationRecording();
try {
metrics.markServletInvocation();
RequestPathInfo requestPathInfo = request.getRequestPathInfo();
List<String> selectorList = selectorToList(requestPathInfo.getSelectorString());
String suffix = requestPathInfo.getSuffix();
String imageName = StringUtils.isNotEmpty(suffix) ? FilenameUtils.getName(suffix) : "";
if (StringUtils.isNotEmpty(suffix)) {
String suffixExtension = FilenameUtils.getExtension(suffix);
if (StringUtils.isNotEmpty(suffixExtension)) {
if (!suffixExtension.equals(requestPathInfo.getExtension())) {
LOGGER.error("The suffix part defines a different extension than the request: {}.", suffix);
metrics.markImageErrors();
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
} else {
LOGGER.error("Invalid suffix: {}.", suffix);
metrics.markImageErrors();
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
}
Resource component = request.getResource();
ResourceResolver resourceResolver = request.getResourceResolver();
if (!component.isResourceType(IMAGE_RESOURCE_TYPE)) {
// image coming from template; need to switch resource
Resource componentCandidate = null;
PageManager pageManager = resourceResolver.adaptTo(PageManager.class);
if (pageManager != null) {
Page page = pageManager.getContainingPage(component);
if (page != null) {
Template template = page.getTemplate();
if (template != null) {
if (StringUtils.isNotEmpty(suffix)) {
long lastModifiedSuffix = getRequestLastModifiedSuffix(suffix);
String relativeTemplatePath = lastModifiedSuffix == 0 ? // no timestamp info, but extension is valid; get resource name
suffix.substring(0, suffix.lastIndexOf('.')) : // timestamp info, get parent path from suffix
suffix.substring(0, suffix.lastIndexOf("/" + String.valueOf(lastModifiedSuffix)));
String imagePath = ResourceUtil.normalize(template.getPath() + relativeTemplatePath);
if (StringUtils.isNotEmpty(imagePath) && !template.getPath().equals(imagePath)) {
componentCandidate = resourceResolver.getResource(imagePath);
}
}
}
}
}
if (componentCandidate == null) {
LOGGER.error("Unable to retrieve an image from this page's template.");
metrics.markImageErrors();
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
component = componentCandidate;
}
LinkHandler linkHandler = request.adaptTo(LinkHandler.class);
Style currentStyle = WCMUtils.getStyle(request);
Page currentPage = Optional.ofNullable(resourceResolver.adaptTo(PageManager.class)).map(pageManager -> pageManager.getContainingPage(request.getResource())).orElse(null);
Resource wrappedImageResourceWithInheritance = getWrappedImageResourceWithInheritance(component, linkHandler, currentStyle, currentPage);
ImageComponent imageComponent = new ImageComponent(wrappedImageResourceWithInheritance);
if (imageComponent.source == Source.NOCONTENT || imageComponent.source == Source.NONEXISTING) {
LOGGER.error("Either the image from {} does not have a valid file reference" + " or the containing page does not have a valid featured image", component.getPath());
metrics.markImageErrors();
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
ValueMap componentProperties = component.getValueMap();
long lastModifiedEpoch = 0;
Calendar lastModifiedDate = componentProperties.get(JcrConstants.JCR_LASTMODIFIED, Calendar.class);
if (lastModifiedDate == null) {
lastModifiedDate = componentProperties.get(NameConstants.PN_PAGE_LAST_MOD, Calendar.class);
}
if (lastModifiedDate != null) {
lastModifiedEpoch = lastModifiedDate.getTimeInMillis();
}
Asset asset = null;
if (imageComponent.source == Source.ASSET) {
asset = imageComponent.imageResource.adaptTo(Asset.class);
if (asset == null) {
LOGGER.error("Unable to adapt resource {} used by image {} to an asset.", imageComponent.imageResource.getPath(), component.getPath());
metrics.markImageErrors();
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
long assetLastModifiedEpoch = asset.getLastModified();
if (assetLastModifiedEpoch > lastModifiedEpoch) {
lastModifiedEpoch = assetLastModifiedEpoch;
}
}
long requestLastModifiedSuffix = getRequestLastModifiedSuffix(suffix);
if (requestLastModifiedSuffix >= 0 && requestLastModifiedSuffix != lastModifiedEpoch) {
String redirectLocation = getRedirectLocation(request, lastModifiedEpoch);
if (StringUtils.isNotEmpty(redirectLocation)) {
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
response.setHeader("Location", redirectLocation);
return;
} else {
LOGGER.error("Unable to determine correct redirect location.");
metrics.markImageErrors();
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
}
if (!handleIfModifiedSinceHeader(request, response, lastModifiedEpoch)) {
Map<String, Integer> transformationMap = getTransformationMap(selectorList, component);
Integer jpegQualityInPercentage = transformationMap.get(SELECTOR_QUALITY_KEY);
double quality = jpegQualityInPercentage / 100.0d;
int resizeWidth = transformationMap.get(SELECTOR_WIDTH_KEY);
String imageType = getImageType(requestPathInfo.getExtension());
if (imageComponent.source == Source.FILE) {
transformAndStreamFile(response, componentProperties, resizeWidth, quality, imageComponent.imageResource, imageType, imageName);
} else if (imageComponent.source == Source.ASSET) {
transformAndStreamAsset(response, componentProperties, resizeWidth, quality, asset, imageType, imageName);
}
metrics.markImageStreamed();
}
} catch (IllegalArgumentException e) {
LOGGER.error("Invalid image request", e.getMessage());
metrics.markImageErrors();
response.sendError(HttpServletResponse.SC_NOT_FOUND);
} finally {
requestDuration.stop();
}
}
Aggregations