MediaHandlerConfig.java
- /*
- * #%L
- * wcm.io
- * %%
- * Copyright (C) 2014 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.media.spi;
- import java.util.Collections;
- import java.util.EnumSet;
- import java.util.List;
- import java.util.Set;
- import org.jetbrains.annotations.NotNull;
- import org.jetbrains.annotations.Nullable;
- import org.osgi.annotation.versioning.ConsumerType;
- import com.day.cq.wcm.api.Page;
- import io.wcm.handler.media.MediaFileType;
- import io.wcm.handler.media.MediaNameConstants;
- import io.wcm.handler.media.markup.DummyImageMediaMarkupBuilder;
- import io.wcm.handler.media.markup.MediaMarkupBuilderUtil;
- import io.wcm.handler.media.markup.SimpleImageMediaMarkupBuilder;
- import io.wcm.handler.mediasource.dam.AemRenditionType;
- import io.wcm.handler.mediasource.dam.DamMediaSource;
- import io.wcm.sling.commons.caservice.ContextAwareService;
- /**
- * {@link MediaHandlerConfig} OSGi services provide application-specific configuration for media handling.
- * Applications can set service properties or bundle headers as defined in {@link ContextAwareService} to apply this
- * configuration only for resources that match the relevant resource paths.
- */
- @ConsumerType
- public abstract class MediaHandlerConfig implements ContextAwareService {
- /**
- * Default image quality for images with lossy compressions (e.g. JPEG).
- */
- public static final double DEFAULT_IMAGE_QUALITY = 0.85d;
- /**
- * Default value for JPEG quality.
- * @deprecated Use {@link #DEFAULT_IMAGE_QUALITY} instead.
- */
- @Deprecated(since = "2.0.0")
- public static final double DEFAULT_JPEG_QUALITY = DEFAULT_IMAGE_QUALITY;
- private static final List<Class<? extends MediaSource>> DEFAULT_MEDIA_SOURCES = List.of(
- DamMediaSource.class);
- private static final List<Class<? extends MediaMarkupBuilder>> DEFAULT_MEDIA_MARKUP_BUILDERS = List.of(
- SimpleImageMediaMarkupBuilder.class,
- DummyImageMediaMarkupBuilder.class);
- /**
- * @return Supported media sources
- */
- public @NotNull List<Class<? extends MediaSource>> getSources() {
- return DEFAULT_MEDIA_SOURCES;
- }
- /**
- * @return Available media markup builders
- */
- public @NotNull List<Class<? extends MediaMarkupBuilder>> getMarkupBuilders() {
- return DEFAULT_MEDIA_MARKUP_BUILDERS;
- }
- /**
- * @return List of media metadata pre processors (optional). The processors are applied in list order.
- */
- public @NotNull List<Class<? extends MediaProcessor>> getPreProcessors() {
- // no processors
- return Collections.emptyList();
- }
- /**
- * @return List of media metadata post processors (optional). The processors are applied in list order.
- */
- public @NotNull List<Class<? extends MediaProcessor>> getPostProcessors() {
- // no processors
- return Collections.emptyList();
- }
- /**
- * Get the default quality for images.
- * The meaning of the quality parameter for the different image formats is described in
- * {@link com.day.image.Layer#write(String, double, java.io.OutputStream)}.
- * @param contentType MIME-type of the output format
- * @return Quality factor
- */
- public double getDefaultImageQuality(@Nullable String contentType) {
- MediaFileType mediaFileType = MediaFileType.getByContentType(contentType);
- if (mediaFileType != null && mediaFileType.isImageQualityPercentage()) {
- return getDefaultImageQualityPercentage();
- }
- else if (mediaFileType == MediaFileType.GIF) {
- return 256d; // 256 colors
- }
- // return quality "1" for all other mime types
- return 1d;
- }
- /**
- * Get the default quality for images.
- * This parameter only applies to images with lossy compression (e.g. JPEG).
- * @return Quality percentage (0..1)
- */
- public double getDefaultImageQualityPercentage() {
- return DEFAULT_IMAGE_QUALITY;
- }
- /**
- * With this switch it's possible to switch all used property and node names from (legacy) wcm.io
- * Handler standard to Adobe Standard (as used e.g. in Adobe Core WCM Components) - e.g.
- * using "fileReference" instead of property name "mediaRef" for the asset reference.
- *
- * <p>
- * The benefit of the wcm.io Handler standard was that it supported storage multiple asset references
- * in one single node - but this it not well supported by the Touch UI anyway, so it's not of much
- * use nowadays.
- * </p>
- *
- * <p>
- * For new projects it is recommended to always use the Adobe standard names. But for backward compatibility
- * the default values is false.
- * </p>
- * @return If true, Adobe standard property and node names are used.
- */
- public boolean useAdobeStandardNames() {
- return false;
- }
- /**
- * @return Default property name for reference to media library item
- */
- public @NotNull String getMediaRefProperty() {
- if (useAdobeStandardNames()) {
- return MediaNameConstants.PN_MEDIA_REF_STANDARD;
- }
- else {
- return MediaNameConstants.PN_MEDIA_REF;
- }
- }
- /**
- * @return Default property name for cropping parameters
- */
- public @NotNull String getMediaCropProperty() {
- if (useAdobeStandardNames()) {
- return MediaNameConstants.PN_MEDIA_CROP_STANDARD;
- }
- else {
- return MediaNameConstants.PN_MEDIA_CROP;
- }
- }
- /**
- * @return Default property name for rotate parameter
- */
- public @NotNull String getMediaRotationProperty() {
- if (useAdobeStandardNames()) {
- return MediaNameConstants.PN_MEDIA_ROTATION_STANDARD;
- }
- else {
- return MediaNameConstants.PN_MEDIA_ROTATION;
- }
- }
- /**
- * @return Default property name for map parameter
- */
- public @NotNull String getMediaMapProperty() {
- if (useAdobeStandardNames()) {
- return MediaNameConstants.PN_MEDIA_MAP_STANDARD;
- }
- else {
- return MediaNameConstants.PN_MEDIA_MAP;
- }
- }
- /**
- * @return Default property name for media alt. text
- */
- public @NotNull String getMediaAltTextProperty() {
- if (useAdobeStandardNames()) {
- return MediaNameConstants.PN_MEDIA_ALTTEXT_STANDARD;
- }
- else {
- return MediaNameConstants.PN_MEDIA_ALTTEXT;
- }
- }
- /**
- * @return Default property name for forcing reading alt. text from DAM asset description
- */
- public @NotNull String getMediaForceAltTextFromAssetProperty() {
- if (useAdobeStandardNames()) {
- return MediaNameConstants.PN_MEDIA_FORCE_ALTTEXT_FROM_ASSET_STANDARD;
- }
- else {
- return MediaNameConstants.PN_MEDIA_FORCE_ALTTEXT_FROM_ASSET;
- }
- }
- /**
- * @return Default property name for marking image as "decorative" - requiring no alt. text
- */
- public @NotNull String getMediaIsDecorativeProperty() {
- if (useAdobeStandardNames()) {
- return MediaNameConstants.PN_MEDIA_IS_DECORATIVE_STANDARD;
- }
- else {
- return MediaNameConstants.PN_MEDIA_IS_DECORATIVE;
- }
- }
- /**
- * @return Default node name for inline media item stored in node within the content page
- */
- public @NotNull String getMediaInlineNodeName() {
- if (useAdobeStandardNames()) {
- return MediaNameConstants.NN_MEDIA_INLINE_STANDARD;
- }
- else {
- return MediaNameConstants.NN_MEDIA_INLINE;
- }
- }
- /**
- * @return If set to true, web renditions generated by AEM (with <code>cq5dam.web.</code> prefix) are
- * taken into account by default when trying to resolve the media request.
- * @deprecated Use {@link #getIncludeAssetAemRenditionsByDefault()} instead.
- */
- @Deprecated(since = "2.0.0")
- public boolean includeAssetWebRenditionsByDefault() {
- return false;
- }
- /**
- * Set of renditions auto-generated by AEM (with <code>cq5dam.</code> prefix) which are taken into account
- * by default when trying to resolve the media request.
- * @return Set or rendition types
- */
- @SuppressWarnings("java:S1874") // ignore use of deprecated method
- public @NotNull Set<AemRenditionType> getIncludeAssetAemRenditionsByDefault() {
- if (includeAssetWebRenditionsByDefault()) {
- return EnumSet.of(AemRenditionType.WEB_RENDITION, AemRenditionType.VIDEO_RENDITION);
- }
- else {
- return EnumSet.of(AemRenditionType.VIDEO_RENDITION);
- }
- }
- /**
- * Enforce to generate only virtual renditions.
- *
- * <p>
- * By default, virtual renditions (rendered on-the-fly via <code>ImageFileServet</code>) are only
- * generated if there is a need to re-scale or crop or transform an image. Otherwise direct references
- * to renditions or original stored in DAM are returned when there is an direct match with the requested ratio and
- * resolution.
- * </p>
- *
- * <p>
- * When this flag is set to <code>true</code>, even if there is a direct match a virtual rendition is returned.
- * This ensures that the default quality setting e.g. for JPEG images is always respected, regardless
- * in which quality the original images was uploaded.
- * </p>
- * @return Enforce always returning virtual renditions for images.
- */
- public boolean enforceVirtualRenditions() {
- return false;
- }
- /**
- * @return Allowed editor types for image IPE (in-place editor).
- * By default, only the OOTB "image" editor type is supported.
- */
- public @NotNull Set<String> allowedIpeEditorTypes() {
- return MediaMarkupBuilderUtil.DEFAULT_ALLOWED_IPE_EDITOR_TYPES;
- }
- /**
- * Get root path for picking assets using path field widgets.
- * @param page Context page
- * @return DAM root path
- */
- public @NotNull String getDamRootPath(@NotNull Page page) {
- return "/content/dam";
- }
- }