/** * Iterate over all media formats defined in media args. Ignores invalid media formats. * If the media format visitor returns a value that is not null, iteration is stopped and the value is returned from * this method. * @param mediaArgs Media args * @param mediaFormatVisitor Media format visitor * @return Return value form media format visitor, if any returned a value that is not null */ @SuppressWarnings("null") private <T> T visitMediaFormats(MediaArgs mediaArgs, MediaFormatVisitor<T> mediaFormatVisitor) { MediaFormat[] mediaFormats = mediaArgs.getMediaFormats(); if (mediaFormats != null) { for (MediaFormat mediaFormat : mediaFormats) { T returnValue = mediaFormatVisitor.visit(mediaFormat); if (returnValue != null) { return returnValue; } } } return null; }
/** * Resolves single rendition (or multiple renditions if {@link MediaArgs#isMediaFormatsMandatory()} is true * and sets the resolved rendition and the URL of the first (best-matching) rendition in the media object. * @param media Media object * @param asset Asset * @param mediaArgs Media args * @return true if all requested renditions could be resolved (at least one or all if * {@link MediaArgs#isMediaFormatsMandatory()} was set to true) */ protected final boolean resolveRenditions(Media media, Asset asset, MediaArgs mediaArgs) { if (mediaArgs.getMediaFormats() != null && mediaArgs.getMediaFormats().length > 1 && mediaArgs.isMediaFormatsMandatory()) { return resolveAllMandatoryRenditions(media, asset, mediaArgs); } else { return resolveFirstMatchRenditions(media, asset, mediaArgs); } }
/** * If a set of media formats is given it is filtered to contain only download media formats. * If no is given a new set of allowed media formats is created by getting from all media formats those marked as "download". * If the result is an empty set of media formats (but downloads are requests) resolution is not successful. * @param mediaArgs Media args * @return true if resolving was successful */ private boolean resolveDownloadMediaFormats(MediaArgs mediaArgs) { if (!mediaArgs.isDownload()) { // not filtering for downloads return true; } List<MediaFormat> candidates = new ArrayList<>(); if (mediaArgs.getMediaFormats() != null) { candidates.addAll(ImmutableList.copyOf(mediaArgs.getMediaFormats())); } else { candidates.addAll(mediaFormatHandler.getMediaFormats()); } MediaFormat[] result = candidates.stream() .filter(MediaFormat::isDownload) .toArray(size -> new MediaFormat[size]); if (result.length > 0) { mediaArgs.mediaFormats(result); return true; } else { return false; } }
if (url != null && mediaArgs.getMediaFormats() != null && mediaArgs.getMediaFormats().length > 0) { this.resolvedMediaFormat = mediaArgs.getMediaFormats()[0];
/** * Iterates over all defined media format and tries to find a matching rendition for each of them * in combination with the other media args. * @param media Media * @param asset Asset * @param mediaArgs Media args * @return true if for *all* media formats a rendition could be found. */ private boolean resolveAllMandatoryRenditions(Media media, Asset asset, MediaArgs mediaArgs) { boolean allResolved = true; List<Rendition> resolvedRenditions = new ArrayList<>(); for (MediaFormat mediaFormat : mediaArgs.getMediaFormats()) { MediaArgs renditionMediaArgs = mediaArgs.clone(); renditionMediaArgs.mediaFormat(mediaFormat); renditionMediaArgs.mediaFormatsMandatory(false); Rendition rendition = asset.getRendition(renditionMediaArgs); if (rendition != null) { resolvedRenditions.add(rendition); } else { allResolved = false; } } media.setRenditions(resolvedRenditions); if (!resolvedRenditions.isEmpty()) { media.setUrl(resolvedRenditions.get(0).getUrl()); } return allResolved; }
/** * Get dimension from first media format defined in media args. Fall back to dummy min. dimension if none specified. * @param media Media metadata * @return Dimension */ public static @NotNull Dimension getMediaformatDimension(@NotNull Media media) { // Create dummy image element to be displayed in Edit mode as placeholder. MediaArgs mediaArgs = media.getMediaRequest().getMediaArgs(); MediaFormat[] mediaFormats = mediaArgs.getMediaFormats(); // detect width/height - either from media args, or from first media format long width = mediaArgs.getFixedWidth(); long height = mediaArgs.getFixedHeight(); if ((width == 0 || height == 0) && mediaFormats != null && mediaFormats.length > 0) { MediaFormat firstMediaFormat = mediaArgs.getMediaFormats()[0]; Dimension dimension = firstMediaFormat.getMinDimension(); if (dimension != null) { width = dimension.getWidth(); height = dimension.getHeight(); } } // fallback to min width/height if (width == 0) { width = MediaMarkupBuilder.DUMMY_MIN_DIMENSION; } if (height == 0) { height = MediaMarkupBuilder.DUMMY_MIN_DIMENSION; } return new Dimension(width, height); }
@Override public boolean accepts(@NotNull Media media) { // accept if not rendition was found and in edit mode // and at least one media format is given, and dummy image is not suppressed MediaArgs mediaArgs = media.getMediaRequest().getMediaArgs(); MediaFormat[] mediaFormats = mediaArgs.getMediaFormats(); return (!media.isValid() || media.getRendition() == null) && getWcmMode() != null && getWcmMode() != WCMMode.DISABLED && (mediaFormats != null && mediaFormats.length > 0) && mediaArgs.isDummyImage(); }
/** * Collect responsive JSON metadata for all renditions as image sources. * @param media Media * @return JSON metadata */ protected JSONArray getResponsiveImageSources(Media media) { MediaFormat[] mediaFormats = media.getMediaRequest().getMediaArgs().getMediaFormats(); JSONArray sources = new JSONArray(); for (MediaFormat mediaFormat : mediaFormats) { sources.put(toReponsiveImageSource(media, mediaFormat)); } return sources; }
@Override public final boolean accepts(@NotNull Media media) { // accept if not rendition was found and in edit mode // and multiple media formats are mandatory, and dummy image is not suppressed MediaArgs mediaArgs = media.getMediaRequest().getMediaArgs(); MediaFormat[] mediaFormats = mediaArgs.getMediaFormats(); return (!media.isValid() || media.getRendition() == null) && getWcmMode() != null && getWcmMode() != WCMMode.DISABLED && (mediaFormats != null && mediaFormats.length > 1) && mediaArgs.isDummyImage() && mediaArgs.isMediaFormatsMandatory(); }
/** * Resolve media format names to media formats so all downstream logic has only to handle the resolved media formats. * If resolving fails an exception is thrown. * @param mediaArgs Media args * @return true if resolving was successful. */ private boolean resolveMediaFormats(MediaArgs mediaArgs) { // resolved media formats already set? done. if (mediaArgs.getMediaFormats() != null) { return true; } // no media format names present? done. if (mediaArgs.getMediaFormatNames() == null) { return true; } String[] mediaFormatNames = mediaArgs.getMediaFormatNames(); MediaFormat[] mediaFormats = new MediaFormat[mediaFormatNames.length]; boolean resolutionSuccessful = true; for (int i = 0; i < mediaFormatNames.length; i++) { mediaFormats[i] = mediaFormatHandler.getMediaFormat(mediaFormatNames[i]); if (mediaFormats[i] == null) { log.warn("Media format name '" + mediaFormatNames[i] + "' is invalid."); resolutionSuccessful = false; } } mediaArgs.mediaFormats(mediaFormats); mediaArgs.mediaFormatNames((String[])null); return resolutionSuccessful; }
else if (mediaArgs.getMediaFormats() != null && mediaArgs.getMediaFormats().length > 0) { return visitMediaFormats(mediaArgs, new MediaFormatVisitor<RenditionMetadata>() { @Override
/** * Requested dimensions either from media format or fixed dimensions from media args. * @return Requested dimensions */ private Dimension getRequestedDimension() { // check for fixed dimensions from media args if (mediaArgs.getFixedWidth() > 0 || mediaArgs.getFixedHeight() > 0) { return new Dimension(mediaArgs.getFixedWidth(), mediaArgs.getFixedHeight()); } // check for dimensions from mediaformat (evaluate only first media format) MediaFormat[] mediaFormats = mediaArgs.getMediaFormats(); if (mediaFormats != null && mediaFormats.length > 0) { Dimension dimension = mediaFormats[0].getMinDimension(); if (dimension != null) { return dimension; } } // fallback to 0/0 - no specific dimension requested return new Dimension(0, 0); }