InlineUriTemplate.java
/*
* #%L
* wcm.io
* %%
* Copyright (C) 2021 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.handler.mediasource.inline;
import static io.wcm.handler.media.MediaNameConstants.URI_TEMPLATE_PLACEHOLDER_HEIGHT;
import static io.wcm.handler.media.MediaNameConstants.URI_TEMPLATE_PLACEHOLDER_WIDTH;
import org.apache.commons.lang3.StringUtils;
import org.apache.sling.api.adapter.Adaptable;
import org.apache.sling.api.resource.Resource;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import io.wcm.handler.media.CropDimension;
import io.wcm.handler.media.Dimension;
import io.wcm.handler.media.MediaArgs;
import io.wcm.handler.media.UriTemplate;
import io.wcm.handler.media.UriTemplateType;
import io.wcm.handler.media.impl.ImageFileServlet;
import io.wcm.handler.media.impl.ImageFileServletSelector;
import io.wcm.handler.media.impl.JcrBinary;
import io.wcm.handler.media.impl.MediaFileServletConstants;
import io.wcm.handler.url.UrlHandler;
import io.wcm.sling.commons.adapter.AdaptTo;
final class InlineUriTemplate implements UriTemplate {
private final String uriTemplate;
private final UriTemplateType type;
private final Dimension dimension;
@SuppressWarnings("java:S107") // allow more than 7 params
InlineUriTemplate(@NotNull UriTemplateType type, @NotNull Dimension dimension,
@NotNull Resource resource, @NotNull String fileName,
@Nullable CropDimension cropDimension, @Nullable Integer rotation,
@NotNull MediaArgs mediaArgs, @NotNull Adaptable adaptable) {
this.uriTemplate = buildUriTemplate(type, resource, fileName, cropDimension, rotation, mediaArgs, adaptable);
this.type = type;
this.dimension = dimension;
}
@SuppressWarnings("java:S1075") // not a file path
private static String buildUriTemplate(@NotNull UriTemplateType type, @NotNull Resource resource,
@NotNull String fileName, @Nullable CropDimension cropDimension, @Nullable Integer rotation,
@NotNull MediaArgs mediaArgs, @NotNull Adaptable adaptable) {
String resourcePath = resource.getPath();
// if parent resource is a nt:file resource, use this one as path for scaled image
Resource parentResource = resource.getParent();
if (parentResource != null && JcrBinary.isNtFile(parentResource)) {
resourcePath = parentResource.getPath();
}
// URL to render scaled image via {@link InlineRenditionServlet}
final long DUMMY_WIDTH = 999991;
final long DUMMY_HEIGHT = 999992;
String path = resourcePath
+ "." + ImageFileServletSelector.build(DUMMY_WIDTH, DUMMY_HEIGHT, cropDimension, rotation,
mediaArgs.getImageQualityPercentage(), false)
+ "." + MediaFileServletConstants.EXTENSION
// replace extension based on the format supported by ImageFileServlet for rendering for this rendition
+ "/" + ImageFileServlet.getImageFileName(fileName, mediaArgs.getEnforceOutputFileExtension());
// build externalized URL
UrlHandler urlHandler = AdaptTo.notNull(adaptable, UrlHandler.class);
String url = urlHandler.get(path).urlMode(mediaArgs.getUrlMode()).buildExternalResourceUrl(resource);
switch (type) {
case CROP_CENTER:
url = StringUtils.replace(url, Long.toString(DUMMY_WIDTH), URI_TEMPLATE_PLACEHOLDER_WIDTH);
url = StringUtils.replace(url, Long.toString(DUMMY_HEIGHT), URI_TEMPLATE_PLACEHOLDER_HEIGHT);
break;
case SCALE_WIDTH:
url = StringUtils.replace(url, Long.toString(DUMMY_WIDTH), URI_TEMPLATE_PLACEHOLDER_WIDTH);
url = StringUtils.replace(url, Long.toString(DUMMY_HEIGHT), "0");
break;
case SCALE_HEIGHT:
url = StringUtils.replace(url, Long.toString(DUMMY_WIDTH), "0");
url = StringUtils.replace(url, Long.toString(DUMMY_HEIGHT), URI_TEMPLATE_PLACEHOLDER_HEIGHT);
break;
default:
throw new IllegalArgumentException("Unsupported type: " + type);
}
return url;
}
@Override
public @NotNull UriTemplateType getType() {
return type;
}
@Override
public @NotNull String getUriTemplate() {
return uriTemplate;
}
@Override
public long getMaxWidth() {
return dimension.getWidth();
}
@Override
public long getMaxHeight() {
return dimension.getHeight();
}
@Override
public String toString() {
return uriTemplate;
}
}