/** * Get more info at : www.jrebirth.org . * Copyright JRebirth.org © 2011-2013 * Contact : sebastien.bordes@jrebirth.org * * 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. */ package org.jrebirth.af.core.resource.image; import java.io.InputStream; import java.util.Collections; import java.util.List; import javafx.scene.image.Image; import javafx.scene.image.WritableImage; import javafx.scene.text.Text; import org.jrebirth.af.api.resource.builder.ResourceBuilder; import org.jrebirth.af.api.resource.image.ImageItem; import org.jrebirth.af.api.resource.image.ImageParams; import org.jrebirth.af.core.resource.Resources; import org.jrebirth.af.core.resource.builder.AbstractResourceBuilder; import org.jrebirth.af.core.resource.provided.JRebirthImages; import org.jrebirth.af.core.resource.provided.JRebirthParameters; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The class <strong>ImageBuilder</strong>. * * Class used to manage images with weak reference. * * @author Sébastien Bordes */ public final class ImageBuilder extends AbstractResourceBuilder<ImageItem, ImageParams, Image> implements ResourceBuilder<ImageItem, ImageParams, Image> { /** The class logger. */ private static final Logger LOGGER = LoggerFactory.getLogger(ImageBuilder.class); /** * {@inheritDoc} */ @Override protected Image buildResource(final ImageItem imageItem, final ImageParams jrImage) { Image image = null; if (jrImage instanceof RelImage) { // Build the requested relative image image = buildLocalImage((RelImage) jrImage, false); } else if (jrImage instanceof AbsImage) { // Build the requested absolute image image = buildLocalImage((AbsImage) jrImage, true); } else if (jrImage instanceof WebImage) { // Build the requested web image image = buildWebImage((WebImage) jrImage); } // Try to get the default image when an image is not found if (image == null && !JRebirthParameters.NOT_AVAILABLE_IMAGE_NAME.equals(jrImage.name())) { // Return the default image image = JRebirthImages.NOT_AVAILABLE.get(); } // Default image was not found if (image == null) { WritableImage img = new WritableImage(30, 30); final Text text = new Text(); text.setText("N/A"); img = text.snapshot(null, img); image = img; } return image; } /** * Build a local image with its local path. * * @param jrImage the local image params * @param skipImagesFolder skip imagesFolder prefix addition * * @return the JavaFX image object */ private Image buildLocalImage(final AbstractBaseImage jrImage, final boolean skipImagesFolder) { final StringBuilder sb = new StringBuilder(); if (jrImage.path() != null && !jrImage.path().isEmpty()) { sb.append(jrImage.path()).append(Resources.PATH_SEP); } sb.append(jrImage.name()); if (jrImage.extension() != null) { sb.append(jrImage.extension()); } return loadImage(sb.toString(), skipImagesFolder); } /** * Build a web image with its url parameters. * * @param jrImage the web image params * * @return the JavaFX image object */ private Image buildWebImage(final WebImage jrImage) { final String url = jrImage.getUrl(); Image image = null; if (url == null || url.isEmpty()) { LOGGER.error("Image : {} not found !", url); } else { image = new Image(url); } return image; } /** * Load an image. * * @param resourceName the name of the image, path must be separated by '/' * * @param skipImagesFolder skip imagesFolder prefix addition * * @return the image loaded */ private Image loadImage(final String resourceName, final boolean skipImagesFolder) { Image image = null; final List<String> imagePaths = skipImagesFolder ? Collections.singletonList("") : JRebirthParameters.IMAGE_FOLDER.get(); for (int i = 0; i < imagePaths.size() && image == null; i++) { String imagePath = imagePaths.get(i); if (!imagePath.isEmpty()) { imagePath += Resources.PATH_SEP; } final InputStream imageInputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(imagePath + resourceName); if (imageInputStream != null) { image = new Image(imageInputStream); } } if (image == null) { LOGGER.error("Image : {} not found into base folder: {}", resourceName, JRebirthParameters.IMAGE_FOLDER.get()); } return image; } }