From 741f7f0f844d992f8333bdf0d43d7aebb7322a64 Mon Sep 17 00:00:00 2001 From: Frank Becker Date: Sat, 29 May 2021 02:24:06 +0200 Subject: [PATCH 1/7] cleanup and fix some sonarcloud issues --- .../src/main/java/org/jbake/app/Asset.java | 26 ++-- .../main/java/org/jbake/app/ContentStore.java | 8 +- .../src/main/java/org/jbake/app/Crawler.java | 20 ++- .../src/main/java/org/jbake/app/FileUtil.java | 113 +++++---------- .../DefaultJBakeConfiguration.java | 10 +- .../main/java/org/jbake/launcher/Main.java | 3 - .../java/org/jbake/model/DocumentModel.java | 4 +- .../org/jbake/parser/AsciidoctorEngine.java | 134 +++++++++++------- .../main/java/org/jbake/parser/Engines.java | 21 +-- .../java/org/jbake/parser/MarkupEngine.java | 2 +- .../org/jbake/render/ArchiveRenderer.java | 1 - .../template/DelegatingTemplateEngine.java | 2 - .../template/FreemarkerTemplateEngine.java | 40 +++--- .../template/GroovyMarkupTemplateEngine.java | 11 +- .../jbake/template/JadeTemplateEngine.java | 2 +- .../org/jbake/template/ModelExtractor.java | 5 +- .../org/jbake/template/ModelExtractors.java | 58 ++++---- .../jbake/template/PebbleTemplateEngine.java | 9 +- .../jbake/template/TemplateEngineAdapter.java | 2 + .../org/jbake/template/TemplateEngines.java | 18 ++- .../template/ThymeleafTemplateEngine.java | 49 +++---- .../template/model/AllContentExtractor.java | 9 +- .../template/model/AllTagsExtractor.java | 5 +- .../org/jbake/template/model/DBExtractor.java | 6 +- .../jbake/template/model/DataExtractor.java | 15 +- .../model/PublishedContentExtractor.java | 8 +- .../model/PublishedCustomExtractor.java | 10 +- .../model/PublishedDateExtractor.java | 5 +- .../model/PublishedPagesExtractor.java | 9 +- .../model/PublishedPostsExtractor.java | 9 +- .../template/model/TagPostsExtractor.java | 13 +- .../model/TaggedDocumentsExtractor.java | 14 +- .../jbake/template/model/TagsExtractor.java | 20 +-- .../jbake/template/model/TemplateModel.java | 9 +- .../model/TypedDocumentsExtractor.java | 12 +- .../java/org/jbake/util/DataFileUtil.java | 11 +- .../test/java/org/jbake/app/CrawlerTest.java | 6 +- .../jbake/template/ModelExtractorsTest.java | 2 +- .../java/org/jbake/BinaryRunner.java | 4 +- 39 files changed, 321 insertions(+), 384 deletions(-) diff --git a/jbake-core/src/main/java/org/jbake/app/Asset.java b/jbake-core/src/main/java/org/jbake/app/Asset.java index 5bbc5d88e..1c76ac6ee 100644 --- a/jbake-core/src/main/java/org/jbake/app/Asset.java +++ b/jbake-core/src/main/java/org/jbake/app/Asset.java @@ -62,12 +62,7 @@ public void copy() { * @param path The starting path */ public void copy(File path) { - FileFilter filter = new FileFilter() { - @Override - public boolean accept(File file) { - return (!config.getAssetIgnoreHidden() || !file.isHidden()) && (file.isFile() || FileUtil.directoryOnlyIfNotIgnored(file, config)); - } - }; + FileFilter filter = file -> (!config.getAssetIgnoreHidden() || !file.isHidden()) && (file.isFile() || FileUtil.directoryOnlyIfNotIgnored(file, config)); copy(path, config.getDestinationFolder(), filter); } @@ -96,21 +91,20 @@ public void copySingleFile(File asset) { * @return true if the path provided points to a file in the asset folder. */ public boolean isAssetFile(File path) { - boolean isAsset = false; - try { - if(FileUtil.directoryOnlyIfNotIgnored(path.getParentFile(), config)) { - if (FileUtil.isFileInDirectory(path, config.getAssetFolder())) { - isAsset = true; - } else if (FileUtil.isFileInDirectory(path, config.getContentFolder()) - && FileUtil.getNotContentFileFilter(config).accept(path)) { - isAsset = true; - } + if (FileUtil.directoryOnlyIfNotIgnored(path.getParentFile(), config) + && (FileUtil.isFileInDirectory(path, config.getAssetFolder()) || assetsInContentFolder(path))) { + return true; } } catch (IOException ioe) { LOGGER.error("Unable to determine the path to asset file {}", path.getPath(), ioe); } - return isAsset; + return false; + } + + private boolean assetsInContentFolder(File path) throws IOException { + return FileUtil.isFileInDirectory(path, config.getContentFolder()) + && FileUtil.getNotContentFileFilter(config).accept(path); } /** diff --git a/jbake-core/src/main/java/org/jbake/app/ContentStore.java b/jbake-core/src/main/java/org/jbake/app/ContentStore.java index 7dc71e887..589ae1005 100644 --- a/jbake-core/src/main/java/org/jbake/app/ContentStore.java +++ b/jbake-core/src/main/java/org/jbake/app/ContentStore.java @@ -34,8 +34,6 @@ import com.orientechnologies.orient.core.metadata.schema.OType; import com.orientechnologies.orient.core.record.impl.ODocument; import com.orientechnologies.orient.core.sql.executor.OResultSet; -import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery; -import org.jbake.launcher.SystemExit; import org.jbake.model.DocumentModel; import org.jbake.model.DocumentTypes; import org.jbake.model.ModelAttributes; @@ -149,8 +147,6 @@ public void close() { } public void shutdown() { - -// Orient.instance().shutdown(); } private void startupIfEnginesAreMissing() { @@ -169,8 +165,6 @@ private void startupIfEnginesAreMissing() { public void drop() { activateOnCurrentThread(); -// db.drop(); - orient.drop(name); } @@ -178,7 +172,7 @@ private void activateOnCurrentThread() { if (db != null) { db.activateOnCurrentThread(); } else { - System.out.println("db is null on activate"); + logger.warn("db is null on activate"); } } diff --git a/jbake-core/src/main/java/org/jbake/app/Crawler.java b/jbake-core/src/main/java/org/jbake/app/Crawler.java index 0c3d8b9d6..0b117d3e8 100644 --- a/jbake-core/src/main/java/org/jbake/app/Crawler.java +++ b/jbake-core/src/main/java/org/jbake/app/Crawler.java @@ -1,10 +1,10 @@ package org.jbake.app; -import com.orientechnologies.orient.core.record.impl.ODocument; import org.apache.commons.configuration2.CompositeConfiguration; import org.apache.commons.io.FilenameUtils; import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.app.configuration.JBakeConfigurationFactory; +import org.jbake.launcher.SystemExit; import org.jbake.model.DocumentModel; import org.jbake.model.DocumentStatus; import org.jbake.model.DocumentTypes; @@ -19,7 +19,6 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Date; -import java.util.Map; /** * Crawls a file system looking for content. @@ -141,9 +140,8 @@ private void crawlDataFiles(File path) { String sha1 = buildHash(sourceFile); String uri = buildDataFileURI(sourceFile); boolean process = true; - DocumentStatus status = DocumentStatus.NEW; String docType = config.getDataFileDocType(); - status = findDocumentStatus(uri, sha1); + DocumentStatus status = findDocumentStatus(uri, sha1); if (status == DocumentStatus.UPDATED) { sb.append(" : modified "); db.deleteContent(uri); @@ -156,8 +154,6 @@ private void crawlDataFiles(File path) { } if (DocumentStatus.NEW == status) { sb.append(" : new "); - } - if (process) { // new or updated crawlDataFile(sourceFile, sha1, uri, docType); } logger.info("{}", sb); @@ -202,7 +198,7 @@ private String buildDataFileURI(final File sourceFile) { String uri = FileUtil.asPath(sourceFile).replace(FileUtil.asPath(config.getDataFolder()), ""); // strip off leading / if (uri.startsWith(FileUtil.URI_SEPARATOR_CHAR)) { - uri = uri.substring(1, uri.length()); + uri = uri.substring(1); } return uri; } @@ -216,7 +212,7 @@ private String createUri(String uri) { + URLEncoder.encode(FilenameUtils.getBaseName(uri), StandardCharsets.UTF_8.name()) + config.getOutputExtension(); } catch (UnsupportedEncodingException e) { - throw new RuntimeException("Missing UTF-8 encoding??", e); // Won't happen unless JDK is broken. + throw new JBakeException(SystemExit.ERROR, "Missing UTF-8 encoding??", e); // Won't happen unless JDK is broken. } } @@ -229,7 +225,7 @@ private String createNoExtensionUri(String uri) { + "index" + config.getOutputExtension(); } catch (UnsupportedEncodingException e) { - throw new RuntimeException("Missing UTF-8 encoding??", e); // Won't happen unless JDK is broken. + throw new JBakeException(SystemExit.ERROR, "Missing UTF-8 encoding??", e); // Won't happen unless JDK is broken. } } @@ -258,7 +254,7 @@ private void crawlDataFile(final File sourceFile, final String sha1, final Strin logger.warn("{} couldn't be parsed so it has been ignored!", sourceFile); } } catch (Exception ex) { - throw new RuntimeException("Failed crawling file: " + sourceFile.getPath() + " " + ex.getMessage(), ex); + throw new JBakeException(SystemExit.ERROR, "Failed crawling file: " + sourceFile.getPath() + " " + ex.getMessage(), ex); } } @@ -293,8 +289,8 @@ private void addAdditionalDocumentAttributes(DocumentModel document, File source document.setCached(true); if (document.getStatus().equals(ModelAttributes.Status.PUBLISHED_DATE) - && (document.getDate() != null) - && new Date().after(document.getDate())) { + && (document.getDate() != null) + && new Date().after(document.getDate())) { document.setStatus(ModelAttributes.Status.PUBLISHED); } diff --git a/jbake-core/src/main/java/org/jbake/app/FileUtil.java b/jbake-core/src/main/java/org/jbake/app/FileUtil.java index c80dbf9e2..2f928298a 100644 --- a/jbake-core/src/main/java/org/jbake/app/FileUtil.java +++ b/jbake-core/src/main/java/org/jbake/app/FileUtil.java @@ -1,6 +1,7 @@ package org.jbake.app; import org.jbake.app.configuration.JBakeConfiguration; +import org.jbake.launcher.SystemExit; import org.jbake.parser.Engines; import java.io.File; @@ -9,10 +10,12 @@ import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.nio.file.Path; import java.nio.file.Paths; import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; /** * Provides File related functions @@ -30,15 +33,11 @@ public class FileUtil { * @return Object for filtering files */ public static FileFilter getFileFilter(JBakeConfiguration config) { - return new FileFilter() { - - @Override - public boolean accept(File pathname) { - //Accept if input is a non-hidden file with registered extension - //or if a non-hidden and not-ignored directory - return !pathname.isHidden() && (pathname.isFile() - && Engines.getRecognizedExtensions().contains(fileExt(pathname))) || (directoryOnlyIfNotIgnored(pathname, config)); - } + return pathname -> { + //Accept if input is a non-hidden file with registered extension + //or if a non-hidden and not-ignored directory + return !pathname.isHidden() && (pathname.isFile() + && Engines.getRecognizedExtensions().contains(fileExt(pathname))) || (directoryOnlyIfNotIgnored(pathname, config)); }; } @@ -50,15 +49,11 @@ public boolean accept(File pathname) { */ @Deprecated public static FileFilter getFileFilter() { - return new FileFilter() { - - @Override - public boolean accept(File pathname) { - //Accept if input is a non-hidden file with registered extension - //or if a non-hidden and not-ignored directory - return !pathname.isHidden() && (pathname.isFile() - && Engines.getRecognizedExtensions().contains(fileExt(pathname))) || (directoryOnlyIfNotIgnored(pathname)); - } + return pathname -> { + //Accept if input is a non-hidden file with registered extension + //or if a non-hidden and not-ignored directory + return !pathname.isHidden() && (pathname.isFile() + && Engines.getRecognizedExtensions().contains(fileExt(pathname))) || (directoryOnlyIfNotIgnored(pathname)); }; } @@ -68,13 +63,7 @@ public boolean accept(File pathname) { * @return Object for filtering files */ public static FileFilter getDataFileFilter() { - return new FileFilter() { - - @Override - public boolean accept(File pathname) { - return "yaml".equalsIgnoreCase(fileExt(pathname)) || "yml".equalsIgnoreCase(fileExt(pathname)); - } - }; + return pathname -> "yaml".equalsIgnoreCase(fileExt(pathname)) || "yml".equalsIgnoreCase(fileExt(pathname)); } /** @@ -84,17 +73,13 @@ public boolean accept(File pathname) { * @return FileFilter object */ public static FileFilter getNotContentFileFilter(JBakeConfiguration config) { - return new FileFilter() { - - @Override - public boolean accept(File pathname) { - //Accept if input is a non-hidden file with NOT-registered extension - //or if a non-hidden and not-ignored directory - return !pathname.isHidden() && (pathname.isFile() - //extension should not be from registered content extensions - && !Engines.getRecognizedExtensions().contains(fileExt(pathname))) - || (directoryOnlyIfNotIgnored(pathname, config)); - } + return pathname -> { + //Accept if input is a non-hidden file with NOT-registered extension + //or if a non-hidden and not-ignored directory + return !pathname.isHidden() && (pathname.isFile() + //extension should not be from registered content extensions + && !Engines.getRecognizedExtensions().contains(fileExt(pathname))) + || (directoryOnlyIfNotIgnored(pathname, config)); }; } @@ -106,17 +91,13 @@ public boolean accept(File pathname) { */ @Deprecated public static FileFilter getNotContentFileFilter() { - return new FileFilter() { - - @Override - public boolean accept(File pathname) { - //Accept if input is a non-hidden file with NOT-registered extension - //or if a non-hidden and not-ignored directory - return !pathname.isHidden() && (pathname.isFile() - //extension should not be from registered content extensions - && !Engines.getRecognizedExtensions().contains(fileExt(pathname))) - || (directoryOnlyIfNotIgnored(pathname)); - } + return pathname -> { + //Accept if input is a non-hidden file with NOT-registered extension + //or if a non-hidden and not-ignored directory + return !pathname.isHidden() && (pathname.isFile() + //extension should not be from registered content extensions + && !Engines.getRecognizedExtensions().contains(fileExt(pathname))) + || (directoryOnlyIfNotIgnored(pathname)); }; } @@ -129,18 +110,9 @@ public boolean accept(File pathname) { * @return true if file is directory and not ignored */ public static boolean directoryOnlyIfNotIgnored(File file, JBakeConfiguration config) { - boolean accept = false; - - FilenameFilter ignoreFile = new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return name.equalsIgnoreCase(config.getIgnoreFileName()); - } - }; - - accept = file.isDirectory() && (file.listFiles(ignoreFile).length == 0); + FilenameFilter ignoreFile = (dir, name) -> name.equalsIgnoreCase(config.getIgnoreFileName()); - return accept; + return file.isDirectory() && (file.listFiles(ignoreFile).length == 0); } /** @@ -152,18 +124,9 @@ public boolean accept(File dir, String name) { */ @Deprecated public static boolean directoryOnlyIfNotIgnored(File file) { - boolean accept = false; - - FilenameFilter ignoreFile = new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return name.equalsIgnoreCase(".jbakeignore"); - } - }; - - accept = file.isDirectory() && (file.listFiles(ignoreFile).length == 0); + FilenameFilter ignoreFile = (dir, name) -> name.equalsIgnoreCase(".jbakeignore"); - return accept; + return file.isDirectory() && (file.listFiles(ignoreFile).length == 0); } public static boolean isExistingFolder(File f) { @@ -176,16 +139,16 @@ public static boolean isExistingFolder(File f) { * @return File referencing folder JBake is running from * @throws Exception when application is not able to work out where is JBake running from */ - public static File getRunningLocation() throws Exception { + public static File getRunningLocation() throws UnsupportedEncodingException { String codePath = FileUtil.class.getProtectionDomain().getCodeSource().getLocation().getPath(); String decodedPath = URLDecoder.decode(codePath, "UTF-8"); File codeFile = new File(decodedPath); if (!codeFile.exists()) { - throw new Exception("Cannot locate running location of JBake!"); + throw new JBakeException(SystemExit.ERROR, "Cannot locate running location of JBake!"); } File codeFolder = codeFile.getParentFile().getParentFile(); if (!codeFolder.exists()) { - throw new Exception("Cannot locate running location of JBake!"); + throw new JBakeException(SystemExit.ERROR, "Cannot locate running location of JBake!"); } return codeFolder; @@ -212,7 +175,7 @@ public static String fileExt(String name) { * @return an hex string representing the SHA1 hash of the file or directory. * @throws Exception if any IOException of SecurityException occured */ - public static String sha1(File sourceFile) throws Exception { + public static String sha1(File sourceFile) throws NoSuchAlgorithmException, IOException { byte[] buffer = new byte[1024]; MessageDigest complete = MessageDigest.getInstance("SHA-1"); updateDigest(complete, sourceFile, buffer); @@ -308,11 +271,11 @@ static public String getPathToRoot(JBakeConfiguration config, File rootPath, Fil return sb.toString(); } - static public String getUriPathToDestinationRoot(JBakeConfiguration config, File sourceFile) { + public static String getUriPathToDestinationRoot(JBakeConfiguration config, File sourceFile) { return getPathToRoot(config, config.getDestinationFolder(), sourceFile); } - static public String getUriPathToContentRoot(JBakeConfiguration config, File sourceFile) { + public static String getUriPathToContentRoot(JBakeConfiguration config, File sourceFile) { return getPathToRoot(config, config.getContentFolder(), sourceFile); } diff --git a/jbake-core/src/main/java/org/jbake/app/configuration/DefaultJBakeConfiguration.java b/jbake-core/src/main/java/org/jbake/app/configuration/DefaultJBakeConfiguration.java index 5de7d8e3c..49f5b9213 100644 --- a/jbake-core/src/main/java/org/jbake/app/configuration/DefaultJBakeConfiguration.java +++ b/jbake-core/src/main/java/org/jbake/app/configuration/DefaultJBakeConfiguration.java @@ -9,7 +9,13 @@ import org.slf4j.LoggerFactory; import java.io.File; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -525,7 +531,6 @@ public void setExampleProject(String type, String fileName) { @Override public void setProperty(String key, Object value) { - compositeConfiguration.setProperty(key, value); } @@ -596,7 +601,6 @@ private void setupDefaultDestination() { private void setupDefaultAssetFolder() { String assetFolder = getAsString(ASSET_FOLDER.getKey()); - File asset = new File(assetFolder); if(asset.isAbsolute()) { setAssetFolder(asset); diff --git a/jbake-core/src/main/java/org/jbake/launcher/Main.java b/jbake-core/src/main/java/org/jbake/launcher/Main.java index c244848f7..83d38a15d 100644 --- a/jbake-core/src/main/java/org/jbake/launcher/Main.java +++ b/jbake-core/src/main/java/org/jbake/launcher/Main.java @@ -1,6 +1,5 @@ package org.jbake.launcher; -import org.apache.commons.configuration2.ex.ConfigurationException; import org.jbake.app.FileUtil; import org.jbake.app.JBakeException; import org.jbake.app.configuration.JBakeConfiguration; @@ -21,8 +20,6 @@ */ public class Main { - private static final String USAGE_PREFIX = "Usage: jbake"; - private static final String ALT_USAGE_PREFIX = " or jbake"; private final Baker baker; private final JettyServer jettyServer; private final BakeWatcher watcher; diff --git a/jbake-core/src/main/java/org/jbake/model/DocumentModel.java b/jbake-core/src/main/java/org/jbake/model/DocumentModel.java index 99fd559cb..9af72bb86 100644 --- a/jbake-core/src/main/java/org/jbake/model/DocumentModel.java +++ b/jbake-core/src/main/java/org/jbake/model/DocumentModel.java @@ -84,8 +84,8 @@ public void setRootPath(String pathToRoot) { put(ModelAttributes.ROOTPATH, pathToRoot); } - public Boolean getRendered() { - return (Boolean) getOrDefault(ModelAttributes.RENDERED, false); + public boolean getRendered() { + return (boolean) getOrDefault(ModelAttributes.RENDERED, false); } public void setRendered(boolean rendered) { diff --git a/jbake-core/src/main/java/org/jbake/parser/AsciidoctorEngine.java b/jbake-core/src/main/java/org/jbake/parser/AsciidoctorEngine.java index a5b106895..9f24c6c6d 100644 --- a/jbake-core/src/main/java/org/jbake/parser/AsciidoctorEngine.java +++ b/jbake-core/src/main/java/org/jbake/parser/AsciidoctorEngine.java @@ -6,14 +6,17 @@ import org.asciidoctor.ast.DocumentHeader; import org.asciidoctor.jruby.AsciidoctorJRuby; import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.model.DocumentModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import java.util.concurrent.locks.ReentrantReadWriteLock; import static org.asciidoctor.AttributesBuilder.attributes; @@ -39,7 +42,7 @@ public class AsciidoctorEngine extends MarkupEngine { private static final String OPT_REQUIRES = "requires"; public AsciidoctorEngine() { - Class engineClass = Asciidoctor.class; + Class engineClass = Asciidoctor.class; assert engineClass != null; } @@ -51,23 +54,7 @@ private Asciidoctor getEngine(Options options) { try { lock.writeLock().lock(); if (engine == null) { - LOGGER.info("Initializing Asciidoctor engine..."); - if (options.map().containsKey(OPT_GEM_PATH)) { - engine = AsciidoctorJRuby.Factory.create(String.valueOf(options.map().get(OPT_GEM_PATH))); - } else { - engine = Asciidoctor.Factory.create(); - } - - if (options.map().containsKey(OPT_REQUIRES)) { - String[] requires = String.valueOf(options.map().get(OPT_REQUIRES)).split(","); - if (requires.length != 0) { - for (String require : requires) { - engine.requireLibrary(require); - } - } - } - - LOGGER.info("Asciidoctor engine initialized."); + initialize(options); } } finally { lock.readLock().lock(); @@ -80,51 +67,96 @@ private Asciidoctor getEngine(Options options) { return engine; } + private void initialize(Options options) { + LOGGER.info("Initializing Asciidoctor engine..."); + if (options.map().containsKey(OPT_GEM_PATH)) { + engine = AsciidoctorJRuby.Factory.create(String.valueOf(options.map().get(OPT_GEM_PATH))); + } else { + engine = Asciidoctor.Factory.create(); + } + + if (options.map().containsKey(OPT_REQUIRES)) { + String[] requires = String.valueOf(options.map().get(OPT_REQUIRES)).split(","); + if (requires.length != 0) { + for (String require : requires) { + engine.requireLibrary(require); + } + } + } + + LOGGER.info("Asciidoctor engine initialized."); + } + @Override public void processHeader(final ParserContext context) { Options options = getAsciiDocOptionsAndAttributes(context); final Asciidoctor asciidoctor = getEngine(options); DocumentHeader header = asciidoctor.readDocumentHeader(context.getFile()); - DocumentModel documentModel = context.getDocumentModel(); - if (header.getDocumentTitle() != null) { - documentModel.setTitle(header.getDocumentTitle().getCombined()); - } + setDocumentTitleIfNotPresentInHeader(context, header); + addAttributesToDocumentModel(context, header); + } + + private void addAttributesToDocumentModel(ParserContext context, DocumentHeader header) { Map attributes = header.getAttributes(); for (Map.Entry attribute : attributes.entrySet()) { - String key = attribute.getKey(); - Object value = attribute.getValue(); - - if (hasJBakePrefix(key)) { - String pKey = key.substring(6); - if(canCastToString(value)) { - storeHeaderValue(pKey, (String) value, documentModel); - } else { - documentModel.put(pKey, value); - } - } - if (hasRevdate(key) && canCastToString(value)) { + addIfKeyHasJbakePrefix(context, attribute); + convertAndSetIfDate(context, attribute); + addIfJbakeTagsOrDefault(context, attribute); + } + } - String dateFormat = context.getConfig().getDateFormat(); - DateFormat df = new SimpleDateFormat(dateFormat); - try { - Date date = df.parse((String) value); - context.setDate(date); - } catch (ParseException e) { - LOGGER.error("Unable to parse revdate. Expected {}", dateFormat, e); - } + private void addIfJbakeTagsOrDefault(ParserContext context, Map.Entry attribute) { + String key = attribute.getKey(); + Object value = attribute.getValue(); + + if (key.equals("jbake-tags")) { + if (canCastToString(value)) { + context.setTags(((String) value).split(",")); + } else { + LOGGER.error("Wrong value of 'jbake-tags'. Expected a String got '{}'", getValueClassName(value)); } - if (key.equals("jbake-tags")) { - if (canCastToString(value)) { - context.setTags(((String) value).split(",")); - } else { - LOGGER.error("Wrong value of 'jbake-tags'. Expected a String got '{}'", getValueClassName(value)); - } + } else { + context.getDocumentModel().put(key, value); + } + } + + private void addIfKeyHasJbakePrefix(ParserContext context, Map.Entry attribute) { + String key = attribute.getKey(); + Object value = attribute.getValue(); + + if (hasJBakePrefix(key)) { + String pKey = key.substring(6); + if(canCastToString(value)) { + storeHeaderValue(pKey, (String) value, context.getDocumentModel()); } else { - documentModel.put(key, attributes.get(key)); + context.getDocumentModel().put(pKey, value); } } } + private void convertAndSetIfDate(ParserContext context, Map.Entry attribute) { + String key = attribute.getKey(); + Object value = attribute.getValue(); + + if (hasRevdate(key) && canCastToString(value)) { + + String dateFormat = context.getConfig().getDateFormat(); + DateFormat df = new SimpleDateFormat(dateFormat); + try { + Date date = df.parse((String) value); + context.setDate(date); + } catch (ParseException e) { + LOGGER.error("Unable to parse revdate. Expected {}", dateFormat, e); + } + } + } + + private void setDocumentTitleIfNotPresentInHeader(ParserContext context, DocumentHeader header) { + if (header.getDocumentTitle() != null) { + context.getDocumentModel().setTitle(header.getDocumentTitle().getCombined()); + } + } + private boolean canCastToString(Object value) { return value instanceof String; } diff --git a/jbake-core/src/main/java/org/jbake/parser/Engines.java b/jbake-core/src/main/java/org/jbake/parser/Engines.java index 4bccb245b..49e729cc0 100644 --- a/jbake-core/src/main/java/org/jbake/parser/Engines.java +++ b/jbake-core/src/main/java/org/jbake/parser/Engines.java @@ -4,6 +4,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.util.Collections; @@ -31,17 +32,17 @@ *

Markup engines are singletons, so are typically used to initialize the underlying renderning engines. They * must not store specific information of a currently processed file (use {@link ParserContext the parser context} * for that).

- * + *

* This class loads the engines only if they are found on classpath. If not, the engine is not registered. This allows * JBake to support multiple rendering engines without the explicit need to have them on classpath. This is a better * fit for embedding. * * @author Cédric Champeau - * */ public class Engines { private static final Logger LOGGER = LoggerFactory.getLogger(Engines.class); private static final Engines INSTANCE; + public static final String PROPERTIES = "META-INF/org.jbake.parser.MarkupEngines.properties"; private final Map parsers; @@ -105,15 +106,17 @@ private static ParserEngine tryLoadEngine(String engineClassName) { private static void loadEngines() { try { ClassLoader cl = Engines.class.getClassLoader(); - Enumeration resources = cl.getResources("META-INF/org.jbake.parser.MarkupEngines.properties"); + Enumeration resources = cl.getResources(PROPERTIES); while (resources.hasMoreElements()) { URL url = resources.nextElement(); - Properties props = new Properties(); - props.load(url.openStream()); - for (Map.Entry entry : props.entrySet()) { - String className = (String) entry.getKey(); - String[] extensions = ((String)entry.getValue()).split(","); - registerEngine(className, extensions); + try (InputStream is = url.openStream()) { + Properties props = new Properties(); + props.load(is); + for (Map.Entry entry : props.entrySet()) { + String className = (String) entry.getKey(); + String[] extensions = ((String) entry.getValue()).split(","); + registerEngine(className, extensions); + } } } } catch (IOException e) { diff --git a/jbake-core/src/main/java/org/jbake/parser/MarkupEngine.java b/jbake-core/src/main/java/org/jbake/parser/MarkupEngine.java index e989b65b3..dd70afb38 100644 --- a/jbake-core/src/main/java/org/jbake/parser/MarkupEngine.java +++ b/jbake-core/src/main/java/org/jbake/parser/MarkupEngine.java @@ -288,7 +288,7 @@ void storeHeaderValue(String inputKey, String inputValue, DocumentModel content) } else if (key.equalsIgnoreCase(ModelAttributes.TAGS)) { content.setTags(getTags(value)); } else if (key.equalsIgnoreCase(ModelAttributes.CACHED)) { - content.setCached(Boolean.valueOf(value)); + content.setCached(Boolean.parseBoolean(value)); } else if (isJson(value)) { content.put(key, JSONValue.parse(value)); } else { diff --git a/jbake-core/src/main/java/org/jbake/render/ArchiveRenderer.java b/jbake-core/src/main/java/org/jbake/render/ArchiveRenderer.java index 397fa5bf1..36af41108 100644 --- a/jbake-core/src/main/java/org/jbake/render/ArchiveRenderer.java +++ b/jbake-core/src/main/java/org/jbake/render/ArchiveRenderer.java @@ -28,7 +28,6 @@ public int render(Renderer renderer, ContentStore db, JBakeConfiguration config) @Override public int render(Renderer renderer, ContentStore db, File destination, File templatesPath, CompositeConfiguration config) throws RenderingException { - JBakeConfiguration configuration = new JBakeConfigurationFactory().createDefaultJbakeConfiguration(templatesPath.getParentFile(), config); return render(renderer, db, configuration); } diff --git a/jbake-core/src/main/java/org/jbake/template/DelegatingTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/DelegatingTemplateEngine.java index cd9ecae16..2ac880392 100644 --- a/jbake-core/src/main/java/org/jbake/template/DelegatingTemplateEngine.java +++ b/jbake-core/src/main/java/org/jbake/template/DelegatingTemplateEngine.java @@ -11,8 +11,6 @@ import java.io.File; import java.io.Writer; -import static org.jbake.app.configuration.PropertyList.PAGINATE_INDEX; - /** * A template which is responsible for delegating to a supported template engine, * based on the file extension. diff --git a/jbake-core/src/main/java/org/jbake/template/FreemarkerTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/FreemarkerTemplateEngine.java index c8f6f0be0..8578999c4 100644 --- a/jbake-core/src/main/java/org/jbake/template/FreemarkerTemplateEngine.java +++ b/jbake-core/src/main/java/org/jbake/template/FreemarkerTemplateEngine.java @@ -36,6 +36,9 @@ public class FreemarkerTemplateEngine extends AbstractTemplateEngine { private Configuration templateCfg; + /** + * @deprecated use {@link FreemarkerTemplateEngine(JBakeConfiguration, ContentStore)} + */ @Deprecated public FreemarkerTemplateEngine(final CompositeConfiguration config, final ContentStore db, final File destination, final File templatesPath) { super(config, db, destination, templatesPath); @@ -62,7 +65,7 @@ private void createTemplateConfiguration() { public void renderDocument(final TemplateModel model, final String templateName, final Writer writer) throws RenderingException { try { Template template = templateCfg.getTemplate(templateName); - template.process(new LazyLoadingModel(templateCfg.getObjectWrapper(), model, db, config), writer); + template.process(new LazyLoadingModel(templateCfg.getObjectWrapper(), model, db), writer); } catch (IOException | TemplateException e) { throw new RenderingException(e); } @@ -75,22 +78,22 @@ public static class LazyLoadingModel implements TemplateHashModel { private final ObjectWrapper wrapper; private final SimpleHash eagerModel; private final ContentStore db; - private final JBakeConfiguration config; - public LazyLoadingModel(ObjectWrapper wrapper, TemplateModel eagerModel, final ContentStore db, JBakeConfiguration config) { + public LazyLoadingModel(ObjectWrapper wrapper, TemplateModel eagerModel, final ContentStore db) { this.eagerModel = new SimpleHash(eagerModel, wrapper); this.db = db; this.wrapper = wrapper; - this.config = config; } @Override public freemarker.template.TemplateModel get(final String key) throws TemplateModelException { try { - // GIT Issue#357: Accessing db in freemarker template throws exception - // When content store is accessed with key "db" then wrap the ContentStore with BeansWrapper and return to template. - // All methods on db are then accessible in template. Eg: ${db.getPublishedPostsByTag(tagName).size()} + /* + * GIT Issue#357: Accessing db in freemarker template throws exception + * When content store is accessed with key "db" then wrap the ContentStore with BeansWrapper and return to template. + * All methods on db are then accessible in template. Eg: ${db.getPublishedPostsByTag(tagName).size()} + */ if (key.equals(ModelAttributes.DB)) { BeansWrapperBuilder bwb = new BeansWrapperBuilder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS); BeansWrapper bw = bwb.build(); @@ -99,22 +102,17 @@ public freemarker.template.TemplateModel get(final String key) throws TemplateMo if (key.equals(ModelAttributes.DATA)) { BeansWrapperBuilder bwb = new BeansWrapperBuilder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS); BeansWrapper bw = bwb.build(); - return bw.wrap(new DataFileUtil(db, config.getDataFileDocType())); + return bw.wrap(new DataFileUtil(db)); } - return extractors.extractAndTransform(db, key, eagerModel.toMap(), new TemplateEngineAdapter() { - - @Override - public freemarker.template.TemplateModel adapt(String key, Object extractedValue) { - if (key.equals(ModelAttributes.ALLTAGS)) { - return new SimpleCollection((Collection) extractedValue, wrapper); - } else if (key.equals(ModelAttributes.PUBLISHED_DATE)) { - return new SimpleDate((Date) extractedValue, TemplateDateModel.UNKNOWN); - } else { - // All other cases, as far as I know, are document collections - return new SimpleSequence((Collection) extractedValue, wrapper); - } - + return extractors.extractAndTransform(db, key, (TemplateModel) eagerModel.toMap(), (key1, extractedValue) -> { + if (key1.equals(ModelAttributes.ALLTAGS)) { + return new SimpleCollection((Collection) extractedValue, wrapper); + } else if (key1.equals(ModelAttributes.PUBLISHED_DATE)) { + return new SimpleDate((Date) extractedValue, TemplateDateModel.UNKNOWN); + } else { + // All other cases, as far as I know, are document collections + return new SimpleSequence((Collection) extractedValue, wrapper); } }); } catch (NoModelExtractorException e) { diff --git a/jbake-core/src/main/java/org/jbake/template/GroovyMarkupTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/GroovyMarkupTemplateEngine.java index 103786ec1..f64094550 100644 --- a/jbake-core/src/main/java/org/jbake/template/GroovyMarkupTemplateEngine.java +++ b/jbake-core/src/main/java/org/jbake/template/GroovyMarkupTemplateEngine.java @@ -25,12 +25,11 @@ public class GroovyMarkupTemplateEngine extends AbstractTemplateEngine { private MarkupTemplateEngine templateEngine; /** - * @deprecated Use {@link #GroovyMarkupTemplateEngine(JBakeConfiguration, ContentStore)} instead - * - * @param config the {@link CompositeConfiguration} of jbake - * @param db the {@link ContentStore} - * @param destination the destination path + * @param config the {@link CompositeConfiguration} of jbake + * @param db the {@link ContentStore} + * @param destination the destination path * @param templatesPath the templates path + * @deprecated Use {@link #GroovyMarkupTemplateEngine(JBakeConfiguration, ContentStore)} instead */ @Deprecated public GroovyMarkupTemplateEngine(final CompositeConfiguration config, final ContentStore db, final File destination, final File templatesPath) { @@ -74,7 +73,7 @@ private TemplateModel wrap(final TemplateModel model) { @Override public Object get(Object key) { try { - return extractors.extractAndTransform(db, (String) key, model, new TemplateEngineAdapter.NoopAdapter()); + return extractors.extractAndTransform(db, (String) key, model, TemplateEngineAdapter.NO_ADAPTER); } catch (NoModelExtractorException e) { return super.get(key); } diff --git a/jbake-core/src/main/java/org/jbake/template/JadeTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/JadeTemplateEngine.java index bbbff0bfb..4129f3f9e 100644 --- a/jbake-core/src/main/java/org/jbake/template/JadeTemplateEngine.java +++ b/jbake-core/src/main/java/org/jbake/template/JadeTemplateEngine.java @@ -78,7 +78,7 @@ private JadeModel wrap(final TemplateModel model) { @Override public Object get(final Object property) { try { - return extractors.extractAndTransform(db, (String) property, this, new TemplateEngineAdapter.NoopAdapter()); + return extractors.extractAndTransform(db, (String) property, model, TemplateEngineAdapter.NO_ADAPTER); } catch (NoModelExtractorException e) { return super.get(property); } diff --git a/jbake-core/src/main/java/org/jbake/template/ModelExtractor.java b/jbake-core/src/main/java/org/jbake/template/ModelExtractor.java index f15c620ec..3e114c7b3 100644 --- a/jbake-core/src/main/java/org/jbake/template/ModelExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/ModelExtractor.java @@ -1,8 +1,7 @@ package org.jbake.template; import org.jbake.app.ContentStore; - -import java.util.Map; +import org.jbake.template.model.TemplateModel; /** @@ -11,6 +10,6 @@ */ public interface ModelExtractor { - T get(ContentStore db, Map model, String key); + T get(ContentStore db, TemplateModel model, String key); } diff --git a/jbake-core/src/main/java/org/jbake/template/ModelExtractors.java b/jbake-core/src/main/java/org/jbake/template/ModelExtractors.java index 599a2b466..65f6a6d08 100644 --- a/jbake-core/src/main/java/org/jbake/template/ModelExtractors.java +++ b/jbake-core/src/main/java/org/jbake/template/ModelExtractors.java @@ -3,11 +3,14 @@ import org.jbake.app.ContentStore; import org.jbake.model.DocumentTypeUtils; import org.jbake.template.model.PublishedCustomExtractor; +import org.jbake.template.model.TemplateModel; import org.jbake.template.model.TypedDocumentsExtractor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.util.Enumeration; import java.util.Map; @@ -37,9 +40,9 @@ public class ModelExtractors { private static final String PROPERTIES = "META-INF/org.jbake.template.ModelExtractors.properties"; - private final static Logger LOGGER = LoggerFactory.getLogger(ModelExtractors.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ModelExtractors.class); - private final Map extractors; + private final Map> extractors; private static class Loader { private static final ModelExtractors INSTANCE = new ModelExtractors(); @@ -50,7 +53,7 @@ public static ModelExtractors getInstance() { } private ModelExtractors() { - extractors = new TreeMap(); + extractors = new TreeMap<>(); loadEngines(); } @@ -59,8 +62,8 @@ public void reset() { loadEngines(); } - public void registerEngine(String key, ModelExtractor extractor) { - ModelExtractor old = extractors.put(key, extractor); + public void registerEngine(String key, ModelExtractor extractor) { + ModelExtractor old = extractors.put(key, extractor); if (old != null) { LOGGER.warn("Registered a model extractor for key [.{}] but another one was already defined: {}", key, old); } @@ -72,21 +75,14 @@ public void registerEngine(String key, ModelExtractor extractor) { * * @param engineClassName engine class, used both as a hint to find it and to create the engine itself. @return null if the engine is not available, an instance of the engine otherwise */ - private static ModelExtractor tryLoadEngine(String engineClassName) { + private static ModelExtractor tryLoadEngine(String engineClassName) { try { - @SuppressWarnings("unchecked") - Class engineClass = (Class) Class.forName(engineClassName, false, ModelExtractors.class.getClassLoader()); - return engineClass.newInstance(); - } catch (ClassNotFoundException e) { + @SuppressWarnings("unchecked") Class engineClass = (Class) Class.forName(engineClassName, false, ModelExtractors.class.getClassLoader()); + return engineClass.getDeclaredConstructor().newInstance(); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoClassDefFoundError | NoSuchMethodException | InvocationTargetException e) { return null; - } catch (InstantiationException e) { - return null; - } catch (IllegalAccessException e) { - return null; - } catch (NoClassDefFoundError e) { - // a dependency of the engine may not be found on classpath - return null; - } + } // a dependency of the engine may not be found on classpath + } /** @@ -99,12 +95,14 @@ private void loadEngines() { Enumeration resources = cl.getResources(PROPERTIES); while (resources.hasMoreElements()) { URL url = resources.nextElement(); - Properties props = new Properties(); - props.load(url.openStream()); - for (Map.Entry entry : props.entrySet()) { - String className = (String) entry.getKey(); - String[] extensions = ((String) entry.getValue()).split(","); - loadAndRegisterEngine(className, extensions); + try (InputStream is = url.openStream()) { + Properties props = new Properties(); + props.load(is); + for (Map.Entry entry : props.entrySet()) { + String className = (String) entry.getKey(); + String[] extensions = ((String) entry.getValue()).split(","); + loadAndRegisterEngine(className, extensions); + } } } } catch (IOException e) { @@ -113,7 +111,7 @@ private void loadEngines() { } private void loadAndRegisterEngine(String className, String... extensions) { - ModelExtractor engine = tryLoadEngine(className); + ModelExtractor engine = tryLoadEngine(className); if (engine != null) { for (String extension : extensions) { registerEngine(extension, engine); @@ -121,7 +119,7 @@ private void loadAndRegisterEngine(String className, String... extensions) { } } - public Type extractAndTransform(ContentStore db, String key, Map map, TemplateEngineAdapter adapter) throws NoModelExtractorException { + public T extractAndTransform(ContentStore db, String key, TemplateModel map, TemplateEngineAdapter adapter) throws NoModelExtractorException { if (extractors.containsKey(key)) { Object extractedValue = extractors.get(key).get(db, map, key); return adapter.adapt(key, extractedValue); @@ -131,16 +129,16 @@ public Type extractAndTransform(ContentStore db, String key, Map map, Tem } /** - * @see java.util.Map#containsKey(java.lang.Object) * @param key A key a {@link ModelExtractor} is registered with * @return true if key is registered + * @see java.util.Map#containsKey(java.lang.Object) */ - public boolean containsKey(Object key) { + public boolean containsKey(String key) { return extractors.containsKey(key); } /** - * @return A @{@link Set} of all known keys a @{@link ModelExtractor} is registered with + * @return A @{@link Set} of all known keys a @{@link ModelExtractor} is registered with * @see java.util.Map#keySet() */ public Set keySet() { @@ -156,4 +154,4 @@ public void registerExtractorsForCustomTypes(String docType) { } } -} \ No newline at end of file +} diff --git a/jbake-core/src/main/java/org/jbake/template/PebbleTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/PebbleTemplateEngine.java index 7a850043c..d684d4ee7 100644 --- a/jbake-core/src/main/java/org/jbake/template/PebbleTemplateEngine.java +++ b/jbake-core/src/main/java/org/jbake/template/PebbleTemplateEngine.java @@ -4,7 +4,6 @@ import com.mitchellbosecke.pebble.error.PebbleException; import com.mitchellbosecke.pebble.extension.escaper.EscaperExtension; import com.mitchellbosecke.pebble.loader.FileLoader; -import com.mitchellbosecke.pebble.loader.Loader; import com.mitchellbosecke.pebble.template.PebbleTemplate; import org.jbake.app.ContentStore; import org.jbake.app.configuration.JBakeConfiguration; @@ -12,7 +11,6 @@ import java.io.IOException; import java.io.Writer; -import java.util.Map; /** * Renders pages using the Pebble template engine. @@ -28,7 +26,7 @@ public PebbleTemplateEngine(final JBakeConfiguration config, final ContentStore } private void initializeTemplateEngine() { - Loader loader = new FileLoader(); + FileLoader loader = new FileLoader(); loader.setPrefix(config.getTemplateFolder().getAbsolutePath()); /* @@ -57,13 +55,10 @@ public void renderDocument(final TemplateModel model, final String templateName, private TemplateModel wrap(final TemplateModel model) { return new TemplateModel(model) { - - private static final long serialVersionUID = -5489285491728950547L; - @Override public Object get(final Object property) { try { - return extractors.extractAndTransform(db, (String) property, this, new TemplateEngineAdapter.NoopAdapter()); + return extractors.extractAndTransform(db, (String) property, this, TemplateEngineAdapter.NO_ADAPTER); } catch(NoModelExtractorException e) { return super.get(property); } diff --git a/jbake-core/src/main/java/org/jbake/template/TemplateEngineAdapter.java b/jbake-core/src/main/java/org/jbake/template/TemplateEngineAdapter.java index c72b4973a..2b8089644 100644 --- a/jbake-core/src/main/java/org/jbake/template/TemplateEngineAdapter.java +++ b/jbake-core/src/main/java/org/jbake/template/TemplateEngineAdapter.java @@ -8,6 +8,8 @@ */ public interface TemplateEngineAdapter { + TemplateEngineAdapter NO_ADAPTER = new NoopAdapter(); + class NoopAdapter implements TemplateEngineAdapter { @Override diff --git a/jbake-core/src/main/java/org/jbake/template/TemplateEngines.java b/jbake-core/src/main/java/org/jbake/template/TemplateEngines.java index a4837f8c2..b684096ab 100644 --- a/jbake-core/src/main/java/org/jbake/template/TemplateEngines.java +++ b/jbake-core/src/main/java/org/jbake/template/TemplateEngines.java @@ -6,6 +6,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Constructor; import java.net.URL; import java.util.Collections; @@ -39,6 +40,7 @@ public class TemplateEngines { private static final Logger LOGGER = LoggerFactory.getLogger(TemplateEngines.class); + public static final String PROPERTIES = "META-INF/org.jbake.parser.TemplateEngines.properties"; private final Map engines; @@ -91,15 +93,17 @@ private static AbstractTemplateEngine tryLoadEngine(final JBakeConfiguration con private void loadEngines(final JBakeConfiguration config, final ContentStore db) { try { ClassLoader cl = TemplateEngines.class.getClassLoader(); - Enumeration resources = cl.getResources("META-INF/org.jbake.parser.TemplateEngines.properties"); + Enumeration resources = cl.getResources(PROPERTIES); while (resources.hasMoreElements()) { URL url = resources.nextElement(); - Properties props = new Properties(); - props.load(url.openStream()); - for (Map.Entry entry : props.entrySet()) { - String className = (String) entry.getKey(); - String[] extensions = ((String) entry.getValue()).split(","); - registerEngine(config, db, className, extensions); + try (InputStream is = url.openStream()) { + Properties props = new Properties(); + props.load(is); + for (Map.Entry entry : props.entrySet()) { + String className = (String) entry.getKey(); + String[] extensions = ((String) entry.getValue()).split(","); + registerEngine(config, db, className, extensions); + } } } } catch (IOException e) { diff --git a/jbake-core/src/main/java/org/jbake/template/ThymeleafTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/ThymeleafTemplateEngine.java index c6cc99dc2..d26018221 100644 --- a/jbake-core/src/main/java/org/jbake/template/ThymeleafTemplateEngine.java +++ b/jbake-core/src/main/java/org/jbake/template/ThymeleafTemplateEngine.java @@ -110,7 +110,7 @@ private void initializeContext(Locale locale, TemplateModel model) { /** * Helper class to lazy load data form extractors by key */ - private class ContextVariable extends LazyContextVariable { + private static class ContextVariable extends LazyContextVariable { private final ContentStore db; private final String key; @@ -126,31 +126,28 @@ public ContextVariable(ContentStore db, String key, TemplateModel model) { protected Object loadValue() { try { - return extractors.extractAndTransform(db, key, model, new TemplateEngineAdapter() { - @Override - public LazyContextVariable adapt(String key, final Object extractedValue) { - if (key.equals(ModelAttributes.ALLTAGS)) { - return new LazyContextVariable>() { - @Override - protected Set loadValue() { - return (Set) extractedValue; - } - }; - } else if (key.equals(ModelAttributes.PUBLISHED_DATE)) { - return new LazyContextVariable() { - @Override - protected Date loadValue() { - return (Date) extractedValue; - } - }; - } else { - return new LazyContextVariable() { - @Override - protected Object loadValue() { - return extractedValue; - } - }; - } + return extractors.extractAndTransform(db, key, model, (k, v) -> { + if (k.equals(ModelAttributes.ALLTAGS)) { + return new LazyContextVariable>() { + @Override + protected Set loadValue() { + return (Set) v; + } + }; + } else if (k.equals(ModelAttributes.PUBLISHED_DATE)) { + return new LazyContextVariable() { + @Override + protected Date loadValue() { + return (Date) v; + } + }; + } else { + return new LazyContextVariable() { + @Override + protected Object loadValue() { + return v; + } + }; } }).getValue(); } catch (NoModelExtractorException e) { diff --git a/jbake-core/src/main/java/org/jbake/template/model/AllContentExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/AllContentExtractor.java index c6fa44946..57fbb1176 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/AllContentExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/AllContentExtractor.java @@ -5,15 +5,16 @@ import org.jbake.model.DocumentModel; import org.jbake.model.DocumentTypes; import org.jbake.template.ModelExtractor; -import static org.jbake.app.configuration.PropertyList.*; import java.util.Map; -public class AllContentExtractor implements ModelExtractor { +import static org.jbake.app.configuration.PropertyList.DATA_FILE_DOCTYPE; + +public class AllContentExtractor implements ModelExtractor> { @Override - public DocumentList get(ContentStore db, Map model, String key) { - Map config = (Map) model.get("config"); + public DocumentList get(ContentStore db, TemplateModel model, String key) { + Map config = model.getConfig(); String dataFileDocType = config.get(DATA_FILE_DOCTYPE.getKey().replace(".", "_")).toString(); DocumentList allContent = new DocumentList<>(); String[] documentTypes = DocumentTypes.getDocumentTypes(); diff --git a/jbake-core/src/main/java/org/jbake/template/model/AllTagsExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/AllTagsExtractor.java index 9e02fdcbf..6bab8fb49 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/AllTagsExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/AllTagsExtractor.java @@ -3,14 +3,13 @@ import org.jbake.app.ContentStore; import org.jbake.template.ModelExtractor; -import java.util.Map; import java.util.Set; public class AllTagsExtractor implements ModelExtractor> { @Override - public Set get(ContentStore db, Map model, String key) { + public Set get(ContentStore db, TemplateModel model, String key) { return db.getAllTags(); } -} \ No newline at end of file +} diff --git a/jbake-core/src/main/java/org/jbake/template/model/DBExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/DBExtractor.java index aa74c4a9c..0b484c475 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/DBExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/DBExtractor.java @@ -3,13 +3,11 @@ import org.jbake.app.ContentStore; import org.jbake.template.ModelExtractor; -import java.util.Map; - public class DBExtractor implements ModelExtractor { @Override - public ContentStore get(ContentStore db, Map model, String key) { + public ContentStore get(ContentStore db, TemplateModel model, String key) { return db; } -} \ No newline at end of file +} diff --git a/jbake-core/src/main/java/org/jbake/template/model/DataExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/DataExtractor.java index 2f33ea29d..ff582faac 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/DataExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/DataExtractor.java @@ -1,25 +1,14 @@ package org.jbake.template.model; import org.jbake.app.ContentStore; -import org.jbake.app.DocumentList; import org.jbake.template.ModelExtractor; import org.jbake.util.DataFileUtil; -import static org.jbake.app.configuration.PropertyList.*; - -import java.util.HashMap; -import java.util.Map; - public class DataExtractor implements ModelExtractor { @Override - public DataFileUtil get(ContentStore db, Map model, String key) { - DocumentList dl = new DocumentList(); - Map config = (Map) model.get("config"); - - String defaultDocType = config.get(DATA_FILE_DOCTYPE.getKey()).toString(); - DataFileUtil dataUtil = new DataFileUtil(db, defaultDocType); - return dataUtil; + public DataFileUtil get(ContentStore db, TemplateModel model, String key) { + return new DataFileUtil(db); } } diff --git a/jbake-core/src/main/java/org/jbake/template/model/PublishedContentExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/PublishedContentExtractor.java index b9b4081ec..f0020daf8 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/PublishedContentExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/PublishedContentExtractor.java @@ -6,12 +6,10 @@ import org.jbake.model.DocumentTypes; import org.jbake.template.ModelExtractor; -import java.util.Map; - -public class PublishedContentExtractor implements ModelExtractor { +public class PublishedContentExtractor implements ModelExtractor> { @Override - public DocumentList get(ContentStore db, Map model, String key) { + public DocumentList get(ContentStore db, TemplateModel model, String key) { DocumentList publishedContent = new DocumentList<>(); String[] documentTypes = DocumentTypes.getDocumentTypes(); for (String docType : documentTypes) { @@ -21,4 +19,4 @@ public DocumentList get(ContentStore db, Map model, String key) { return publishedContent; } -} \ No newline at end of file +} diff --git a/jbake-core/src/main/java/org/jbake/template/model/PublishedCustomExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/PublishedCustomExtractor.java index 570d7ac82..9f54bb45a 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/PublishedCustomExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/PublishedCustomExtractor.java @@ -2,11 +2,10 @@ import org.jbake.app.ContentStore; import org.jbake.app.DocumentList; +import org.jbake.model.DocumentModel; import org.jbake.template.ModelExtractor; -import java.util.Map; - -public class PublishedCustomExtractor implements ModelExtractor { +public class PublishedCustomExtractor implements ModelExtractor> { String customDocumentType; @@ -15,9 +14,8 @@ public PublishedCustomExtractor(String customDocumentType) { } @Override - public DocumentList get(ContentStore db, Map model, String key) { - + public DocumentList get(ContentStore db, TemplateModel model, String key) { return db.getPublishedContent(customDocumentType); } -} \ No newline at end of file +} diff --git a/jbake-core/src/main/java/org/jbake/template/model/PublishedDateExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/PublishedDateExtractor.java index 469b5e93c..cd65ba826 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/PublishedDateExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/PublishedDateExtractor.java @@ -4,13 +4,12 @@ import org.jbake.template.ModelExtractor; import java.util.Date; -import java.util.Map; public class PublishedDateExtractor implements ModelExtractor { @Override - public Date get(ContentStore db, Map model, String key) { + public Date get(ContentStore db, TemplateModel model, String key) { return new Date(); } -} \ No newline at end of file +} diff --git a/jbake-core/src/main/java/org/jbake/template/model/PublishedPagesExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/PublishedPagesExtractor.java index 5789472c6..c7f1a265f 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/PublishedPagesExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/PublishedPagesExtractor.java @@ -2,15 +2,14 @@ import org.jbake.app.ContentStore; import org.jbake.app.DocumentList; +import org.jbake.model.DocumentModel; import org.jbake.template.ModelExtractor; -import java.util.Map; - -public class PublishedPagesExtractor implements ModelExtractor { +public class PublishedPagesExtractor implements ModelExtractor> { @Override - public DocumentList get(ContentStore db, Map model, String key) { + public DocumentList get(ContentStore db, TemplateModel model, String key) { return db.getPublishedPages(); } -} \ No newline at end of file +} diff --git a/jbake-core/src/main/java/org/jbake/template/model/PublishedPostsExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/PublishedPostsExtractor.java index 741526901..11fc746b3 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/PublishedPostsExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/PublishedPostsExtractor.java @@ -2,14 +2,13 @@ import org.jbake.app.ContentStore; import org.jbake.app.DocumentList; +import org.jbake.model.DocumentModel; import org.jbake.template.ModelExtractor; -import java.util.Map; - -public class PublishedPostsExtractor implements ModelExtractor { +public class PublishedPostsExtractor implements ModelExtractor> { @Override - public DocumentList get(ContentStore db, Map model, String key) { + public DocumentList get(ContentStore db, TemplateModel model, String key) { if (model.containsKey("numberOfPages")) { return db.getPublishedPosts(true); } else { @@ -17,4 +16,4 @@ public DocumentList get(ContentStore db, Map model, String key) { } } -} \ No newline at end of file +} diff --git a/jbake-core/src/main/java/org/jbake/template/model/TagPostsExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/TagPostsExtractor.java index b502fd6e5..6db2138b5 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/TagPostsExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/TagPostsExtractor.java @@ -2,19 +2,16 @@ import org.jbake.app.ContentStore; import org.jbake.app.DocumentList; +import org.jbake.model.DocumentModel; import org.jbake.template.ModelExtractor; -import java.util.Map; - -public class TagPostsExtractor implements ModelExtractor { +public class TagPostsExtractor implements ModelExtractor> { @Override - public DocumentList get(ContentStore db, Map model, String key) { + public DocumentList get(ContentStore db, TemplateModel model, String key) { String tag = null; - TemplateModel templateModel = new TemplateModel(); - templateModel.putAll(model); - if (templateModel.getTag() != null) { - tag = templateModel.getTag(); + if (model.getTag() != null) { + tag = model.getTag(); } // fetch the tag posts from db return db.getPublishedPostsByTag(tag); diff --git a/jbake-core/src/main/java/org/jbake/template/model/TaggedDocumentsExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/TaggedDocumentsExtractor.java index 09402b2af..367073e92 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/TaggedDocumentsExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/TaggedDocumentsExtractor.java @@ -2,21 +2,17 @@ import org.jbake.app.ContentStore; import org.jbake.app.DocumentList; +import org.jbake.model.DocumentModel; import org.jbake.template.ModelExtractor; -import java.util.Map; - -public class TaggedDocumentsExtractor implements ModelExtractor { +public class TaggedDocumentsExtractor implements ModelExtractor> { @Override - public DocumentList get(ContentStore db, Map model, String key) { + public DocumentList get(ContentStore db, TemplateModel model, String key) { String tag = null; - TemplateModel templateModel = new TemplateModel(); - templateModel.putAll(model); - if (templateModel.getTag() != null) { - tag = templateModel.getTag(); + if (model.getTag() != null) { + tag = model.getTag(); } - // fetch the tagged documents from db return db.getPublishedDocumentsByTag(tag); } diff --git a/jbake-core/src/main/java/org/jbake/template/model/TagsExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/TagsExtractor.java index 2ac2ddb3a..920583f04 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/TagsExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/TagsExtractor.java @@ -5,33 +5,27 @@ import org.jbake.app.FileUtil; import org.jbake.template.ModelExtractor; -import java.util.Map; - import static org.jbake.app.configuration.PropertyList.OUTPUT_EXTENSION; import static org.jbake.app.configuration.PropertyList.TAG_PATH; -public class TagsExtractor implements ModelExtractor { +public class TagsExtractor implements ModelExtractor> { @Override - public DocumentList get(ContentStore db, Map model, String key) { + public DocumentList get(ContentStore db, TemplateModel model, String key) { DocumentList dl = new DocumentList<>(); - TemplateModel templateModel = new TemplateModel(); - templateModel.putAll(model); - Map config = templateModel.getConfig(); - String tagPath = config.get(TAG_PATH.getKey().replace(".", "_")).toString(); + String tagPath = model.getConfig().get(TAG_PATH.getKey().replace(".", "_")).toString(); for (String tag : db.getAllTags()) { TemplateModel newTag = new TemplateModel(); - String tagName = tag; - newTag.setName(tagName); + newTag.setName(tag); - String uri = tagPath + FileUtil.URI_SEPARATOR_CHAR + tag + config.get(OUTPUT_EXTENSION.getKey().replace(".", "_")).toString(); + String uri = tagPath + FileUtil.URI_SEPARATOR_CHAR + tag + model.getConfig().get(OUTPUT_EXTENSION.getKey().replace(".", "_")).toString(); newTag.setUri(uri); - newTag.setTaggedPosts(db.getPublishedPostsByTag(tagName)); - newTag.setTaggedDocuments(db.getPublishedDocumentsByTag(tagName)); + newTag.setTaggedPosts(db.getPublishedPostsByTag(tag)); + newTag.setTaggedDocuments(db.getPublishedDocumentsByTag(tag)); dl.push(newTag); } return dl; diff --git a/jbake-core/src/main/java/org/jbake/template/model/TemplateModel.java b/jbake-core/src/main/java/org/jbake/template/model/TemplateModel.java index 8f4cd3cfc..87b6eb9e2 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/TemplateModel.java +++ b/jbake-core/src/main/java/org/jbake/template/model/TemplateModel.java @@ -7,6 +7,7 @@ import org.jbake.template.DelegatingTemplateEngine; import java.io.Writer; +import java.util.Collections; import java.util.Map; public class TemplateModel extends BaseModel { @@ -19,7 +20,9 @@ public TemplateModel(TemplateModel model) { } public Map getConfig() { - return (Map) get(ModelAttributes.CONFIG); + @SuppressWarnings("unchecked") + Map configMap = (Map) get(ModelAttributes.CONFIG); + return Collections.unmodifiableMap(configMap); } public void setConfig(Map configModel) { @@ -66,11 +69,11 @@ public void setTag(String tag) { put(ModelAttributes.TAG, tag); } - public void setTaggedPosts(DocumentList taggedPosts) { + public void setTaggedPosts(DocumentList taggedPosts) { put(ModelAttributes.TAGGED_POSTS, taggedPosts); } - public void setTaggedDocuments(DocumentList taggedDocuments) { + public void setTaggedDocuments(DocumentList taggedDocuments) { put(ModelAttributes.TAGGED_DOCUMENTS, taggedDocuments); } diff --git a/jbake-core/src/main/java/org/jbake/template/model/TypedDocumentsExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/TypedDocumentsExtractor.java index a2b5c3bfd..ffa7a4d8f 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/TypedDocumentsExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/TypedDocumentsExtractor.java @@ -2,23 +2,21 @@ import org.jbake.app.ContentStore; import org.jbake.app.DocumentList; +import org.jbake.model.DocumentModel; import org.jbake.model.DocumentTypeUtils; import org.jbake.template.ModelExtractor; -import java.util.Map; - -public class TypedDocumentsExtractor implements ModelExtractor { +public class TypedDocumentsExtractor implements ModelExtractor> { @Override - public DocumentList get(ContentStore db, Map model, String key) { + public DocumentList get(ContentStore db, TemplateModel model, String key) { // document types are pluralized in model, so unpluralize try { String type = DocumentTypeUtils.unpluralize(key); return db.getAllContent(type); } catch (UnsupportedOperationException e) { - - return new DocumentList(); + return new DocumentList<>(); } } -} \ No newline at end of file +} diff --git a/jbake-core/src/main/java/org/jbake/util/DataFileUtil.java b/jbake-core/src/main/java/org/jbake/util/DataFileUtil.java index a6dcc80f8..19faa2272 100644 --- a/jbake-core/src/main/java/org/jbake/util/DataFileUtil.java +++ b/jbake-core/src/main/java/org/jbake/util/DataFileUtil.java @@ -2,6 +2,7 @@ import org.jbake.app.ContentStore; import org.jbake.app.DocumentList; +import org.jbake.model.DocumentModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,22 +13,20 @@ public class DataFileUtil { private static final Logger LOGGER = LoggerFactory.getLogger(DataFileUtil.class); - private ContentStore db; - private String defaultDocType; + private final ContentStore db; - public DataFileUtil(ContentStore db, String defaultDocType) { + public DataFileUtil(ContentStore db) { this.db = db; - this.defaultDocType = defaultDocType; } public Map get(String ref) { Map result = new HashMap<>(); - DocumentList docs = db.getDocumentByUri(ref); + DocumentList docs = db.getDocumentByUri(ref); if (docs.isEmpty()) { LOGGER.warn("Unable to locate content for ref: {}", ref); } else { if (docs.size() == 1) { - result = (Map) docs.get(0); + result = docs.get(0); } else { LOGGER.warn("Located multiple hits for ref: {}", ref); } diff --git a/jbake-core/src/test/java/org/jbake/app/CrawlerTest.java b/jbake-core/src/test/java/org/jbake/app/CrawlerTest.java index 73d9cfc12..38eca583a 100644 --- a/jbake-core/src/test/java/org/jbake/app/CrawlerTest.java +++ b/jbake-core/src/test/java/org/jbake/app/CrawlerTest.java @@ -4,12 +4,10 @@ import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.jbake.model.DocumentModel; -import org.jbake.model.ModelAttributes; import org.jbake.model.DocumentTypes; +import org.jbake.model.ModelAttributes; import org.jbake.util.DataFileUtil; import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; import java.util.Map; @@ -61,7 +59,7 @@ public void crawlDataFiles() { crawler.crawlDataFiles(); Assert.assertEquals(1, db.getDocumentCount("data")); - DataFileUtil util = new DataFileUtil(db, "data"); + DataFileUtil util = new DataFileUtil(db); Map data = util.get("videos.yaml"); Assert.assertFalse(data.isEmpty()); Assert.assertNotNull(data.get("data")); diff --git a/jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.java b/jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.java index 4a98127d5..d7b56049a 100644 --- a/jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.java +++ b/jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.java @@ -14,7 +14,7 @@ public class ModelExtractorsTest { public ExpectedException thrown = ExpectedException.none(); @After - public void tearDown() throws Exception { + public void tearDown() { ModelExtractors.getInstance().reset(); } diff --git a/jbake-dist/src/smoke-test/java/org/jbake/BinaryRunner.java b/jbake-dist/src/smoke-test/java/org/jbake/BinaryRunner.java index fb9b3cf11..a5cf8a05f 100644 --- a/jbake-dist/src/smoke-test/java/org/jbake/BinaryRunner.java +++ b/jbake-dist/src/smoke-test/java/org/jbake/BinaryRunner.java @@ -8,7 +8,7 @@ public class BinaryRunner { - private File folder; + private final File folder; public BinaryRunner(File folder) { this.folder = folder; @@ -30,7 +30,7 @@ private void printOutput(InputStream inputStream) throws IOException { String line; BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - while ((line = reader.readLine()) != null ) { + while ((line = reader.readLine()) != null) { System.out.println(line); } reader.close(); From 52d86d2c11a1c690e72d07c19dcd3ab22a467c02 Mon Sep 17 00:00:00 2001 From: Frank Becker Date: Sat, 29 May 2021 11:05:11 +0200 Subject: [PATCH 2/7] remove irc notifications from travis build and jdk8 from appveyor build. test jdk16 --- .travis.yml | 5 ++--- appveyor.yml | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 859438b56..a02016590 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,13 +17,13 @@ script: - "./gradlew check --stacktrace" jdk: - - openjdk15 + - openjdk16 - openjdk11 jobs: include: - - jdk: openjdk15 + - jdk: openjdk16 os: osx - jdk: openjdk11 @@ -42,7 +42,6 @@ jobs: - "./gradlew -PskipSigning jacocoRootReport coveralls -i --stacktrace" notifications: - irc: "irc.freenode.org#jbake" webhooks: urls: - https://webhooks.gitter.im/e/2d332fabb02dba68a36b diff --git a/appveyor.yml b/appveyor.yml index 65894fc34..c0785c27f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,9 +8,8 @@ clone_depth: 10 environment: TERM: dumb matrix: - - JAVA_HOME: C:\Program Files\Java\jdk1.8.0 - JAVA_HOME: C:\Program Files\Java\jdk11 - - JAVA_HOME: C:\Program Files\Java\jdk15 + - JAVA_HOME: C:\Program Files\Java\jdk16 install: - SET PATH=%JAVA_HOME%\bin;%PATH% From 02cc5c93b830acfe055aba28841fc84b0d578ef0 Mon Sep 17 00:00:00 2001 From: Frank Becker Date: Sat, 29 May 2021 13:16:32 +0200 Subject: [PATCH 3/7] refactor loading of ModelExtractors and MarkupEngines --- .../src/main/java/org/jbake/app/FileUtil.java | 44 ++---- .../src/main/java/org/jbake/app/Parser.java | 6 +- .../org/jbake/model/DocumentTypeUtils.java | 8 +- .../java/org/jbake/model/DocumentTypes.java | 9 +- .../main/java/org/jbake/parser/Engines.java | 138 ------------------ .../java/org/jbake/parser/MarkupEngines.java | 73 +++++++++ .../java/org/jbake/parser/YamlEngine.java | 12 +- .../template/DescriptorFileEngineLoader.java | 109 ++++++++++++++ .../org/jbake/template/ModelExtractors.java | 107 ++------------ .../org/jbake/template/TemplateEngines.java | 7 +- .../template/model/AllContentExtractor.java | 3 +- .../model/PublishedContentExtractor.java | 3 +- ...jbake.template.TemplateEngines.properties} | 0 ...oovyMarkupTemplateEngineRenderingTest.java | 1 - .../org/jbake/model/DocumentTypesTest.java | 8 +- ...delExtractorsDocumentTypeListenerTest.java | 4 +- .../jbake/template/ModelExtractorsTest.java | 8 +- 17 files changed, 238 insertions(+), 302 deletions(-) delete mode 100644 jbake-core/src/main/java/org/jbake/parser/Engines.java create mode 100644 jbake-core/src/main/java/org/jbake/parser/MarkupEngines.java create mode 100644 jbake-core/src/main/java/org/jbake/template/DescriptorFileEngineLoader.java rename jbake-core/src/main/resources/META-INF/{org.jbake.parser.TemplateEngines.properties => org.jbake.template.TemplateEngines.properties} (100%) diff --git a/jbake-core/src/main/java/org/jbake/app/FileUtil.java b/jbake-core/src/main/java/org/jbake/app/FileUtil.java index 2f928298a..e05f3aee3 100644 --- a/jbake-core/src/main/java/org/jbake/app/FileUtil.java +++ b/jbake-core/src/main/java/org/jbake/app/FileUtil.java @@ -2,7 +2,7 @@ import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.launcher.SystemExit; -import org.jbake.parser.Engines; +import org.jbake.parser.MarkupEngines; import java.io.File; import java.io.FileFilter; @@ -26,6 +26,8 @@ public class FileUtil { public static final String URI_SEPARATOR_CHAR = "/"; + private FileUtil() {} + /** * Filters files based on their file extension. * @@ -33,12 +35,10 @@ public class FileUtil { * @return Object for filtering files */ public static FileFilter getFileFilter(JBakeConfiguration config) { - return pathname -> { - //Accept if input is a non-hidden file with registered extension - //or if a non-hidden and not-ignored directory - return !pathname.isHidden() && (pathname.isFile() - && Engines.getRecognizedExtensions().contains(fileExt(pathname))) || (directoryOnlyIfNotIgnored(pathname, config)); - }; + //Accept if input is a non-hidden file with registered extension + //or if a non-hidden and not-ignored directory + return pathname -> !pathname.isHidden() && (pathname.isFile() + && MarkupEngines.getInstance().supportsExtension(fileExt(pathname))) || (directoryOnlyIfNotIgnored(pathname, config)); } /** @@ -49,12 +49,8 @@ public static FileFilter getFileFilter(JBakeConfiguration config) { */ @Deprecated public static FileFilter getFileFilter() { - return pathname -> { - //Accept if input is a non-hidden file with registered extension - //or if a non-hidden and not-ignored directory - return !pathname.isHidden() && (pathname.isFile() - && Engines.getRecognizedExtensions().contains(fileExt(pathname))) || (directoryOnlyIfNotIgnored(pathname)); - }; + return pathname -> !pathname.isHidden() && (pathname.isFile() + && MarkupEngines.getInstance().supportsExtension(fileExt(pathname))) || (directoryOnlyIfNotIgnored(pathname)); } /** @@ -73,14 +69,10 @@ public static FileFilter getDataFileFilter() { * @return FileFilter object */ public static FileFilter getNotContentFileFilter(JBakeConfiguration config) { - return pathname -> { - //Accept if input is a non-hidden file with NOT-registered extension - //or if a non-hidden and not-ignored directory - return !pathname.isHidden() && (pathname.isFile() - //extension should not be from registered content extensions - && !Engines.getRecognizedExtensions().contains(fileExt(pathname))) - || (directoryOnlyIfNotIgnored(pathname, config)); - }; + return pathname -> !pathname.isHidden() && (pathname.isFile() + //extension should not be from registered content extensions + && !MarkupEngines.getInstance().supportsExtension(fileExt(pathname))) + || (directoryOnlyIfNotIgnored(pathname, config)); } /** @@ -91,14 +83,10 @@ public static FileFilter getNotContentFileFilter(JBakeConfiguration config) { */ @Deprecated public static FileFilter getNotContentFileFilter() { - return pathname -> { - //Accept if input is a non-hidden file with NOT-registered extension - //or if a non-hidden and not-ignored directory - return !pathname.isHidden() && (pathname.isFile() + return pathname -> !pathname.isHidden() && (pathname.isFile() //extension should not be from registered content extensions - && !Engines.getRecognizedExtensions().contains(fileExt(pathname))) + && !MarkupEngines.getInstance().supportsExtension(fileExt(pathname))) || (directoryOnlyIfNotIgnored(pathname)); - }; } /** @@ -252,7 +240,7 @@ public static String asPath(String path) { * @param config the jbake configuration * @return the relative path to get to the root */ - static public String getPathToRoot(JBakeConfiguration config, File rootPath, File sourceFile) { + public static String getPathToRoot(JBakeConfiguration config, File rootPath, File sourceFile) { Path r = Paths.get(rootPath.toURI()); Path s = Paths.get(sourceFile.getParentFile().toURI()); diff --git a/jbake-core/src/main/java/org/jbake/app/Parser.java b/jbake-core/src/main/java/org/jbake/app/Parser.java index 129b01abf..e54d51488 100644 --- a/jbake-core/src/main/java/org/jbake/app/Parser.java +++ b/jbake-core/src/main/java/org/jbake/app/Parser.java @@ -2,7 +2,7 @@ import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.model.DocumentModel; -import org.jbake.parser.Engines; +import org.jbake.parser.MarkupEngines; import org.jbake.parser.ParserEngine; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -17,7 +17,7 @@ public class Parser { private static final Logger LOGGER = LoggerFactory.getLogger(Parser.class); - private JBakeConfiguration config; + private final JBakeConfiguration config; /** * Creates a new instance of Parser. @@ -35,7 +35,7 @@ public Parser(JBakeConfiguration config) { * @return The contents of the file */ public DocumentModel processFile(File file) { - ParserEngine engine = Engines.get(FileUtil.fileExt(file)); + ParserEngine engine = MarkupEngines.fromExtension(FileUtil.fileExt(file)); if (engine == null) { LOGGER.error("Unable to find suitable markup engine for {}", file); return null; diff --git a/jbake-core/src/main/java/org/jbake/model/DocumentTypeUtils.java b/jbake-core/src/main/java/org/jbake/model/DocumentTypeUtils.java index 9f744c212..37d03552d 100644 --- a/jbake-core/src/main/java/org/jbake/model/DocumentTypeUtils.java +++ b/jbake-core/src/main/java/org/jbake/model/DocumentTypeUtils.java @@ -1,5 +1,7 @@ package org.jbake.model; +import java.util.Set; + public class DocumentTypeUtils { private DocumentTypeUtils() {} @@ -9,7 +11,7 @@ public static String unpluralize(String pluralized) { if ((pluralized == null) || (pluralized.length() == 0)) { throw new IllegalArgumentException("pluralized string should not be null or length should be bigger than zero"); } - String[] documentTypes = DocumentTypes.getDocumentTypes(); + Set documentTypes = DocumentTypes.getDocumentTypes(); String unpluralizedDoctype = pluralized.substring(0, pluralized.length() - 1); if (DocumentTypes.contains(unpluralizedDoctype)) { @@ -20,7 +22,7 @@ public static String unpluralize(String pluralized) { } public static String pluralize(String documentType) { - String[] documentTypes = DocumentTypes.getDocumentTypes(); + Set documentTypes = DocumentTypes.getDocumentTypes(); if (DocumentTypes.contains(documentType)) { return documentType + "s"; @@ -28,4 +30,4 @@ public static String pluralize(String documentType) { throw new UnsupportedOperationException("there is no document type \"" + documentType + "\" we can pluralize\n" + "We only have " + documentTypes); } -} \ No newline at end of file +} diff --git a/jbake-core/src/main/java/org/jbake/model/DocumentTypes.java b/jbake-core/src/main/java/org/jbake/model/DocumentTypes.java index 0ecc975ec..a7086a7ce 100644 --- a/jbake-core/src/main/java/org/jbake/model/DocumentTypes.java +++ b/jbake-core/src/main/java/org/jbake/model/DocumentTypes.java @@ -1,7 +1,5 @@ package org.jbake.model; -import org.jbake.parser.Engines; - import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; @@ -52,11 +50,8 @@ public static void addListener(DocumentTypeListener listener) { * * @return all supported document types */ - public static String[] getDocumentTypes() { - // TODO: is this needed? - // make sure engines are loaded before to get document types - Engines.getRecognizedExtensions(); - return DEFAULT_DOC_TYPES.toArray(new String[DEFAULT_DOC_TYPES.size()]); + public static Set getDocumentTypes() { + return DEFAULT_DOC_TYPES; } public static boolean contains(String documentType) { diff --git a/jbake-core/src/main/java/org/jbake/parser/Engines.java b/jbake-core/src/main/java/org/jbake/parser/Engines.java deleted file mode 100644 index 49e729cc0..000000000 --- a/jbake-core/src/main/java/org/jbake/parser/Engines.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.jbake.parser; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.net.URL; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - -/** - *

A singleton class giving access to markup engines. Markup engines are loaded based on classpath. - * New engines may be registered either at runtime (not recommanded) or by putting a descriptor file - * on classpath (recommanded).

- * - *

The descriptor file must be found in META-INF directory and named - * org.jbake.parser.MarkupEngines.properties. The format of the file is easy:

- * - * org.jbake.parser.RawMarkupEngine=html
- * org.jbake.parser.AsciidoctorEngine=ad,adoc,asciidoc
- * org.jbake.parser.MarkdownEngine=md
- *
- *

where the key is the class of the engine (must extend {@link org.jbake.parser.MarkupEngine} and have a no-arg - * constructor and the value is a comma-separated list of file extensions that this engine is capable of proceeding.

- * - *

Markup engines are singletons, so are typically used to initialize the underlying renderning engines. They - * must not store specific information of a currently processed file (use {@link ParserContext the parser context} - * for that).

- *

- * This class loads the engines only if they are found on classpath. If not, the engine is not registered. This allows - * JBake to support multiple rendering engines without the explicit need to have them on classpath. This is a better - * fit for embedding. - * - * @author Cédric Champeau - */ -public class Engines { - private static final Logger LOGGER = LoggerFactory.getLogger(Engines.class); - private static final Engines INSTANCE; - public static final String PROPERTIES = "META-INF/org.jbake.parser.MarkupEngines.properties"; - - private final Map parsers; - - - static { - INSTANCE = new Engines(); - loadEngines(); - } - - public static ParserEngine get(String fileExtension) { - return INSTANCE.getEngine(fileExtension); - } - - public static void register(String fileExtension, ParserEngine engine) { - INSTANCE.registerEngine(fileExtension, engine); - } - - public static Set getRecognizedExtensions() { - return Collections.unmodifiableSet(INSTANCE.parsers.keySet()); - } - - private Engines() { - parsers = new HashMap<>(); - } - - private void registerEngine(String fileExtension, ParserEngine markupEngine) { - ParserEngine old = parsers.put(fileExtension, markupEngine); - if (old != null) { - LOGGER.warn("Registered a markup engine for extension [.{}] but another one was already defined: {}", fileExtension, old); - } - } - - private ParserEngine getEngine(String fileExtension) { - return parsers.get(fileExtension); - } - - /** - * This method is used to search for a specific class, telling if loading the engine would succeed. This is - * typically used to avoid loading optional modules. - * - * @param engineClassName engine class, used both as a hint to find it and to create the engine itself. - * @return null if the engine is not available, an instance of the engine otherwise - */ - private static ParserEngine tryLoadEngine(String engineClassName) { - try { - @SuppressWarnings("unchecked") - Class engineClass = (Class) Class.forName(engineClassName, false, Engines.class.getClassLoader()); - return engineClass.getDeclaredConstructor().newInstance(); - } catch (ClassNotFoundException | NoClassDefFoundError | IllegalAccessException | InstantiationException e) { - return new ErrorEngine(engineClassName); - } catch (NoSuchMethodException | InvocationTargetException e) { - LOGGER.error("unable to instantiate ParserEngine {}", engineClassName); - } - return null; - } - - /** - * This method is used internally to load markup engines. Markup engines are found using descriptor files on classpath, so - * adding an engine is as easy as adding a jar on classpath with the descriptor file included. - */ - private static void loadEngines() { - try { - ClassLoader cl = Engines.class.getClassLoader(); - Enumeration resources = cl.getResources(PROPERTIES); - while (resources.hasMoreElements()) { - URL url = resources.nextElement(); - try (InputStream is = url.openStream()) { - Properties props = new Properties(); - props.load(is); - for (Map.Entry entry : props.entrySet()) { - String className = (String) entry.getKey(); - String[] extensions = ((String) entry.getValue()).split(","); - registerEngine(className, extensions); - } - } - } - } catch (IOException e) { - LOGGER.error("Error loading Engines", e); - } - } - - private static void registerEngine(String className, String... extensions) { - ParserEngine engine = tryLoadEngine(className); - if (engine != null) { - for (String extension : extensions) { - register(extension, engine); - } - if (engine instanceof ErrorEngine) { - LOGGER.warn("Unable to load a suitable rendering engine for extensions {}", (Object) extensions); - } - } - } -} diff --git a/jbake-core/src/main/java/org/jbake/parser/MarkupEngines.java b/jbake-core/src/main/java/org/jbake/parser/MarkupEngines.java new file mode 100644 index 000000000..9b09402f8 --- /dev/null +++ b/jbake-core/src/main/java/org/jbake/parser/MarkupEngines.java @@ -0,0 +1,73 @@ +package org.jbake.parser; + +import org.jbake.template.DescriptorFileEngineLoader; + +import java.util.Set; + +/** + *

A singleton class giving access to markup engines. Markup engines are loaded based on classpath. + * New engines may be registered either at runtime (not recommanded) or by putting a descriptor file + * on classpath (recommanded).

+ * + *

The descriptor file must be found in META-INF directory and named + * org.jbake.parser.MarkupEngines.properties. The format of the file is easy:

+ * + * org.jbake.parser.RawMarkupEngine=html
+ * org.jbake.parser.AsciidoctorEngine=ad,adoc,asciidoc
+ * org.jbake.parser.MarkdownEngine=md
+ *
+ *

where the key is the class of the engine (must extend {@link org.jbake.parser.MarkupEngine} and have a no-arg + * constructor and the value is a comma-separated list of file extensions that this engine is capable of proceeding.

+ * + *

Markup engines are singletons, so are typically used to initialize the underlying renderning engines. They + * must not store specific information of a currently processed file (use {@link ParserContext the parser context} + * for that).

+ *

+ * This class loads the engines only if they are found on classpath. If not, the engine is not registered. This allows + * JBake to support multiple rendering engines without the explicit need to have them on classpath. This is a better + * fit for embedding. + * + * @author Cédric Champeau + */ +public class MarkupEngines extends DescriptorFileEngineLoader { + public static final String PROPERTIES = "META-INF/org.jbake.parser.MarkupEngines.properties"; + + private static class Loader { + + private static final MarkupEngines INSTANCE = new MarkupEngines(); + } + public static MarkupEngines getInstance() { + return MarkupEngines.Loader.INSTANCE; + } + + private MarkupEngines() { + super(); + loadEngines(); + } + + public static Set recognizedExtensions() { + return getInstance().keySet(); + } + + public static ParserEngine fromExtension(String fileExt) { + return getInstance().get(fileExt); + } + + @Override + protected String descriptorFile() { + return PROPERTIES; + } + + @Override + protected void loadAndRegisterEngine(String className, String... extensions) { + ParserEngine engine = tryLoadEngine(className); + if (engine != null) { + for (String extension : extensions) { + registerEngine(extension, engine); + } + if (engine instanceof ErrorEngine) { + LOGGER.warn("Unable to load a suitable rendering engine for extensions {}", (Object) extensions); + } + } + } +} diff --git a/jbake-core/src/main/java/org/jbake/parser/YamlEngine.java b/jbake-core/src/main/java/org/jbake/parser/YamlEngine.java index bf65a81cc..f0a4cfd01 100644 --- a/jbake-core/src/main/java/org/jbake/parser/YamlEngine.java +++ b/jbake-core/src/main/java/org/jbake/parser/YamlEngine.java @@ -1,20 +1,15 @@ package org.jbake.parser; -import org.apache.commons.io.IOUtils; import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.model.DocumentModel; -import org.jbake.model.DocumentTypes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.yaml.snakeyaml.Yaml; -import javax.swing.text.Document; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,6 +25,7 @@ public class YamlEngine extends MarkupEngine { * @param file * @return */ + @SuppressWarnings("unchecked") private DocumentModel parseFile(File file) { DocumentModel model = new DocumentModel(); Yaml yaml = new Yaml(); @@ -38,7 +34,7 @@ private DocumentModel parseFile(File file) { if (result instanceof List) { model.put("data", result); } else if (result instanceof Map) { - model.putAll((Map)result); + model.putAll((Map) result); } else { LOGGER.warn("Unexpected result [{}] while parsing YAML file {}", result.getClass(), file); } @@ -63,14 +59,14 @@ public void processHeader(final ParserContext context) { DocumentModel fileContents = parseFile(context.getFile()); DocumentModel documentModel = context.getDocumentModel(); - for (String key : fileContents.keySet()) { + fileContents.keySet().forEach(key -> { if (hasJBakePrefix(key)) { String pKey = key.substring(6); documentModel.put(pKey, fileContents.get(key)); } else { documentModel.put(key, fileContents.get(key)); } - } + }); } /** diff --git a/jbake-core/src/main/java/org/jbake/template/DescriptorFileEngineLoader.java b/jbake-core/src/main/java/org/jbake/template/DescriptorFileEngineLoader.java new file mode 100644 index 000000000..f0fc592fc --- /dev/null +++ b/jbake-core/src/main/java/org/jbake/template/DescriptorFileEngineLoader.java @@ -0,0 +1,109 @@ +package org.jbake.template; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.net.URL; +import java.util.Enumeration; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.TreeMap; + +public abstract class DescriptorFileEngineLoader { + protected static final Logger LOGGER = LoggerFactory.getLogger(DescriptorFileEngineLoader.class); + private final Map classes; + + protected DescriptorFileEngineLoader() { + classes = new TreeMap<>(); + } + + /** + * This method is used to search for a specific class, telling if loading the engine would succeed. This is + * typically used to avoid loading optional modules. + * + * @param engineClassName engine class, used both as a hint to find it and to create the engine itself. @return null if the engine is not available, an instance of the engine otherwise + */ + @SuppressWarnings("unchecked") + protected T tryLoadEngine(String engineClassName) { + try { + Class engineClass = Class.forName(engineClassName, false, DescriptorFileEngineLoader.class.getClassLoader()); + return (T) engineClass.getDeclaredConstructor().newInstance(); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoClassDefFoundError | NoSuchMethodException | InvocationTargetException e) { + return null; + } // a dependency of the engine may not be found on classpath + + } + + protected void registerEngine(String key, T extractor) { + T old = classes.put(key, extractor); + if (old != null) { + LOGGER.warn("Override detected. Registered a model extractor for key [.{}] but another one was already defined: {}", key, old); + } + } + + /** + * This method is used internally to load markup engines. Markup engines are found using descriptor files on + * classpath, so adding an engine is as easy as adding a jar on classpath with the descriptor file included. + */ + protected void loadEngines() { + try { + ClassLoader cl = DescriptorFileEngineLoader.class.getClassLoader(); + Enumeration resources = cl.getResources(descriptorFile()); + while (resources.hasMoreElements()) { + URL url = resources.nextElement(); + try (InputStream is = url.openStream()) { + Properties props = new Properties(); + props.load(is); + for (Map.Entry entry : props.entrySet()) { + String className = (String) entry.getKey(); + String[] extensions = ((String) entry.getValue()).split(","); + loadAndRegisterEngine(className, extensions); + } + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + protected void loadAndRegisterEngine(String className, String... extensions) { + T engine = tryLoadEngine(className); + if (engine != null) { + for (String extension : extensions) { + registerEngine(extension, engine); + } + } + } + + protected abstract String descriptorFile(); + + /** + * @param key A key a {@link ModelExtractor} is registered with + * @return true if key is registered + * @see Map#containsKey(Object) + */ + public boolean supportsExtension(String key) { + return classes.containsKey(key); + } + + /** + * @return A @{@link Set} of all known keys a @{@link ModelExtractor} is registered with + * @see Map#keySet() + */ + public Set keySet() { + return classes.keySet(); + } + + protected T get(String extension) { + return classes.get(extension); + } + + public void reset() { + classes.clear(); + loadEngines(); + } +} diff --git a/jbake-core/src/main/java/org/jbake/template/ModelExtractors.java b/jbake-core/src/main/java/org/jbake/template/ModelExtractors.java index 65f6a6d08..29a8b41d2 100644 --- a/jbake-core/src/main/java/org/jbake/template/ModelExtractors.java +++ b/jbake-core/src/main/java/org/jbake/template/ModelExtractors.java @@ -5,18 +5,6 @@ import org.jbake.template.model.PublishedCustomExtractor; import org.jbake.template.model.TemplateModel; import org.jbake.template.model.TypedDocumentsExtractor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.net.URL; -import java.util.Enumeration; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.TreeMap; /** @@ -37,12 +25,9 @@ * @author ndx * @author Cédric Champeau */ -public class ModelExtractors { - private static final String PROPERTIES = "META-INF/org.jbake.template.ModelExtractors.properties"; - - private static final Logger LOGGER = LoggerFactory.getLogger(ModelExtractors.class); +public class ModelExtractors extends DescriptorFileEngineLoader> { - private final Map> extractors; + private static final String PROPERTIES = "META-INF/org.jbake.template.ModelExtractors.properties"; private static class Loader { private static final ModelExtractors INSTANCE = new ModelExtractors(); @@ -53,101 +38,27 @@ public static ModelExtractors getInstance() { } private ModelExtractors() { - extractors = new TreeMap<>(); + super(); loadEngines(); } - public void reset() { - extractors.clear(); - loadEngines(); - } - - public void registerEngine(String key, ModelExtractor extractor) { - ModelExtractor old = extractors.put(key, extractor); - if (old != null) { - LOGGER.warn("Registered a model extractor for key [.{}] but another one was already defined: {}", key, old); - } - } - - /** - * This method is used to search for a specific class, telling if loading the engine would succeed. This is - * typically used to avoid loading optional modules. - * - * @param engineClassName engine class, used both as a hint to find it and to create the engine itself. @return null if the engine is not available, an instance of the engine otherwise - */ - private static ModelExtractor tryLoadEngine(String engineClassName) { - try { - @SuppressWarnings("unchecked") Class engineClass = (Class) Class.forName(engineClassName, false, ModelExtractors.class.getClassLoader()); - return engineClass.getDeclaredConstructor().newInstance(); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoClassDefFoundError | NoSuchMethodException | InvocationTargetException e) { - return null; - } // a dependency of the engine may not be found on classpath - - } - - /** - * This method is used internally to load markup engines. Markup engines are found using descriptor files on - * classpath, so adding an engine is as easy as adding a jar on classpath with the descriptor file included. - */ - private void loadEngines() { - try { - ClassLoader cl = ModelExtractors.class.getClassLoader(); - Enumeration resources = cl.getResources(PROPERTIES); - while (resources.hasMoreElements()) { - URL url = resources.nextElement(); - try (InputStream is = url.openStream()) { - Properties props = new Properties(); - props.load(is); - for (Map.Entry entry : props.entrySet()) { - String className = (String) entry.getKey(); - String[] extensions = ((String) entry.getValue()).split(","); - loadAndRegisterEngine(className, extensions); - } - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - private void loadAndRegisterEngine(String className, String... extensions) { - ModelExtractor engine = tryLoadEngine(className); - if (engine != null) { - for (String extension : extensions) { - registerEngine(extension, engine); - } - } + @Override + protected String descriptorFile() { + return PROPERTIES; } public T extractAndTransform(ContentStore db, String key, TemplateModel map, TemplateEngineAdapter adapter) throws NoModelExtractorException { - if (extractors.containsKey(key)) { - Object extractedValue = extractors.get(key).get(db, map, key); + if (supportsExtension(key)) { + Object extractedValue = get(key).get(db, map, key); return adapter.adapt(key, extractedValue); } else { throw new NoModelExtractorException("no model extractor for key \"" + key + "\""); } } - /** - * @param key A key a {@link ModelExtractor} is registered with - * @return true if key is registered - * @see java.util.Map#containsKey(java.lang.Object) - */ - public boolean containsKey(String key) { - return extractors.containsKey(key); - } - - /** - * @return A @{@link Set} of all known keys a @{@link ModelExtractor} is registered with - * @see java.util.Map#keySet() - */ - public Set keySet() { - return extractors.keySet(); - } - public void registerExtractorsForCustomTypes(String docType) { String pluralizedDoctype = DocumentTypeUtils.pluralize(docType); - if (!containsKey(pluralizedDoctype)) { + if (!supportsExtension(pluralizedDoctype)) { LOGGER.info("register new extractors for document type: {}", docType); registerEngine(pluralizedDoctype, new TypedDocumentsExtractor()); registerEngine("published_" + pluralizedDoctype, new PublishedCustomExtractor(docType)); diff --git a/jbake-core/src/main/java/org/jbake/template/TemplateEngines.java b/jbake-core/src/main/java/org/jbake/template/TemplateEngines.java index b684096ab..d7c46864b 100644 --- a/jbake-core/src/main/java/org/jbake/template/TemplateEngines.java +++ b/jbake-core/src/main/java/org/jbake/template/TemplateEngines.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.util.Collections; import java.util.Enumeration; @@ -23,7 +24,7 @@ * rendering may be registered either at runtime (not recommanded) or by putting a descriptor file on classpath * (recommanded).

*

The descriptor file must be found in META-INF directory and named - * org.jbake.parser.TemplateEngines.properties. The format of the file is easy:

+ * org.jbake.template.TemplateEngines.properties. The format of the file is easy:

* org.jbake.parser.FreeMarkerRenderer=ftl
org.jbake.parser.GroovyRenderer=groovy,gsp
*

where the key is the class of the engine (must extend {@link AbstractTemplateEngine} and have * a 4-arg constructor and the value is a comma-separated list of file extensions that this engine is capable @@ -40,7 +41,7 @@ public class TemplateEngines { private static final Logger LOGGER = LoggerFactory.getLogger(TemplateEngines.class); - public static final String PROPERTIES = "META-INF/org.jbake.parser.TemplateEngines.properties"; + public static final String PROPERTIES = "META-INF/org.jbake.template.TemplateEngines.properties"; private final Map engines; @@ -79,7 +80,7 @@ private static AbstractTemplateEngine tryLoadEngine(final JBakeConfiguration con Class engineClass = (Class) Class.forName(engineClassName, false, TemplateEngines.class.getClassLoader()); Constructor ctor = engineClass.getConstructor(JBakeConfiguration.class, ContentStore.class); return ctor.newInstance(config, db); - } catch (Throwable e) { + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoClassDefFoundError | NoSuchMethodException | InvocationTargetException e) { // not all engines might be necessary, therefore only emit class loading issue with level warn LOGGER.debug("Template engine not available: {}", engineClassName); return null; diff --git a/jbake-core/src/main/java/org/jbake/template/model/AllContentExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/AllContentExtractor.java index 57fbb1176..1dc5bd8e0 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/AllContentExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/AllContentExtractor.java @@ -17,8 +17,7 @@ public DocumentList get(ContentStore db, TemplateModel model, Str Map config = model.getConfig(); String dataFileDocType = config.get(DATA_FILE_DOCTYPE.getKey().replace(".", "_")).toString(); DocumentList allContent = new DocumentList<>(); - String[] documentTypes = DocumentTypes.getDocumentTypes(); - for (String docType : documentTypes) { + for (String docType : DocumentTypes.getDocumentTypes()) { if (!docType.equals(dataFileDocType)) { DocumentList query = db.getAllContent(docType); allContent.addAll(query); diff --git a/jbake-core/src/main/java/org/jbake/template/model/PublishedContentExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/PublishedContentExtractor.java index f0020daf8..cbf3b8556 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/PublishedContentExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/PublishedContentExtractor.java @@ -11,8 +11,7 @@ public class PublishedContentExtractor implements ModelExtractor get(ContentStore db, TemplateModel model, String key) { DocumentList publishedContent = new DocumentList<>(); - String[] documentTypes = DocumentTypes.getDocumentTypes(); - for (String docType : documentTypes) { + for (String docType : DocumentTypes.getDocumentTypes()) { DocumentList query = db.getPublishedContent(docType); publishedContent.addAll(query); } diff --git a/jbake-core/src/main/resources/META-INF/org.jbake.parser.TemplateEngines.properties b/jbake-core/src/main/resources/META-INF/org.jbake.template.TemplateEngines.properties similarity index 100% rename from jbake-core/src/main/resources/META-INF/org.jbake.parser.TemplateEngines.properties rename to jbake-core/src/main/resources/META-INF/org.jbake.template.TemplateEngines.properties diff --git a/jbake-core/src/test/java/org/jbake/app/template/GroovyMarkupTemplateEngineRenderingTest.java b/jbake-core/src/test/java/org/jbake/app/template/GroovyMarkupTemplateEngineRenderingTest.java index cbc52455b..99c64e55d 100644 --- a/jbake-core/src/test/java/org/jbake/app/template/GroovyMarkupTemplateEngineRenderingTest.java +++ b/jbake-core/src/test/java/org/jbake/app/template/GroovyMarkupTemplateEngineRenderingTest.java @@ -6,7 +6,6 @@ import org.jbake.app.Parser; import org.jbake.app.Renderer; import org.jbake.model.DocumentModel; -import org.jbake.model.DocumentTypes; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; diff --git a/jbake-core/src/test/java/org/jbake/model/DocumentTypesTest.java b/jbake-core/src/test/java/org/jbake/model/DocumentTypesTest.java index 9a664ea31..ae9174abe 100644 --- a/jbake-core/src/test/java/org/jbake/model/DocumentTypesTest.java +++ b/jbake-core/src/test/java/org/jbake/model/DocumentTypesTest.java @@ -2,6 +2,8 @@ import org.junit.Test; +import java.util.Set; + import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -9,9 +11,9 @@ public class DocumentTypesTest { @Test - public void shouldReturnDefaultDocumentTypes() throws Exception { - String[] knownDocumentTypes = DocumentTypes.getDocumentTypes(); - String[] expectedDocumentType = new String[] {"page", "post", "masterindex", "archive", "feed" }; + public void shouldReturnDefaultDocumentTypes() { + Set knownDocumentTypes = DocumentTypes.getDocumentTypes(); + String[] expectedDocumentType = new String[]{"page", "post", "masterindex", "archive", "feed"}; assertThat(knownDocumentTypes).contains(expectedDocumentType); } diff --git a/jbake-core/src/test/java/org/jbake/template/ModelExtractorsDocumentTypeListenerTest.java b/jbake-core/src/test/java/org/jbake/template/ModelExtractorsDocumentTypeListenerTest.java index 3c17c6f97..9ea46c6de 100644 --- a/jbake-core/src/test/java/org/jbake/template/ModelExtractorsDocumentTypeListenerTest.java +++ b/jbake-core/src/test/java/org/jbake/template/ModelExtractorsDocumentTypeListenerTest.java @@ -18,9 +18,9 @@ public void shouldRegisterExtractorsForCustomType() { listener.added(newDocumentType); // then: "an extractor is registered by pluralized type as key" - assertThat(ModelExtractors.getInstance().containsKey("projects")).isTrue(); + assertThat(ModelExtractors.getInstance().supportsExtension("projects")).isTrue(); // and: "an extractor for published types is registered" - assertThat(ModelExtractors.getInstance().containsKey("published_projects")).isTrue(); + assertThat(ModelExtractors.getInstance().supportsExtension("published_projects")).isTrue(); } } diff --git a/jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.java b/jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.java index d7b56049a..204ad3999 100644 --- a/jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.java +++ b/jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.java @@ -41,7 +41,7 @@ public void shouldLoadExtractorsOnInstantiation() { }; for (String aKey : expectedKeys) { - assertThat(ModelExtractors.getInstance().containsKey(aKey)).isTrue(); + assertThat(ModelExtractors.getInstance().supportsExtension(aKey)).isTrue(); } } @@ -52,7 +52,7 @@ public void shouldRegisterExtractorsOnlyForCustomTypes() { ModelExtractors.getInstance().registerExtractorsForCustomTypes(knownDocumentType); - assertThat(ModelExtractors.getInstance().containsKey("published_alltags")).isFalse(); + assertThat(ModelExtractors.getInstance().supportsExtension("published_alltags")).isFalse(); } @Test @@ -65,10 +65,10 @@ public void shouldRegisterExtractorsForCustomType() { ModelExtractors.getInstance().registerExtractorsForCustomTypes(newDocumentType); // then an extractor is registered by pluralized type as key - assertThat(ModelExtractors.getInstance().containsKey("projects")).isTrue(); + assertThat(ModelExtractors.getInstance().supportsExtension("projects")).isTrue(); // and an extractor for published types is registered - assertThat(ModelExtractors.getInstance().containsKey("published_projects")).isTrue(); + assertThat(ModelExtractors.getInstance().supportsExtension("published_projects")).isTrue(); } @Test From fbfedc12b65df870d7571ef1b4039c9271dd7795 Mon Sep 17 00:00:00 2001 From: Frank Becker Date: Sat, 29 May 2021 16:08:16 +0200 Subject: [PATCH 4/7] refactor TemplateEngines extends DescriptorFileEngineLoader --- .../src/main/java/org/jbake/app/Crawler.java | 1 + .../src/main/java/org/jbake/app/FileUtil.java | 3 +- .../src/main/java/org/jbake/app/Oven.java | 7 +- .../src/main/java/org/jbake/app/Parser.java | 2 +- .../src/main/java/org/jbake/app/Renderer.java | 9 +- .../jbake/app/configuration/ConfigUtil.java | 2 +- .../JBakeConfigurationFactory.java | 4 +- .../JBakeConfigurationInspector.java | 2 +- .../engine/DescriptorFileEngineLoader.java | 169 ++++++++++++++++++ .../{parser => engine}/MarkupEngines.java | 35 ++-- .../{template => engine}/ModelExtractors.java | 27 ++- .../org/jbake/engine/TemplateEngines.java | 67 +++++++ .../{app => exception}/JBakeException.java | 2 +- .../NoModelExtractorException.java | 2 +- .../RenderingException.java | 2 +- .../main/java/org/jbake/launcher/Baker.java | 2 +- .../java/org/jbake/launcher/JettyServer.java | 2 +- .../main/java/org/jbake/launcher/Main.java | 2 +- .../{template => }/model/TemplateModel.java | 5 +- .../org/jbake/render/ArchiveRenderer.java | 2 +- .../org/jbake/render/DocumentsRenderer.java | 2 +- .../org/jbake/render/Error404Renderer.java | 6 +- .../java/org/jbake/render/FeedRenderer.java | 2 +- .../java/org/jbake/render/IndexRenderer.java | 2 +- .../java/org/jbake/render/RenderingTool.java | 2 +- .../org/jbake/render/SitemapRenderer.java | 2 +- .../java/org/jbake/render/TagsRenderer.java | 2 +- .../template/AbstractTemplateEngine.java | 6 +- .../template/DelegatingTemplateEngine.java | 6 +- .../template/DescriptorFileEngineLoader.java | 109 ----------- .../template/FreemarkerTemplateEngine.java | 4 +- .../template/GroovyMarkupTemplateEngine.java | 4 +- .../jbake/template/GroovyTemplateEngine.java | 4 +- .../jbake/template/JadeTemplateEngine.java | 4 +- .../jbake/template/PebbleTemplateEngine.java | 4 +- .../org/jbake/template/TemplateEngine.java | 10 ++ .../org/jbake/template/TemplateEngines.java | 123 ------------- .../template/ThymeleafTemplateEngine.java | 3 +- .../template/model/AllContentExtractor.java | 2 +- .../template/model/AllTagsExtractor.java | 2 +- .../org/jbake/template/model/DBExtractor.java | 2 +- .../jbake/template/model/DataExtractor.java | 2 +- .../template/{ => model}/ModelExtractor.java | 4 +- .../ModelExtractorsDocumentTypeListener.java | 3 +- .../model/PublishedContentExtractor.java | 2 +- .../model/PublishedCustomExtractor.java | 2 +- .../model/PublishedDateExtractor.java | 2 +- .../model/PublishedPagesExtractor.java | 2 +- .../model/PublishedPostsExtractor.java | 2 +- .../template/model/TagPostsExtractor.java | 2 +- .../model/TaggedDocumentsExtractor.java | 2 +- .../jbake/template/model/TagsExtractor.java | 2 +- .../model/TypedDocumentsExtractor.java | 2 +- .../template/model/UnknownModelExtractor.java | 24 +++ ...org.jbake.engine.MarkupEngines.properties} | 0 ...g.jbake.engine.ModelExtractors.properties} | 0 ...g.jbake.engine.TemplateEngines.properties} | 0 .../src/test/java/org/jbake/app/OvenTest.java | 8 +- .../app/configuration/ConfigUtilTest.java | 61 +++---- .../JBakeConfigurationInspectorTest.java | 2 +- .../AbstractTemplateEngineRenderingTest.java | 12 +- .../ModelExtractorsTest.java | 2 +- .../java/org/jbake/launcher/MainTest.java | 3 +- .../org/jbake/render/ArchiveRendererTest.java | 4 +- .../jbake/render/DocumentsRendererTest.java | 4 +- .../jbake/render/Error404RendererTest.java | 8 +- .../org/jbake/render/FeedRendererTest.java | 2 +- .../org/jbake/render/IndexRendererTest.java | 2 +- .../org/jbake/render/SitemapRendererTest.java | 2 +- .../org/jbake/render/TagsRendererTest.java | 2 +- ...delExtractorsDocumentTypeListenerTest.java | 2 + 71 files changed, 438 insertions(+), 375 deletions(-) create mode 100644 jbake-core/src/main/java/org/jbake/engine/DescriptorFileEngineLoader.java rename jbake-core/src/main/java/org/jbake/{parser => engine}/MarkupEngines.java (72%) rename jbake-core/src/main/java/org/jbake/{template => engine}/ModelExtractors.java (71%) create mode 100644 jbake-core/src/main/java/org/jbake/engine/TemplateEngines.java rename jbake-core/src/main/java/org/jbake/{app => exception}/JBakeException.java (96%) rename jbake-core/src/main/java/org/jbake/{template => exception}/NoModelExtractorException.java (92%) rename jbake-core/src/main/java/org/jbake/{template => exception}/RenderingException.java (93%) rename jbake-core/src/main/java/org/jbake/{template => }/model/TemplateModel.java (94%) delete mode 100644 jbake-core/src/main/java/org/jbake/template/DescriptorFileEngineLoader.java create mode 100644 jbake-core/src/main/java/org/jbake/template/TemplateEngine.java delete mode 100644 jbake-core/src/main/java/org/jbake/template/TemplateEngines.java rename jbake-core/src/main/java/org/jbake/template/{ => model}/ModelExtractor.java (75%) rename jbake-core/src/main/java/org/jbake/template/{ => model}/ModelExtractorsDocumentTypeListener.java (78%) create mode 100644 jbake-core/src/main/java/org/jbake/template/model/UnknownModelExtractor.java rename jbake-core/src/main/resources/META-INF/{org.jbake.parser.MarkupEngines.properties => org.jbake.engine.MarkupEngines.properties} (100%) rename jbake-core/src/main/resources/META-INF/{org.jbake.template.ModelExtractors.properties => org.jbake.engine.ModelExtractors.properties} (100%) rename jbake-core/src/main/resources/META-INF/{org.jbake.template.TemplateEngines.properties => org.jbake.engine.TemplateEngines.properties} (100%) rename jbake-core/src/test/java/org/jbake/{template => engine}/ModelExtractorsTest.java (99%) diff --git a/jbake-core/src/main/java/org/jbake/app/Crawler.java b/jbake-core/src/main/java/org/jbake/app/Crawler.java index 0b117d3e8..e5df1c7a9 100644 --- a/jbake-core/src/main/java/org/jbake/app/Crawler.java +++ b/jbake-core/src/main/java/org/jbake/app/Crawler.java @@ -4,6 +4,7 @@ import org.apache.commons.io.FilenameUtils; import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.app.configuration.JBakeConfigurationFactory; +import org.jbake.exception.JBakeException; import org.jbake.launcher.SystemExit; import org.jbake.model.DocumentModel; import org.jbake.model.DocumentStatus; diff --git a/jbake-core/src/main/java/org/jbake/app/FileUtil.java b/jbake-core/src/main/java/org/jbake/app/FileUtil.java index e05f3aee3..a728ba49a 100644 --- a/jbake-core/src/main/java/org/jbake/app/FileUtil.java +++ b/jbake-core/src/main/java/org/jbake/app/FileUtil.java @@ -1,8 +1,9 @@ package org.jbake.app; import org.jbake.app.configuration.JBakeConfiguration; +import org.jbake.engine.MarkupEngines; +import org.jbake.exception.JBakeException; import org.jbake.launcher.SystemExit; -import org.jbake.parser.MarkupEngines; import java.io.File; import java.io.FileFilter; diff --git a/jbake-core/src/main/java/org/jbake/app/Oven.java b/jbake-core/src/main/java/org/jbake/app/Oven.java index ead7ce2cf..69464193a 100644 --- a/jbake-core/src/main/java/org/jbake/app/Oven.java +++ b/jbake-core/src/main/java/org/jbake/app/Oven.java @@ -6,11 +6,12 @@ import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.app.configuration.JBakeConfigurationFactory; import org.jbake.app.configuration.JBakeConfigurationInspector; +import org.jbake.engine.ModelExtractors; +import org.jbake.exception.JBakeException; +import org.jbake.exception.RenderingException; import org.jbake.model.DocumentTypes; import org.jbake.render.RenderingTool; -import org.jbake.template.ModelExtractors; -import org.jbake.template.ModelExtractorsDocumentTypeListener; -import org.jbake.template.RenderingException; +import org.jbake.template.model.ModelExtractorsDocumentTypeListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/jbake-core/src/main/java/org/jbake/app/Parser.java b/jbake-core/src/main/java/org/jbake/app/Parser.java index e54d51488..e9c72a16e 100644 --- a/jbake-core/src/main/java/org/jbake/app/Parser.java +++ b/jbake-core/src/main/java/org/jbake/app/Parser.java @@ -1,8 +1,8 @@ package org.jbake.app; import org.jbake.app.configuration.JBakeConfiguration; +import org.jbake.engine.MarkupEngines; import org.jbake.model.DocumentModel; -import org.jbake.parser.MarkupEngines; import org.jbake.parser.ParserEngine; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/jbake-core/src/main/java/org/jbake/app/Renderer.java b/jbake-core/src/main/java/org/jbake/app/Renderer.java index 625d70998..23131ea73 100644 --- a/jbake-core/src/main/java/org/jbake/app/Renderer.java +++ b/jbake-core/src/main/java/org/jbake/app/Renderer.java @@ -6,8 +6,8 @@ import org.jbake.app.configuration.JBakeConfigurationFactory; import org.jbake.model.DocumentModel; import org.jbake.model.ModelAttributes; +import org.jbake.model.TemplateModel; import org.jbake.template.DelegatingTemplateEngine; -import org.jbake.template.model.TemplateModel; import org.jbake.util.PagingHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,7 +18,6 @@ import java.io.OutputStreamWriter; import java.io.Writer; import java.nio.file.Files; -import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -283,13 +282,13 @@ public int renderTags(String tagPath) throws Exception { TemplateModel model = new TemplateModel(); model.setRenderer(renderingEngine); model.setTag(tag); - DocumentModel map = buildSimpleModel(ModelAttributes.TAG.toString()); + DocumentModel map = buildSimpleModel(ModelAttributes.TAG); File path = new File(config.getDestinationFolder() + File.separator + tagPath + File.separator + tag + config.getOutputExtension()); map.setRootPath(FileUtil.getUriPathToDestinationRoot(config, path)); model.setContent(map); - render(new ModelRenderingConfig(path, ModelAttributes.TAG.toString(), model, findTemplateName(ModelAttributes.TAG.toString()))); + render(new ModelRenderingConfig(path, ModelAttributes.TAG, model, findTemplateName(ModelAttributes.TAG))); renderedCount++; } catch (Exception e) { @@ -304,7 +303,7 @@ public int renderTags(String tagPath) throws Exception { // display all tags page. TemplateModel model = new TemplateModel(); model.setRenderer(renderingEngine); - DocumentModel map = buildSimpleModel(ModelAttributes.TAGS.toString()); + DocumentModel map = buildSimpleModel(ModelAttributes.TAGS); File path = new File(config.getDestinationFolder() + File.separator + tagPath + File.separator + "index" + config.getOutputExtension()); map.setRootPath(FileUtil.getUriPathToDestinationRoot(config, path)); diff --git a/jbake-core/src/main/java/org/jbake/app/configuration/ConfigUtil.java b/jbake-core/src/main/java/org/jbake/app/configuration/ConfigUtil.java index c0c6260f4..d11f53135 100644 --- a/jbake-core/src/main/java/org/jbake/app/configuration/ConfigUtil.java +++ b/jbake-core/src/main/java/org/jbake/app/configuration/ConfigUtil.java @@ -7,7 +7,7 @@ import org.apache.commons.configuration2.builder.fluent.Parameters; import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler; import org.apache.commons.configuration2.ex.ConfigurationException; -import org.jbake.app.JBakeException; +import org.jbake.exception.JBakeException; import org.jbake.launcher.SystemExit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationFactory.java b/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationFactory.java index 1ff3fa764..f9dc264e9 100644 --- a/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationFactory.java +++ b/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationFactory.java @@ -2,7 +2,7 @@ import org.apache.commons.configuration2.CompositeConfiguration; -import org.jbake.app.JBakeException; +import org.jbake.exception.JBakeException; import java.io.File; @@ -111,7 +111,7 @@ public DefaultJBakeConfiguration createDefaultJbakeConfiguration(File sourceFold */ @Deprecated public DefaultJBakeConfiguration createJettyJbakeConfiguration(File sourceFolder, File destinationFolder, boolean isClearCache) throws JBakeException { - return createJettyJbakeConfiguration(sourceFolder, destinationFolder, (File)null, isClearCache); + return createJettyJbakeConfiguration(sourceFolder, destinationFolder, null, isClearCache); } /** diff --git a/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationInspector.java b/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationInspector.java index abe3737cf..7c6a2fa83 100644 --- a/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationInspector.java +++ b/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationInspector.java @@ -1,7 +1,7 @@ package org.jbake.app.configuration; import org.jbake.app.FileUtil; -import org.jbake.app.JBakeException; +import org.jbake.exception.JBakeException; import org.jbake.launcher.SystemExit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/jbake-core/src/main/java/org/jbake/engine/DescriptorFileEngineLoader.java b/jbake-core/src/main/java/org/jbake/engine/DescriptorFileEngineLoader.java new file mode 100644 index 000000000..94a67e9d7 --- /dev/null +++ b/jbake-core/src/main/java/org/jbake/engine/DescriptorFileEngineLoader.java @@ -0,0 +1,169 @@ +package org.jbake.engine; + +import org.jbake.app.ContentStore; +import org.jbake.app.configuration.JBakeConfiguration; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.net.URL; +import java.util.Enumeration; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.TreeMap; + +public abstract class DescriptorFileEngineLoader { + protected final Logger logger = LoggerFactory.getLogger(this.getClass().getCanonicalName()); + private final Map classes; + protected final Context context; + + protected DescriptorFileEngineLoader() { + classes = new TreeMap<>(); + context = new Context(); + } + + /** + * This method is used to search for a specific class, telling if loading the engine would succeed. This is + * typically used to avoid loading optional modules. + * + * @param context The context to construct an engine class, used both as a hint to find it and to create the engine itself. + */ + protected T tryLoadEngine(Context context) { + try { + Class engineClass = Class.forName(context.className(), false, DescriptorFileEngineLoader.class.getClassLoader()); + context.addEngineClass(engineClass); + return createInstance(context); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoClassDefFoundError | NoSuchMethodException | InvocationTargetException e) { + return getErrorEngine(context.className()); + } // a dependency of the engine may not be found on classpath + + } + + @NotNull + protected abstract T createInstance(Context context) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException; + + protected abstract T getErrorEngine(String engineClassName); + + protected void registerEngine(String key, T engine) { + T old = classes.put(key, engine); + if (old != null) { + logger.warn("Override detected. Registered an engine [{}] for key [{}] but another one was already defined: [{}]", engine.getClass().getName(), key, old); + } + } + + /** + * This method is used internally to load engines. Engines are found using descriptor files on + * classpath, so adding an engine is as easy as adding a jar on classpath with the descriptor file included. + */ + protected void loadEngines() { + try { + ClassLoader cl = DescriptorFileEngineLoader.class.getClassLoader(); + Enumeration resources = cl.getResources(descriptorFile()); + while (resources.hasMoreElements()) { + URL url = resources.nextElement(); + try (InputStream is = url.openStream()) { + Properties props = new Properties(); + props.load(is); + for (Map.Entry entry : props.entrySet()) { + String className = (String) entry.getKey(); + String[] extensions = ((String) entry.getValue()).split(","); + context.addClassName(className); + context.addExtensions(extensions); + loadAndRegisterEngine(context); + } + } + } + } catch (IOException e) { + logger.error("Error loading engines: {}", e.getMessage(), e); + } + } + + protected void loadAndRegisterEngine(Context context) { + T engine = tryLoadEngine(context); + if (engine != null) { + for (String extension : context.extensions()) { + registerEngine(extension, engine); + } + } + } + + protected abstract String descriptorFile(); + + /** + * @param key A key an Engine is registered with + * @return true if key is registered + * @see Map#containsKey(Object) + */ + public boolean supportsExtension(String key) { + return classes.containsKey(key); + } + + /** + * @return A @{@link Set} of all known keys an Engine is registered with + * @see Map#keySet() + */ + public Set keySet() { + return classes.keySet(); + } + + protected T get(String extension) { + return classes.get(extension); + } + + public void reset() { + classes.clear(); + loadEngines(); + } + + protected class Context { + private String className; + private String[] extensions; + private Class engingeClass; + private JBakeConfiguration configuration; + private ContentStore db; + + public void addClassName(String className) { + this.className = className; + } + + public String className() { + return className; + } + + public void addExtensions(String[] extensions) { + this.extensions = extensions; + } + + public String[] extensions() { + return extensions; + } + + public Class engineClass() { + return engingeClass; + } + + public void addEngineClass(Class engineClass) { + this.engingeClass = engineClass; + } + + public ContentStore db() { + return db; + } + + public JBakeConfiguration config() { + return configuration; + } + + public void addConfig(JBakeConfiguration config) { + this.configuration = config; + } + + public void addDb(ContentStore db) { + this.db = db; + } + } +} diff --git a/jbake-core/src/main/java/org/jbake/parser/MarkupEngines.java b/jbake-core/src/main/java/org/jbake/engine/MarkupEngines.java similarity index 72% rename from jbake-core/src/main/java/org/jbake/parser/MarkupEngines.java rename to jbake-core/src/main/java/org/jbake/engine/MarkupEngines.java index 9b09402f8..2925527dd 100644 --- a/jbake-core/src/main/java/org/jbake/parser/MarkupEngines.java +++ b/jbake-core/src/main/java/org/jbake/engine/MarkupEngines.java @@ -1,8 +1,11 @@ -package org.jbake.parser; +package org.jbake.engine; -import org.jbake.template.DescriptorFileEngineLoader; +import org.jbake.parser.ErrorEngine; +import org.jbake.parser.ParserContext; +import org.jbake.parser.ParserEngine; +import org.jetbrains.annotations.NotNull; -import java.util.Set; +import java.lang.reflect.InvocationTargetException; /** *

A singleton class giving access to markup engines. Markup engines are loaded based on classpath. @@ -10,7 +13,7 @@ * on classpath (recommanded).

* *

The descriptor file must be found in META-INF directory and named - * org.jbake.parser.MarkupEngines.properties. The format of the file is easy:

+ * org.jbake.engine.MarkupEngines.properties. The format of the file is easy:

* * org.jbake.parser.RawMarkupEngine=html
* org.jbake.parser.AsciidoctorEngine=ad,adoc,asciidoc
@@ -30,7 +33,7 @@ * @author Cédric Champeau */ public class MarkupEngines extends DescriptorFileEngineLoader { - public static final String PROPERTIES = "META-INF/org.jbake.parser.MarkupEngines.properties"; + public static final String PROPERTIES = "META-INF/org.jbake.engine.MarkupEngines.properties"; private static class Loader { @@ -45,8 +48,14 @@ private MarkupEngines() { loadEngines(); } - public static Set recognizedExtensions() { - return getInstance().keySet(); + @Override + protected @NotNull ParserEngine createInstance(Context context) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { + return (ParserEngine) context.engineClass().getDeclaredConstructor().newInstance(); + } + + @Override + protected ParserEngine getErrorEngine(String engineClassName) { + return new ErrorEngine(engineClassName); } public static ParserEngine fromExtension(String fileExt) { @@ -58,16 +67,4 @@ protected String descriptorFile() { return PROPERTIES; } - @Override - protected void loadAndRegisterEngine(String className, String... extensions) { - ParserEngine engine = tryLoadEngine(className); - if (engine != null) { - for (String extension : extensions) { - registerEngine(extension, engine); - } - if (engine instanceof ErrorEngine) { - LOGGER.warn("Unable to load a suitable rendering engine for extensions {}", (Object) extensions); - } - } - } } diff --git a/jbake-core/src/main/java/org/jbake/template/ModelExtractors.java b/jbake-core/src/main/java/org/jbake/engine/ModelExtractors.java similarity index 71% rename from jbake-core/src/main/java/org/jbake/template/ModelExtractors.java rename to jbake-core/src/main/java/org/jbake/engine/ModelExtractors.java index 29a8b41d2..e55f292fc 100644 --- a/jbake-core/src/main/java/org/jbake/template/ModelExtractors.java +++ b/jbake-core/src/main/java/org/jbake/engine/ModelExtractors.java @@ -1,10 +1,17 @@ -package org.jbake.template; +package org.jbake.engine; import org.jbake.app.ContentStore; +import org.jbake.exception.NoModelExtractorException; import org.jbake.model.DocumentTypeUtils; +import org.jbake.model.TemplateModel; +import org.jbake.template.TemplateEngineAdapter; +import org.jbake.template.model.ModelExtractor; import org.jbake.template.model.PublishedCustomExtractor; -import org.jbake.template.model.TemplateModel; import org.jbake.template.model.TypedDocumentsExtractor; +import org.jbake.template.model.UnknownModelExtractor; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.InvocationTargetException; /** @@ -12,7 +19,7 @@ * rendering may be registered either at runtime (not recommanded) or by putting a descriptor file on classpath * (recommanded).

*

The descriptor file must be found in META-INF directory and named - * org.jbake.template.ModelExtractors.properties. The format of the file is easy:

+ * org.jbake.engine.ModelExtractors.properties. The format of the file is easy:

* org.jbake.template.model.AllPosts=all_posts
org.jbake.template.model.AllContent=all_content
*

where the key is the class of the extractor (must implement {@link ModelExtractor} and the value is the key * by which values are to be accessed in model.

@@ -27,7 +34,7 @@ */ public class ModelExtractors extends DescriptorFileEngineLoader> { - private static final String PROPERTIES = "META-INF/org.jbake.template.ModelExtractors.properties"; + private static final String PROPERTIES = "META-INF/org.jbake.engine.ModelExtractors.properties"; private static class Loader { private static final ModelExtractors INSTANCE = new ModelExtractors(); @@ -42,11 +49,21 @@ private ModelExtractors() { loadEngines(); } + @Override + protected ModelExtractor getErrorEngine(String engineClassName) { + return new UnknownModelExtractor(engineClassName); + } + @Override protected String descriptorFile() { return PROPERTIES; } + @Override + protected @NotNull ModelExtractor createInstance(Context context) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { + return (ModelExtractor) context.engineClass().getDeclaredConstructor().newInstance(); + } + public T extractAndTransform(ContentStore db, String key, TemplateModel map, TemplateEngineAdapter adapter) throws NoModelExtractorException { if (supportsExtension(key)) { Object extractedValue = get(key).get(db, map, key); @@ -59,7 +76,7 @@ public T extractAndTransform(ContentStore db, String key, TemplateModel map, public void registerExtractorsForCustomTypes(String docType) { String pluralizedDoctype = DocumentTypeUtils.pluralize(docType); if (!supportsExtension(pluralizedDoctype)) { - LOGGER.info("register new extractors for document type: {}", docType); + logger.info("register new extractors for document type: {}", docType); registerEngine(pluralizedDoctype, new TypedDocumentsExtractor()); registerEngine("published_" + pluralizedDoctype, new PublishedCustomExtractor(docType)); } diff --git a/jbake-core/src/main/java/org/jbake/engine/TemplateEngines.java b/jbake-core/src/main/java/org/jbake/engine/TemplateEngines.java new file mode 100644 index 000000000..9d9fa1d09 --- /dev/null +++ b/jbake-core/src/main/java/org/jbake/engine/TemplateEngines.java @@ -0,0 +1,67 @@ +package org.jbake.engine; + +import org.jbake.app.ContentStore; +import org.jbake.app.configuration.JBakeConfiguration; +import org.jbake.template.AbstractTemplateEngine; +import org.jbake.template.TemplateEngine; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Set; + + +/** + *

+ * A singleton class giving access to rendering engines. Rendering engines are loaded based on classpath. New + * rendering may be registered either at runtime (not recommanded) or by putting a descriptor file on classpath + * (recommanded).

+ *

The descriptor file must be found in META-INF directory and named + * org.jbake.engine.TemplateEngines.properties. The format of the file is easy:

+ * org.jbake.parser.FreeMarkerRenderer=ftl
org.jbake.parser.GroovyRenderer=groovy,gsp
+ *

where the key is the class of the engine (must extend {@link AbstractTemplateEngine} and have + * a 4-arg constructor and the value is a comma-separated list of file extensions that this engine is capable + * of proceeding.

+ *

Rendering engines are singletons, so are typically used to initialize the underlying template engines. + *

+ * This class loads the engines only if they are found on classpath. If not, the engine is not registered. This allows + * JBake to support multiple rendering engines without the explicit need to have them on classpath. This is a better fit + * for embedding. + *

+ * + * @author Cédric Champeau + */ +public class TemplateEngines extends DescriptorFileEngineLoader { + + public static final String PROPERTIES = "META-INF/org.jbake.engine.TemplateEngines.properties"; + + public TemplateEngines(final JBakeConfiguration config, final ContentStore db) { + context.addConfig(config); + context.addDb(db); + loadEngines(); + } + + public Set getRecognizedExtensions() { + return keySet(); + } + + public TemplateEngine getEngine(String fileExtension) { + return get(fileExtension); + } + + @Override + protected @NotNull TemplateEngine createInstance(Context context) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { + Constructor ctor = context.engineClass().getConstructor(JBakeConfiguration.class, ContentStore.class); + return (TemplateEngine) ctor.newInstance(context.config(), context.db()); + } + + @Override + protected TemplateEngine getErrorEngine(String engineClassName) { + return null; + } + + @Override + protected String descriptorFile() { + return PROPERTIES; + } +} diff --git a/jbake-core/src/main/java/org/jbake/app/JBakeException.java b/jbake-core/src/main/java/org/jbake/exception/JBakeException.java similarity index 96% rename from jbake-core/src/main/java/org/jbake/app/JBakeException.java rename to jbake-core/src/main/java/org/jbake/exception/JBakeException.java index f3e858a4a..d87e49696 100644 --- a/jbake-core/src/main/java/org/jbake/app/JBakeException.java +++ b/jbake-core/src/main/java/org/jbake/exception/JBakeException.java @@ -1,4 +1,4 @@ -package org.jbake.app; +package org.jbake.exception; import org.jbake.launcher.SystemExit; diff --git a/jbake-core/src/main/java/org/jbake/template/NoModelExtractorException.java b/jbake-core/src/main/java/org/jbake/exception/NoModelExtractorException.java similarity index 92% rename from jbake-core/src/main/java/org/jbake/template/NoModelExtractorException.java rename to jbake-core/src/main/java/org/jbake/exception/NoModelExtractorException.java index 51727a762..5dbcac429 100644 --- a/jbake-core/src/main/java/org/jbake/template/NoModelExtractorException.java +++ b/jbake-core/src/main/java/org/jbake/exception/NoModelExtractorException.java @@ -1,4 +1,4 @@ -package org.jbake.template; +package org.jbake.exception; public class NoModelExtractorException extends RenderingException { diff --git a/jbake-core/src/main/java/org/jbake/template/RenderingException.java b/jbake-core/src/main/java/org/jbake/exception/RenderingException.java similarity index 93% rename from jbake-core/src/main/java/org/jbake/template/RenderingException.java rename to jbake-core/src/main/java/org/jbake/exception/RenderingException.java index 5b0bb3444..7a9ec6e48 100644 --- a/jbake-core/src/main/java/org/jbake/template/RenderingException.java +++ b/jbake-core/src/main/java/org/jbake/exception/RenderingException.java @@ -1,4 +1,4 @@ -package org.jbake.template; +package org.jbake.exception; /** * Thrown if rendering of a document failed. diff --git a/jbake-core/src/main/java/org/jbake/launcher/Baker.java b/jbake-core/src/main/java/org/jbake/launcher/Baker.java index 536625c98..ec2f5ac56 100644 --- a/jbake-core/src/main/java/org/jbake/launcher/Baker.java +++ b/jbake-core/src/main/java/org/jbake/launcher/Baker.java @@ -1,10 +1,10 @@ package org.jbake.launcher; import org.apache.commons.configuration2.CompositeConfiguration; -import org.jbake.app.JBakeException; import org.jbake.app.Oven; import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.app.configuration.JBakeConfigurationFactory; +import org.jbake.exception.JBakeException; import java.text.MessageFormat; import java.util.List; diff --git a/jbake-core/src/main/java/org/jbake/launcher/JettyServer.java b/jbake-core/src/main/java/org/jbake/launcher/JettyServer.java index cff105932..a57627f0a 100644 --- a/jbake-core/src/main/java/org/jbake/launcher/JettyServer.java +++ b/jbake-core/src/main/java/org/jbake/launcher/JettyServer.java @@ -7,8 +7,8 @@ import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.ResourceHandler; -import org.jbake.app.JBakeException; import org.jbake.app.configuration.JBakeConfiguration; +import org.jbake.exception.JBakeException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/jbake-core/src/main/java/org/jbake/launcher/Main.java b/jbake-core/src/main/java/org/jbake/launcher/Main.java index 83d38a15d..0714bdd05 100644 --- a/jbake-core/src/main/java/org/jbake/launcher/Main.java +++ b/jbake-core/src/main/java/org/jbake/launcher/Main.java @@ -1,9 +1,9 @@ package org.jbake.launcher; import org.jbake.app.FileUtil; -import org.jbake.app.JBakeException; import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.app.configuration.JBakeConfigurationFactory; +import org.jbake.exception.JBakeException; import org.jbake.util.ConfigurationPrinter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/jbake-core/src/main/java/org/jbake/template/model/TemplateModel.java b/jbake-core/src/main/java/org/jbake/model/TemplateModel.java similarity index 94% rename from jbake-core/src/main/java/org/jbake/template/model/TemplateModel.java rename to jbake-core/src/main/java/org/jbake/model/TemplateModel.java index 87b6eb9e2..539b00d57 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/TemplateModel.java +++ b/jbake-core/src/main/java/org/jbake/model/TemplateModel.java @@ -1,9 +1,6 @@ -package org.jbake.template.model; +package org.jbake.model; import org.jbake.app.DocumentList; -import org.jbake.model.BaseModel; -import org.jbake.model.DocumentModel; -import org.jbake.model.ModelAttributes; import org.jbake.template.DelegatingTemplateEngine; import java.io.Writer; diff --git a/jbake-core/src/main/java/org/jbake/render/ArchiveRenderer.java b/jbake-core/src/main/java/org/jbake/render/ArchiveRenderer.java index 36af41108..ed66d8685 100644 --- a/jbake-core/src/main/java/org/jbake/render/ArchiveRenderer.java +++ b/jbake-core/src/main/java/org/jbake/render/ArchiveRenderer.java @@ -5,7 +5,7 @@ import org.jbake.app.Renderer; import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.app.configuration.JBakeConfigurationFactory; -import org.jbake.template.RenderingException; +import org.jbake.exception.RenderingException; import java.io.File; diff --git a/jbake-core/src/main/java/org/jbake/render/DocumentsRenderer.java b/jbake-core/src/main/java/org/jbake/render/DocumentsRenderer.java index 742cc473b..f198bc41f 100644 --- a/jbake-core/src/main/java/org/jbake/render/DocumentsRenderer.java +++ b/jbake-core/src/main/java/org/jbake/render/DocumentsRenderer.java @@ -5,9 +5,9 @@ import org.jbake.app.DocumentList; import org.jbake.app.Renderer; import org.jbake.app.configuration.JBakeConfiguration; +import org.jbake.exception.RenderingException; import org.jbake.model.DocumentModel; import org.jbake.model.ModelAttributes; -import org.jbake.template.RenderingException; import java.io.File; import java.util.LinkedList; diff --git a/jbake-core/src/main/java/org/jbake/render/Error404Renderer.java b/jbake-core/src/main/java/org/jbake/render/Error404Renderer.java index fd2eb4a57..2b5e8ee6e 100644 --- a/jbake-core/src/main/java/org/jbake/render/Error404Renderer.java +++ b/jbake-core/src/main/java/org/jbake/render/Error404Renderer.java @@ -1,13 +1,13 @@ package org.jbake.render; -import java.io.File; - import org.apache.commons.configuration2.CompositeConfiguration; import org.jbake.app.ContentStore; import org.jbake.app.Renderer; import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.app.configuration.JBakeConfigurationFactory; -import org.jbake.template.RenderingException; +import org.jbake.exception.RenderingException; + +import java.io.File; public class Error404Renderer implements RenderingTool { diff --git a/jbake-core/src/main/java/org/jbake/render/FeedRenderer.java b/jbake-core/src/main/java/org/jbake/render/FeedRenderer.java index cd4ffcbeb..d705b44eb 100644 --- a/jbake-core/src/main/java/org/jbake/render/FeedRenderer.java +++ b/jbake-core/src/main/java/org/jbake/render/FeedRenderer.java @@ -5,7 +5,7 @@ import org.jbake.app.Renderer; import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.app.configuration.JBakeConfigurationFactory; -import org.jbake.template.RenderingException; +import org.jbake.exception.RenderingException; import java.io.File; diff --git a/jbake-core/src/main/java/org/jbake/render/IndexRenderer.java b/jbake-core/src/main/java/org/jbake/render/IndexRenderer.java index b5b05a870..a3b435b0d 100644 --- a/jbake-core/src/main/java/org/jbake/render/IndexRenderer.java +++ b/jbake-core/src/main/java/org/jbake/render/IndexRenderer.java @@ -5,7 +5,7 @@ import org.jbake.app.Renderer; import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.app.configuration.JBakeConfigurationFactory; -import org.jbake.template.RenderingException; +import org.jbake.exception.RenderingException; import java.io.File; diff --git a/jbake-core/src/main/java/org/jbake/render/RenderingTool.java b/jbake-core/src/main/java/org/jbake/render/RenderingTool.java index 3417406b8..7a891de6e 100644 --- a/jbake-core/src/main/java/org/jbake/render/RenderingTool.java +++ b/jbake-core/src/main/java/org/jbake/render/RenderingTool.java @@ -4,7 +4,7 @@ import org.jbake.app.ContentStore; import org.jbake.app.Renderer; import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.template.RenderingException; +import org.jbake.exception.RenderingException; import java.io.File; diff --git a/jbake-core/src/main/java/org/jbake/render/SitemapRenderer.java b/jbake-core/src/main/java/org/jbake/render/SitemapRenderer.java index 3d3525fa3..1471f99b2 100644 --- a/jbake-core/src/main/java/org/jbake/render/SitemapRenderer.java +++ b/jbake-core/src/main/java/org/jbake/render/SitemapRenderer.java @@ -5,7 +5,7 @@ import org.jbake.app.Renderer; import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.app.configuration.JBakeConfigurationFactory; -import org.jbake.template.RenderingException; +import org.jbake.exception.RenderingException; import java.io.File; diff --git a/jbake-core/src/main/java/org/jbake/render/TagsRenderer.java b/jbake-core/src/main/java/org/jbake/render/TagsRenderer.java index 41b70bc1b..808763412 100644 --- a/jbake-core/src/main/java/org/jbake/render/TagsRenderer.java +++ b/jbake-core/src/main/java/org/jbake/render/TagsRenderer.java @@ -5,7 +5,7 @@ import org.jbake.app.Renderer; import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.app.configuration.JBakeConfigurationFactory; -import org.jbake.template.RenderingException; +import org.jbake.exception.RenderingException; import java.io.File; diff --git a/jbake-core/src/main/java/org/jbake/template/AbstractTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/AbstractTemplateEngine.java index 479f0a127..20be8ed47 100644 --- a/jbake-core/src/main/java/org/jbake/template/AbstractTemplateEngine.java +++ b/jbake-core/src/main/java/org/jbake/template/AbstractTemplateEngine.java @@ -5,7 +5,8 @@ import org.jbake.app.ContentStore; import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.app.configuration.JBakeConfigurationFactory; -import org.jbake.template.model.TemplateModel; +import org.jbake.engine.ModelExtractors; +import org.jbake.model.TemplateModel; import java.io.File; import java.io.Writer; @@ -27,7 +28,7 @@ * * @author Cédric Champeau */ -public abstract class AbstractTemplateEngine { +public abstract class AbstractTemplateEngine implements TemplateEngine { protected static ModelExtractors extractors = ModelExtractors.getInstance(); protected final JBakeConfiguration config; @@ -46,5 +47,4 @@ protected AbstractTemplateEngine(final JBakeConfiguration config, final ContentS this.db = db; } - public abstract void renderDocument(TemplateModel model, String templateName, Writer writer) throws RenderingException; } diff --git a/jbake-core/src/main/java/org/jbake/template/DelegatingTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/DelegatingTemplateEngine.java index 2ac880392..e9b4254ea 100644 --- a/jbake-core/src/main/java/org/jbake/template/DelegatingTemplateEngine.java +++ b/jbake-core/src/main/java/org/jbake/template/DelegatingTemplateEngine.java @@ -4,7 +4,9 @@ import org.jbake.app.ContentStore; import org.jbake.app.FileUtil; import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.template.model.TemplateModel; +import org.jbake.engine.TemplateEngines; +import org.jbake.exception.RenderingException; +import org.jbake.model.TemplateModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -64,7 +66,7 @@ public void renderDocument(final TemplateModel model, final String templateName, } } String ext = FileUtil.fileExt(theTemplateName); - AbstractTemplateEngine engine = renderers.getEngine(ext); + TemplateEngine engine = renderers.getEngine(ext); if (engine != null) { engine.renderDocument(model, theTemplateName, writer); } else { diff --git a/jbake-core/src/main/java/org/jbake/template/DescriptorFileEngineLoader.java b/jbake-core/src/main/java/org/jbake/template/DescriptorFileEngineLoader.java deleted file mode 100644 index f0fc592fc..000000000 --- a/jbake-core/src/main/java/org/jbake/template/DescriptorFileEngineLoader.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.jbake.template; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.net.URL; -import java.util.Enumeration; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.TreeMap; - -public abstract class DescriptorFileEngineLoader { - protected static final Logger LOGGER = LoggerFactory.getLogger(DescriptorFileEngineLoader.class); - private final Map classes; - - protected DescriptorFileEngineLoader() { - classes = new TreeMap<>(); - } - - /** - * This method is used to search for a specific class, telling if loading the engine would succeed. This is - * typically used to avoid loading optional modules. - * - * @param engineClassName engine class, used both as a hint to find it and to create the engine itself. @return null if the engine is not available, an instance of the engine otherwise - */ - @SuppressWarnings("unchecked") - protected T tryLoadEngine(String engineClassName) { - try { - Class engineClass = Class.forName(engineClassName, false, DescriptorFileEngineLoader.class.getClassLoader()); - return (T) engineClass.getDeclaredConstructor().newInstance(); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoClassDefFoundError | NoSuchMethodException | InvocationTargetException e) { - return null; - } // a dependency of the engine may not be found on classpath - - } - - protected void registerEngine(String key, T extractor) { - T old = classes.put(key, extractor); - if (old != null) { - LOGGER.warn("Override detected. Registered a model extractor for key [.{}] but another one was already defined: {}", key, old); - } - } - - /** - * This method is used internally to load markup engines. Markup engines are found using descriptor files on - * classpath, so adding an engine is as easy as adding a jar on classpath with the descriptor file included. - */ - protected void loadEngines() { - try { - ClassLoader cl = DescriptorFileEngineLoader.class.getClassLoader(); - Enumeration resources = cl.getResources(descriptorFile()); - while (resources.hasMoreElements()) { - URL url = resources.nextElement(); - try (InputStream is = url.openStream()) { - Properties props = new Properties(); - props.load(is); - for (Map.Entry entry : props.entrySet()) { - String className = (String) entry.getKey(); - String[] extensions = ((String) entry.getValue()).split(","); - loadAndRegisterEngine(className, extensions); - } - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - protected void loadAndRegisterEngine(String className, String... extensions) { - T engine = tryLoadEngine(className); - if (engine != null) { - for (String extension : extensions) { - registerEngine(extension, engine); - } - } - } - - protected abstract String descriptorFile(); - - /** - * @param key A key a {@link ModelExtractor} is registered with - * @return true if key is registered - * @see Map#containsKey(Object) - */ - public boolean supportsExtension(String key) { - return classes.containsKey(key); - } - - /** - * @return A @{@link Set} of all known keys a @{@link ModelExtractor} is registered with - * @see Map#keySet() - */ - public Set keySet() { - return classes.keySet(); - } - - protected T get(String extension) { - return classes.get(extension); - } - - public void reset() { - classes.clear(); - loadEngines(); - } -} diff --git a/jbake-core/src/main/java/org/jbake/template/FreemarkerTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/FreemarkerTemplateEngine.java index 8578999c4..253b79665 100644 --- a/jbake-core/src/main/java/org/jbake/template/FreemarkerTemplateEngine.java +++ b/jbake-core/src/main/java/org/jbake/template/FreemarkerTemplateEngine.java @@ -17,8 +17,10 @@ import org.apache.commons.configuration2.CompositeConfiguration; import org.jbake.app.ContentStore; import org.jbake.app.configuration.JBakeConfiguration; +import org.jbake.exception.NoModelExtractorException; +import org.jbake.exception.RenderingException; import org.jbake.model.ModelAttributes; -import org.jbake.template.model.TemplateModel; +import org.jbake.model.TemplateModel; import org.jbake.util.DataFileUtil; import java.io.File; diff --git a/jbake-core/src/main/java/org/jbake/template/GroovyMarkupTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/GroovyMarkupTemplateEngine.java index f64094550..8e05a23e9 100644 --- a/jbake-core/src/main/java/org/jbake/template/GroovyMarkupTemplateEngine.java +++ b/jbake-core/src/main/java/org/jbake/template/GroovyMarkupTemplateEngine.java @@ -7,7 +7,9 @@ import org.apache.commons.configuration2.CompositeConfiguration; import org.jbake.app.ContentStore; import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.template.model.TemplateModel; +import org.jbake.exception.NoModelExtractorException; +import org.jbake.exception.RenderingException; +import org.jbake.model.TemplateModel; import java.io.File; import java.io.Writer; diff --git a/jbake-core/src/main/java/org/jbake/template/GroovyTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/GroovyTemplateEngine.java index caad683e6..53f9a51b0 100644 --- a/jbake-core/src/main/java/org/jbake/template/GroovyTemplateEngine.java +++ b/jbake-core/src/main/java/org/jbake/template/GroovyTemplateEngine.java @@ -10,7 +10,9 @@ import org.codehaus.groovy.runtime.MethodClosure; import org.jbake.app.ContentStore; import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.template.model.TemplateModel; +import org.jbake.exception.NoModelExtractorException; +import org.jbake.exception.RenderingException; +import org.jbake.model.TemplateModel; import org.xml.sax.SAXException; import javax.xml.parsers.ParserConfigurationException; diff --git a/jbake-core/src/main/java/org/jbake/template/JadeTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/JadeTemplateEngine.java index 4129f3f9e..9b855ad22 100644 --- a/jbake-core/src/main/java/org/jbake/template/JadeTemplateEngine.java +++ b/jbake-core/src/main/java/org/jbake/template/JadeTemplateEngine.java @@ -14,7 +14,9 @@ import org.apache.commons.lang.StringEscapeUtils; import org.jbake.app.ContentStore; import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.template.model.TemplateModel; +import org.jbake.exception.NoModelExtractorException; +import org.jbake.exception.RenderingException; +import org.jbake.model.TemplateModel; import java.io.File; import java.io.IOException; diff --git a/jbake-core/src/main/java/org/jbake/template/PebbleTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/PebbleTemplateEngine.java index d684d4ee7..8cb3876e4 100644 --- a/jbake-core/src/main/java/org/jbake/template/PebbleTemplateEngine.java +++ b/jbake-core/src/main/java/org/jbake/template/PebbleTemplateEngine.java @@ -7,7 +7,9 @@ import com.mitchellbosecke.pebble.template.PebbleTemplate; import org.jbake.app.ContentStore; import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.template.model.TemplateModel; +import org.jbake.exception.NoModelExtractorException; +import org.jbake.exception.RenderingException; +import org.jbake.model.TemplateModel; import java.io.IOException; import java.io.Writer; diff --git a/jbake-core/src/main/java/org/jbake/template/TemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/TemplateEngine.java new file mode 100644 index 000000000..0b4afdf41 --- /dev/null +++ b/jbake-core/src/main/java/org/jbake/template/TemplateEngine.java @@ -0,0 +1,10 @@ +package org.jbake.template; + +import org.jbake.exception.RenderingException; +import org.jbake.model.TemplateModel; + +import java.io.Writer; + +public interface TemplateEngine { + void renderDocument(TemplateModel model, String templateName, Writer writer) throws RenderingException; +} diff --git a/jbake-core/src/main/java/org/jbake/template/TemplateEngines.java b/jbake-core/src/main/java/org/jbake/template/TemplateEngines.java deleted file mode 100644 index d7c46864b..000000000 --- a/jbake-core/src/main/java/org/jbake/template/TemplateEngines.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.jbake.template; - -import org.jbake.app.ContentStore; -import org.jbake.app.configuration.JBakeConfiguration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.net.URL; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - - -/** - *

- * A singleton class giving access to rendering engines. Rendering engines are loaded based on classpath. New - * rendering may be registered either at runtime (not recommanded) or by putting a descriptor file on classpath - * (recommanded).

- *

The descriptor file must be found in META-INF directory and named - * org.jbake.template.TemplateEngines.properties. The format of the file is easy:

- * org.jbake.parser.FreeMarkerRenderer=ftl
org.jbake.parser.GroovyRenderer=groovy,gsp
- *

where the key is the class of the engine (must extend {@link AbstractTemplateEngine} and have - * a 4-arg constructor and the value is a comma-separated list of file extensions that this engine is capable - * of proceeding.

- *

Rendering engines are singletons, so are typically used to initialize the underlying template engines. - *

- * This class loads the engines only if they are found on classpath. If not, the engine is not registered. This allows - * JBake to support multiple rendering engines without the explicit need to have them on classpath. This is a better fit - * for embedding. - *

- * - * @author Cédric Champeau - */ -public class TemplateEngines { - - private static final Logger LOGGER = LoggerFactory.getLogger(TemplateEngines.class); - public static final String PROPERTIES = "META-INF/org.jbake.template.TemplateEngines.properties"; - - private final Map engines; - - public Set getRecognizedExtensions() { - return Collections.unmodifiableSet(engines.keySet()); - } - - public TemplateEngines(final JBakeConfiguration config, final ContentStore db) { - engines = new HashMap<>(); - loadEngines(config, db); - } - - private void registerEngine(String fileExtension, AbstractTemplateEngine templateEngine) { - AbstractTemplateEngine old = engines.put(fileExtension, templateEngine); - if (old != null) { - LOGGER.warn("Registered a template engine for extension [.{}] but another one was already defined: {}", fileExtension, old); - } - } - - public AbstractTemplateEngine getEngine(String fileExtension) { - return engines.get(fileExtension); - } - - /** - * This method is used to search for a specific class, telling if loading the engine would succeed. This is - * typically used to avoid loading optional modules. - * - * - * @param config the configuration - * @param db database instance - * @param engineClassName engine class, used both as a hint to find it and to create the engine itself. @return null if the engine is not available, an instance of the engine otherwise - */ - private static AbstractTemplateEngine tryLoadEngine(final JBakeConfiguration config, final ContentStore db, String engineClassName) { - try { - @SuppressWarnings("unchecked") - Class engineClass = (Class) Class.forName(engineClassName, false, TemplateEngines.class.getClassLoader()); - Constructor ctor = engineClass.getConstructor(JBakeConfiguration.class, ContentStore.class); - return ctor.newInstance(config, db); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoClassDefFoundError | NoSuchMethodException | InvocationTargetException e) { - // not all engines might be necessary, therefore only emit class loading issue with level warn - LOGGER.debug("Template engine not available: {}", engineClassName); - return null; - } - } - - /** - * This method is used internally to load markup engines. Markup engines are found using descriptor files on - * classpath, so adding an engine is as easy as adding a jar on classpath with the descriptor file included. - */ - private void loadEngines(final JBakeConfiguration config, final ContentStore db) { - try { - ClassLoader cl = TemplateEngines.class.getClassLoader(); - Enumeration resources = cl.getResources(PROPERTIES); - while (resources.hasMoreElements()) { - URL url = resources.nextElement(); - try (InputStream is = url.openStream()) { - Properties props = new Properties(); - props.load(is); - for (Map.Entry entry : props.entrySet()) { - String className = (String) entry.getKey(); - String[] extensions = ((String) entry.getValue()).split(","); - registerEngine(config, db, className, extensions); - } - } - } - } catch (IOException e) { - LOGGER.error("Error loading engines", e); - } - } - - private void registerEngine(final JBakeConfiguration config, final ContentStore db, String className, String... extensions) { - AbstractTemplateEngine engine = tryLoadEngine(config, db, className); - if (engine != null) { - for (String extension : extensions) { - registerEngine(extension, engine); - } - } - } -} diff --git a/jbake-core/src/main/java/org/jbake/template/ThymeleafTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/ThymeleafTemplateEngine.java index d26018221..907e8a983 100644 --- a/jbake-core/src/main/java/org/jbake/template/ThymeleafTemplateEngine.java +++ b/jbake-core/src/main/java/org/jbake/template/ThymeleafTemplateEngine.java @@ -5,9 +5,10 @@ import org.jbake.app.ContentStore; import org.jbake.app.configuration.DefaultJBakeConfiguration; import org.jbake.app.configuration.JBakeConfiguration; +import org.jbake.exception.NoModelExtractorException; import org.jbake.model.DocumentModel; import org.jbake.model.ModelAttributes; -import org.jbake.template.model.TemplateModel; +import org.jbake.model.TemplateModel; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import org.thymeleaf.context.LazyContextVariable; diff --git a/jbake-core/src/main/java/org/jbake/template/model/AllContentExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/AllContentExtractor.java index 1dc5bd8e0..e46ac9c0c 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/AllContentExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/AllContentExtractor.java @@ -4,7 +4,7 @@ import org.jbake.app.DocumentList; import org.jbake.model.DocumentModel; import org.jbake.model.DocumentTypes; -import org.jbake.template.ModelExtractor; +import org.jbake.model.TemplateModel; import java.util.Map; diff --git a/jbake-core/src/main/java/org/jbake/template/model/AllTagsExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/AllTagsExtractor.java index 6bab8fb49..69b586ec7 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/AllTagsExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/AllTagsExtractor.java @@ -1,7 +1,7 @@ package org.jbake.template.model; import org.jbake.app.ContentStore; -import org.jbake.template.ModelExtractor; +import org.jbake.model.TemplateModel; import java.util.Set; diff --git a/jbake-core/src/main/java/org/jbake/template/model/DBExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/DBExtractor.java index 0b484c475..900164d62 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/DBExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/DBExtractor.java @@ -1,7 +1,7 @@ package org.jbake.template.model; import org.jbake.app.ContentStore; -import org.jbake.template.ModelExtractor; +import org.jbake.model.TemplateModel; public class DBExtractor implements ModelExtractor { diff --git a/jbake-core/src/main/java/org/jbake/template/model/DataExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/DataExtractor.java index ff582faac..3f76c45f1 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/DataExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/DataExtractor.java @@ -1,7 +1,7 @@ package org.jbake.template.model; import org.jbake.app.ContentStore; -import org.jbake.template.ModelExtractor; +import org.jbake.model.TemplateModel; import org.jbake.util.DataFileUtil; public class DataExtractor implements ModelExtractor { diff --git a/jbake-core/src/main/java/org/jbake/template/ModelExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/ModelExtractor.java similarity index 75% rename from jbake-core/src/main/java/org/jbake/template/ModelExtractor.java rename to jbake-core/src/main/java/org/jbake/template/model/ModelExtractor.java index 3e114c7b3..2ba40e527 100644 --- a/jbake-core/src/main/java/org/jbake/template/ModelExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/ModelExtractor.java @@ -1,7 +1,7 @@ -package org.jbake.template; +package org.jbake.template.model; import org.jbake.app.ContentStore; -import org.jbake.template.model.TemplateModel; +import org.jbake.model.TemplateModel; /** diff --git a/jbake-core/src/main/java/org/jbake/template/ModelExtractorsDocumentTypeListener.java b/jbake-core/src/main/java/org/jbake/template/model/ModelExtractorsDocumentTypeListener.java similarity index 78% rename from jbake-core/src/main/java/org/jbake/template/ModelExtractorsDocumentTypeListener.java rename to jbake-core/src/main/java/org/jbake/template/model/ModelExtractorsDocumentTypeListener.java index ee6e429dc..d8c0b44d2 100644 --- a/jbake-core/src/main/java/org/jbake/template/ModelExtractorsDocumentTypeListener.java +++ b/jbake-core/src/main/java/org/jbake/template/model/ModelExtractorsDocumentTypeListener.java @@ -1,5 +1,6 @@ -package org.jbake.template; +package org.jbake.template.model; +import org.jbake.engine.ModelExtractors; import org.jbake.model.DocumentTypeListener; public class ModelExtractorsDocumentTypeListener implements DocumentTypeListener { diff --git a/jbake-core/src/main/java/org/jbake/template/model/PublishedContentExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/PublishedContentExtractor.java index cbf3b8556..773f58d38 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/PublishedContentExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/PublishedContentExtractor.java @@ -4,7 +4,7 @@ import org.jbake.app.DocumentList; import org.jbake.model.DocumentModel; import org.jbake.model.DocumentTypes; -import org.jbake.template.ModelExtractor; +import org.jbake.model.TemplateModel; public class PublishedContentExtractor implements ModelExtractor> { diff --git a/jbake-core/src/main/java/org/jbake/template/model/PublishedCustomExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/PublishedCustomExtractor.java index 9f54bb45a..26e60efef 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/PublishedCustomExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/PublishedCustomExtractor.java @@ -3,7 +3,7 @@ import org.jbake.app.ContentStore; import org.jbake.app.DocumentList; import org.jbake.model.DocumentModel; -import org.jbake.template.ModelExtractor; +import org.jbake.model.TemplateModel; public class PublishedCustomExtractor implements ModelExtractor> { diff --git a/jbake-core/src/main/java/org/jbake/template/model/PublishedDateExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/PublishedDateExtractor.java index cd65ba826..62afdfc67 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/PublishedDateExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/PublishedDateExtractor.java @@ -1,7 +1,7 @@ package org.jbake.template.model; import org.jbake.app.ContentStore; -import org.jbake.template.ModelExtractor; +import org.jbake.model.TemplateModel; import java.util.Date; diff --git a/jbake-core/src/main/java/org/jbake/template/model/PublishedPagesExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/PublishedPagesExtractor.java index c7f1a265f..48525020e 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/PublishedPagesExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/PublishedPagesExtractor.java @@ -3,7 +3,7 @@ import org.jbake.app.ContentStore; import org.jbake.app.DocumentList; import org.jbake.model.DocumentModel; -import org.jbake.template.ModelExtractor; +import org.jbake.model.TemplateModel; public class PublishedPagesExtractor implements ModelExtractor> { diff --git a/jbake-core/src/main/java/org/jbake/template/model/PublishedPostsExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/PublishedPostsExtractor.java index 11fc746b3..8c082291d 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/PublishedPostsExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/PublishedPostsExtractor.java @@ -3,7 +3,7 @@ import org.jbake.app.ContentStore; import org.jbake.app.DocumentList; import org.jbake.model.DocumentModel; -import org.jbake.template.ModelExtractor; +import org.jbake.model.TemplateModel; public class PublishedPostsExtractor implements ModelExtractor> { diff --git a/jbake-core/src/main/java/org/jbake/template/model/TagPostsExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/TagPostsExtractor.java index 6db2138b5..18f703932 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/TagPostsExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/TagPostsExtractor.java @@ -3,7 +3,7 @@ import org.jbake.app.ContentStore; import org.jbake.app.DocumentList; import org.jbake.model.DocumentModel; -import org.jbake.template.ModelExtractor; +import org.jbake.model.TemplateModel; public class TagPostsExtractor implements ModelExtractor> { diff --git a/jbake-core/src/main/java/org/jbake/template/model/TaggedDocumentsExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/TaggedDocumentsExtractor.java index 367073e92..ce97d821a 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/TaggedDocumentsExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/TaggedDocumentsExtractor.java @@ -3,7 +3,7 @@ import org.jbake.app.ContentStore; import org.jbake.app.DocumentList; import org.jbake.model.DocumentModel; -import org.jbake.template.ModelExtractor; +import org.jbake.model.TemplateModel; public class TaggedDocumentsExtractor implements ModelExtractor> { diff --git a/jbake-core/src/main/java/org/jbake/template/model/TagsExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/TagsExtractor.java index 920583f04..f294047e3 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/TagsExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/TagsExtractor.java @@ -3,7 +3,7 @@ import org.jbake.app.ContentStore; import org.jbake.app.DocumentList; import org.jbake.app.FileUtil; -import org.jbake.template.ModelExtractor; +import org.jbake.model.TemplateModel; import static org.jbake.app.configuration.PropertyList.OUTPUT_EXTENSION; import static org.jbake.app.configuration.PropertyList.TAG_PATH; diff --git a/jbake-core/src/main/java/org/jbake/template/model/TypedDocumentsExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/TypedDocumentsExtractor.java index ffa7a4d8f..7b13a0900 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/TypedDocumentsExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/TypedDocumentsExtractor.java @@ -4,7 +4,7 @@ import org.jbake.app.DocumentList; import org.jbake.model.DocumentModel; import org.jbake.model.DocumentTypeUtils; -import org.jbake.template.ModelExtractor; +import org.jbake.model.TemplateModel; public class TypedDocumentsExtractor implements ModelExtractor> { diff --git a/jbake-core/src/main/java/org/jbake/template/model/UnknownModelExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/UnknownModelExtractor.java new file mode 100644 index 000000000..45abf254c --- /dev/null +++ b/jbake-core/src/main/java/org/jbake/template/model/UnknownModelExtractor.java @@ -0,0 +1,24 @@ +package org.jbake.template.model; + +import org.jbake.app.ContentStore; +import org.jbake.app.DocumentList; +import org.jbake.model.DocumentModel; +import org.jbake.model.TemplateModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class UnknownModelExtractor implements ModelExtractor> { + + private final static Logger logger = LoggerFactory.getLogger(UnknownModelExtractor.class); + private final String className; + + public UnknownModelExtractor(String className) { + this.className = className; + } + + @Override + public DocumentList get(ContentStore db, TemplateModel model, String key) { + logger.debug("Could not find class [{}] to get document list by key [{}]", className, key); + return new DocumentList<>(); + } +} diff --git a/jbake-core/src/main/resources/META-INF/org.jbake.parser.MarkupEngines.properties b/jbake-core/src/main/resources/META-INF/org.jbake.engine.MarkupEngines.properties similarity index 100% rename from jbake-core/src/main/resources/META-INF/org.jbake.parser.MarkupEngines.properties rename to jbake-core/src/main/resources/META-INF/org.jbake.engine.MarkupEngines.properties diff --git a/jbake-core/src/main/resources/META-INF/org.jbake.template.ModelExtractors.properties b/jbake-core/src/main/resources/META-INF/org.jbake.engine.ModelExtractors.properties similarity index 100% rename from jbake-core/src/main/resources/META-INF/org.jbake.template.ModelExtractors.properties rename to jbake-core/src/main/resources/META-INF/org.jbake.engine.ModelExtractors.properties diff --git a/jbake-core/src/main/resources/META-INF/org.jbake.template.TemplateEngines.properties b/jbake-core/src/main/resources/META-INF/org.jbake.engine.TemplateEngines.properties similarity index 100% rename from jbake-core/src/main/resources/META-INF/org.jbake.template.TemplateEngines.properties rename to jbake-core/src/main/resources/META-INF/org.jbake.engine.TemplateEngines.properties diff --git a/jbake-core/src/test/java/org/jbake/app/OvenTest.java b/jbake-core/src/test/java/org/jbake/app/OvenTest.java index a59e84aec..6e61b3e0a 100644 --- a/jbake-core/src/test/java/org/jbake/app/OvenTest.java +++ b/jbake-core/src/test/java/org/jbake/app/OvenTest.java @@ -5,24 +5,22 @@ import org.jbake.app.configuration.ConfigUtil; import org.jbake.app.configuration.DefaultJBakeConfiguration; import org.jbake.app.configuration.PropertyList; +import org.jbake.exception.JBakeException; import org.jbake.model.DocumentTypes; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.Is.is; - -import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Locale; import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.atLeastOnce; diff --git a/jbake-core/src/test/java/org/jbake/app/configuration/ConfigUtilTest.java b/jbake-core/src/test/java/org/jbake/app/configuration/ConfigUtilTest.java index 4db87a457..b08958892 100644 --- a/jbake-core/src/test/java/org/jbake/app/configuration/ConfigUtilTest.java +++ b/jbake-core/src/test/java/org/jbake/app/configuration/ConfigUtilTest.java @@ -3,8 +3,8 @@ import ch.qos.logback.classic.spi.LoggingEvent; import org.apache.commons.io.FileUtils; import org.jbake.TestUtils; -import org.jbake.app.JBakeException; import org.jbake.app.LoggingTest; +import org.jbake.exception.JBakeException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -14,47 +14,42 @@ import java.io.FileWriter; import java.lang.reflect.Field; import java.nio.file.Files; -import java.nio.file.OpenOption; import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.nio.file.StandardOpenOption; import java.util.List; import static ch.qos.logback.classic.Level.WARN; import static org.assertj.core.api.Assertions.assertThat; -import static org.jbake.TestUtils.getTestResourcesAsSourceFolder; -import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -public class ConfigUtilTest extends LoggingTest { +class ConfigUtilTest extends LoggingTest { private Path sourceFolder; private ConfigUtil util; @BeforeEach - public void setup(@TempDir Path folder) { + void setup(@TempDir Path folder) { this.sourceFolder = folder; this.util = new ConfigUtil(); } @Test - public void shouldLoadSiteHost() throws Exception { + void shouldLoadSiteHost() throws Exception { JBakeConfiguration config = util.loadConfig(TestUtils.getTestResourcesAsSourceFolder()); assertThat(config.getSiteHost()).isEqualTo("http://www.jbake.org"); } @Test - public void shouldLoadADefaultConfiguration() throws Exception { + void shouldLoadADefaultConfiguration() throws Exception { JBakeConfiguration config = util.loadConfig(TestUtils.getTestResourcesAsSourceFolder()); assertDefaultPropertiesPresent(config); } @Test - public void shouldLoadACustomConfiguration() throws Exception { + void shouldLoadACustomConfiguration() throws Exception { File customConfigFile = new File(sourceFolder.toFile(), "jbake.properties"); BufferedWriter writer = new BufferedWriter(new FileWriter(customConfigFile)); @@ -68,7 +63,7 @@ public void shouldLoadACustomConfiguration() throws Exception { } @Test - public void shouldThrowAnExceptionIfSourcefolderDoesNotExist() throws Exception { + void shouldThrowAnExceptionIfSourcefolderDoesNotExist() { File nonExistentSourceFolder = mock(File.class); when(nonExistentSourceFolder.getAbsolutePath()).thenReturn("/tmp/nonexistent"); when(nonExistentSourceFolder.exists()).thenReturn(false); @@ -78,7 +73,7 @@ public void shouldThrowAnExceptionIfSourcefolderDoesNotExist() throws Exception } @Test - public void shouldAddSourcefolderToConfiguration() throws Exception { + void shouldAddSourcefolderToConfiguration() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); JBakeConfiguration config = util.loadConfig(sourceFolder); @@ -87,7 +82,7 @@ public void shouldAddSourcefolderToConfiguration() throws Exception { } @Test - public void shouldThrowAnExceptionIfSourcefolderIsNotADirectory() throws Exception { + void shouldThrowAnExceptionIfSourcefolderIsNotADirectory() { File sourceFolder = mock(File.class); when(sourceFolder.exists()).thenReturn(true); @@ -98,7 +93,7 @@ public void shouldThrowAnExceptionIfSourcefolderIsNotADirectory() throws Excepti } @Test - public void shouldReturnDestinationFolderFromConfiguration() throws Exception { + void shouldReturnDestinationFolderFromConfiguration() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); File expectedDestinationFolder = new File(sourceFolder, "output"); JBakeConfiguration config = util.loadConfig(sourceFolder); @@ -107,7 +102,7 @@ public void shouldReturnDestinationFolderFromConfiguration() throws Exception { } @Test - public void shouldReturnAssetFolderFromConfiguration() throws Exception { + void shouldReturnAssetFolderFromConfiguration() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); File expectedDestinationFolder = new File(sourceFolder, "assets"); JBakeConfiguration config = util.loadConfig(sourceFolder); @@ -116,7 +111,7 @@ public void shouldReturnAssetFolderFromConfiguration() throws Exception { } @Test - public void shouldReturnTemplateFolderFromConfiguration() throws Exception { + void shouldReturnTemplateFolderFromConfiguration() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); File expectedDestinationFolder = new File(sourceFolder, "templates"); JBakeConfiguration config = util.loadConfig(sourceFolder); @@ -125,7 +120,7 @@ public void shouldReturnTemplateFolderFromConfiguration() throws Exception { } @Test - public void shouldReturnContentFolderFromConfiguration() throws Exception { + void shouldReturnContentFolderFromConfiguration() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); File expectedDestinationFolder = new File(sourceFolder, "content"); JBakeConfiguration config = util.loadConfig(sourceFolder); @@ -134,7 +129,7 @@ public void shouldReturnContentFolderFromConfiguration() throws Exception { } @Test - public void shouldGetTemplateFileDoctype() throws Exception { + void shouldGetTemplateFileDoctype() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); File expectedTemplateFile = new File(sourceFolder, "templates/index.ftl"); JBakeConfiguration config = util.loadConfig(sourceFolder); @@ -145,7 +140,7 @@ public void shouldGetTemplateFileDoctype() throws Exception { } @Test - public void shouldLogWarningIfDocumentTypeNotFound() throws Exception { + void shouldLogWarningIfDocumentTypeNotFound() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); JBakeConfiguration config = util.loadConfig(sourceFolder); @@ -160,7 +155,7 @@ public void shouldLogWarningIfDocumentTypeNotFound() throws Exception { } @Test - public void shouldGetTemplateOutputExtension() throws Exception { + void shouldGetTemplateOutputExtension() throws Exception { String docType = "masterindex"; File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); @@ -173,7 +168,7 @@ public void shouldGetTemplateOutputExtension() throws Exception { } @Test - public void shouldGetMarkdownExtensionsAsList() throws Exception { + void shouldGetMarkdownExtensionsAsList() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); DefaultJBakeConfiguration config = (DefaultJBakeConfiguration) util.loadConfig(sourceFolder); @@ -183,7 +178,7 @@ public void shouldGetMarkdownExtensionsAsList() throws Exception { } @Test - public void shouldReturnConfiguredDocTypes() throws Exception { + void shouldReturnConfiguredDocTypes() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); DefaultJBakeConfiguration config = (DefaultJBakeConfiguration) util.loadConfig(sourceFolder); @@ -195,7 +190,7 @@ public void shouldReturnConfiguredDocTypes() throws Exception { } @Test - public void shouldReturnAListOfAsciidoctorOptionsKeys() throws Exception { + void shouldReturnAListOfAsciidoctorOptionsKeys() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); DefaultJBakeConfiguration config = (DefaultJBakeConfiguration) util.loadConfig(sourceFolder); config.setProperty("asciidoctor.option.requires", "asciidoctor-diagram"); @@ -207,7 +202,7 @@ public void shouldReturnAListOfAsciidoctorOptionsKeys() throws Exception { } @Test - public void shouldReturnAnAsciidoctorOption() throws Exception { + void shouldReturnAnAsciidoctorOption() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); DefaultJBakeConfiguration config = (DefaultJBakeConfiguration) util.loadConfig(sourceFolder); config.setProperty("asciidoctor.option.requires", "asciidoctor-diagram"); @@ -219,7 +214,7 @@ public void shouldReturnAnAsciidoctorOption() throws Exception { } @Test - public void shouldReturnAnAsciidoctorOptionWithAListValue() throws Exception { + void shouldReturnAnAsciidoctorOptionWithAListValue() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); DefaultJBakeConfiguration config = (DefaultJBakeConfiguration) util.loadConfig(sourceFolder); config.setProperty("asciidoctor.option.requires", "asciidoctor-diagram"); @@ -231,7 +226,7 @@ public void shouldReturnAnAsciidoctorOptionWithAListValue() throws Exception { } @Test - public void shouldReturnEmptyListIfOptionNotAvailable() throws Exception { + void shouldReturnEmptyListIfOptionNotAvailable() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); DefaultJBakeConfiguration config = (DefaultJBakeConfiguration) util.loadConfig(sourceFolder); @@ -241,7 +236,7 @@ public void shouldReturnEmptyListIfOptionNotAvailable() throws Exception { } @Test - public void shouldLogAWarningIfAsciidocOptionCouldNotBeFound() throws Exception { + void shouldLogAWarningIfAsciidocOptionCouldNotBeFound() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); DefaultJBakeConfiguration config = (DefaultJBakeConfiguration) util.loadConfig(sourceFolder); @@ -255,7 +250,7 @@ public void shouldLogAWarningIfAsciidocOptionCouldNotBeFound() throws Exception } @Test - public void shouldHandleNonExistingFiles() throws Exception { + void shouldHandleNonExistingFiles() throws Exception { File source = TestUtils.getTestResourcesAsSourceFolder(); File expectedTemplateFolder = new File(source, "templates"); @@ -328,7 +323,7 @@ void shouldSetCustomFoldersWithAbsolutePaths() throws Exception { } @Test - public void shouldUseUtf8EncodingAsDefault() throws Exception{ + void shouldUseUtf8EncodingAsDefault() throws Exception{ String unicodeString = "中文属性使用默认Properties编码"; JBakeConfiguration config = util.loadConfig(TestUtils.getTestResourcesAsSourceFolder()); @@ -338,7 +333,7 @@ public void shouldUseUtf8EncodingAsDefault() throws Exception{ } @Test - public void shouldBePossibleToSetCustomEncoding() throws Exception { + void shouldBePossibleToSetCustomEncoding() throws Exception { String expected = "Latin1 encoded file äöü"; JBakeConfiguration config = util.setEncoding("ISO8859_1").loadConfig(TestUtils.getTestResourcesAsSourceFolder("/fixtureLatin1")); @@ -347,7 +342,7 @@ public void shouldBePossibleToSetCustomEncoding() throws Exception { } @Test - public void shouldLogAWarningAndFallbackToUTF8IfEncodingIsNotSupported() throws Exception { + void shouldLogAWarningAndFallbackToUTF8IfEncodingIsNotSupported() throws Exception { JBakeConfiguration config = util.setEncoding("UNSUPPORTED_ENCODING").loadConfig(TestUtils.getTestResourcesAsSourceFolder("/fixtureLatin1")); verify(mockAppender, times(1)).doAppend(captorLoggingEvent.capture()); @@ -359,7 +354,7 @@ public void shouldLogAWarningAndFallbackToUTF8IfEncodingIsNotSupported() throws @Test - public void shouldReturnIgnoreFileFromConfiguration() throws Exception { + void shouldReturnIgnoreFileFromConfiguration() throws Exception { File sourceFolder = TestUtils.getTestResourcesAsSourceFolder(); JBakeConfiguration config = util.loadConfig(sourceFolder); diff --git a/jbake-core/src/test/java/org/jbake/app/configuration/JBakeConfigurationInspectorTest.java b/jbake-core/src/test/java/org/jbake/app/configuration/JBakeConfigurationInspectorTest.java index 158c10db1..5d5566600 100644 --- a/jbake-core/src/test/java/org/jbake/app/configuration/JBakeConfigurationInspectorTest.java +++ b/jbake-core/src/test/java/org/jbake/app/configuration/JBakeConfigurationInspectorTest.java @@ -2,8 +2,8 @@ import ch.qos.logback.classic.spi.LoggingEvent; import org.jbake.TestUtils; -import org.jbake.app.JBakeException; import org.jbake.app.LoggingTest; +import org.jbake.exception.JBakeException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; diff --git a/jbake-core/src/test/java/org/jbake/app/template/AbstractTemplateEngineRenderingTest.java b/jbake-core/src/test/java/org/jbake/app/template/AbstractTemplateEngineRenderingTest.java index 69ee1cab4..102f5caf4 100644 --- a/jbake-core/src/test/java/org/jbake/app/template/AbstractTemplateEngineRenderingTest.java +++ b/jbake-core/src/test/java/org/jbake/app/template/AbstractTemplateEngineRenderingTest.java @@ -28,20 +28,22 @@ import org.jbake.app.Crawler; import org.jbake.app.Parser; import org.jbake.app.Renderer; +import org.jbake.engine.ModelExtractors; import org.jbake.model.DocumentModel; import org.jbake.model.DocumentTypes; -import org.jbake.template.ModelExtractors; -import org.jbake.template.ModelExtractorsDocumentTypeListener; +import org.jbake.template.model.ModelExtractorsDocumentTypeListener; import org.junit.After; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Rule; import org.junit.Test; import java.io.File; import java.nio.charset.Charset; -import java.util.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; diff --git a/jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.java b/jbake-core/src/test/java/org/jbake/engine/ModelExtractorsTest.java similarity index 99% rename from jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.java rename to jbake-core/src/test/java/org/jbake/engine/ModelExtractorsTest.java index 204ad3999..76a2735d8 100644 --- a/jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.java +++ b/jbake-core/src/test/java/org/jbake/engine/ModelExtractorsTest.java @@ -1,4 +1,4 @@ -package org.jbake.template; +package org.jbake.engine; import org.jbake.model.DocumentTypes; import org.junit.After; diff --git a/jbake-core/src/test/java/org/jbake/launcher/MainTest.java b/jbake-core/src/test/java/org/jbake/launcher/MainTest.java index 0d2083929..b93a2bc8d 100644 --- a/jbake-core/src/test/java/org/jbake/launcher/MainTest.java +++ b/jbake-core/src/test/java/org/jbake/launcher/MainTest.java @@ -4,12 +4,12 @@ import org.apache.commons.configuration2.ex.ConfigurationException; import org.itsallcode.junit.sysextensions.ExitGuard; import org.jbake.TestUtils; -import org.jbake.app.JBakeException; import org.jbake.app.LoggingTest; import org.jbake.app.configuration.ConfigUtil; import org.jbake.app.configuration.DefaultJBakeConfiguration; import org.jbake.app.configuration.JBakeConfiguration; import org.jbake.app.configuration.JBakeConfigurationFactory; +import org.jbake.exception.JBakeException; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -20,7 +20,6 @@ import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.IOException; import java.io.PrintStream; import java.nio.file.Path; diff --git a/jbake-core/src/test/java/org/jbake/render/ArchiveRendererTest.java b/jbake-core/src/test/java/org/jbake/render/ArchiveRendererTest.java index 7d49a304e..ec9fa252d 100644 --- a/jbake-core/src/test/java/org/jbake/render/ArchiveRendererTest.java +++ b/jbake-core/src/test/java/org/jbake/render/ArchiveRendererTest.java @@ -4,7 +4,7 @@ import org.jbake.app.Renderer; import org.jbake.app.configuration.DefaultJBakeConfiguration; import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.template.RenderingException; +import org.jbake.exception.RenderingException; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -30,7 +30,7 @@ public void returnsZeroWhenConfigDoesNotRenderArchives() throws RenderingExcepti Renderer mockRenderer = mock(Renderer.class); int renderResponse = renderer.render(mockRenderer, contentStore, configuration); - assertThat(renderResponse).isEqualTo(0); + assertThat(renderResponse).isZero(); } @Test diff --git a/jbake-core/src/test/java/org/jbake/render/DocumentsRendererTest.java b/jbake-core/src/test/java/org/jbake/render/DocumentsRendererTest.java index 9003ef3d6..68df2a57d 100644 --- a/jbake-core/src/test/java/org/jbake/render/DocumentsRendererTest.java +++ b/jbake-core/src/test/java/org/jbake/render/DocumentsRendererTest.java @@ -4,15 +4,13 @@ import org.jbake.app.DocumentList; import org.jbake.app.Renderer; import org.jbake.app.configuration.JBakeConfiguration; +import org.jbake.exception.RenderingException; import org.jbake.model.DocumentModel; import org.jbake.model.DocumentTypes; import org.jbake.model.ModelAttributes; -import org.jbake.template.RenderingException; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.jupiter.api.Assertions; -import org.junit.rules.ExpectedException; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.MockitoAnnotations; diff --git a/jbake-core/src/test/java/org/jbake/render/Error404RendererTest.java b/jbake-core/src/test/java/org/jbake/render/Error404RendererTest.java index 24281c526..4901d378d 100644 --- a/jbake-core/src/test/java/org/jbake/render/Error404RendererTest.java +++ b/jbake-core/src/test/java/org/jbake/render/Error404RendererTest.java @@ -4,13 +4,17 @@ import org.jbake.app.Renderer; import org.jbake.app.configuration.DefaultJBakeConfiguration; import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.template.RenderingException; +import org.jbake.exception.RenderingException; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; public class Error404RendererTest { @Test diff --git a/jbake-core/src/test/java/org/jbake/render/FeedRendererTest.java b/jbake-core/src/test/java/org/jbake/render/FeedRendererTest.java index cb81f1d7d..93a915a1a 100644 --- a/jbake-core/src/test/java/org/jbake/render/FeedRendererTest.java +++ b/jbake-core/src/test/java/org/jbake/render/FeedRendererTest.java @@ -4,7 +4,7 @@ import org.jbake.app.Renderer; import org.jbake.app.configuration.DefaultJBakeConfiguration; import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.template.RenderingException; +import org.jbake.exception.RenderingException; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; diff --git a/jbake-core/src/test/java/org/jbake/render/IndexRendererTest.java b/jbake-core/src/test/java/org/jbake/render/IndexRendererTest.java index 40d6f1d8e..289c4d440 100644 --- a/jbake-core/src/test/java/org/jbake/render/IndexRendererTest.java +++ b/jbake-core/src/test/java/org/jbake/render/IndexRendererTest.java @@ -4,7 +4,7 @@ import org.jbake.app.Renderer; import org.jbake.app.configuration.DefaultJBakeConfiguration; import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.template.RenderingException; +import org.jbake.exception.RenderingException; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; diff --git a/jbake-core/src/test/java/org/jbake/render/SitemapRendererTest.java b/jbake-core/src/test/java/org/jbake/render/SitemapRendererTest.java index ecbccc379..cb6028b35 100644 --- a/jbake-core/src/test/java/org/jbake/render/SitemapRendererTest.java +++ b/jbake-core/src/test/java/org/jbake/render/SitemapRendererTest.java @@ -4,7 +4,7 @@ import org.jbake.app.Renderer; import org.jbake.app.configuration.DefaultJBakeConfiguration; import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.template.RenderingException; +import org.jbake.exception.RenderingException; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; diff --git a/jbake-core/src/test/java/org/jbake/render/TagsRendererTest.java b/jbake-core/src/test/java/org/jbake/render/TagsRendererTest.java index 479ff67d6..2e9996e15 100644 --- a/jbake-core/src/test/java/org/jbake/render/TagsRendererTest.java +++ b/jbake-core/src/test/java/org/jbake/render/TagsRendererTest.java @@ -4,7 +4,7 @@ import org.jbake.app.Renderer; import org.jbake.app.configuration.DefaultJBakeConfiguration; import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.template.RenderingException; +import org.jbake.exception.RenderingException; import org.junit.Test; import java.util.Arrays; diff --git a/jbake-core/src/test/java/org/jbake/template/ModelExtractorsDocumentTypeListenerTest.java b/jbake-core/src/test/java/org/jbake/template/ModelExtractorsDocumentTypeListenerTest.java index 9ea46c6de..d72958346 100644 --- a/jbake-core/src/test/java/org/jbake/template/ModelExtractorsDocumentTypeListenerTest.java +++ b/jbake-core/src/test/java/org/jbake/template/ModelExtractorsDocumentTypeListenerTest.java @@ -1,6 +1,8 @@ package org.jbake.template; +import org.jbake.engine.ModelExtractors; import org.jbake.model.DocumentTypes; +import org.jbake.template.model.ModelExtractorsDocumentTypeListener; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; From c56e57e2de373765b4eee32722aac2e8878ebd6f Mon Sep 17 00:00:00 2001 From: Frank Becker Date: Sat, 29 May 2021 16:16:32 +0200 Subject: [PATCH 5/7] more sonatype cleanup --- .../org/jbake/exception/JBakeException.java | 2 +- .../java/org/jbake/launcher/JettyServer.java | 10 ++++---- .../template/model/UnknownModelExtractor.java | 2 +- .../src/test/java/org/jbake/app/OvenTest.java | 24 +++++++++---------- .../JBakeConfigurationInspectorTest.java | 18 +++++++------- .../java/org/jbake/launcher/MainTest.java | 4 ++-- .../jbake/render/DocumentsRendererTest.java | 2 +- .../jbake/render/Error404RendererTest.java | 2 +- .../org/jbake/render/FeedRendererTest.java | 2 +- .../org/jbake/render/IndexRendererTest.java | 2 +- .../org/jbake/render/SitemapRendererTest.java | 2 +- .../org/jbake/render/TagsRendererTest.java | 2 +- 12 files changed, 36 insertions(+), 36 deletions(-) diff --git a/jbake-core/src/main/java/org/jbake/exception/JBakeException.java b/jbake-core/src/main/java/org/jbake/exception/JBakeException.java index d87e49696..b2cb2d85c 100644 --- a/jbake-core/src/main/java/org/jbake/exception/JBakeException.java +++ b/jbake-core/src/main/java/org/jbake/exception/JBakeException.java @@ -11,7 +11,7 @@ public class JBakeException extends RuntimeException { private static final long serialVersionUID = 1L; - final private SystemExit exit; + private final SystemExit exit; /** * diff --git a/jbake-core/src/main/java/org/jbake/launcher/JettyServer.java b/jbake-core/src/main/java/org/jbake/launcher/JettyServer.java index a57627f0a..296902a12 100644 --- a/jbake-core/src/main/java/org/jbake/launcher/JettyServer.java +++ b/jbake-core/src/main/java/org/jbake/launcher/JettyServer.java @@ -50,14 +50,14 @@ private void run(String resourceBase, String contextPath, String hostname, int p connector.setPort(port); server.addConnector(connector); - ResourceHandler resource_handler = new ResourceHandler(); - resource_handler.setDirectoriesListed(true); - resource_handler.setWelcomeFiles(new String[]{"index", "index.html"}); - resource_handler.setResourceBase(resourceBase); + ResourceHandler resourceHandler = new ResourceHandler(); + resourceHandler.setDirectoriesListed(true); + resourceHandler.setWelcomeFiles(new String[]{"index", "index.html"}); + resourceHandler.setResourceBase(resourceBase); ContextHandler contextHandler = new ContextHandler(); contextHandler.setContextPath(contextPath); - contextHandler.setHandler(resource_handler); + contextHandler.setHandler(resourceHandler); HandlerList handlers = new HandlerList(); diff --git a/jbake-core/src/main/java/org/jbake/template/model/UnknownModelExtractor.java b/jbake-core/src/main/java/org/jbake/template/model/UnknownModelExtractor.java index 45abf254c..5a7ccad0c 100644 --- a/jbake-core/src/main/java/org/jbake/template/model/UnknownModelExtractor.java +++ b/jbake-core/src/main/java/org/jbake/template/model/UnknownModelExtractor.java @@ -9,7 +9,7 @@ public class UnknownModelExtractor implements ModelExtractor> { - private final static Logger logger = LoggerFactory.getLogger(UnknownModelExtractor.class); + private final Logger logger = LoggerFactory.getLogger(UnknownModelExtractor.class); private final String className; public UnknownModelExtractor(String className) { diff --git a/jbake-core/src/test/java/org/jbake/app/OvenTest.java b/jbake-core/src/test/java/org/jbake/app/OvenTest.java index 6e61b3e0a..e7803cec6 100644 --- a/jbake-core/src/test/java/org/jbake/app/OvenTest.java +++ b/jbake-core/src/test/java/org/jbake/app/OvenTest.java @@ -29,7 +29,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -public class OvenTest { +class OvenTest { @TempDir Path root; @@ -39,7 +39,7 @@ public class OvenTest { private ContentStore contentStore; @BeforeEach - public void setUp() throws Exception { + void setUp() throws Exception { // reset values to known state otherwise previous test case runs can affect the success of this test case DocumentTypes.resetDocumentTypes(); File output = root.resolve("output").toFile(); @@ -51,7 +51,7 @@ public void setUp() throws Exception { } @AfterEach - public void tearDown() { + void tearDown() { if (contentStore != null && contentStore.isActive()) { contentStore.close(); contentStore.shutdown(); @@ -59,7 +59,7 @@ public void tearDown() { } @Test - public void bakeWithAbsolutePaths() { + void bakeWithAbsolutePaths() { configuration.setTemplateFolder(new File(sourceFolder, "groovyMarkupTemplates")); configuration.setContentFolder(new File(sourceFolder, "content")); configuration.setAssetFolder(new File(sourceFolder, "assets")); @@ -71,7 +71,7 @@ public void bakeWithAbsolutePaths() { } @Test - public void shouldBakeWithRelativeCustomPaths() throws Exception { + void shouldBakeWithRelativeCustomPaths() throws Exception { sourceFolder = TestUtils.getTestResourcesAsSourceFolder("/fixture-custom-relative"); configuration = (DefaultJBakeConfiguration) new ConfigUtil().loadConfig(sourceFolder); File assetFolder = new File(configuration.getDestinationFolder(), "css"); @@ -91,7 +91,7 @@ public void shouldBakeWithRelativeCustomPaths() throws Exception { } @Test - public void shouldBakeWithAbsoluteCustomPaths() throws Exception { + void shouldBakeWithAbsoluteCustomPaths() throws Exception { // given Path source = root.resolve("source"); @@ -138,14 +138,14 @@ public void shouldBakeWithAbsoluteCustomPaths() throws Exception { @Test - public void shouldThrowExceptionIfSourceFolderDoesNotExist() { + void shouldThrowExceptionIfSourceFolderDoesNotExist() { configuration.setSourceFolder(root.resolve("none").toFile()); assertThrows(JBakeException.class, () -> new Oven(configuration)); } @Test - public void shouldInstantiateNeededUtensils() throws Exception { + void shouldInstantiateNeededUtensils() throws Exception { File template = TestUtils.newFolder(root.toFile(), "template"); File content = TestUtils.newFolder(root.toFile(), "content"); @@ -165,7 +165,7 @@ public void shouldInstantiateNeededUtensils() throws Exception { } @Test() - public void shouldInspectConfigurationDuringInstantiationFromUtils() { + void shouldInspectConfigurationDuringInstantiationFromUtils() { configuration.setSourceFolder(root.resolve("none").toFile()); Utensils utensils = new Utensils(); @@ -175,7 +175,7 @@ public void shouldInspectConfigurationDuringInstantiationFromUtils() { } @Test - public void shouldCrawlRenderAndCopyAssets() throws Exception { + void shouldCrawlRenderAndCopyAssets() throws Exception { File template = TestUtils.newFolder(root.toFile(), "template"); File content = TestUtils.newFolder(root.toFile(), "content"); File assets = TestUtils.newFolder(root.toFile(), "assets"); @@ -208,7 +208,7 @@ public void shouldCrawlRenderAndCopyAssets() throws Exception { } @Test - public void localeConfiguration() throws Exception { + void localeConfiguration() throws Exception { String language = configuration.getJvmLocale(); final Oven oven = new Oven(configuration); @@ -218,7 +218,7 @@ public void localeConfiguration() throws Exception { } @Test - public void noLocaleConfiguration() throws Exception { + void noLocaleConfiguration() throws Exception { configuration.setProperty(PropertyList.JVM_LOCALE.getKey(), null); String language = Locale.getDefault().getLanguage(); diff --git a/jbake-core/src/test/java/org/jbake/app/configuration/JBakeConfigurationInspectorTest.java b/jbake-core/src/test/java/org/jbake/app/configuration/JBakeConfigurationInspectorTest.java index 5d5566600..b16674c9b 100644 --- a/jbake-core/src/test/java/org/jbake/app/configuration/JBakeConfigurationInspectorTest.java +++ b/jbake-core/src/test/java/org/jbake/app/configuration/JBakeConfigurationInspectorTest.java @@ -18,18 +18,18 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -public class JBakeConfigurationInspectorTest extends LoggingTest { +class JBakeConfigurationInspectorTest extends LoggingTest { private Path folder; @BeforeEach - public void setup(@TempDir Path folder) { + void setup(@TempDir Path folder) { this.folder = folder; } @Test - public void shouldThrowExceptionIfSourceFolderDoesNotExist() throws Exception { + void shouldThrowExceptionIfSourceFolderDoesNotExist() throws Exception { File nonExistentFile = new File(folder.toFile(), "nofolder"); JBakeConfiguration configuration = mock(JBakeConfiguration.class); when(configuration.getSourceFolder()).thenReturn(nonExistentFile); @@ -42,7 +42,7 @@ public void shouldThrowExceptionIfSourceFolderDoesNotExist() throws Exception { } @Test - public void shouldThrowExceptionIfSourceFolderIsNotReadable() throws Exception { + void shouldThrowExceptionIfSourceFolderIsNotReadable() throws Exception { File nonReadableFile = mock(File.class); when(nonReadableFile.exists()).thenReturn(true); when(nonReadableFile.isDirectory()).thenReturn(true); @@ -59,7 +59,7 @@ public void shouldThrowExceptionIfSourceFolderIsNotReadable() throws Exception { } @Test - public void shouldThrowExceptionIfTemplateFolderDoesNotExist() throws Exception { + void shouldThrowExceptionIfTemplateFolderDoesNotExist() throws Exception { String templateFolderName = "template/custom"; File expectedFolder = new File(folder.toFile(), templateFolderName); JBakeConfiguration configuration = mock(JBakeConfiguration.class); @@ -74,7 +74,7 @@ public void shouldThrowExceptionIfTemplateFolderDoesNotExist() throws Exception } @Test - public void shouldThrowExceptionIfContentFolderDoesNotExist() throws Exception { + void shouldThrowExceptionIfContentFolderDoesNotExist() throws Exception { String contentFolderName = "content"; String templateFolderName = "template"; File templateFolder = TestUtils.newFolder(folder.toFile(), templateFolderName); @@ -94,7 +94,7 @@ public void shouldThrowExceptionIfContentFolderDoesNotExist() throws Exception { } @Test - public void shouldCreateDestinationFolderIfNotExists() throws Exception { + void shouldCreateDestinationFolderIfNotExists() throws Exception { String contentFolderName = "content"; String templateFolderName = "template"; String destinationFolderName = "output"; @@ -118,7 +118,7 @@ public void shouldCreateDestinationFolderIfNotExists() throws Exception { } @Test - public void shouldThrowExceptionIfDestinationFolderNotWritable() throws Exception { + void shouldThrowExceptionIfDestinationFolderNotWritable() throws Exception { String contentFolderName = "content"; String templateFolderName = "template"; @@ -141,7 +141,7 @@ public void shouldThrowExceptionIfDestinationFolderNotWritable() throws Exceptio } @Test - public void shouldLogWarningIfAssetFolderDoesNotExist() throws Exception { + void shouldLogWarningIfAssetFolderDoesNotExist() throws Exception { String contentFolderName = "content"; String templateFolderName = "template"; String destinationFolderName = "output"; diff --git a/jbake-core/src/test/java/org/jbake/launcher/MainTest.java b/jbake-core/src/test/java/org/jbake/launcher/MainTest.java index b93a2bc8d..41f72cb9d 100644 --- a/jbake-core/src/test/java/org/jbake/launcher/MainTest.java +++ b/jbake-core/src/test/java/org/jbake/launcher/MainTest.java @@ -81,7 +81,7 @@ void launchJetty(@TempDir Path source) throws Exception { } @Test - public void launchBakeWithCustomPropertiesEncoding(@TempDir Path source) throws Exception { + void launchBakeWithCustomPropertiesEncoding(@TempDir Path source) throws Exception { File currentWorkingdir = newFolder(source, "jbake"); mockDefaultJbakeConfiguration(currentWorkingdir); @@ -92,7 +92,7 @@ public void launchBakeWithCustomPropertiesEncoding(@TempDir Path source) throws } @Test - public void launchBakeWithDefaultUtf8PropertiesEncoding(@TempDir Path source) throws Exception { + void launchBakeWithDefaultUtf8PropertiesEncoding(@TempDir Path source) throws Exception { File currentWorkingdir = newFolder(source, "jbake"); mockDefaultJbakeConfiguration(currentWorkingdir); diff --git a/jbake-core/src/test/java/org/jbake/render/DocumentsRendererTest.java b/jbake-core/src/test/java/org/jbake/render/DocumentsRendererTest.java index 68df2a57d..288777ad2 100644 --- a/jbake-core/src/test/java/org/jbake/render/DocumentsRendererTest.java +++ b/jbake-core/src/test/java/org/jbake/render/DocumentsRendererTest.java @@ -58,7 +58,7 @@ public void shouldReturnZeroIfNothingHasRendered() throws Exception { int renderResponse = documentsRenderer.render(renderer, db, configuration); - assertThat(renderResponse).isEqualTo(0); + assertThat(renderResponse).isZero(); } @Test diff --git a/jbake-core/src/test/java/org/jbake/render/Error404RendererTest.java b/jbake-core/src/test/java/org/jbake/render/Error404RendererTest.java index 4901d378d..f82ea0045 100644 --- a/jbake-core/src/test/java/org/jbake/render/Error404RendererTest.java +++ b/jbake-core/src/test/java/org/jbake/render/Error404RendererTest.java @@ -29,7 +29,7 @@ public void returnsZeroWhenConfigDoesNotRenderError404() throws RenderingExcepti Renderer mockRenderer = mock(Renderer.class); int renderResponse = renderer.render(mockRenderer, contentStore, configuration); - assertThat(renderResponse).isEqualTo(0); + assertThat(renderResponse).isZero(); } @Test diff --git a/jbake-core/src/test/java/org/jbake/render/FeedRendererTest.java b/jbake-core/src/test/java/org/jbake/render/FeedRendererTest.java index 93a915a1a..cbce49b68 100644 --- a/jbake-core/src/test/java/org/jbake/render/FeedRendererTest.java +++ b/jbake-core/src/test/java/org/jbake/render/FeedRendererTest.java @@ -30,7 +30,7 @@ public void returnsZeroWhenConfigDoesNotRenderFeeds() throws RenderingException Renderer mockRenderer = mock(Renderer.class); int renderResponse = renderer.render(mockRenderer, contentStore, configuration); - assertThat(renderResponse).isEqualTo(0); + assertThat(renderResponse).isZero(); } @Test diff --git a/jbake-core/src/test/java/org/jbake/render/IndexRendererTest.java b/jbake-core/src/test/java/org/jbake/render/IndexRendererTest.java index 289c4d440..b2da9ae01 100644 --- a/jbake-core/src/test/java/org/jbake/render/IndexRendererTest.java +++ b/jbake-core/src/test/java/org/jbake/render/IndexRendererTest.java @@ -30,7 +30,7 @@ public void returnsZeroWhenConfigDoesNotRenderIndices() throws RenderingExceptio Renderer mockRenderer = mock(Renderer.class); int renderResponse = renderer.render(mockRenderer, contentStore, configuration); - assertThat(renderResponse).isEqualTo(0); + assertThat(renderResponse).isZero(); } @Test diff --git a/jbake-core/src/test/java/org/jbake/render/SitemapRendererTest.java b/jbake-core/src/test/java/org/jbake/render/SitemapRendererTest.java index cb6028b35..c4b25f3b8 100644 --- a/jbake-core/src/test/java/org/jbake/render/SitemapRendererTest.java +++ b/jbake-core/src/test/java/org/jbake/render/SitemapRendererTest.java @@ -30,7 +30,7 @@ public void returnsZeroWhenConfigDoesNotRenderSitemaps() throws RenderingExcepti Renderer mockRenderer = mock(Renderer.class); int renderResponse = renderer.render(mockRenderer, contentStore, configuration); - assertThat(renderResponse).isEqualTo(0); + assertThat(renderResponse).isZero(); } @Test diff --git a/jbake-core/src/test/java/org/jbake/render/TagsRendererTest.java b/jbake-core/src/test/java/org/jbake/render/TagsRendererTest.java index 2e9996e15..74b6b1bca 100644 --- a/jbake-core/src/test/java/org/jbake/render/TagsRendererTest.java +++ b/jbake-core/src/test/java/org/jbake/render/TagsRendererTest.java @@ -34,7 +34,7 @@ public void returnsZeroWhenConfigDoesNotRenderTags() throws RenderingException { Renderer mockRenderer = mock(Renderer.class); int renderResponse = renderer.render(mockRenderer, contentStore, configuration); - assertThat(renderResponse).isEqualTo(0); + assertThat(renderResponse).isZero(); } @Test From 2881c88a7e358ef8e94579d3f0beadbe164d1031 Mon Sep 17 00:00:00 2001 From: Frank Becker Date: Sat, 29 May 2021 16:22:51 +0200 Subject: [PATCH 6/7] update gradle to 7.0.2 --- gradle/wrapper/gradle-wrapper.properties | 2 +- jbake-core/build.gradle | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 442d9132e..0f80bbf51 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/jbake-core/build.gradle b/jbake-core/build.gradle index 3e41caa41..8376d3d06 100644 --- a/jbake-core/build.gradle +++ b/jbake-core/build.gradle @@ -37,6 +37,7 @@ dependencies { processResources { from("src/main/resources") { include 'default.properties' + duplicatesStrategy DuplicatesStrategy.EXCLUDE expand jbakeVersion: project.version, timestamp: grgit.head().dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss'['VV']'")), gitHash: grgit.head().abbreviatedId From 3f8b5d0823a7104894b5eba7d733b93684585229 Mon Sep 17 00:00:00 2001 From: Frank Becker Date: Sat, 29 May 2021 16:47:25 +0200 Subject: [PATCH 7/7] gradle plugin updates --- build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 3fbfcf837..692d9b555 100644 --- a/build.gradle +++ b/build.gradle @@ -2,12 +2,12 @@ plugins { id "eclipse" id "idea" id "io.sdkman.vendors" version "2.0.0" apply false - id "com.github.kt3k.coveralls" version "2.10.2" apply false - id "org.sonarqube" version "3.1.1" apply false - id 'com.github.ben-manes.versions' version '0.38.0' - id "nebula.optional-base" version "5.0.3" apply false + id "com.github.kt3k.coveralls" version "2.12.0" apply false + id "org.sonarqube" version "3.2.0" apply false + id 'com.github.ben-manes.versions' version '0.39.0' + id "nebula.optional-base" version "6.0.0" apply false id 'org.ajoberstar.grgit' version "$grgitVersion" - id "io.github.gradle-nexus.publish-plugin" version "1.0.0" + id "io.github.gradle-nexus.publish-plugin" version "1.1.0" id "com.github.breadmoirai.github-release" version "2.2.12" }