@Override public final HtmlElement<?> build(@NotNull Media media) { HtmlElement<?> mediaElement = getImageElement(media); // set responsive image sources JSONArray sources = getResponsiveImageSources(media); setResponsiveImageSource(mediaElement, sources, media); // set additional attributes setAdditionalAttributes(mediaElement, media); // further processing in edit or preview mode applyWcmMarkup(mediaElement, media); return mediaElement; }
@Override public final HtmlElement<?> build(@NotNull Media media) { // render media element for rendition HtmlElement<?> mediaElement = getImageElement(media); // set additional attributes setAdditionalAttributes(mediaElement, media); // further processing in edit or preview mode applyWcmMarkup(mediaElement, media); return mediaElement; }
/** * Adds CSS classes that denote the changes to the media element when compared to a different version. * If no diff has been requested by the WCM UI, there won't be any changes to the element. * @param mediaElement Element to be decorated * @param resource Resource pointing to JCR node * @param refProperty Name of property for media library item reference. If null, default name is used. * @param request Servlet request * @deprecated Use * {@link #addDiffDecoration(HtmlElement, Resource, String, SlingHttpServletRequest, MediaHandlerConfig)} */ @Deprecated public static void addDiffDecoration(@NotNull HtmlElement<?> mediaElement, @NotNull Resource resource, @NotNull String refProperty, @NotNull SlingHttpServletRequest request) { addDiffDecoration(mediaElement, resource, refProperty, request, null); }
@SuppressWarnings({ "null", "unused" }) @Override public final HtmlElement<?> build(@NotNull Media media) { HtmlElement<?> mediaElement = getImageElement(media); // set responsive image sources JSONArray sources = getResponsiveImageSources(media); setResponsiveImageSource(mediaElement, sources, media); // set additional attributes setAdditionalAttributes(mediaElement, media); // enable drag&drop for media source - if none is specified use first one defined in config MediaSource mediaSource = media.getMediaSource(); if (mediaSource == null && !mediaHandlerConfig.getSources().isEmpty()) { Class<? extends MediaSource> mediaSourceClass = mediaHandlerConfig.getSources().iterator().next(); mediaSource = AdaptTo.notNull(adaptable, mediaSourceClass); } if (mediaSource != null) { mediaSource.enableMediaDrop(mediaElement, media.getMediaRequest()); } return mediaElement; }
@Override protected HtmlElement<?> getImageElement(Media media) { HtmlElement image = super.getImageElement(media); if (image != null) { // clear with/height attribute, size is controlled via CSS and JavaScript image.removeAttribute("width"); image.removeAttribute("height"); } return image; }
@SuppressWarnings({ "null", "unused" }) @Override public HtmlElement<?> build(@NotNull Media media) { // Create dummy image element to be displayed in Edit mode as placeholder. Dimension dimension = MediaMarkupBuilderUtil.getMediaformatDimension(media); MediaArgs mediaArgs = media.getMediaRequest().getMediaArgs(); // create dummy image String dummyImageUrl = StringUtils.defaultString(mediaArgs.getDummyImageUrl(), DUMMY_IMAGE); dummyImageUrl = urlHandler.get(dummyImageUrl) .urlMode(media.getMediaRequest().getMediaArgs().getUrlMode()) .buildExternalResourceUrl(); Image image = new Image(dummyImageUrl, dimension.getWidth(), dimension.getHeight()) .addCssClass(MediaNameConstants.CSS_DUMMYIMAGE); // set additional attributes setAdditionalAttributes(image, media); // enable drag&drop for media source - if none is specified use first one defined in config MediaSource mediaSource = media.getMediaSource(); if (mediaSource == null && !mediaHandlerConfig.getSources().isEmpty()) { Class<? extends MediaSource> mediaSourceClass = mediaHandlerConfig.getSources().iterator().next(); mediaSource = AdaptTo.notNull(adaptable, mediaSourceClass); } if (mediaSource != null) { mediaSource.enableMediaDrop(image, media.getMediaRequest()); } return image; }
@Override public final boolean isValidMedia(@NotNull HtmlElement<?> element) { if (element instanceof Image) { Image img = (Image)element; // if it's a responsive image, we don't need the src attribute set return imageSourceIsNotEmpty(img) && !StringUtils.contains(img.getCssClass(), MediaNameConstants.CSS_DUMMYIMAGE); } return false; }
/** * Collect responsive JSON metadata for all renditions as image sources. * @param media Media * @return JSON metadata */ protected JSONArray getResponsiveImageSources(Media media) { Collection<Rendition> renditions = media.getRenditions(); JSONArray sources = new JSONArray(); for (Rendition rendition : renditions) { sources.put(toReponsiveImageSource(media, rendition)); } return sources; }
@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(); }
@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(); }
/** * Build JSON metadata for one rendition as image source. * @param media Media * @param mediaFormat Media format * @return JSON metadata */ protected JSONObject toReponsiveImageSource(Media media, MediaFormat mediaFormat) { String url = buildDummyImageUrl(mediaFormat); try { JSONObject source = new JSONObject(); source.put(MediaNameConstants.PROP_BREAKPOINT, mediaFormat.getProperties().get(MediaNameConstants.PROP_BREAKPOINT)); source.put(ResponsiveImageMediaMarkupBuilder.PROP_SRC, url); return source; } catch (JSONException ex) { throw new RuntimeException("Error building JSON source.", ex); } }
/** * 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; }
/** * Build HTML5 video player element * @param media Media metadata * @return Media element */ protected Video getVideoPlayerElement(@NotNull Media media) { Dimension dimension = MediaMarkupBuilderUtil.getMediaformatDimension(media); Video video = new Video(); video.setWidth((int)dimension.getWidth()); video.setHeight((int)dimension.getHeight()); video.setControls(true); // add video sources for each video profile addSources(video, media); // add flash player as fallback video.addContent(getFlashPlayerElement(media, dimension)); return video; }
@Override @SuppressWarnings("null") public void enableMediaDrop(@NotNull HtmlElement element, @NotNull MediaRequest mediaRequest) { if (wcmMode == WCMMode.DISABLED || wcmMode == null) { return; } if (componentContext != null && componentContext.getEditContext() != null && MediaMarkupBuilderUtil.canApplyDragDropSupport(mediaRequest, componentContext)) { String refProperty = prependDotSlash(getMediaRefProperty(mediaRequest, mediaHandlerConfig)); String cropProperty = prependDotSlash(getMediaCropProperty(mediaRequest, mediaHandlerConfig)); String rotationProperty = prependDotSlash(getMediaRotationProperty(mediaRequest, mediaHandlerConfig)); String name = refProperty; if (StringUtils.contains(name, "/")) { name = Text.getName(name); } // check of drop target for "media" group already exists - get it's id for the cq-dd- css class Optional<String> dropTargetCssClass = getMediaDropTargetID(); if (!dropTargetCssClass.isPresent()) { // otherwise add a new drop target and get it's id dropTargetCssClass = addMediaDroptarget(refProperty, cropProperty, rotationProperty, name); } if (element != null) { element.addCssClass(dropTargetCssClass.get()); } } }
/** * Apply Markup for Drag&Drop mode and Diff decoration in WCM edit/preview mode. * @param mediaElement Media element * @param media Media */ protected void applyWcmMarkup(HtmlElement<?> mediaElement, Media media) { // further processing in edit or preview mode Resource resource = media.getMediaRequest().getResource(); if (mediaElement != null && resource != null && wcmMode != null) { switch (wcmMode) { case EDIT: // enable drag&drop from content finder media.getMediaSource().enableMediaDrop(mediaElement, media.getMediaRequest()); break; case PREVIEW: // enable drag&drop from content finder media.getMediaSource().enableMediaDrop(mediaElement, media.getMediaRequest()); // add diff decoration if (request != null) { String refProperty = StringUtils.defaultString(media.getMediaRequest().getRefProperty(), mediaHandlerConfig.getMediaRefProperty()); MediaMarkupBuilderUtil.addDiffDecoration(mediaElement, resource, refProperty, request, mediaHandlerConfig); } break; default: // do nothing } } }