diff --git a/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/font/FontBuilder.java b/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/font/FontBuilder.java index 2ba5d0eff..7d83b61f0 100644 --- a/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/font/FontBuilder.java +++ b/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/font/FontBuilder.java @@ -17,6 +17,7 @@ */ package org.jrebirth.af.core.resource.font; +import java.net.URL; import java.util.List; import javafx.scene.text.Font; @@ -24,7 +25,6 @@ import org.jrebirth.af.core.resource.Resources; import org.jrebirth.af.core.resource.builder.AbstractResourceBuilder; import org.jrebirth.af.core.resource.provided.JRebirthParameters; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -115,34 +115,44 @@ private void checkFontStatus(final FontParams realFont) { // Try to load system fonts final List fonts = Font.getFontNames(transformFontName(realFont.name().name())); - Font font; + Font font = null; + String fontName = null; + if (fonts.isEmpty()) { - - // This variable will hold the 2 alternative font names - String fontName = JRebirthParameters.FONT_FOLDER.get() + Resources.PATH_SEP + transformFontName(realFont.name().name()) + JRebirthParameters.TRUE_TYPE_FONT_EXTENSION.get(); - - LOGGER.trace("Try to load Transformed Font {}", fontName); - font = Font.loadFont(Thread.currentThread().getContextClassLoader().getResourceAsStream(fontName), realFont.size()); - - // The font name contains '_' in its file name to replace ' ' - if (font == null) { - fontName = JRebirthParameters.FONT_FOLDER.get() + Resources.PATH_SEP + realFont.name().name() + JRebirthParameters.TRUE_TYPE_FONT_EXTENSION.get(); - LOGGER.trace("Try to load Raw Font {}", fontName); - font = Font.loadFont( - Thread.currentThread().getContextClassLoader().getResourceAsStream(fontName), realFont.size()); - + + List fontPaths = JRebirthParameters.FONT_FOLDER.get(); + for(int i = 0 ; i < fontPaths.size() && font == null ;i++){ + + String fontPath = fontPaths.get(i); + + // This variable will hold the 2 alternative font names + fontName = fontPath + Resources.PATH_SEP + transformFontName(realFont.name().name()) + JRebirthParameters.TRUE_TYPE_FONT_EXTENSION.get(); + + LOGGER.trace("Try to load Transformed Font {}", fontName); + font = Font.loadFont(Thread.currentThread().getContextClassLoader().getResourceAsStream(fontName), realFont.size()); + + // The font name contains '_' in its file name to replace ' ' if (font == null) { - // Neither transformed nor raw font has been loaded (with or without '_') - LOGGER.error("Font Not Found {}", fontName); + fontName = JRebirthParameters.FONT_FOLDER.get() + Resources.PATH_SEP + realFont.name().name() + JRebirthParameters.TRUE_TYPE_FONT_EXTENSION.get(); + LOGGER.trace("Try to load Raw Font {}", fontName); + font = Font.loadFont( + Thread.currentThread().getContextClassLoader().getResourceAsStream(fontName), realFont.size()); + + if (font != null) { + // Raw font has been loaded + LOGGER.info("{} Raw Font loaded", fontName); + } } else { - // Raw font has been loaded - LOGGER.info("{} Raw Font loaded", fontName); + // Transformed font has been loaded + LOGGER.info("{} Transformed Font loaded", fontName); } - } else { - // Transformed font has been loaded - LOGGER.info("{} Transformed Font loaded", fontName); + } + if (font == null) { + // Neither transformed nor raw font has been loaded (with or without '_') + LOGGER.error("Font : {} not found into base folder: {}", realFont.name().name(), JRebirthParameters.FONT_FOLDER.get()); + } } } } diff --git a/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/image/ImageBuilder.java b/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/image/ImageBuilder.java index 0b01bf0b5..45624a90b 100644 --- a/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/image/ImageBuilder.java +++ b/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/image/ImageBuilder.java @@ -18,6 +18,7 @@ package org.jrebirth.af.core.resource.image; import java.io.InputStream; +import java.util.List; import javafx.scene.image.Image; @@ -25,7 +26,6 @@ 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; @@ -54,10 +54,18 @@ protected Image buildResource(final ImageItem imageItem, final ImageParams jrIma // Build the requested font image = buildWebImage((WebImage) jrImage); } - if (image == null) { + + // 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){ + //Build one programmatically TODO + } + return image; } @@ -112,12 +120,18 @@ private Image buildWebImage(final WebImage jrImage) { */ private Image loadImage(final String resourceName) { Image image = null; - final InputStream imageInputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(JRebirthParameters.IMAGE_FOLDER.get() + Resources.PATH_SEP + resourceName); - if (imageInputStream != null) { - image = new Image(imageInputStream); + + List imagePaths = JRebirthParameters.IMAGE_FOLDER.get(); + for(int i = 0 ; i < imagePaths.size() && image == null ;i++){ + + String imagePath = imagePaths.get(i); + final InputStream imageInputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(imagePath + Resources.PATH_SEP + resourceName); + if (imageInputStream != null) { + image = new Image(imageInputStream); + } } if (image == null) { - LOGGER.error("Image : {} not found into base folder: {}", resourceName, JRebirthParameters.IMAGE_FOLDER.get() + Resources.PATH_SEP); + LOGGER.error("Image : {} not found into base folder: {}", resourceName, JRebirthParameters.IMAGE_FOLDER.get()); } return image; } diff --git a/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/parameter/ObjectParameter.java b/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/parameter/ObjectParameter.java index 8b26828a7..e375698cf 100644 --- a/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/parameter/ObjectParameter.java +++ b/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/parameter/ObjectParameter.java @@ -17,6 +17,7 @@ */ package org.jrebirth.af.core.resource.parameter; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -106,6 +107,8 @@ public Object parseObject(final ParameterEntry parameterEntry) { res = this.object; } else if (this.object instanceof Class) { res = parseClassParameter(parameterEntry.getSerializedString()); + } else if (this.object instanceof List) { + res = parseListParameter(parameterEntry.getSerializedString()); } else { res = parsePrimitive(parameterEntry.getSerializedString()); } @@ -134,6 +137,23 @@ private Object parseClassParameter(final String serializedObject) { return res; } + /** + * Parse a generic list. + * + * @param serializedObject the concatenated list + * + * @return the list object + */ + private Object parseListParameter(final String serializedObject) { + List res = new ArrayList<>(); + + for(String item : serializedObject.split(";")){ + res.add(item); + } + + return res; + } + /** * Parse primitive serialized object. * diff --git a/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/provided/JRebirthParameters.java b/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/provided/JRebirthParameters.java index 311f9d423..1addebd20 100644 --- a/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/provided/JRebirthParameters.java +++ b/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/provided/JRebirthParameters.java @@ -17,6 +17,9 @@ */ package org.jrebirth.af.core.resource.provided; +import java.util.Collections; +import java.util.List; + import org.jrebirth.af.core.facade.DefaultComponentFactory; import org.jrebirth.af.core.link.DefaultUnprocessedWaveHandler; import org.jrebirth.af.core.resource.color.WebColor; @@ -38,6 +41,9 @@ public interface JRebirthParameters { /** The name of the AUTO_REFRESH parameter which is quite special because it modify how other parameters will be processed. */ String AUTO_REFRESH_NAME = "autoRefreshResource"; + + /** The image name of the NOT_AVAILABLE_IMAGE parameter, this image can lead to StackOverFlowError when it was not available. */ + String NOT_AVAILABLE_IMAGE_NAME = "NotAvailableImage"; /**************************************************************************************/ /** __________________________Application Core Parameters.___________________________ */ @@ -84,18 +90,18 @@ public interface JRebirthParameters { /**************************************************************************************/ /** Fonts default folder, Multiple folder can be managed by separating them with a comma ','. */ - ParameterItem FONT_FOLDER = create("fontsFolder", "fonts"); + ParameterItem> FONT_FOLDER = create("fontsFolder", Collections.singletonList("fonts")); /** Images default folder, Multiple folder can be managed by separating them with a comma ','. */ - ParameterItem IMAGE_FOLDER = create("imagesFolder", "images"); + ParameterItem> IMAGE_FOLDER = create("imagesFolder", Collections.singletonList("images")); /** * The NOT_AVAILABLE_IMAGE field is used to define the image to use when an image is missing. */ - ParameterItem NOT_AVAILABLE_IMAGE = create("notAvailableImage", new LocalImage("NotAvailableImage", ImageExtension.PNG)); + ParameterItem NOT_AVAILABLE_IMAGE = create("notAvailableImage", new LocalImage(NOT_AVAILABLE_IMAGE_NAME, ImageExtension.PNG)); /** Styles default folder, Multiple folder can be managed by separating them with a comma ','. */ - ParameterItem STYLE_FOLDER = create("stylesFolder", "styles"); + ParameterItem> STYLE_FOLDER = create("stylesFolder", Collections.singletonList("styles")); /** * The DEFAULT_CSS field is used to parameterize the name of the default style sheet. diff --git a/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/style/StyleSheetBuilder.java b/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/style/StyleSheetBuilder.java index a9f805c48..ef7990d10 100644 --- a/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/style/StyleSheetBuilder.java +++ b/org.jrebirth.af/core/src/main/java/org/jrebirth/af/core/resource/style/StyleSheetBuilder.java @@ -18,11 +18,11 @@ package org.jrebirth.af.core.resource.style; import java.net.URL; +import java.util.List; import org.jrebirth.af.core.resource.Resources; import org.jrebirth.af.core.resource.builder.AbstractResourceBuilder; import org.jrebirth.af.core.resource.provided.JRebirthParameters; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -65,8 +65,6 @@ private URL buildStyleSheetUrl(final StyleSheet ss) { final StringBuilder sb = new StringBuilder(); - sb.append(JRebirthParameters.STYLE_FOLDER.get()).append(Resources.PATH_SEP); - if (!ss.path().isEmpty()) { sb.append(ss.path()).append(Resources.PATH_SEP); } @@ -89,10 +87,18 @@ private URL buildStyleSheetUrl(final StyleSheet ss) { */ private URL buildUrl(final String styleSheetPath) { - final URL cssResource = Thread.currentThread().getContextClassLoader().getResource(styleSheetPath); - + URL cssResource = null; + + List stylePaths = JRebirthParameters.STYLE_FOLDER.get(); + for(int i = 0 ; i < stylePaths.size() && cssResource == null ;i++){ + + String stylePath = stylePaths.get(i); + + cssResource = Thread.currentThread().getContextClassLoader().getResource(stylePath + Resources.PATH_SEP + styleSheetPath); + } + if (cssResource == null) { - LOGGER.error("Style Sheet : " + styleSheetPath + " not found !"); + LOGGER.error("Style Sheet : {} not found into base folder: {}", styleSheetPath , JRebirthParameters.STYLE_FOLDER.get()); } return cssResource; } diff --git a/org.jrebirth.af/core/src/test/java/org/jrebirth/af/core/resource/image/ImageTest.java b/org.jrebirth.af/core/src/test/java/org/jrebirth/af/core/resource/image/ImageTest.java index 41542e17a..83c6ddc6f 100644 --- a/org.jrebirth.af/core/src/test/java/org/jrebirth/af/core/resource/image/ImageTest.java +++ b/org.jrebirth.af/core/src/test/java/org/jrebirth/af/core/resource/image/ImageTest.java @@ -1,12 +1,14 @@ package org.jrebirth.af.core.resource.image; +import java.util.Arrays; + import javafx.scene.image.Image; import org.jrebirth.af.core.resource.AbstractBaseParams; import org.jrebirth.af.core.resource.ResourceBuilders; import org.jrebirth.af.core.resource.image.ImageItem; import org.jrebirth.af.core.resource.image.LocalImage; - +import org.jrebirth.af.core.resource.provided.JRebirthParameters; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; @@ -29,7 +31,7 @@ public static void setUpBeforeClass() throws Exception { @Before public void setUp() throws Exception { - + JRebirthParameters.IMAGE_FOLDER.define(Arrays.asList("images", "imagesBis")); } @Test @@ -38,6 +40,7 @@ public void localImage() { checkLocalImage(TestImages.TEST_LOCAL_IMAGE_1); checkLocalImage(TestImages.TEST_LOCAL_IMAGE_2); checkLocalImage(TestImages.TEST_LOCAL_IMAGE_3); + checkLocalImage(TestImages.TEST_LOCAL_IMAGE_4); } private void checkLocalImage(final ImageItem imageItem) { diff --git a/org.jrebirth.af/core/src/test/java/org/jrebirth/af/core/resource/image/TestImages.java b/org.jrebirth.af/core/src/test/java/org/jrebirth/af/core/resource/image/TestImages.java index 1036817f0..77292a222 100644 --- a/org.jrebirth.af/core/src/test/java/org/jrebirth/af/core/resource/image/TestImages.java +++ b/org.jrebirth.af/core/src/test/java/org/jrebirth/af/core/resource/image/TestImages.java @@ -43,6 +43,9 @@ public interface TestImages { /** The local image. */ ImageItem TEST_LOCAL_IMAGE_3 = create(new LocalImage("logo", ImageExtension.PNG)); + + /** The local image. */ + ImageItem TEST_LOCAL_IMAGE_4 = create(new LocalImage("logoBiss", ImageExtension.PNG)); /**************************************************************************************/ /** ___________________________________Web Image.____________________________________ */ diff --git a/org.jrebirth.af/core/src/test/resources/config/test-jrebirth.properties b/org.jrebirth.af/core/src/test/resources/config/test-jrebirth.properties index 52ce7873b..78ba6acb5 100644 --- a/org.jrebirth.af/core/src/test/resources/config/test-jrebirth.properties +++ b/org.jrebirth.af/core/src/test/resources/config/test-jrebirth.properties @@ -35,6 +35,6 @@ applicationSceneBgColor=000000||0.0 trueTypeFontExtension=.ttf fontsFolder=fonts -imagesFolder=images +imagesFolder=images,imagesBis stylesFolder=styles defaultStyleSheet=default diff --git a/org.jrebirth.af/core/src/test/resources/imagesBis/logoBis.png b/org.jrebirth.af/core/src/test/resources/imagesBis/logoBis.png new file mode 100644 index 000000000..b29554205 Binary files /dev/null and b/org.jrebirth.af/core/src/test/resources/imagesBis/logoBis.png differ