MediaFileType.java
- /*
- * #%L
- * wcm.io
- * %%
- * Copyright (C) 2019 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;
- import java.util.EnumSet;
- import java.util.Set;
- import java.util.stream.Collectors;
- import java.util.stream.Stream;
- import org.apache.commons.lang3.StringUtils;
- import org.jetbrains.annotations.NotNull;
- import org.jetbrains.annotations.Nullable;
- import org.osgi.annotation.versioning.ProviderType;
- import io.wcm.wcm.commons.contenttype.ContentType;
- import io.wcm.wcm.commons.contenttype.FileExtension;
- /**
- * File types supported by Media Handler.
- */
- @ProviderType
- public enum MediaFileType {
- /**
- * JPEG
- */
- JPEG(new String[] { ContentType.JPEG }, new String[] { FileExtension.JPEG, "jpeg" }, true),
- /**
- * PNG
- */
- PNG(new String[] { ContentType.PNG }, new String[] { FileExtension.PNG }, false),
- /**
- * GIF
- */
- GIF(new String[] { ContentType.GIF }, new String[] { FileExtension.GIF }, false),
- /**
- * TIFF
- */
- TIFF(new String[] { ContentType.TIFF }, new String[] { FileExtension.TIFF, "tiff" }, false),
- /**
- * SVG
- */
- SVG(new String[] { ContentType.SVG }, new String[] { FileExtension.SVG }, false);
- private final Set<String> contentTypes;
- private final Set<String> extensions;
- private final boolean imageQualityPercentage;
- @SuppressWarnings("null")
- MediaFileType(@NotNull String @NotNull [] contentTypes,
- @NotNull String @NotNull [] extensions,
- boolean imageQualityPercentage) {
- this.contentTypes = Set.of(contentTypes);
- this.extensions = Set.of(extensions);
- this.imageQualityPercentage = imageQualityPercentage;
- }
- /**
- * @return Content types
- */
- public Set<String> getContentTypes() {
- return this.contentTypes;
- }
- /**
- * @return File extensions
- */
- public Set<String> getExtensions() {
- return extensions;
- }
- /**
- * @return true if this image type has lossy compression and image quality is specified in percentage
- */
- public boolean isImageQualityPercentage() {
- return imageQualityPercentage;
- }
- /**
- * All file types that are supported by the Media Handler for rendering as image.
- */
- private static final EnumSet<MediaFileType> IMAGE_FILE_TYPES = EnumSet.of(
- GIF,
- JPEG,
- PNG,
- TIFF,
- SVG);
- /**
- * All file types that are supported by the browser for direct display.
- */
- private static final EnumSet<MediaFileType> BROWSER_IMAGE_FILE_TYPES = EnumSet.of(
- GIF,
- JPEG,
- PNG,
- SVG);
- /**
- * All file types that are vector formats and can be scaled by the browser.
- */
- private static final EnumSet<MediaFileType> VECTOR_IMAGE_FILE_TYPES = EnumSet.of(
- SVG);
- /**
- * Check if the given file extension is supported by the Media Handler for rendering as image.
- * @param fileExtension File extension
- * @return true if image
- */
- public static boolean isImage(@Nullable String fileExtension) {
- return isExtension(IMAGE_FILE_TYPES, fileExtension);
- }
- /**
- * @return Image file extensions supported by the Media Handler for rendering as image.
- */
- public static @NotNull Set<String> getImageFileExtensions() {
- return getFileExtensions(IMAGE_FILE_TYPES);
- }
- /**
- * @return Image content types supported by the Media Handler for rendering as image.
- */
- public static @NotNull Set<String> getImageContentTypes() {
- return getContentTypes(IMAGE_FILE_TYPES);
- }
- /**
- * Check if the given file extension is supported for direct display in a browser.
- * @param fileExtension File extension
- * @return true if image is supported in browsers
- */
- public static boolean isBrowserImage(@Nullable String fileExtension) {
- return isExtension(BROWSER_IMAGE_FILE_TYPES, fileExtension);
- }
- /**
- * @return Image file extensions supported for direct display in a browser.
- */
- public static @NotNull Set<String> getBrowserImageFileExtensions() {
- return getFileExtensions(BROWSER_IMAGE_FILE_TYPES);
- }
- /**
- * @return Image content types supported for direct display in a browser.
- */
- public static @NotNull Set<String> getBrowserImageContentTypes() {
- return getContentTypes(BROWSER_IMAGE_FILE_TYPES);
- }
- /**
- * Check if the given file extension is a vector image file extension.
- * @param fileExtension File extension
- * @return true if image is a vector image.
- */
- public static boolean isVectorImage(@Nullable String fileExtension) {
- return isExtension(VECTOR_IMAGE_FILE_TYPES, fileExtension);
- }
- /**
- * @return Image file extensions that are vector images.
- */
- public static @NotNull Set<String> getVectorImageFileExtensions() {
- return getFileExtensions(VECTOR_IMAGE_FILE_TYPES);
- }
- /**
- * @return Image content types that are vector images.
- */
- public static @NotNull Set<String> getVectorImageContentTypes() {
- return getContentTypes(VECTOR_IMAGE_FILE_TYPES);
- }
- private static Set<String> getContentTypes(@NotNull EnumSet<MediaFileType> fileTypes) {
- return fileTypes.stream()
- .flatMap(type -> type.getContentTypes().stream())
- .collect(Collectors.toSet());
- }
- private static boolean isExtension(@NotNull EnumSet<MediaFileType> fileTypes, @Nullable String fileExtension) {
- if (StringUtils.isEmpty(fileExtension)) {
- return false;
- }
- return fileTypes.stream()
- .anyMatch(type -> type.getExtensions().contains(StringUtils.lowerCase(fileExtension)));
- }
- private static Set<String> getFileExtensions(@NotNull EnumSet<MediaFileType> fileTypes) {
- return fileTypes.stream()
- .flatMap(type -> type.getExtensions().stream())
- .collect(Collectors.toSet());
- }
- /**
- * Get Media file type by content type.
- * @param contentType Content type
- * @return Media file type or null if not found
- */
- @SuppressWarnings("null")
- public static @Nullable MediaFileType getByContentType(@Nullable String contentType) {
- if (contentType == null) {
- return null;
- }
- String contentTypeLowerCase = StringUtils.toRootLowerCase(contentType);
- return Stream.of(values())
- .filter(type -> type.getContentTypes().contains(contentTypeLowerCase))
- .findFirst()
- .orElse(null);
- }
- /**
- * Get Media file type by file extension.
- * @param extension File extension
- * @return Media file type or null if not found
- */
- @SuppressWarnings("null")
- public static @Nullable MediaFileType getByFileExtensions(@Nullable String extension) {
- if (extension == null) {
- return null;
- }
- String extensionLowerCase = StringUtils.toRootLowerCase(extension);
- return Stream.of(values())
- .filter(type -> type.getExtensions().contains(extensionLowerCase))
- .findFirst()
- .orElse(null);
- }
- }