From abee786e59955b5c5f39e17669718fcb462072b6 Mon Sep 17 00:00:00 2001 From: Ondrej Zizka Date: Sat, 15 Nov 2025 22:31:22 +0100 Subject: [PATCH 001/593] Upgrade Gradle to 7.6.6 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b..0d01abe8d 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-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 109c90a7269183267f6d3b7e763deac7e20f56ea Mon Sep 17 00:00:00 2001 From: Ondrej Zizka Date: Sat, 15 Nov 2025 23:09:22 +0100 Subject: [PATCH 002/593] Rename .java to .kt --- jbake-core/src/main/java/org/jbake/app/{Asset.java => Asset.kt} | 0 .../java/org/jbake/app/{ContentStore.java => ContentStore.kt} | 0 .../src/main/java/org/jbake/app/{Crawler.java => Crawler.kt} | 0 jbake-core/src/main/java/org/jbake/app/{DBUtil.java => DBUtil.kt} | 0 .../java/org/jbake/app/{DocumentList.java => DocumentList.kt} | 0 .../src/main/java/org/jbake/app/{FileUtil.java => FileUtil.kt} | 0 .../java/org/jbake/app/{JBakeException.java => JBakeException.kt} | 0 jbake-core/src/main/java/org/jbake/app/{Oven.java => Oven.kt} | 0 jbake-core/src/main/java/org/jbake/app/{Parser.java => Parser.kt} | 0 .../src/main/java/org/jbake/app/{Renderer.java => Renderer.kt} | 0 .../src/main/java/org/jbake/app/{Utensils.java => Utensils.kt} | 0 .../org/jbake/app/{UtensilsFactory.java => UtensilsFactory.kt} | 0 .../src/main/java/org/jbake/app/{ZipUtil.java => ZipUtil.kt} | 0 .../jbake/app/configuration/{ConfigUtil.java => ConfigUtil.kt} | 0 ...efaultJBakeConfiguration.java => DefaultJBakeConfiguration.kt} | 0 .../{JBakeConfiguration.java => JBakeConfiguration.kt} | 0 ...BakeConfigurationFactory.java => JBakeConfigurationFactory.kt} | 0 ...ConfigurationInspector.java => JBakeConfigurationInspector.kt} | 0 .../org/jbake/app/configuration/{Property.java => Property.kt} | 0 .../app/configuration/{PropertyList.java => PropertyList.kt} | 0 .../java/org/jbake/launcher/{BakeWatcher.java => BakeWatcher.kt} | 0 .../src/main/java/org/jbake/launcher/{Baker.java => Baker.kt} | 0 .../{CustomFSChangeListener.java => CustomFSChangeListener.kt} | 0 .../src/main/java/org/jbake/launcher/{Init.java => Init.kt} | 0 .../java/org/jbake/launcher/{JettyServer.java => JettyServer.kt} | 0 .../org/jbake/launcher/{LaunchOptions.java => LaunchOptions.kt} | 0 .../src/main/java/org/jbake/launcher/{Main.java => Main.kt} | 0 .../java/org/jbake/launcher/{SystemExit.java => SystemExit.kt} | 0 .../main/java/org/jbake/model/{BaseModel.java => BaseModel.kt} | 0 .../java/org/jbake/model/{DocumentModel.java => DocumentModel.kt} | 0 .../org/jbake/model/{DocumentStatus.java => DocumentStatus.kt} | 0 .../model/{DocumentTypeListener.java => DocumentTypeListener.kt} | 0 .../jbake/model/{DocumentTypeUtils.java => DocumentTypeUtils.kt} | 0 .../java/org/jbake/model/{DocumentTypes.java => DocumentTypes.kt} | 0 .../org/jbake/model/{ModelAttributes.java => ModelAttributes.kt} | 0 .../jbake/parser/{AsciidoctorEngine.java => AsciidoctorEngine.kt} | 0 .../src/main/java/org/jbake/parser/{Engines.java => Engines.kt} | 0 .../java/org/jbake/parser/{ErrorEngine.java => ErrorEngine.kt} | 0 .../org/jbake/parser/{MarkdownEngine.java => MarkdownEngine.kt} | 0 .../java/org/jbake/parser/{MarkupEngine.java => MarkupEngine.kt} | 0 .../org/jbake/parser/{ParserContext.java => ParserContext.kt} | 0 .../java/org/jbake/parser/{ParserEngine.java => ParserEngine.kt} | 0 .../org/jbake/parser/{RawMarkupEngine.java => RawMarkupEngine.kt} | 0 .../main/java/org/jbake/parser/{YamlEngine.java => YamlEngine.kt} | 0 .../org/jbake/render/{ArchiveRenderer.java => ArchiveRenderer.kt} | 0 .../jbake/render/{DocumentsRenderer.java => DocumentsRenderer.kt} | 0 .../jbake/render/{Error404Renderer.java => Error404Renderer.kt} | 0 .../java/org/jbake/render/{FeedRenderer.java => FeedRenderer.kt} | 0 .../org/jbake/render/{IndexRenderer.java => IndexRenderer.kt} | 0 .../org/jbake/render/{RenderingTool.java => RenderingTool.kt} | 0 .../org/jbake/render/{SitemapRenderer.java => SitemapRenderer.kt} | 0 .../java/org/jbake/render/{TagsRenderer.java => TagsRenderer.kt} | 0 .../{AbstractTemplateEngine.java => AbstractTemplateEngine.kt} | 0 ...{DelegatingTemplateEngine.java => DelegatingTemplateEngine.kt} | 0 ...{FreemarkerTemplateEngine.java => FreemarkerTemplateEngine.kt} | 0 ...ovyMarkupTemplateEngine.java => GroovyMarkupTemplateEngine.kt} | 0 .../{GroovyTemplateEngine.java => GroovyTemplateEngine.kt} | 0 .../template/{JadeTemplateEngine.java => JadeTemplateEngine.kt} | 0 .../org/jbake/template/{ModelExtractor.java => ModelExtractor.kt} | 0 .../jbake/template/{ModelExtractors.java => ModelExtractors.kt} | 0 ...ntTypeListener.java => ModelExtractorsDocumentTypeListener.kt} | 0 ...oModelExtractorException.java => NoModelExtractorException.kt} | 0 .../{PebbleTemplateEngine.java => PebbleTemplateEngine.kt} | 0 .../template/{RenderingException.java => RenderingException.kt} | 0 .../{TemplateEngineAdapter.java => TemplateEngineAdapter.kt} | 0 .../jbake/template/{TemplateEngines.java => TemplateEngines.kt} | 0 .../{ThymeleafTemplateEngine.java => ThymeleafTemplateEngine.kt} | 0 .../model/{AllContentExtractor.java => AllContentExtractor.kt} | 0 .../template/model/{AllTagsExtractor.java => AllTagsExtractor.kt} | 0 .../org/jbake/template/model/{DBExtractor.java => DBExtractor.kt} | 0 .../jbake/template/model/{DataExtractor.java => DataExtractor.kt} | 0 ...ublishedContentExtractor.java => PublishedContentExtractor.kt} | 0 ...{PublishedCustomExtractor.java => PublishedCustomExtractor.kt} | 0 .../{PublishedDateExtractor.java => PublishedDateExtractor.kt} | 0 .../{PublishedPagesExtractor.java => PublishedPagesExtractor.kt} | 0 .../{PublishedPostsExtractor.java => PublishedPostsExtractor.kt} | 0 .../model/{TagPostsExtractor.java => TagPostsExtractor.kt} | 0 ...{TaggedDocumentsExtractor.java => TaggedDocumentsExtractor.kt} | 0 .../jbake/template/model/{TagsExtractor.java => TagsExtractor.kt} | 0 .../jbake/template/model/{TemplateModel.java => TemplateModel.kt} | 0 .../{TypedDocumentsExtractor.java => TypedDocumentsExtractor.kt} | 0 .../util/{ConfigurationPrinter.java => ConfigurationPrinter.kt} | 0 .../java/org/jbake/util/{DataFileUtil.java => DataFileUtil.kt} | 0 .../src/main/java/org/jbake/util/{DebugUtil.java => DebugUtil.kt} | 0 .../src/main/java/org/jbake/util/{HtmlUtil.java => HtmlUtil.kt} | 0 .../java/org/jbake/util/{PagingHelper.java => PagingHelper.kt} | 0 .../jbake/{FakeDocumentBuilder.java => FakeDocumentBuilder.kt} | 0 .../src/test/java/org/jbake/{TestUtils.java => TestUtils.kt} | 0 .../jbake/app/{AsciidocParserTest.java => AsciidocParserTest.kt} | 0 .../src/test/java/org/jbake/app/{AssetTest.java => AssetTest.kt} | 0 ...ntStoreIntegrationTest.java => ContentStoreIntegrationTest.kt} | 0 .../org/jbake/app/{ContentStoreTest.java => ContentStoreTest.kt} | 0 .../test/java/org/jbake/app/{CrawlerTest.java => CrawlerTest.kt} | 0 .../java/org/jbake/app/{DebugUtilTest.java => DebugUtilTest.kt} | 0 .../java/org/jbake/app/{FileUtilTest.java => FileUtilTest.kt} | 0 .../src/test/java/org/jbake/app/{InitTest.java => InitTest.kt} | 0 .../test/java/org/jbake/app/{LoggingTest.java => LoggingTest.kt} | 0 .../java/org/jbake/app/{MdParserTest.java => MdParserTest.kt} | 0 .../src/test/java/org/jbake/app/{OvenTest.java => OvenTest.kt} | 0 .../java/org/jbake/app/{PaginationTest.java => PaginationTest.kt} | 0 .../test/java/org/jbake/app/{ParserTest.java => ParserTest.kt} | 0 .../app/configuration/{ConfigUtilTest.java => ConfigUtilTest.kt} | 0 ...igurationFactoryTest.java => JBakeConfigurationFactoryTest.kt} | 0 ...ationInspectorTest.java => JBakeConfigurationInspectorTest.kt} | 0 .../configuration/{PropertyListTest.java => PropertyListTest.kt} | 0 ...eRenderingTest.java => AbstractTemplateEngineRenderingTest.kt} | 0 ...enderingTest.java => FreemarkerTemplateEngineRenderingTest.kt} | 0 ...deringTest.java => GroovyMarkupTemplateEngineRenderingTest.kt} | 0 ...ineRenderingTest.java => GroovyTemplateEngineRenderingTest.kt} | 0 ...ngineRenderingTest.java => JadeTemplateEngineRenderingTest.kt} | 0 ...ineRenderingTest.java => PebbleTemplateEngineRenderingTest.kt} | 0 ...RenderingTest.java => ThymeleafTemplateEngineRenderingTest.kt} | 0 .../jbake/launcher/{JettyServerTest.java => JettyServerTest.kt} | 0 .../launcher/{LaunchOptionsTest.java => LaunchOptionsTest.kt} | 0 .../test/java/org/jbake/launcher/{MainTest.java => MainTest.kt} | 0 .../jbake/model/{DocumentTypesTest.java => DocumentTypesTest.kt} | 0 .../render/{ArchiveRendererTest.java => ArchiveRendererTest.kt} | 0 .../{DocumentsRendererTest.java => DocumentsRendererTest.kt} | 0 .../render/{Error404RendererTest.java => Error404RendererTest.kt} | 0 .../jbake/render/{FeedRendererTest.java => FeedRendererTest.kt} | 0 .../jbake/render/{IndexRendererTest.java => IndexRendererTest.kt} | 0 .../java/org/jbake/render/{RendererTest.java => RendererTest.kt} | 0 .../jbake/render/{ServiceLoaderTest.java => ServiceLoaderTest.kt} | 0 .../render/{SitemapRendererTest.java => SitemapRendererTest.kt} | 0 .../jbake/render/{TagsRendererTest.java => TagsRendererTest.kt} | 0 ...kCompositeConfiguration.java => MockCompositeConfiguration.kt} | 0 ...stenerTest.java => ModelExtractorsDocumentTypeListenerTest.kt} | 0 .../template/{ModelExtractorsTest.java => ModelExtractorsTest.kt} | 0 ...{ConfigurationPrinterTest.java => ConfigurationPrinterTest.kt} | 0 .../java/org/jbake/util/{HtmlUtilTest.java => HtmlUtilTest.kt} | 0 .../org/jbake/util/{PagingHelperTest.java => PagingHelperTest.kt} | 0 .../java/org/jbake/{BinaryRunner.java => BinaryRunner.kt} | 0 .../jbake/{BuiltInProjectsTest.java => BuiltInProjectsTest.kt} | 0 .../org/jbake/{ProjectWebsiteTest.java => ProjectWebsiteTest.kt} | 0 .../java/org/jbake/maven/{GenerateMojo.java => GenerateMojo.kt} | 0 .../main/java/org/jbake/maven/{InlineMojo.java => InlineMojo.kt} | 0 .../src/main/java/org/jbake/maven/{SeedMojo.java => SeedMojo.kt} | 0 .../main/java/org/jbake/maven/{WatchMojo.java => WatchMojo.kt} | 0 .../java/org/jbake/maven/util/{DirWatcher.java => DirWatcher.kt} | 0 139 files changed, 0 insertions(+), 0 deletions(-) rename jbake-core/src/main/java/org/jbake/app/{Asset.java => Asset.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/{ContentStore.java => ContentStore.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/{Crawler.java => Crawler.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/{DBUtil.java => DBUtil.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/{DocumentList.java => DocumentList.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/{FileUtil.java => FileUtil.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/{JBakeException.java => JBakeException.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/{Oven.java => Oven.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/{Parser.java => Parser.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/{Renderer.java => Renderer.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/{Utensils.java => Utensils.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/{UtensilsFactory.java => UtensilsFactory.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/{ZipUtil.java => ZipUtil.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/configuration/{ConfigUtil.java => ConfigUtil.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/configuration/{DefaultJBakeConfiguration.java => DefaultJBakeConfiguration.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/configuration/{JBakeConfiguration.java => JBakeConfiguration.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/configuration/{JBakeConfigurationFactory.java => JBakeConfigurationFactory.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/configuration/{JBakeConfigurationInspector.java => JBakeConfigurationInspector.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/configuration/{Property.java => Property.kt} (100%) rename jbake-core/src/main/java/org/jbake/app/configuration/{PropertyList.java => PropertyList.kt} (100%) rename jbake-core/src/main/java/org/jbake/launcher/{BakeWatcher.java => BakeWatcher.kt} (100%) rename jbake-core/src/main/java/org/jbake/launcher/{Baker.java => Baker.kt} (100%) rename jbake-core/src/main/java/org/jbake/launcher/{CustomFSChangeListener.java => CustomFSChangeListener.kt} (100%) rename jbake-core/src/main/java/org/jbake/launcher/{Init.java => Init.kt} (100%) rename jbake-core/src/main/java/org/jbake/launcher/{JettyServer.java => JettyServer.kt} (100%) rename jbake-core/src/main/java/org/jbake/launcher/{LaunchOptions.java => LaunchOptions.kt} (100%) rename jbake-core/src/main/java/org/jbake/launcher/{Main.java => Main.kt} (100%) rename jbake-core/src/main/java/org/jbake/launcher/{SystemExit.java => SystemExit.kt} (100%) rename jbake-core/src/main/java/org/jbake/model/{BaseModel.java => BaseModel.kt} (100%) rename jbake-core/src/main/java/org/jbake/model/{DocumentModel.java => DocumentModel.kt} (100%) rename jbake-core/src/main/java/org/jbake/model/{DocumentStatus.java => DocumentStatus.kt} (100%) rename jbake-core/src/main/java/org/jbake/model/{DocumentTypeListener.java => DocumentTypeListener.kt} (100%) rename jbake-core/src/main/java/org/jbake/model/{DocumentTypeUtils.java => DocumentTypeUtils.kt} (100%) rename jbake-core/src/main/java/org/jbake/model/{DocumentTypes.java => DocumentTypes.kt} (100%) rename jbake-core/src/main/java/org/jbake/model/{ModelAttributes.java => ModelAttributes.kt} (100%) rename jbake-core/src/main/java/org/jbake/parser/{AsciidoctorEngine.java => AsciidoctorEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/parser/{Engines.java => Engines.kt} (100%) rename jbake-core/src/main/java/org/jbake/parser/{ErrorEngine.java => ErrorEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/parser/{MarkdownEngine.java => MarkdownEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/parser/{MarkupEngine.java => MarkupEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/parser/{ParserContext.java => ParserContext.kt} (100%) rename jbake-core/src/main/java/org/jbake/parser/{ParserEngine.java => ParserEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/parser/{RawMarkupEngine.java => RawMarkupEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/parser/{YamlEngine.java => YamlEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/render/{ArchiveRenderer.java => ArchiveRenderer.kt} (100%) rename jbake-core/src/main/java/org/jbake/render/{DocumentsRenderer.java => DocumentsRenderer.kt} (100%) rename jbake-core/src/main/java/org/jbake/render/{Error404Renderer.java => Error404Renderer.kt} (100%) rename jbake-core/src/main/java/org/jbake/render/{FeedRenderer.java => FeedRenderer.kt} (100%) rename jbake-core/src/main/java/org/jbake/render/{IndexRenderer.java => IndexRenderer.kt} (100%) rename jbake-core/src/main/java/org/jbake/render/{RenderingTool.java => RenderingTool.kt} (100%) rename jbake-core/src/main/java/org/jbake/render/{SitemapRenderer.java => SitemapRenderer.kt} (100%) rename jbake-core/src/main/java/org/jbake/render/{TagsRenderer.java => TagsRenderer.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{AbstractTemplateEngine.java => AbstractTemplateEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{DelegatingTemplateEngine.java => DelegatingTemplateEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{FreemarkerTemplateEngine.java => FreemarkerTemplateEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{GroovyMarkupTemplateEngine.java => GroovyMarkupTemplateEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{GroovyTemplateEngine.java => GroovyTemplateEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{JadeTemplateEngine.java => JadeTemplateEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{ModelExtractor.java => ModelExtractor.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{ModelExtractors.java => ModelExtractors.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{ModelExtractorsDocumentTypeListener.java => ModelExtractorsDocumentTypeListener.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{NoModelExtractorException.java => NoModelExtractorException.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{PebbleTemplateEngine.java => PebbleTemplateEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{RenderingException.java => RenderingException.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{TemplateEngineAdapter.java => TemplateEngineAdapter.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{TemplateEngines.java => TemplateEngines.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/{ThymeleafTemplateEngine.java => ThymeleafTemplateEngine.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/model/{AllContentExtractor.java => AllContentExtractor.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/model/{AllTagsExtractor.java => AllTagsExtractor.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/model/{DBExtractor.java => DBExtractor.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/model/{DataExtractor.java => DataExtractor.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/model/{PublishedContentExtractor.java => PublishedContentExtractor.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/model/{PublishedCustomExtractor.java => PublishedCustomExtractor.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/model/{PublishedDateExtractor.java => PublishedDateExtractor.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/model/{PublishedPagesExtractor.java => PublishedPagesExtractor.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/model/{PublishedPostsExtractor.java => PublishedPostsExtractor.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/model/{TagPostsExtractor.java => TagPostsExtractor.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/model/{TaggedDocumentsExtractor.java => TaggedDocumentsExtractor.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/model/{TagsExtractor.java => TagsExtractor.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/model/{TemplateModel.java => TemplateModel.kt} (100%) rename jbake-core/src/main/java/org/jbake/template/model/{TypedDocumentsExtractor.java => TypedDocumentsExtractor.kt} (100%) rename jbake-core/src/main/java/org/jbake/util/{ConfigurationPrinter.java => ConfigurationPrinter.kt} (100%) rename jbake-core/src/main/java/org/jbake/util/{DataFileUtil.java => DataFileUtil.kt} (100%) rename jbake-core/src/main/java/org/jbake/util/{DebugUtil.java => DebugUtil.kt} (100%) rename jbake-core/src/main/java/org/jbake/util/{HtmlUtil.java => HtmlUtil.kt} (100%) rename jbake-core/src/main/java/org/jbake/util/{PagingHelper.java => PagingHelper.kt} (100%) rename jbake-core/src/test/java/org/jbake/{FakeDocumentBuilder.java => FakeDocumentBuilder.kt} (100%) rename jbake-core/src/test/java/org/jbake/{TestUtils.java => TestUtils.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/{AsciidocParserTest.java => AsciidocParserTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/{AssetTest.java => AssetTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/{ContentStoreIntegrationTest.java => ContentStoreIntegrationTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/{ContentStoreTest.java => ContentStoreTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/{CrawlerTest.java => CrawlerTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/{DebugUtilTest.java => DebugUtilTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/{FileUtilTest.java => FileUtilTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/{InitTest.java => InitTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/{LoggingTest.java => LoggingTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/{MdParserTest.java => MdParserTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/{OvenTest.java => OvenTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/{PaginationTest.java => PaginationTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/{ParserTest.java => ParserTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/configuration/{ConfigUtilTest.java => ConfigUtilTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/configuration/{JBakeConfigurationFactoryTest.java => JBakeConfigurationFactoryTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/configuration/{JBakeConfigurationInspectorTest.java => JBakeConfigurationInspectorTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/configuration/{PropertyListTest.java => PropertyListTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/template/{AbstractTemplateEngineRenderingTest.java => AbstractTemplateEngineRenderingTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/template/{FreemarkerTemplateEngineRenderingTest.java => FreemarkerTemplateEngineRenderingTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/template/{GroovyMarkupTemplateEngineRenderingTest.java => GroovyMarkupTemplateEngineRenderingTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/template/{GroovyTemplateEngineRenderingTest.java => GroovyTemplateEngineRenderingTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/template/{JadeTemplateEngineRenderingTest.java => JadeTemplateEngineRenderingTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/template/{PebbleTemplateEngineRenderingTest.java => PebbleTemplateEngineRenderingTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/app/template/{ThymeleafTemplateEngineRenderingTest.java => ThymeleafTemplateEngineRenderingTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/launcher/{JettyServerTest.java => JettyServerTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/launcher/{LaunchOptionsTest.java => LaunchOptionsTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/launcher/{MainTest.java => MainTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/model/{DocumentTypesTest.java => DocumentTypesTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/render/{ArchiveRendererTest.java => ArchiveRendererTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/render/{DocumentsRendererTest.java => DocumentsRendererTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/render/{Error404RendererTest.java => Error404RendererTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/render/{FeedRendererTest.java => FeedRendererTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/render/{IndexRendererTest.java => IndexRendererTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/render/{RendererTest.java => RendererTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/render/{ServiceLoaderTest.java => ServiceLoaderTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/render/{SitemapRendererTest.java => SitemapRendererTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/render/{TagsRendererTest.java => TagsRendererTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/render/support/{MockCompositeConfiguration.java => MockCompositeConfiguration.kt} (100%) rename jbake-core/src/test/java/org/jbake/template/{ModelExtractorsDocumentTypeListenerTest.java => ModelExtractorsDocumentTypeListenerTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/template/{ModelExtractorsTest.java => ModelExtractorsTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/util/{ConfigurationPrinterTest.java => ConfigurationPrinterTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/util/{HtmlUtilTest.java => HtmlUtilTest.kt} (100%) rename jbake-core/src/test/java/org/jbake/util/{PagingHelperTest.java => PagingHelperTest.kt} (100%) rename jbake-dist/src/smoke-test/java/org/jbake/{BinaryRunner.java => BinaryRunner.kt} (100%) rename jbake-dist/src/smoke-test/java/org/jbake/{BuiltInProjectsTest.java => BuiltInProjectsTest.kt} (100%) rename jbake-dist/src/smoke-test/java/org/jbake/{ProjectWebsiteTest.java => ProjectWebsiteTest.kt} (100%) rename jbake-maven-plugin/src/main/java/org/jbake/maven/{GenerateMojo.java => GenerateMojo.kt} (100%) rename jbake-maven-plugin/src/main/java/org/jbake/maven/{InlineMojo.java => InlineMojo.kt} (100%) rename jbake-maven-plugin/src/main/java/org/jbake/maven/{SeedMojo.java => SeedMojo.kt} (100%) rename jbake-maven-plugin/src/main/java/org/jbake/maven/{WatchMojo.java => WatchMojo.kt} (100%) rename jbake-maven-plugin/src/main/java/org/jbake/maven/util/{DirWatcher.java => DirWatcher.kt} (100%) diff --git a/jbake-core/src/main/java/org/jbake/app/Asset.java b/jbake-core/src/main/java/org/jbake/app/Asset.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/Asset.java rename to jbake-core/src/main/java/org/jbake/app/Asset.kt diff --git a/jbake-core/src/main/java/org/jbake/app/ContentStore.java b/jbake-core/src/main/java/org/jbake/app/ContentStore.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/ContentStore.java rename to jbake-core/src/main/java/org/jbake/app/ContentStore.kt diff --git a/jbake-core/src/main/java/org/jbake/app/Crawler.java b/jbake-core/src/main/java/org/jbake/app/Crawler.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/Crawler.java rename to jbake-core/src/main/java/org/jbake/app/Crawler.kt diff --git a/jbake-core/src/main/java/org/jbake/app/DBUtil.java b/jbake-core/src/main/java/org/jbake/app/DBUtil.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/DBUtil.java rename to jbake-core/src/main/java/org/jbake/app/DBUtil.kt diff --git a/jbake-core/src/main/java/org/jbake/app/DocumentList.java b/jbake-core/src/main/java/org/jbake/app/DocumentList.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/DocumentList.java rename to jbake-core/src/main/java/org/jbake/app/DocumentList.kt diff --git a/jbake-core/src/main/java/org/jbake/app/FileUtil.java b/jbake-core/src/main/java/org/jbake/app/FileUtil.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/FileUtil.java rename to jbake-core/src/main/java/org/jbake/app/FileUtil.kt diff --git a/jbake-core/src/main/java/org/jbake/app/JBakeException.java b/jbake-core/src/main/java/org/jbake/app/JBakeException.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/JBakeException.java rename to jbake-core/src/main/java/org/jbake/app/JBakeException.kt diff --git a/jbake-core/src/main/java/org/jbake/app/Oven.java b/jbake-core/src/main/java/org/jbake/app/Oven.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/Oven.java rename to jbake-core/src/main/java/org/jbake/app/Oven.kt diff --git a/jbake-core/src/main/java/org/jbake/app/Parser.java b/jbake-core/src/main/java/org/jbake/app/Parser.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/Parser.java rename to jbake-core/src/main/java/org/jbake/app/Parser.kt diff --git a/jbake-core/src/main/java/org/jbake/app/Renderer.java b/jbake-core/src/main/java/org/jbake/app/Renderer.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/Renderer.java rename to jbake-core/src/main/java/org/jbake/app/Renderer.kt diff --git a/jbake-core/src/main/java/org/jbake/app/Utensils.java b/jbake-core/src/main/java/org/jbake/app/Utensils.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/Utensils.java rename to jbake-core/src/main/java/org/jbake/app/Utensils.kt diff --git a/jbake-core/src/main/java/org/jbake/app/UtensilsFactory.java b/jbake-core/src/main/java/org/jbake/app/UtensilsFactory.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/UtensilsFactory.java rename to jbake-core/src/main/java/org/jbake/app/UtensilsFactory.kt diff --git a/jbake-core/src/main/java/org/jbake/app/ZipUtil.java b/jbake-core/src/main/java/org/jbake/app/ZipUtil.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/ZipUtil.java rename to jbake-core/src/main/java/org/jbake/app/ZipUtil.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/configuration/ConfigUtil.java rename to jbake-core/src/main/java/org/jbake/app/configuration/ConfigUtil.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/configuration/DefaultJBakeConfiguration.java rename to jbake-core/src/main/java/org/jbake/app/configuration/DefaultJBakeConfiguration.kt diff --git a/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfiguration.java b/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfiguration.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfiguration.java rename to jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfiguration.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationFactory.java rename to jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationFactory.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationInspector.java rename to jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationInspector.kt diff --git a/jbake-core/src/main/java/org/jbake/app/configuration/Property.java b/jbake-core/src/main/java/org/jbake/app/configuration/Property.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/configuration/Property.java rename to jbake-core/src/main/java/org/jbake/app/configuration/Property.kt diff --git a/jbake-core/src/main/java/org/jbake/app/configuration/PropertyList.java b/jbake-core/src/main/java/org/jbake/app/configuration/PropertyList.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/app/configuration/PropertyList.java rename to jbake-core/src/main/java/org/jbake/app/configuration/PropertyList.kt diff --git a/jbake-core/src/main/java/org/jbake/launcher/BakeWatcher.java b/jbake-core/src/main/java/org/jbake/launcher/BakeWatcher.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/launcher/BakeWatcher.java rename to jbake-core/src/main/java/org/jbake/launcher/BakeWatcher.kt diff --git a/jbake-core/src/main/java/org/jbake/launcher/Baker.java b/jbake-core/src/main/java/org/jbake/launcher/Baker.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/launcher/Baker.java rename to jbake-core/src/main/java/org/jbake/launcher/Baker.kt diff --git a/jbake-core/src/main/java/org/jbake/launcher/CustomFSChangeListener.java b/jbake-core/src/main/java/org/jbake/launcher/CustomFSChangeListener.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/launcher/CustomFSChangeListener.java rename to jbake-core/src/main/java/org/jbake/launcher/CustomFSChangeListener.kt diff --git a/jbake-core/src/main/java/org/jbake/launcher/Init.java b/jbake-core/src/main/java/org/jbake/launcher/Init.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/launcher/Init.java rename to jbake-core/src/main/java/org/jbake/launcher/Init.kt diff --git a/jbake-core/src/main/java/org/jbake/launcher/JettyServer.java b/jbake-core/src/main/java/org/jbake/launcher/JettyServer.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/launcher/JettyServer.java rename to jbake-core/src/main/java/org/jbake/launcher/JettyServer.kt diff --git a/jbake-core/src/main/java/org/jbake/launcher/LaunchOptions.java b/jbake-core/src/main/java/org/jbake/launcher/LaunchOptions.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/launcher/LaunchOptions.java rename to jbake-core/src/main/java/org/jbake/launcher/LaunchOptions.kt diff --git a/jbake-core/src/main/java/org/jbake/launcher/Main.java b/jbake-core/src/main/java/org/jbake/launcher/Main.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/launcher/Main.java rename to jbake-core/src/main/java/org/jbake/launcher/Main.kt diff --git a/jbake-core/src/main/java/org/jbake/launcher/SystemExit.java b/jbake-core/src/main/java/org/jbake/launcher/SystemExit.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/launcher/SystemExit.java rename to jbake-core/src/main/java/org/jbake/launcher/SystemExit.kt diff --git a/jbake-core/src/main/java/org/jbake/model/BaseModel.java b/jbake-core/src/main/java/org/jbake/model/BaseModel.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/model/BaseModel.java rename to jbake-core/src/main/java/org/jbake/model/BaseModel.kt diff --git a/jbake-core/src/main/java/org/jbake/model/DocumentModel.java b/jbake-core/src/main/java/org/jbake/model/DocumentModel.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/model/DocumentModel.java rename to jbake-core/src/main/java/org/jbake/model/DocumentModel.kt diff --git a/jbake-core/src/main/java/org/jbake/model/DocumentStatus.java b/jbake-core/src/main/java/org/jbake/model/DocumentStatus.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/model/DocumentStatus.java rename to jbake-core/src/main/java/org/jbake/model/DocumentStatus.kt diff --git a/jbake-core/src/main/java/org/jbake/model/DocumentTypeListener.java b/jbake-core/src/main/java/org/jbake/model/DocumentTypeListener.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/model/DocumentTypeListener.java rename to jbake-core/src/main/java/org/jbake/model/DocumentTypeListener.kt diff --git a/jbake-core/src/main/java/org/jbake/model/DocumentTypeUtils.java b/jbake-core/src/main/java/org/jbake/model/DocumentTypeUtils.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/model/DocumentTypeUtils.java rename to jbake-core/src/main/java/org/jbake/model/DocumentTypeUtils.kt diff --git a/jbake-core/src/main/java/org/jbake/model/DocumentTypes.java b/jbake-core/src/main/java/org/jbake/model/DocumentTypes.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/model/DocumentTypes.java rename to jbake-core/src/main/java/org/jbake/model/DocumentTypes.kt diff --git a/jbake-core/src/main/java/org/jbake/model/ModelAttributes.java b/jbake-core/src/main/java/org/jbake/model/ModelAttributes.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/model/ModelAttributes.java rename to jbake-core/src/main/java/org/jbake/model/ModelAttributes.kt diff --git a/jbake-core/src/main/java/org/jbake/parser/AsciidoctorEngine.java b/jbake-core/src/main/java/org/jbake/parser/AsciidoctorEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/parser/AsciidoctorEngine.java rename to jbake-core/src/main/java/org/jbake/parser/AsciidoctorEngine.kt diff --git a/jbake-core/src/main/java/org/jbake/parser/Engines.java b/jbake-core/src/main/java/org/jbake/parser/Engines.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/parser/Engines.java rename to jbake-core/src/main/java/org/jbake/parser/Engines.kt diff --git a/jbake-core/src/main/java/org/jbake/parser/ErrorEngine.java b/jbake-core/src/main/java/org/jbake/parser/ErrorEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/parser/ErrorEngine.java rename to jbake-core/src/main/java/org/jbake/parser/ErrorEngine.kt diff --git a/jbake-core/src/main/java/org/jbake/parser/MarkdownEngine.java b/jbake-core/src/main/java/org/jbake/parser/MarkdownEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/parser/MarkdownEngine.java rename to jbake-core/src/main/java/org/jbake/parser/MarkdownEngine.kt diff --git a/jbake-core/src/main/java/org/jbake/parser/MarkupEngine.java b/jbake-core/src/main/java/org/jbake/parser/MarkupEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/parser/MarkupEngine.java rename to jbake-core/src/main/java/org/jbake/parser/MarkupEngine.kt diff --git a/jbake-core/src/main/java/org/jbake/parser/ParserContext.java b/jbake-core/src/main/java/org/jbake/parser/ParserContext.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/parser/ParserContext.java rename to jbake-core/src/main/java/org/jbake/parser/ParserContext.kt diff --git a/jbake-core/src/main/java/org/jbake/parser/ParserEngine.java b/jbake-core/src/main/java/org/jbake/parser/ParserEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/parser/ParserEngine.java rename to jbake-core/src/main/java/org/jbake/parser/ParserEngine.kt diff --git a/jbake-core/src/main/java/org/jbake/parser/RawMarkupEngine.java b/jbake-core/src/main/java/org/jbake/parser/RawMarkupEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/parser/RawMarkupEngine.java rename to jbake-core/src/main/java/org/jbake/parser/RawMarkupEngine.kt diff --git a/jbake-core/src/main/java/org/jbake/parser/YamlEngine.java b/jbake-core/src/main/java/org/jbake/parser/YamlEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/parser/YamlEngine.java rename to jbake-core/src/main/java/org/jbake/parser/YamlEngine.kt diff --git a/jbake-core/src/main/java/org/jbake/render/ArchiveRenderer.java b/jbake-core/src/main/java/org/jbake/render/ArchiveRenderer.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/render/ArchiveRenderer.java rename to jbake-core/src/main/java/org/jbake/render/ArchiveRenderer.kt diff --git a/jbake-core/src/main/java/org/jbake/render/DocumentsRenderer.java b/jbake-core/src/main/java/org/jbake/render/DocumentsRenderer.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/render/DocumentsRenderer.java rename to jbake-core/src/main/java/org/jbake/render/DocumentsRenderer.kt diff --git a/jbake-core/src/main/java/org/jbake/render/Error404Renderer.java b/jbake-core/src/main/java/org/jbake/render/Error404Renderer.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/render/Error404Renderer.java rename to jbake-core/src/main/java/org/jbake/render/Error404Renderer.kt diff --git a/jbake-core/src/main/java/org/jbake/render/FeedRenderer.java b/jbake-core/src/main/java/org/jbake/render/FeedRenderer.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/render/FeedRenderer.java rename to jbake-core/src/main/java/org/jbake/render/FeedRenderer.kt diff --git a/jbake-core/src/main/java/org/jbake/render/IndexRenderer.java b/jbake-core/src/main/java/org/jbake/render/IndexRenderer.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/render/IndexRenderer.java rename to jbake-core/src/main/java/org/jbake/render/IndexRenderer.kt diff --git a/jbake-core/src/main/java/org/jbake/render/RenderingTool.java b/jbake-core/src/main/java/org/jbake/render/RenderingTool.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/render/RenderingTool.java rename to jbake-core/src/main/java/org/jbake/render/RenderingTool.kt diff --git a/jbake-core/src/main/java/org/jbake/render/SitemapRenderer.java b/jbake-core/src/main/java/org/jbake/render/SitemapRenderer.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/render/SitemapRenderer.java rename to jbake-core/src/main/java/org/jbake/render/SitemapRenderer.kt diff --git a/jbake-core/src/main/java/org/jbake/render/TagsRenderer.java b/jbake-core/src/main/java/org/jbake/render/TagsRenderer.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/render/TagsRenderer.java rename to jbake-core/src/main/java/org/jbake/render/TagsRenderer.kt diff --git a/jbake-core/src/main/java/org/jbake/template/AbstractTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/AbstractTemplateEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/AbstractTemplateEngine.java rename to jbake-core/src/main/java/org/jbake/template/AbstractTemplateEngine.kt diff --git a/jbake-core/src/main/java/org/jbake/template/DelegatingTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/DelegatingTemplateEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/DelegatingTemplateEngine.java rename to jbake-core/src/main/java/org/jbake/template/DelegatingTemplateEngine.kt diff --git a/jbake-core/src/main/java/org/jbake/template/FreemarkerTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/FreemarkerTemplateEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/FreemarkerTemplateEngine.java rename to jbake-core/src/main/java/org/jbake/template/FreemarkerTemplateEngine.kt diff --git a/jbake-core/src/main/java/org/jbake/template/GroovyMarkupTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/GroovyMarkupTemplateEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/GroovyMarkupTemplateEngine.java rename to jbake-core/src/main/java/org/jbake/template/GroovyMarkupTemplateEngine.kt diff --git a/jbake-core/src/main/java/org/jbake/template/GroovyTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/GroovyTemplateEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/GroovyTemplateEngine.java rename to jbake-core/src/main/java/org/jbake/template/GroovyTemplateEngine.kt diff --git a/jbake-core/src/main/java/org/jbake/template/JadeTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/JadeTemplateEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/JadeTemplateEngine.java rename to jbake-core/src/main/java/org/jbake/template/JadeTemplateEngine.kt diff --git a/jbake-core/src/main/java/org/jbake/template/ModelExtractor.java b/jbake-core/src/main/java/org/jbake/template/ModelExtractor.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/ModelExtractor.java rename to jbake-core/src/main/java/org/jbake/template/ModelExtractor.kt diff --git a/jbake-core/src/main/java/org/jbake/template/ModelExtractors.java b/jbake-core/src/main/java/org/jbake/template/ModelExtractors.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/ModelExtractors.java rename to jbake-core/src/main/java/org/jbake/template/ModelExtractors.kt diff --git a/jbake-core/src/main/java/org/jbake/template/ModelExtractorsDocumentTypeListener.java b/jbake-core/src/main/java/org/jbake/template/ModelExtractorsDocumentTypeListener.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/ModelExtractorsDocumentTypeListener.java rename to jbake-core/src/main/java/org/jbake/template/ModelExtractorsDocumentTypeListener.kt diff --git a/jbake-core/src/main/java/org/jbake/template/NoModelExtractorException.java b/jbake-core/src/main/java/org/jbake/template/NoModelExtractorException.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/NoModelExtractorException.java rename to jbake-core/src/main/java/org/jbake/template/NoModelExtractorException.kt diff --git a/jbake-core/src/main/java/org/jbake/template/PebbleTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/PebbleTemplateEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/PebbleTemplateEngine.java rename to jbake-core/src/main/java/org/jbake/template/PebbleTemplateEngine.kt diff --git a/jbake-core/src/main/java/org/jbake/template/RenderingException.java b/jbake-core/src/main/java/org/jbake/template/RenderingException.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/RenderingException.java rename to jbake-core/src/main/java/org/jbake/template/RenderingException.kt diff --git a/jbake-core/src/main/java/org/jbake/template/TemplateEngineAdapter.java b/jbake-core/src/main/java/org/jbake/template/TemplateEngineAdapter.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/TemplateEngineAdapter.java rename to jbake-core/src/main/java/org/jbake/template/TemplateEngineAdapter.kt diff --git a/jbake-core/src/main/java/org/jbake/template/TemplateEngines.java b/jbake-core/src/main/java/org/jbake/template/TemplateEngines.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/TemplateEngines.java rename to jbake-core/src/main/java/org/jbake/template/TemplateEngines.kt diff --git a/jbake-core/src/main/java/org/jbake/template/ThymeleafTemplateEngine.java b/jbake-core/src/main/java/org/jbake/template/ThymeleafTemplateEngine.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/ThymeleafTemplateEngine.java rename to jbake-core/src/main/java/org/jbake/template/ThymeleafTemplateEngine.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/model/AllContentExtractor.java rename to jbake-core/src/main/java/org/jbake/template/model/AllContentExtractor.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/model/AllTagsExtractor.java rename to jbake-core/src/main/java/org/jbake/template/model/AllTagsExtractor.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/model/DBExtractor.java rename to jbake-core/src/main/java/org/jbake/template/model/DBExtractor.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/model/DataExtractor.java rename to jbake-core/src/main/java/org/jbake/template/model/DataExtractor.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/model/PublishedContentExtractor.java rename to jbake-core/src/main/java/org/jbake/template/model/PublishedContentExtractor.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/model/PublishedCustomExtractor.java rename to jbake-core/src/main/java/org/jbake/template/model/PublishedCustomExtractor.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/model/PublishedDateExtractor.java rename to jbake-core/src/main/java/org/jbake/template/model/PublishedDateExtractor.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/model/PublishedPagesExtractor.java rename to jbake-core/src/main/java/org/jbake/template/model/PublishedPagesExtractor.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/model/PublishedPostsExtractor.java rename to jbake-core/src/main/java/org/jbake/template/model/PublishedPostsExtractor.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/model/TagPostsExtractor.java rename to jbake-core/src/main/java/org/jbake/template/model/TagPostsExtractor.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/model/TaggedDocumentsExtractor.java rename to jbake-core/src/main/java/org/jbake/template/model/TaggedDocumentsExtractor.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/model/TagsExtractor.java rename to jbake-core/src/main/java/org/jbake/template/model/TagsExtractor.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/model/TemplateModel.java rename to jbake-core/src/main/java/org/jbake/template/model/TemplateModel.kt 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.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/template/model/TypedDocumentsExtractor.java rename to jbake-core/src/main/java/org/jbake/template/model/TypedDocumentsExtractor.kt diff --git a/jbake-core/src/main/java/org/jbake/util/ConfigurationPrinter.java b/jbake-core/src/main/java/org/jbake/util/ConfigurationPrinter.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/util/ConfigurationPrinter.java rename to jbake-core/src/main/java/org/jbake/util/ConfigurationPrinter.kt diff --git a/jbake-core/src/main/java/org/jbake/util/DataFileUtil.java b/jbake-core/src/main/java/org/jbake/util/DataFileUtil.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/util/DataFileUtil.java rename to jbake-core/src/main/java/org/jbake/util/DataFileUtil.kt diff --git a/jbake-core/src/main/java/org/jbake/util/DebugUtil.java b/jbake-core/src/main/java/org/jbake/util/DebugUtil.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/util/DebugUtil.java rename to jbake-core/src/main/java/org/jbake/util/DebugUtil.kt diff --git a/jbake-core/src/main/java/org/jbake/util/HtmlUtil.java b/jbake-core/src/main/java/org/jbake/util/HtmlUtil.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/util/HtmlUtil.java rename to jbake-core/src/main/java/org/jbake/util/HtmlUtil.kt diff --git a/jbake-core/src/main/java/org/jbake/util/PagingHelper.java b/jbake-core/src/main/java/org/jbake/util/PagingHelper.kt similarity index 100% rename from jbake-core/src/main/java/org/jbake/util/PagingHelper.java rename to jbake-core/src/main/java/org/jbake/util/PagingHelper.kt diff --git a/jbake-core/src/test/java/org/jbake/FakeDocumentBuilder.java b/jbake-core/src/test/java/org/jbake/FakeDocumentBuilder.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/FakeDocumentBuilder.java rename to jbake-core/src/test/java/org/jbake/FakeDocumentBuilder.kt diff --git a/jbake-core/src/test/java/org/jbake/TestUtils.java b/jbake-core/src/test/java/org/jbake/TestUtils.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/TestUtils.java rename to jbake-core/src/test/java/org/jbake/TestUtils.kt diff --git a/jbake-core/src/test/java/org/jbake/app/AsciidocParserTest.java b/jbake-core/src/test/java/org/jbake/app/AsciidocParserTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/AsciidocParserTest.java rename to jbake-core/src/test/java/org/jbake/app/AsciidocParserTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/AssetTest.java b/jbake-core/src/test/java/org/jbake/app/AssetTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/AssetTest.java rename to jbake-core/src/test/java/org/jbake/app/AssetTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/ContentStoreIntegrationTest.java b/jbake-core/src/test/java/org/jbake/app/ContentStoreIntegrationTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/ContentStoreIntegrationTest.java rename to jbake-core/src/test/java/org/jbake/app/ContentStoreIntegrationTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/ContentStoreTest.java b/jbake-core/src/test/java/org/jbake/app/ContentStoreTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/ContentStoreTest.java rename to jbake-core/src/test/java/org/jbake/app/ContentStoreTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/CrawlerTest.java b/jbake-core/src/test/java/org/jbake/app/CrawlerTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/CrawlerTest.java rename to jbake-core/src/test/java/org/jbake/app/CrawlerTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/DebugUtilTest.java b/jbake-core/src/test/java/org/jbake/app/DebugUtilTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/DebugUtilTest.java rename to jbake-core/src/test/java/org/jbake/app/DebugUtilTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/FileUtilTest.java b/jbake-core/src/test/java/org/jbake/app/FileUtilTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/FileUtilTest.java rename to jbake-core/src/test/java/org/jbake/app/FileUtilTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/InitTest.java b/jbake-core/src/test/java/org/jbake/app/InitTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/InitTest.java rename to jbake-core/src/test/java/org/jbake/app/InitTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/LoggingTest.java b/jbake-core/src/test/java/org/jbake/app/LoggingTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/LoggingTest.java rename to jbake-core/src/test/java/org/jbake/app/LoggingTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/MdParserTest.java b/jbake-core/src/test/java/org/jbake/app/MdParserTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/MdParserTest.java rename to jbake-core/src/test/java/org/jbake/app/MdParserTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/OvenTest.java b/jbake-core/src/test/java/org/jbake/app/OvenTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/OvenTest.java rename to jbake-core/src/test/java/org/jbake/app/OvenTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/PaginationTest.java b/jbake-core/src/test/java/org/jbake/app/PaginationTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/PaginationTest.java rename to jbake-core/src/test/java/org/jbake/app/PaginationTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/ParserTest.java b/jbake-core/src/test/java/org/jbake/app/ParserTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/ParserTest.java rename to jbake-core/src/test/java/org/jbake/app/ParserTest.kt 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.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/configuration/ConfigUtilTest.java rename to jbake-core/src/test/java/org/jbake/app/configuration/ConfigUtilTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/configuration/JBakeConfigurationFactoryTest.java b/jbake-core/src/test/java/org/jbake/app/configuration/JBakeConfigurationFactoryTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/configuration/JBakeConfigurationFactoryTest.java rename to jbake-core/src/test/java/org/jbake/app/configuration/JBakeConfigurationFactoryTest.kt 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.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/configuration/JBakeConfigurationInspectorTest.java rename to jbake-core/src/test/java/org/jbake/app/configuration/JBakeConfigurationInspectorTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/configuration/PropertyListTest.java b/jbake-core/src/test/java/org/jbake/app/configuration/PropertyListTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/configuration/PropertyListTest.java rename to jbake-core/src/test/java/org/jbake/app/configuration/PropertyListTest.kt 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.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/template/AbstractTemplateEngineRenderingTest.java rename to jbake-core/src/test/java/org/jbake/app/template/AbstractTemplateEngineRenderingTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/template/FreemarkerTemplateEngineRenderingTest.java b/jbake-core/src/test/java/org/jbake/app/template/FreemarkerTemplateEngineRenderingTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/template/FreemarkerTemplateEngineRenderingTest.java rename to jbake-core/src/test/java/org/jbake/app/template/FreemarkerTemplateEngineRenderingTest.kt 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.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/template/GroovyMarkupTemplateEngineRenderingTest.java rename to jbake-core/src/test/java/org/jbake/app/template/GroovyMarkupTemplateEngineRenderingTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/template/GroovyTemplateEngineRenderingTest.java b/jbake-core/src/test/java/org/jbake/app/template/GroovyTemplateEngineRenderingTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/template/GroovyTemplateEngineRenderingTest.java rename to jbake-core/src/test/java/org/jbake/app/template/GroovyTemplateEngineRenderingTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/template/JadeTemplateEngineRenderingTest.java b/jbake-core/src/test/java/org/jbake/app/template/JadeTemplateEngineRenderingTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/template/JadeTemplateEngineRenderingTest.java rename to jbake-core/src/test/java/org/jbake/app/template/JadeTemplateEngineRenderingTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/template/PebbleTemplateEngineRenderingTest.java b/jbake-core/src/test/java/org/jbake/app/template/PebbleTemplateEngineRenderingTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/template/PebbleTemplateEngineRenderingTest.java rename to jbake-core/src/test/java/org/jbake/app/template/PebbleTemplateEngineRenderingTest.kt diff --git a/jbake-core/src/test/java/org/jbake/app/template/ThymeleafTemplateEngineRenderingTest.java b/jbake-core/src/test/java/org/jbake/app/template/ThymeleafTemplateEngineRenderingTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/app/template/ThymeleafTemplateEngineRenderingTest.java rename to jbake-core/src/test/java/org/jbake/app/template/ThymeleafTemplateEngineRenderingTest.kt diff --git a/jbake-core/src/test/java/org/jbake/launcher/JettyServerTest.java b/jbake-core/src/test/java/org/jbake/launcher/JettyServerTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/launcher/JettyServerTest.java rename to jbake-core/src/test/java/org/jbake/launcher/JettyServerTest.kt diff --git a/jbake-core/src/test/java/org/jbake/launcher/LaunchOptionsTest.java b/jbake-core/src/test/java/org/jbake/launcher/LaunchOptionsTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/launcher/LaunchOptionsTest.java rename to jbake-core/src/test/java/org/jbake/launcher/LaunchOptionsTest.kt diff --git a/jbake-core/src/test/java/org/jbake/launcher/MainTest.java b/jbake-core/src/test/java/org/jbake/launcher/MainTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/launcher/MainTest.java rename to jbake-core/src/test/java/org/jbake/launcher/MainTest.kt diff --git a/jbake-core/src/test/java/org/jbake/model/DocumentTypesTest.java b/jbake-core/src/test/java/org/jbake/model/DocumentTypesTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/model/DocumentTypesTest.java rename to jbake-core/src/test/java/org/jbake/model/DocumentTypesTest.kt diff --git a/jbake-core/src/test/java/org/jbake/render/ArchiveRendererTest.java b/jbake-core/src/test/java/org/jbake/render/ArchiveRendererTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/render/ArchiveRendererTest.java rename to jbake-core/src/test/java/org/jbake/render/ArchiveRendererTest.kt diff --git a/jbake-core/src/test/java/org/jbake/render/DocumentsRendererTest.java b/jbake-core/src/test/java/org/jbake/render/DocumentsRendererTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/render/DocumentsRendererTest.java rename to jbake-core/src/test/java/org/jbake/render/DocumentsRendererTest.kt diff --git a/jbake-core/src/test/java/org/jbake/render/Error404RendererTest.java b/jbake-core/src/test/java/org/jbake/render/Error404RendererTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/render/Error404RendererTest.java rename to jbake-core/src/test/java/org/jbake/render/Error404RendererTest.kt diff --git a/jbake-core/src/test/java/org/jbake/render/FeedRendererTest.java b/jbake-core/src/test/java/org/jbake/render/FeedRendererTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/render/FeedRendererTest.java rename to jbake-core/src/test/java/org/jbake/render/FeedRendererTest.kt diff --git a/jbake-core/src/test/java/org/jbake/render/IndexRendererTest.java b/jbake-core/src/test/java/org/jbake/render/IndexRendererTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/render/IndexRendererTest.java rename to jbake-core/src/test/java/org/jbake/render/IndexRendererTest.kt diff --git a/jbake-core/src/test/java/org/jbake/render/RendererTest.java b/jbake-core/src/test/java/org/jbake/render/RendererTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/render/RendererTest.java rename to jbake-core/src/test/java/org/jbake/render/RendererTest.kt diff --git a/jbake-core/src/test/java/org/jbake/render/ServiceLoaderTest.java b/jbake-core/src/test/java/org/jbake/render/ServiceLoaderTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/render/ServiceLoaderTest.java rename to jbake-core/src/test/java/org/jbake/render/ServiceLoaderTest.kt diff --git a/jbake-core/src/test/java/org/jbake/render/SitemapRendererTest.java b/jbake-core/src/test/java/org/jbake/render/SitemapRendererTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/render/SitemapRendererTest.java rename to jbake-core/src/test/java/org/jbake/render/SitemapRendererTest.kt diff --git a/jbake-core/src/test/java/org/jbake/render/TagsRendererTest.java b/jbake-core/src/test/java/org/jbake/render/TagsRendererTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/render/TagsRendererTest.java rename to jbake-core/src/test/java/org/jbake/render/TagsRendererTest.kt diff --git a/jbake-core/src/test/java/org/jbake/render/support/MockCompositeConfiguration.java b/jbake-core/src/test/java/org/jbake/render/support/MockCompositeConfiguration.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/render/support/MockCompositeConfiguration.java rename to jbake-core/src/test/java/org/jbake/render/support/MockCompositeConfiguration.kt diff --git a/jbake-core/src/test/java/org/jbake/template/ModelExtractorsDocumentTypeListenerTest.java b/jbake-core/src/test/java/org/jbake/template/ModelExtractorsDocumentTypeListenerTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/template/ModelExtractorsDocumentTypeListenerTest.java rename to jbake-core/src/test/java/org/jbake/template/ModelExtractorsDocumentTypeListenerTest.kt diff --git a/jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.java b/jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.java rename to jbake-core/src/test/java/org/jbake/template/ModelExtractorsTest.kt diff --git a/jbake-core/src/test/java/org/jbake/util/ConfigurationPrinterTest.java b/jbake-core/src/test/java/org/jbake/util/ConfigurationPrinterTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/util/ConfigurationPrinterTest.java rename to jbake-core/src/test/java/org/jbake/util/ConfigurationPrinterTest.kt diff --git a/jbake-core/src/test/java/org/jbake/util/HtmlUtilTest.java b/jbake-core/src/test/java/org/jbake/util/HtmlUtilTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/util/HtmlUtilTest.java rename to jbake-core/src/test/java/org/jbake/util/HtmlUtilTest.kt diff --git a/jbake-core/src/test/java/org/jbake/util/PagingHelperTest.java b/jbake-core/src/test/java/org/jbake/util/PagingHelperTest.kt similarity index 100% rename from jbake-core/src/test/java/org/jbake/util/PagingHelperTest.java rename to jbake-core/src/test/java/org/jbake/util/PagingHelperTest.kt diff --git a/jbake-dist/src/smoke-test/java/org/jbake/BinaryRunner.java b/jbake-dist/src/smoke-test/java/org/jbake/BinaryRunner.kt similarity index 100% rename from jbake-dist/src/smoke-test/java/org/jbake/BinaryRunner.java rename to jbake-dist/src/smoke-test/java/org/jbake/BinaryRunner.kt diff --git a/jbake-dist/src/smoke-test/java/org/jbake/BuiltInProjectsTest.java b/jbake-dist/src/smoke-test/java/org/jbake/BuiltInProjectsTest.kt similarity index 100% rename from jbake-dist/src/smoke-test/java/org/jbake/BuiltInProjectsTest.java rename to jbake-dist/src/smoke-test/java/org/jbake/BuiltInProjectsTest.kt diff --git a/jbake-dist/src/smoke-test/java/org/jbake/ProjectWebsiteTest.java b/jbake-dist/src/smoke-test/java/org/jbake/ProjectWebsiteTest.kt similarity index 100% rename from jbake-dist/src/smoke-test/java/org/jbake/ProjectWebsiteTest.java rename to jbake-dist/src/smoke-test/java/org/jbake/ProjectWebsiteTest.kt diff --git a/jbake-maven-plugin/src/main/java/org/jbake/maven/GenerateMojo.java b/jbake-maven-plugin/src/main/java/org/jbake/maven/GenerateMojo.kt similarity index 100% rename from jbake-maven-plugin/src/main/java/org/jbake/maven/GenerateMojo.java rename to jbake-maven-plugin/src/main/java/org/jbake/maven/GenerateMojo.kt diff --git a/jbake-maven-plugin/src/main/java/org/jbake/maven/InlineMojo.java b/jbake-maven-plugin/src/main/java/org/jbake/maven/InlineMojo.kt similarity index 100% rename from jbake-maven-plugin/src/main/java/org/jbake/maven/InlineMojo.java rename to jbake-maven-plugin/src/main/java/org/jbake/maven/InlineMojo.kt diff --git a/jbake-maven-plugin/src/main/java/org/jbake/maven/SeedMojo.java b/jbake-maven-plugin/src/main/java/org/jbake/maven/SeedMojo.kt similarity index 100% rename from jbake-maven-plugin/src/main/java/org/jbake/maven/SeedMojo.java rename to jbake-maven-plugin/src/main/java/org/jbake/maven/SeedMojo.kt diff --git a/jbake-maven-plugin/src/main/java/org/jbake/maven/WatchMojo.java b/jbake-maven-plugin/src/main/java/org/jbake/maven/WatchMojo.kt similarity index 100% rename from jbake-maven-plugin/src/main/java/org/jbake/maven/WatchMojo.java rename to jbake-maven-plugin/src/main/java/org/jbake/maven/WatchMojo.kt diff --git a/jbake-maven-plugin/src/main/java/org/jbake/maven/util/DirWatcher.java b/jbake-maven-plugin/src/main/java/org/jbake/maven/util/DirWatcher.kt similarity index 100% rename from jbake-maven-plugin/src/main/java/org/jbake/maven/util/DirWatcher.java rename to jbake-maven-plugin/src/main/java/org/jbake/maven/util/DirWatcher.kt From 8e0a0483bf0c1572ad53342ee3ed4b2efb3411d6 Mon Sep 17 00:00:00 2001 From: Ondrej Zizka Date: Sat, 15 Nov 2025 23:09:22 +0100 Subject: [PATCH 003/593] Automatic conversion to Kotlin --- build.gradle | 9 + jbake-core/build.gradle | 7 + .../src/main/java/org/jbake/app/Asset.kt | 177 ++-- .../main/java/org/jbake/app/ContentStore.kt | 503 +++++----- .../src/main/java/org/jbake/app/Crawler.kt | 354 +++---- .../src/main/java/org/jbake/app/DBUtil.kt | 74 +- .../main/java/org/jbake/app/DocumentList.kt | 25 +- .../src/main/java/org/jbake/app/FileUtil.kt | 350 ++++--- .../main/java/org/jbake/app/JBakeException.kt | 43 +- .../src/main/java/org/jbake/app/Oven.kt | 260 +++-- .../src/main/java/org/jbake/app/Parser.kt | 53 +- .../src/main/java/org/jbake/app/Renderer.kt | 510 +++++----- .../src/main/java/org/jbake/app/Utensils.kt | 61 +- .../java/org/jbake/app/UtensilsFactory.kt | 40 +- .../src/main/java/org/jbake/app/ZipUtil.kt | 49 +- .../org/jbake/app/configuration/ConfigUtil.kt | 177 ++-- .../DefaultJBakeConfiguration.kt | 750 +++++++-------- .../app/configuration/JBakeConfiguration.kt | 250 +++-- .../JBakeConfigurationFactory.kt | 155 +-- .../JBakeConfigurationInspector.kt | 100 +- .../org/jbake/app/configuration/Property.kt | 78 +- .../jbake/app/configuration/PropertyList.kt | 319 ++++--- .../java/org/jbake/launcher/BakeWatcher.kt | 75 +- .../src/main/java/org/jbake/launcher/Baker.kt | 55 +- .../jbake/launcher/CustomFSChangeListener.kt | 64 +- .../src/main/java/org/jbake/launcher/Init.kt | 73 +- .../java/org/jbake/launcher/JettyServer.kt | 134 +-- .../java/org/jbake/launcher/LaunchOptions.kt | 198 ++-- .../src/main/java/org/jbake/launcher/Main.kt | 233 +++-- .../java/org/jbake/launcher/SystemExit.kt | 9 +- .../main/java/org/jbake/model/BaseModel.kt | 23 +- .../java/org/jbake/model/DocumentModel.kt | 208 ++-- .../java/org/jbake/model/DocumentStatus.kt | 4 +- .../org/jbake/model/DocumentTypeListener.kt | 7 +- .../java/org/jbake/model/DocumentTypeUtils.kt | 40 +- .../java/org/jbake/model/DocumentTypes.kt | 84 +- .../java/org/jbake/model/ModelAttributes.kt | 86 +- .../org/jbake/parser/AsciidoctorEngine.kt | 245 +++-- .../src/main/java/org/jbake/parser/Engines.kt | 211 ++-- .../main/java/org/jbake/parser/ErrorEngine.kt | 38 +- .../java/org/jbake/parser/MarkdownEngine.kt | 79 +- .../java/org/jbake/parser/MarkupEngine.kt | 316 +++--- .../java/org/jbake/parser/ParserContext.kt | 121 +-- .../java/org/jbake/parser/ParserEngine.kt | 25 +- .../java/org/jbake/parser/RawMarkupEngine.kt | 5 +- .../main/java/org/jbake/parser/YamlEngine.kt | 99 +- .../java/org/jbake/render/ArchiveRenderer.kt | 58 +- .../org/jbake/render/DocumentsRenderer.kt | 136 +-- .../java/org/jbake/render/Error404Renderer.kt | 52 +- .../java/org/jbake/render/FeedRenderer.kt | 53 +- .../java/org/jbake/render/IndexRenderer.kt | 57 +- .../java/org/jbake/render/RenderingTool.kt | 35 +- .../java/org/jbake/render/SitemapRenderer.kt | 53 +- .../java/org/jbake/render/TagsRenderer.kt | 51 +- .../jbake/template/AbstractTemplateEngine.kt | 66 +- .../template/DelegatingTemplateEngine.kt | 96 +- .../template/FreemarkerTemplateEngine.kt | 190 ++-- .../template/GroovyMarkupTemplateEngine.kt | 121 +-- .../jbake/template/GroovyTemplateEngine.kt | 134 +-- .../org/jbake/template/JadeTemplateEngine.kt | 159 +-- .../java/org/jbake/template/ModelExtractor.kt | 15 +- .../org/jbake/template/ModelExtractors.kt | 211 ++-- .../ModelExtractorsDocumentTypeListener.kt | 12 +- .../template/NoModelExtractorException.kt | 18 +- .../jbake/template/PebbleTemplateEngine.kt | 93 +- .../org/jbake/template/RenderingException.kt | 16 +- .../jbake/template/TemplateEngineAdapter.kt | 17 +- .../org/jbake/template/TemplateEngines.kt | 175 ++-- .../jbake/template/ThymeleafTemplateEngine.kt | 223 +++-- .../template/model/AllContentExtractor.kt | 40 +- .../jbake/template/model/AllTagsExtractor.kt | 20 +- .../org/jbake/template/model/DBExtractor.kt | 19 +- .../org/jbake/template/model/DataExtractor.kt | 29 +- .../model/PublishedContentExtractor.kt | 35 +- .../model/PublishedCustomExtractor.kt | 28 +- .../template/model/PublishedDateExtractor.kt | 21 +- .../template/model/PublishedPagesExtractor.kt | 21 +- .../template/model/PublishedPostsExtractor.kt | 23 +- .../jbake/template/model/TagPostsExtractor.kt | 27 +- .../model/TaggedDocumentsExtractor.kt | 27 +- .../org/jbake/template/model/TagsExtractor.kt | 66 +- .../org/jbake/template/model/TemplateModel.kt | 107 +-- .../template/model/TypedDocumentsExtractor.kt | 30 +- .../org/jbake/util/ConfigurationPrinter.kt | 77 +- .../main/java/org/jbake/util/DataFileUtil.kt | 46 +- .../src/main/java/org/jbake/util/DebugUtil.kt | 17 +- .../src/main/java/org/jbake/util/HtmlUtil.kt | 90 +- .../main/java/org/jbake/util/PagingHelper.kt | 56 +- .../java/org/jbake/FakeDocumentBuilder.kt | 130 ++- .../src/test/java/org/jbake/TestUtils.kt | 67 +- .../java/org/jbake/app/AsciidocParserTest.kt | 372 ++++---- .../src/test/java/org/jbake/app/AssetTest.kt | 413 ++++---- .../jbake/app/ContentStoreIntegrationTest.kt | 112 +-- .../java/org/jbake/app/ContentStoreTest.kt | 187 ++-- .../test/java/org/jbake/app/CrawlerTest.kt | 163 ++-- .../test/java/org/jbake/app/DebugUtilTest.kt | 58 +- .../test/java/org/jbake/app/FileUtilTest.kt | 83 +- .../src/test/java/org/jbake/app/InitTest.kt | 105 +- .../test/java/org/jbake/app/LoggingTest.kt | 57 +- .../test/java/org/jbake/app/MdParserTest.kt | 903 +++++++++--------- .../src/test/java/org/jbake/app/OvenTest.kt | 334 +++---- .../test/java/org/jbake/app/PaginationTest.kt | 87 +- .../src/test/java/org/jbake/app/ParserTest.kt | 585 ++++++------ .../jbake/app/configuration/ConfigUtilTest.kt | 532 ++++++----- .../JBakeConfigurationFactoryTest.kt | 191 ++-- .../JBakeConfigurationInspectorTest.kt | 241 ++--- .../app/configuration/PropertyListTest.kt | 25 +- .../AbstractTemplateEngineRenderingTest.kt | 386 ++++---- .../FreemarkerTemplateEngineRenderingTest.kt | 72 +- ...GroovyMarkupTemplateEngineRenderingTest.kt | 135 +-- .../GroovyTemplateEngineRenderingTest.kt | 14 +- .../JadeTemplateEngineRenderingTest.kt | 9 +- .../PebbleTemplateEngineRenderingTest.kt | 10 +- .../ThymeleafTemplateEngineRenderingTest.kt | 10 +- .../org/jbake/launcher/JettyServerTest.kt | 106 +- .../org/jbake/launcher/LaunchOptionsTest.kt | 197 ++-- .../test/java/org/jbake/launcher/MainTest.kt | 414 ++++---- .../java/org/jbake/model/DocumentTypesTest.kt | 70 +- .../org/jbake/render/ArchiveRendererTest.kt | 132 +-- .../org/jbake/render/DocumentsRendererTest.kt | 296 +++--- .../org/jbake/render/Error404RendererTest.kt | 130 +-- .../java/org/jbake/render/FeedRendererTest.kt | 132 +-- .../org/jbake/render/IndexRendererTest.kt | 157 +-- .../java/org/jbake/render/RendererTest.kt | 99 +- .../org/jbake/render/ServiceLoaderTest.kt | 52 +- .../org/jbake/render/SitemapRendererTest.kt | 132 +-- .../java/org/jbake/render/TagsRendererTest.kt | 147 ++- .../support/MockCompositeConfiguration.kt | 38 +- ...ModelExtractorsDocumentTypeListenerTest.kt | 25 +- .../org/jbake/template/ModelExtractorsTest.kt | 85 +- .../jbake/util/ConfigurationPrinterTest.kt | 68 +- .../test/java/org/jbake/util/HtmlUtilTest.kt | 213 ++--- .../java/org/jbake/util/PagingHelperTest.kt | 71 +- jbake-dist/build.gradle | 8 + .../smoke-test/java/org/jbake/BinaryRunner.kt | 48 +- .../java/org/jbake/BuiltInProjectsTest.kt | 122 +-- .../java/org/jbake/ProjectWebsiteTest.kt | 105 +- jbake-maven-plugin/build.gradle | 8 + .../main/java/org/jbake/maven/GenerateMojo.kt | 121 +-- .../main/java/org/jbake/maven/InlineMojo.kt | 126 ++- .../src/main/java/org/jbake/maven/SeedMojo.kt | 175 ++-- .../main/java/org/jbake/maven/WatchMojo.kt | 167 ++-- .../java/org/jbake/maven/util/DirWatcher.kt | 104 +- settings.gradle | 8 + 144 files changed, 9147 insertions(+), 9286 deletions(-) diff --git a/build.gradle b/build.gradle index 9a3787aa2..41aaf7532 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ plugins { id 'org.jreleaser' version "$jreleaserVersion" apply false id "eclipse" id "idea" + id 'org.jetbrains.kotlin.jvm' } def buildTimeAndDate = grgit.head().dateTime @@ -46,3 +47,11 @@ dependencyUpdates.resolutionStrategy { } } } +repositories { + mavenCentral() +} +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" +} +compileKotlin { +} diff --git a/jbake-core/build.gradle b/jbake-core/build.gradle index 626a11a6b..6f27020c0 100644 --- a/jbake-core/build.gradle +++ b/jbake-core/build.gradle @@ -4,6 +4,7 @@ plugins { id "org.jbake.convention.java-common" id 'java-library' id 'nebula.optional-base' version "$optionalBaseVersion" + id 'org.jetbrains.kotlin.jvm' } apply from: "$rootDir/gradle/maven-publishing.gradle" @@ -55,6 +56,7 @@ dependencies { // cli specific dependencies implementation "org.eclipse.jetty:jetty-server:$jettyServerVersion", optional implementation "info.picocli:picocli:$picocli", optional + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } processResources { @@ -64,3 +66,8 @@ processResources { gitHash: grgit.head().abbreviatedId } } +repositories { + mavenCentral() +} +compileKotlin { +} diff --git a/jbake-core/src/main/java/org/jbake/app/Asset.kt b/jbake-core/src/main/java/org/jbake/app/Asset.kt index 7eefa962f..8179b4c4a 100644 --- a/jbake-core/src/main/java/org/jbake/app/Asset.kt +++ b/jbake-core/src/main/java/org/jbake/app/Asset.kt @@ -1,59 +1,46 @@ -package org.jbake.app; - -import org.apache.commons.configuration2.CompositeConfiguration; -import org.apache.commons.io.FileUtils; -import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.app.configuration.JBakeConfigurationFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.FileFilter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; +package org.jbake.app + +import org.apache.commons.configuration2.CompositeConfiguration +import org.apache.commons.io.FileUtils +import org.jbake.app.configuration.JBakeConfiguration +import org.jbake.app.configuration.JBakeConfigurationFactory +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.io.File +import java.io.FileFilter +import java.io.IOException +import java.util.* /** * Deals with assets (static files such as css, js or image files). * - * @author Jonathan Bullock jonbullock@gmail.com + * @author Jonathan Bullock [jonbullock@gmail.com](mailto:jonbullock@gmail.com) */ -public class Asset { - - private static final Logger LOGGER = LoggerFactory.getLogger(Asset.class); - private final List errors = new LinkedList<>(); - private final JBakeConfiguration config; +class Asset { + private val errors: MutableList = LinkedList() + private val config: JBakeConfiguration /** * @param source Source file for the asset * @param destination Destination (target) directory for asset file * @param config Project configuration - * @deprecated Use {@link #Asset(JBakeConfiguration)} instead. - * Compatibility constructor. - * Creates an instance of Asset. */ - @Deprecated - public Asset(File source, File destination, CompositeConfiguration config) { - this.config = new JBakeConfigurationFactory().createDefaultJbakeConfiguration(source, destination, config); + @Deprecated( + """Use {@link #Asset(JBakeConfiguration)} instead. + Compatibility constructor. + Creates an instance of Asset.""" + ) + constructor(source: File?, destination: File?, config: CompositeConfiguration?) { + this.config = JBakeConfigurationFactory().createDefaultJbakeConfiguration(source, destination, config) } /** * Creates an instance of Asset. * - * @param config The project configuration. @see{{@link JBakeConfiguration}} + * @param config The project configuration. @see{[JBakeConfiguration]} */ - public Asset(JBakeConfiguration config) { - this.config = config; - } - - /** - * Copy all files from assets folder to destination folder - * read from configuration - */ - public void copy() { - copy(config.getAssetFolder()); + constructor(config: JBakeConfiguration) { + this.config = config } /** @@ -61,14 +48,21 @@ public class Asset { * * @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)); + /** + * Copy all files from assets folder to destination folder + * read from configuration + */ + @JvmOverloads + fun copy(path: File = config.assetFolder) { + val filter: FileFilter = object : FileFilter { + override fun accept(file: File): Boolean { + return (!config.assetIgnoreHidden || !file.isHidden()) && (file.isFile() || FileUtil.directoryOnlyIfNotIgnored( + file, + config + )) } - }; - copy(path, config.getDestinationFolder(), filter); + } + copy(path, config.destinationFolder, filter) } /** @@ -76,17 +70,18 @@ public class Asset { * * @param asset The asset file to copy */ - public void copySingleFile(File asset) { + fun copySingleFile(asset: File) { try { - if ( !asset.isDirectory() ) { - String targetPath = config.getDestinationFolder().getCanonicalPath() + File.separatorChar + assetSubPath(asset); - LOGGER.info("Copying single asset file to [{}]", targetPath); - copyFile(asset, new File(targetPath)); + if (!asset.isDirectory()) { + val targetPath = + (config.destinationFolder!!.getCanonicalPath() + File.separatorChar).toString() + assetSubPath(asset) + LOGGER.info("Copying single asset file to [{}]", targetPath) + copyFile(asset, File(targetPath)) } else { - LOGGER.info("Skip copying single asset file [{}]. Is a directory.", asset.getPath()); + LOGGER.info("Skip copying single asset file [{}]. Is a directory.", asset.getPath()) } - } catch (IOException io) { - LOGGER.error("Failed to copy the asset file.", io); + } catch (io: IOException) { + LOGGER.error("Failed to copy the asset file.", io) } } @@ -95,22 +90,23 @@ public class Asset { * @param path to the file to validate. * @return true if the path provided points to a file in the asset folder. */ - public boolean isAssetFile(File path) { - boolean isAsset = false; + fun isAssetFile(path: File): Boolean { + var 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)) { + if (FileUtil.isFileInDirectory(path, config.assetFolder)) { + isAsset = true + } else if (FileUtil.isFileInDirectory(path, config.contentFolder) + && FileUtil.getNotContentFileFilter(config).accept(path) + ) { + isAsset = true } } - } catch (IOException ioe) { - LOGGER.error("Unable to determine the path to asset file {}", path.getPath(), ioe); + } catch (ioe: IOException) { + LOGGER.error("Unable to determine the path to asset file {}", path.getPath(), ioe) } - return isAsset; + return isAsset } /** @@ -118,8 +114,8 @@ public class Asset { * * @param path of the content directory */ - public void copyAssetsFromContent(File path) { - copy(path, config.getDestinationFolder(), FileUtil.getNotContentFileFilter(config)); + fun copyAssetsFromContent(path: File) { + copy(path, config.destinationFolder, FileUtil.getNotContentFileFilter(config)) } /** @@ -127,40 +123,49 @@ public class Asset { * * @return a list of errors. */ - public List getErrors() { - return new ArrayList<>(errors); + fun getErrors(): MutableList { + return ArrayList(errors) } - private String assetSubPath(File asset) throws IOException { + @Throws(IOException::class) + private fun assetSubPath(asset: File): String { // First, strip asset folder from file path - String targetFolder = asset.getCanonicalPath().replace(config.getAssetFolder().getCanonicalPath() + File.separatorChar, ""); + var targetFolder = + asset.getCanonicalPath().replace(config.assetFolder!!.getCanonicalPath() + File.separatorChar, "") // And just to be sure, let's also remove the content folder, as some assets are copied from here. - targetFolder = targetFolder.replace(config.getContentFolder().getCanonicalPath() + File.separatorChar, ""); - return targetFolder; + targetFolder = targetFolder.replace(config.contentFolder!!.getCanonicalPath() + File.separatorChar, "") + return targetFolder } - private void copy(File sourceFolder, File targetFolder, final FileFilter filter) { - final File[] assets = sourceFolder.listFiles(filter); + private fun copy(sourceFolder: File, targetFolder: File?, filter: FileFilter?) { + val assets = sourceFolder.listFiles(filter) if (assets != null) { - Arrays.sort(assets); - for (File asset : assets) { - final File target = new File(targetFolder, asset.getName()); + Arrays.sort(assets) + for (asset in assets) { + val target = File(targetFolder, asset.getName()) if (asset.isFile()) { - copyFile(asset, target); + copyFile(asset, target) } else if (asset.isDirectory()) { - copy(asset, target, filter); + copy(asset, target, filter) } } } } - private void copyFile(File asset, File targetFolder) { + private fun copyFile(asset: File, targetFolder: File) { try { - FileUtils.copyFile(asset, targetFolder); - LOGGER.info("Copying [{}]... done!", asset.getPath()); - } catch (IOException|IllegalArgumentException e) { - LOGGER.error("Copying [{}]... failed!", asset.getPath(), e); - errors.add(e); + FileUtils.copyFile(asset, targetFolder) + LOGGER.info("Copying [{}]... done!", asset.getPath()) + } catch (e: IOException) { + LOGGER.error("Copying [{}]... failed!", asset.getPath(), e) + errors.add(e) + } catch (e: IllegalArgumentException) { + LOGGER.error("Copying [{}]... failed!", asset.getPath(), e) + errors.add(e) } } + + companion object { + private val LOGGER: Logger = LoggerFactory.getLogger(Asset::class.java) + } } diff --git a/jbake-core/src/main/java/org/jbake/app/ContentStore.kt b/jbake-core/src/main/java/org/jbake/app/ContentStore.kt index 352e97ae5..fdf5376b1 100644 --- a/jbake-core/src/main/java/org/jbake/app/ContentStore.kt +++ b/jbake-core/src/main/java/org/jbake/app/ContentStore.kt @@ -21,399 +21,388 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package org.jbake.app; - -import com.orientechnologies.common.log.OLogManager; -import com.orientechnologies.orient.core.Orient; -import com.orientechnologies.orient.core.db.ODatabaseSession; -import com.orientechnologies.orient.core.db.ODatabaseType; -import com.orientechnologies.orient.core.db.OrientDB; -import com.orientechnologies.orient.core.db.OrientDBConfig; -import com.orientechnologies.orient.core.metadata.schema.OClass; -import com.orientechnologies.orient.core.metadata.schema.OSchema; -import com.orientechnologies.orient.core.metadata.schema.OType; -import com.orientechnologies.orient.core.record.OElement; -import com.orientechnologies.orient.core.sql.executor.OResultSet; -import org.jbake.model.DocumentModel; -import org.jbake.model.DocumentTypes; -import org.jbake.model.ModelAttributes; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; +package org.jbake.app + +import com.orientechnologies.common.log.OLogManager +import com.orientechnologies.orient.core.Orient +import com.orientechnologies.orient.core.db.ODatabaseSession +import com.orientechnologies.orient.core.db.ODatabaseType +import com.orientechnologies.orient.core.db.OrientDB +import com.orientechnologies.orient.core.db.OrientDBConfig +import com.orientechnologies.orient.core.metadata.schema.OClass +import com.orientechnologies.orient.core.metadata.schema.OSchema +import com.orientechnologies.orient.core.metadata.schema.OType +import com.orientechnologies.orient.core.record.ORecord +import org.jbake.model.DocumentModel +import org.jbake.model.DocumentTypes +import org.jbake.model.ModelAttributes +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.io.File +import java.util.* /** * @author jdlee */ -public class ContentStore { - - private static final String STATEMENT_GET_PUBLISHED_POST_BY_TYPE_AND_TAG = "select * from Documents where status='published' and type='%s' and ? in tags order by date desc"; - private static final String STATEMENT_GET_DOCUMENT_STATUS_BY_DOCTYPE_AND_URI = "select sha1,rendered from Documents where sourceuri=?"; - private static final String STATEMENT_GET_PUBLISHED_COUNT = "select count(*) as count from Documents where status='published' and type='%s'"; - private static final String STATEMENT_MARK_CONTENT_AS_RENDERD = "update Documents set rendered=true where rendered=false and type='%s' and sourceuri='%s' and cached=true"; - private static final String STATEMENT_DELETE_DOCTYPE_BY_SOURCEURI = "delete from Documents where sourceuri=?"; - private static final String STATEMENT_GET_UNDRENDERED_CONTENT = "select * from Documents where rendered=false order by date desc"; - private static final String STATEMENT_GET_SIGNATURE_FOR_TEMPLATES = "select sha1 from Signatures where key='templates'"; - private static final String STATEMENT_GET_TAGS_FROM_PUBLISHED_POSTS = "select tags from Documents where status='published' and type='post'"; - private static final String STATEMENT_GET_ALL_CONTENT_BY_DOCTYPE = "select * from Documents where type='%s' order by date desc"; - private static final String STATEMENT_GET_PUBLISHED_CONTENT_BY_DOCTYPE = "select * from Documents where status='published' and type='%s' order by date desc"; - private static final String STATEMENT_GET_PUBLISHED_POSTS_BY_TAG = "select * from Documents where status='published' and type='post' and ? in tags order by date desc"; - private static final String STATEMENT_GET_TAGS_BY_DOCTYPE = "select tags from Documents where status='published' and type='%s'"; - private static final String STATEMENT_INSERT_TEMPLATES_SIGNATURE = "insert into Signatures(key,sha1) values('templates',?)"; - private static final String STATEMENT_DELETE_ALL = "delete from Documents where type='%s'"; - private static final String STATEMENT_UPDATE_TEMPLATE_SIGNATURE = "update Signatures set sha1=? where key='templates'"; - private static final String STATEMENT_GET_DOCUMENT_COUNT_BY_TYPE = "select count(*) as count from Documents where type='%s'"; - - private final Logger logger = LoggerFactory.getLogger(ContentStore.class); - private final String type; - private final String name; - - private ODatabaseSession db; - - private long start = -1; - private long limit = -1; - private OrientDB orient; - - public ContentStore(final String type, String name) { - this.type = type; - this.name = name; - } - - - public void startup() { - startupIfEnginesAreMissing(); - - if (type.equalsIgnoreCase(ODatabaseType.PLOCAL.name())) { - orient = new OrientDB(type + ":" + name, OrientDBConfig.defaultConfig()); - } else { - orient = new OrientDB(type + ":", OrientDBConfig.defaultConfig()); - } +class ContentStore(private val type: String, private val name: String?) { + private val logger: Logger = LoggerFactory.getLogger(ContentStore::class.java) - orient.createIfNotExists(name, ODatabaseType.valueOf(type.toUpperCase())); + private var db: ODatabaseSession? = null - db = orient.open(name, "admin", "admin"); + var start: Long = -1 + private set + var limit: Long = -1 + private set + private var orient: OrientDB? = null - activateOnCurrentThread(); - updateSchema(); - } + fun startup() { + startupIfEnginesAreMissing() - public long getStart() { - return start; - } + if (type.equals(ODatabaseType.PLOCAL.name, ignoreCase = true)) { + orient = OrientDB(type + ":" + name, OrientDBConfig.defaultConfig()) + } else { + orient = OrientDB(type + ":", OrientDBConfig.defaultConfig()) + } - public void setStart(int start) { - this.start = start; - } + orient!!.createIfNotExists(name, ODatabaseType.valueOf(type.uppercase(Locale.getDefault()))) - public long getLimit() { - return limit; + db = orient!!.open(name, "admin", "admin") + + activateOnCurrentThread() + + updateSchema() } - public void setLimit(int limit) { - this.limit = limit; + fun setStart(start: Int) { + this.start = start.toLong() } - public void resetPagination() { - this.start = -1; - this.limit = -1; + fun setLimit(limit: Int) { + this.limit = limit.toLong() } - public final void updateSchema() { + fun resetPagination() { + this.start = -1 + this.limit = -1 + } - OSchema schema = db.getMetadata().getSchema(); + fun updateSchema() { + val schema = db!!.getMetadata().getSchema() if (!schema.existsClass(Schema.DOCUMENTS)) { - createDocType(schema); + createDocType(schema) } if (!schema.existsClass(Schema.SIGNATURES)) { - createSignatureType(schema); + createSignatureType(schema) } } - public void close() { + fun close() { if (db != null) { - activateOnCurrentThread(); - db.close(); + activateOnCurrentThread() + db!!.close() } if (orient != null) { - orient.close(); + orient!!.close() } - DBUtil.closeDataStore(); + DBUtil.closeDataStore() } - public void shutdown() { - -// Orient.instance().shutdown(); + fun shutdown() { + // Orient.instance().shutdown(); } - private void startupIfEnginesAreMissing() { + private fun startupIfEnginesAreMissing() { // Using a jdk which doesn't bundle a javascript engine // throws a NoClassDefFoundError while logging the warning // see https://github.com/orientechnologies/orientdb/issues/5855 - OLogManager.instance().setWarnEnabled(false); + OLogManager.instance().setWarnEnabled(false) // If an instance of Orient was previously shutdown all engines are removed. // We need to startup Orient again. if (Orient.instance().getEngines().isEmpty()) { - Orient.instance().startup(); + Orient.instance().startup() } - OLogManager.instance().setWarnEnabled(true); + OLogManager.instance().setWarnEnabled(true) } - public void drop() { - activateOnCurrentThread(); -// db.drop(); + fun drop() { + activateOnCurrentThread() - orient.drop(name); + // db.drop(); + orient!!.drop(name) } - private void activateOnCurrentThread() { + private fun activateOnCurrentThread() { if (db != null) { - db.activateOnCurrentThread(); + db!!.activateOnCurrentThread() } else { - System.out.println("db is null on activate"); + println("db is null on activate") } } - public long getDocumentCount(String docType) { - activateOnCurrentThread(); - String statement = String.format(STATEMENT_GET_DOCUMENT_COUNT_BY_TYPE, docType); - return (long) query(statement).get(0).get("count"); + fun getDocumentCount(docType: String?): Long { + activateOnCurrentThread() + val statement = String.format(STATEMENT_GET_DOCUMENT_COUNT_BY_TYPE, docType) + return query(statement).get(0).get("count") as Long } - public long getPublishedCount(String docType) { - String statement = String.format(STATEMENT_GET_PUBLISHED_COUNT, docType); - return (long) query(statement).get(0).get("count"); + fun getPublishedCount(docType: String?): Long { + val statement = String.format(STATEMENT_GET_PUBLISHED_COUNT, docType) + return query(statement).get(0).get("count") as Long } - public DocumentList getDocumentByUri(String uri) { - return query("select * from Documents where sourceuri=?", uri); + fun getDocumentByUri(uri: String?): DocumentList { + return query("select * from Documents where sourceuri=?", uri) } - public DocumentList getDocumentStatus(String uri) { - return query(STATEMENT_GET_DOCUMENT_STATUS_BY_DOCTYPE_AND_URI, uri); + fun getDocumentStatus(uri: String?): DocumentList { + return query(STATEMENT_GET_DOCUMENT_STATUS_BY_DOCTYPE_AND_URI, uri) } - public DocumentList getPublishedPosts() { - return getPublishedContent("post"); - } + val publishedPosts: DocumentList + get() = getPublishedContent("post") - public DocumentList getPublishedPosts(boolean applyPaging) { - return getPublishedContent("post", applyPaging); + fun getPublishedPosts(applyPaging: Boolean): DocumentList { + return getPublishedContent("post", applyPaging) } - public DocumentList getPublishedPostsByTag(String tag) { - return query(STATEMENT_GET_PUBLISHED_POSTS_BY_TAG, tag); + fun getPublishedPostsByTag(tag: String?): DocumentList { + return query(STATEMENT_GET_PUBLISHED_POSTS_BY_TAG, tag) } - public DocumentList getPublishedDocumentsByTag(String tag) { - final DocumentList documents = new DocumentList<>(); + fun getPublishedDocumentsByTag(tag: String?): DocumentList { + val documents = DocumentList() - for (final String docType : DocumentTypes.getDocumentTypes()) { - String statement = String.format(STATEMENT_GET_PUBLISHED_POST_BY_TYPE_AND_TAG, docType); - DocumentList documentsByTag = query(statement, tag); - documents.addAll(documentsByTag); + for (docType in DocumentTypes.getDocumentTypes()) { + val statement: String = String.format(STATEMENT_GET_PUBLISHED_POST_BY_TYPE_AND_TAG, docType) + val documentsByTag = query(statement, tag) + documents.addAll(documentsByTag) } - return documents; + return documents } - public DocumentList getPublishedPages() { - return getPublishedContent("page"); - } + val publishedPages: DocumentList + get() = getPublishedContent("page") - public DocumentList getPublishedContent(String docType) { - return getPublishedContent(docType, false); + fun getPublishedContent(docType: String?): DocumentList { + return getPublishedContent(docType, false) } - private DocumentList getPublishedContent(String docType, boolean applyPaging) { - String query = String.format(STATEMENT_GET_PUBLISHED_CONTENT_BY_DOCTYPE, docType); + private fun getPublishedContent(docType: String?, applyPaging: Boolean): DocumentList { + var query = String.format(STATEMENT_GET_PUBLISHED_CONTENT_BY_DOCTYPE, docType) if (applyPaging && hasStartAndLimitBoundary()) { - query += " SKIP " + start + " LIMIT " + limit; + query += " SKIP " + start + " LIMIT " + limit } - return query(query); + return query(query) } - public DocumentList getAllContent(String docType) { - return getAllContent(docType, false); + fun getAllContent(docType: String?): DocumentList { + return getAllContent(docType, false) } - public DocumentList getAllContent(String docType, boolean applyPaging) { - String query = String.format(STATEMENT_GET_ALL_CONTENT_BY_DOCTYPE, docType); + fun getAllContent(docType: String?, applyPaging: Boolean): DocumentList { + var query = String.format(STATEMENT_GET_ALL_CONTENT_BY_DOCTYPE, docType) if (applyPaging && hasStartAndLimitBoundary()) { - query += " SKIP " + start + " LIMIT " + limit; + query += " SKIP " + start + " LIMIT " + limit } - return query(query); + return query(query) } - private boolean hasStartAndLimitBoundary() { - return (start >= 0) && (limit > -1); + private fun hasStartAndLimitBoundary(): Boolean { + return (start >= 0) && (limit > -1) } - private DocumentList getAllTagsFromPublishedPosts() { - return query(STATEMENT_GET_TAGS_FROM_PUBLISHED_POSTS); - } + private val allTagsFromPublishedPosts: DocumentList + get() = query(STATEMENT_GET_TAGS_FROM_PUBLISHED_POSTS) - private DocumentList getSignaturesForTemplates() { - return query(STATEMENT_GET_SIGNATURE_FOR_TEMPLATES); - } + private val signaturesForTemplates: DocumentList + get() = query(STATEMENT_GET_SIGNATURE_FOR_TEMPLATES) - public DocumentList getUnrenderedContent() { - return query(STATEMENT_GET_UNDRENDERED_CONTENT); - } + val unrenderedContent: DocumentList + get() = query(STATEMENT_GET_UNDRENDERED_CONTENT) - public void deleteContent(String uri) { - executeCommand(STATEMENT_DELETE_DOCTYPE_BY_SOURCEURI, uri); + fun deleteContent(uri: String?) { + executeCommand(STATEMENT_DELETE_DOCTYPE_BY_SOURCEURI, uri) } - public void markContentAsRendered(DocumentModel document) { - String statement = String.format(STATEMENT_MARK_CONTENT_AS_RENDERD, document.getType(), document.getSourceuri()); - executeCommand(statement); + fun markContentAsRendered(document: DocumentModel) { + val statement: String = + String.format(STATEMENT_MARK_CONTENT_AS_RENDERD, document.getType(), document.getSourceuri()) + executeCommand(statement) } - private void updateSignatures(String currentTemplatesSignature) { - executeCommand(STATEMENT_UPDATE_TEMPLATE_SIGNATURE, currentTemplatesSignature); + private fun updateSignatures(currentTemplatesSignature: String?) { + executeCommand(STATEMENT_UPDATE_TEMPLATE_SIGNATURE, currentTemplatesSignature) } - public void deleteAllByDocType(String docType) { - String statement = String.format(STATEMENT_DELETE_ALL, docType); - executeCommand(statement); + fun deleteAllByDocType(docType: String?) { + val statement = String.format(STATEMENT_DELETE_ALL, docType) + executeCommand(statement) } - private void insertTemplatesSignature(String currentTemplatesSignature) { - executeCommand(STATEMENT_INSERT_TEMPLATES_SIGNATURE, currentTemplatesSignature); + private fun insertTemplatesSignature(currentTemplatesSignature: String?) { + executeCommand(STATEMENT_INSERT_TEMPLATES_SIGNATURE, currentTemplatesSignature) } - private DocumentList query(String sql) { - activateOnCurrentThread(); - OResultSet results = db.query(sql); - return DocumentList.wrap(results); + private fun query(sql: String): DocumentList { + activateOnCurrentThread() + val results = db!!.query(sql) + return DocumentList.wrap(results) } - private DocumentList query(String sql, Object... args) { - activateOnCurrentThread(); - OResultSet results = db.command(sql, args); - return DocumentList.wrap(results); + private fun query(sql: String?, vararg args: Any?): DocumentList { + activateOnCurrentThread() + val results = db!!.command(sql, *args) + return DocumentList.wrap(results) } - private void executeCommand(String query, Object... args) { - activateOnCurrentThread(); - db.command(query, args); + private fun executeCommand(query: String?, vararg args: Any?) { + activateOnCurrentThread() + db!!.command(query, *args) } - public Set getTags() { - DocumentList docs = this.getAllTagsFromPublishedPosts(); - Set result = new HashSet<>(); - for (DocumentModel document : docs) { - String[] tags = document.getTags(); - Collections.addAll(result, tags); + val tags: MutableSet + get() { + val docs = this.allTagsFromPublishedPosts + val result: MutableSet = HashSet() + for (document in docs) { + val tags = document.getTags() + Collections.addAll(result, *tags) + } + return result } - return result; - } - public Set getAllTags() { - Set result = new HashSet<>(); - for (String docType : DocumentTypes.getDocumentTypes()) { - String statement = String.format(STATEMENT_GET_TAGS_BY_DOCTYPE, docType); - DocumentList docs = query(statement); - for (DocumentModel document : docs) { - String[] tags = document.getTags(); - Collections.addAll(result, tags); + val allTags: MutableSet + get() { + val result: MutableSet = HashSet() + for (docType in DocumentTypes.getDocumentTypes()) { + val statement: String = + String.format(STATEMENT_GET_TAGS_BY_DOCTYPE, docType) + val docs = query(statement) + for (document in docs) { + val tags = document.getTags() + Collections.addAll(result, *tags) + } } + return result } - return result; - } - - private void createDocType(final OSchema schema) { - logger.debug("Create document class"); - OClass page = schema.createClass(Schema.DOCUMENTS); - page.createProperty(ModelAttributes.SHA1, OType.STRING).setNotNull(true); - page.createIndex(Schema.DOCUMENTS + "sha1Index", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.SHA1); - page.createProperty(ModelAttributes.SOURCE_URI, OType.STRING).setNotNull(true); - page.createIndex(Schema.DOCUMENTS + "sourceUriIndex", OClass.INDEX_TYPE.UNIQUE, ModelAttributes.SOURCE_URI); - page.createProperty(ModelAttributes.CACHED, OType.BOOLEAN).setNotNull(true); - page.createIndex(Schema.DOCUMENTS + "cachedIndex", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.CACHED); - page.createProperty(ModelAttributes.RENDERED, OType.BOOLEAN).setNotNull(true); - page.createIndex(Schema.DOCUMENTS + "renderedIndex", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.RENDERED); - page.createProperty(ModelAttributes.STATUS, OType.STRING).setNotNull(true); - page.createIndex(Schema.DOCUMENTS + "statusIndex", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.STATUS); - page.createProperty(ModelAttributes.TYPE, OType.STRING).setNotNull(true); - page.createIndex(Schema.DOCUMENTS + "typeIndex", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.TYPE); + private fun createDocType(schema: OSchema) { + logger.debug("Create document class") + val page = schema.createClass(Schema.DOCUMENTS) + page.createProperty(ModelAttributes.SHA1, OType.STRING).setNotNull(true) + page.createIndex(Schema.DOCUMENTS + "sha1Index", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.SHA1) + page.createProperty(ModelAttributes.SOURCE_URI, OType.STRING).setNotNull(true) + page.createIndex(Schema.DOCUMENTS + "sourceUriIndex", OClass.INDEX_TYPE.UNIQUE, ModelAttributes.SOURCE_URI) + page.createProperty(ModelAttributes.CACHED, OType.BOOLEAN).setNotNull(true) + page.createIndex(Schema.DOCUMENTS + "cachedIndex", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.CACHED) + page.createProperty(ModelAttributes.RENDERED, OType.BOOLEAN).setNotNull(true) + page.createIndex(Schema.DOCUMENTS + "renderedIndex", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.RENDERED) + page.createProperty(ModelAttributes.STATUS, OType.STRING).setNotNull(true) + page.createIndex(Schema.DOCUMENTS + "statusIndex", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.STATUS) + page.createProperty(ModelAttributes.TYPE, OType.STRING).setNotNull(true) + page.createIndex(Schema.DOCUMENTS + "typeIndex", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.TYPE) } - private void createSignatureType(OSchema schema) { - OClass signatures = schema.createClass(Schema.SIGNATURES); - signatures.createProperty(ModelAttributes.SHA1, OType.STRING).setNotNull(true); - signatures.createIndex("sha1Idx", OClass.INDEX_TYPE.UNIQUE, ModelAttributes.SHA1); + private fun createSignatureType(schema: OSchema) { + val signatures = schema.createClass(Schema.SIGNATURES) + signatures.createProperty(ModelAttributes.SHA1, OType.STRING).setNotNull(true) + signatures.createIndex("sha1Idx", OClass.INDEX_TYPE.UNIQUE, ModelAttributes.SHA1) } - public void updateAndClearCacheIfNeeded(boolean needed, File templateFolder) { - - boolean clearCache = needed; + fun updateAndClearCacheIfNeeded(needed: Boolean, templateFolder: File?) { + var clearCache = needed if (!needed) { - clearCache = updateTemplateSignatureIfChanged(templateFolder); + clearCache = updateTemplateSignatureIfChanged(templateFolder) } if (clearCache) { - deleteAllDocumentTypes(); - this.updateSchema(); + deleteAllDocumentTypes() + this.updateSchema() } } - private boolean updateTemplateSignatureIfChanged(File templateFolder) { - boolean templateSignatureChanged = false; + private fun updateTemplateSignatureIfChanged(templateFolder: File?): Boolean { + var templateSignatureChanged = false - DocumentList docs = this.getSignaturesForTemplates(); - String currentTemplatesSignature; + val docs = this.signaturesForTemplates + var currentTemplatesSignature: String? try { - currentTemplatesSignature = FileUtil.sha1(templateFolder); - } catch (Exception e) { - currentTemplatesSignature = ""; + currentTemplatesSignature = FileUtil.sha1(templateFolder) + } catch (e: Exception) { + currentTemplatesSignature = "" } if (!docs.isEmpty()) { - String sha1 = docs.get(0).getSha1(); - if (!sha1.equals(currentTemplatesSignature)) { - this.updateSignatures(currentTemplatesSignature); - templateSignatureChanged = true; + val sha1 = docs.get(0).getSha1() + if (sha1 != currentTemplatesSignature) { + this.updateSignatures(currentTemplatesSignature) + templateSignatureChanged = true } } else { // first computation of templates signature - this.insertTemplatesSignature(currentTemplatesSignature); - templateSignatureChanged = true; + this.insertTemplatesSignature(currentTemplatesSignature) + templateSignatureChanged = true } - return templateSignatureChanged; + return templateSignatureChanged } - private void deleteAllDocumentTypes() { - for (String docType : DocumentTypes.getDocumentTypes()) { + private fun deleteAllDocumentTypes() { + for (docType in DocumentTypes.getDocumentTypes()) { try { - this.deleteAllByDocType(docType); - } catch (Exception e) { + this.deleteAllByDocType(docType) + } catch (e: Exception) { // maybe a non existing document type } } } - public boolean isActive() { - return db.isActiveOnCurrentThread(); - } - - public void addDocument(DocumentModel document) { - OElement element = db.newElement(Schema.DOCUMENTS); - document.forEach((k, v) -> element.setProperty(k, v, OType.ANY)); - element.save(); + val isActive: Boolean + get() = db!!.isActiveOnCurrentThread() + + fun addDocument(document: DocumentModel) { + val element = db!!.newElement(Schema.DOCUMENTS) + document.forEach { (k: String?, v: Any?) -> element.setProperty(k, v, OType.ANY) } + element.save() + } + + protected object Schema { + const val DOCUMENTS: String = "Documents" + const val SIGNATURES: String = "Signatures" + } + + companion object { + private const val STATEMENT_GET_PUBLISHED_POST_BY_TYPE_AND_TAG = + "select * from Documents where status='published' and type='%s' and ? in tags order by date desc" + private const val STATEMENT_GET_DOCUMENT_STATUS_BY_DOCTYPE_AND_URI = + "select sha1,rendered from Documents where sourceuri=?" + private const val STATEMENT_GET_PUBLISHED_COUNT = + "select count(*) as count from Documents where status='published' and type='%s'" + private const val STATEMENT_MARK_CONTENT_AS_RENDERD = + "update Documents set rendered=true where rendered=false and type='%s' and sourceuri='%s' and cached=true" + private const val STATEMENT_DELETE_DOCTYPE_BY_SOURCEURI = "delete from Documents where sourceuri=?" + private const val STATEMENT_GET_UNDRENDERED_CONTENT = + "select * from Documents where rendered=false order by date desc" + private const val STATEMENT_GET_SIGNATURE_FOR_TEMPLATES = "select sha1 from Signatures where key='templates'" + private const val STATEMENT_GET_TAGS_FROM_PUBLISHED_POSTS = + "select tags from Documents where status='published' and type='post'" + private const val STATEMENT_GET_ALL_CONTENT_BY_DOCTYPE = + "select * from Documents where type='%s' order by date desc" + private const val STATEMENT_GET_PUBLISHED_CONTENT_BY_DOCTYPE = + "select * from Documents where status='published' and type='%s' order by date desc" + private const val STATEMENT_GET_PUBLISHED_POSTS_BY_TAG = + "select * from Documents where status='published' and type='post' and ? in tags order by date desc" + private const val STATEMENT_GET_TAGS_BY_DOCTYPE = + "select tags from Documents where status='published' and type='%s'" + private const val STATEMENT_INSERT_TEMPLATES_SIGNATURE = + "insert into Signatures(key,sha1) values('templates',?)" + private const val STATEMENT_DELETE_ALL = "delete from Documents where type='%s'" + private const val STATEMENT_UPDATE_TEMPLATE_SIGNATURE = "update Signatures set sha1=? where key='templates'" + private const val STATEMENT_GET_DOCUMENT_COUNT_BY_TYPE = + "select count(*) as count from Documents where type='%s'" } - - protected abstract class Schema { - static final String DOCUMENTS = "Documents"; - static final String SIGNATURES = "Signatures"; - } - } diff --git a/jbake-core/src/main/java/org/jbake/app/Crawler.kt b/jbake-core/src/main/java/org/jbake/app/Crawler.kt index 0c3d8b9d6..0b556dfa7 100644 --- a/jbake-core/src/main/java/org/jbake/app/Crawler.kt +++ b/jbake-core/src/main/java/org/jbake/app/Crawler.kt @@ -1,51 +1,46 @@ -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.model.DocumentModel; -import org.jbake.model.DocumentStatus; -import org.jbake.model.DocumentTypes; -import org.jbake.model.ModelAttributes; -import org.jbake.util.HtmlUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Date; -import java.util.Map; +package org.jbake.app + +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.model.DocumentModel +import org.jbake.model.DocumentStatus +import org.jbake.model.DocumentTypes +import org.jbake.model.ModelAttributes +import org.jbake.util.HtmlUtil +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.io.File +import java.io.UnsupportedEncodingException +import java.net.URLEncoder +import java.nio.charset.StandardCharsets +import java.util.* /** * Crawls a file system looking for content. * - * @author Jonathan Bullock jonbullock@gmail.com + * @author Jonathan Bullock [jonbullock@gmail.com](mailto:jonbullock@gmail.com) */ -public class Crawler { - - private static final Logger logger = LoggerFactory.getLogger(Crawler.class); - private final ContentStore db; - private final JBakeConfiguration config; - private final Parser parser; +class Crawler { + private val db: ContentStore + private val config: JBakeConfiguration + private val parser: Parser /** * @param db Database instance for content * @param source Base directory where content directory is located * @param config Project configuration - * @deprecated Use {@link #Crawler(ContentStore, JBakeConfiguration)} instead. - *

- * Creates new instance of Crawler. */ - @Deprecated - public Crawler(ContentStore db, File source, CompositeConfiguration config) { - this.db = db; - this.config = new JBakeConfigurationFactory().createDefaultJbakeConfiguration(source, config); - this.parser = new Parser(this.config); + @Deprecated( + """Use {@link #Crawler(ContentStore, JBakeConfiguration)} instead. +

+ Creates new instance of Crawler.""" + ) + constructor(db: ContentStore, source: File?, config: CompositeConfiguration?) { + this.db = db + this.config = JBakeConfigurationFactory().createDefaultJbakeConfiguration(source, config) + this.parser = Parser(this.config) } /** @@ -54,32 +49,32 @@ public class Crawler { * @param db Database instance for content * @param config Project configuration */ - public Crawler(ContentStore db, JBakeConfiguration config) { - this.db = db; - this.config = config; - this.parser = new Parser(config); + constructor(db: ContentStore, config: JBakeConfiguration) { + this.db = db + this.config = config + this.parser = Parser(config) } - public void crawl() { - crawl(config.getContentFolder()); + fun crawl() { + crawl(config.contentFolder!!) - logger.info("Content detected:"); - for (String docType : DocumentTypes.getDocumentTypes()) { - long count = db.getDocumentCount(docType); + logger.info("Content detected:") + for (docType in DocumentTypes.getDocumentTypes()) { + val count = db.getDocumentCount(docType) if (count > 0) { - logger.info("Parsed {} files of type: {}", count, docType); + logger.info("Parsed {} files of type: {}", count, docType) } } } - public void crawlDataFiles() { - crawlDataFiles(config.getDataFolder()); + fun crawlDataFiles() { + crawlDataFiles(config.dataFolder!!) - logger.info("Data files detected:"); - String docType = config.getDataFileDocType(); - long count = db.getDocumentCount(docType); + logger.info("Data files detected:") + val docType = config.dataFileDocType + val count = db.getDocumentCount(docType) if (count > 0) { - logger.info("Parsed {} files", count); + logger.info("Parsed {} files", count) } } @@ -88,40 +83,39 @@ public class Crawler { * * @param path Folder to start from */ - private void crawl(File path) { - File[] contents = path.listFiles(FileUtil.getFileFilter(config)); + private fun crawl(path: File) { + val contents = path.listFiles(FileUtil.getFileFilter(config)) if (contents != null) { - Arrays.sort(contents); - for (File sourceFile : contents) { + Arrays.sort(contents) + for (sourceFile in contents) { if (sourceFile.isFile()) { - crawlFile(sourceFile); + crawlFile(sourceFile) } else if (sourceFile.isDirectory()) { - crawl(sourceFile); + crawl(sourceFile) } } } } - private void crawlFile(File sourceFile) { - - StringBuilder sb = new StringBuilder(); - sb.append("Processing [").append(sourceFile.getPath()).append("]... "); - String sha1 = buildHash(sourceFile); - String uri = buildURI(sourceFile); - DocumentStatus status = findDocumentStatus(uri, sha1); + private fun crawlFile(sourceFile: File) { + val sb = StringBuilder() + sb.append("Processing [").append(sourceFile.getPath()).append("]... ") + val sha1 = buildHash(sourceFile) + val uri = buildURI(sourceFile) + val status = findDocumentStatus(uri, sha1) if (status == DocumentStatus.UPDATED) { - sb.append(" : modified "); - db.deleteContent(uri); + sb.append(" : modified ") + db.deleteContent(uri) } else if (status == DocumentStatus.IDENTICAL) { - sb.append(" : same "); + sb.append(" : same ") } else if (DocumentStatus.NEW == status) { - sb.append(" : new "); + sb.append(" : new ") } - logger.info("{}", sb); + logger.info("{}", sb) if (status != DocumentStatus.IDENTICAL) { - processSourceFile(sourceFile, sha1, uri); + processSourceFile(sourceFile, sha1, uri) } } @@ -130,196 +124,204 @@ public class Crawler { * * @param path Folder to start from */ - private void crawlDataFiles(File path) { - File[] contents = path.listFiles(FileUtil.getDataFileFilter()); + private fun crawlDataFiles(path: File) { + val contents = path.listFiles(FileUtil.getDataFileFilter()) if (contents != null) { - Arrays.sort(contents); - for (File sourceFile : contents) { + Arrays.sort(contents) + for (sourceFile in contents) { if (sourceFile.isFile()) { - StringBuilder sb = new StringBuilder(); - sb.append("Processing [").append(sourceFile.getPath()).append("]... "); - String sha1 = buildHash(sourceFile); - String uri = buildDataFileURI(sourceFile); - boolean process = true; - DocumentStatus status = DocumentStatus.NEW; - String docType = config.getDataFileDocType(); - status = findDocumentStatus(uri, sha1); + val sb = StringBuilder() + sb.append("Processing [").append(sourceFile.getPath()).append("]... ") + val sha1 = buildHash(sourceFile) + val uri = buildDataFileURI(sourceFile) + var process = true + var status = DocumentStatus.NEW + val docType = config.dataFileDocType + status = findDocumentStatus(uri, sha1) if (status == DocumentStatus.UPDATED) { - sb.append(" : modified "); - db.deleteContent(uri); + sb.append(" : modified ") + db.deleteContent(uri) } else if (status == DocumentStatus.IDENTICAL) { - sb.append(" : same "); - process = false; + sb.append(" : same ") + process = false } if (!process) { - break; + break } if (DocumentStatus.NEW == status) { - sb.append(" : new "); + sb.append(" : new ") } if (process) { // new or updated - crawlDataFile(sourceFile, sha1, uri, docType); + crawlDataFile(sourceFile, sha1, uri, docType) } - logger.info("{}", sb); + logger.info("{}", sb) } if (sourceFile.isDirectory()) { - crawlDataFiles(sourceFile); + crawlDataFiles(sourceFile) } } } } - private String buildHash(final File sourceFile) { - String sha1; + private fun buildHash(sourceFile: File?): String { + var sha1: String try { - sha1 = FileUtil.sha1(sourceFile); - } catch (Exception e) { - logger.error("unable to build sha1 hash for source file '{}'", sourceFile); - sha1 = ""; + sha1 = FileUtil.sha1(sourceFile) + } catch (e: Exception) { + logger.error("unable to build sha1 hash for source file '{}'", sourceFile) + sha1 = "" } - return sha1; + return sha1 } - private String buildURI(final File sourceFile) { - String uri = FileUtil.asPath(sourceFile).replace(FileUtil.asPath(config.getContentFolder()), ""); + private fun buildURI(sourceFile: File?): String { + var uri: String = FileUtil.asPath(sourceFile).replace(asPath(config.contentFolder), "") if (useNoExtensionUri(uri)) { // convert URI from xxx.html to xxx/index.html - uri = createNoExtensionUri(uri); + uri = createNoExtensionUri(uri) } else { - uri = createUri(uri); + uri = createUri(uri) } // strip off leading / to enable generating non-root based sites if (uri.startsWith(FileUtil.URI_SEPARATOR_CHAR)) { - uri = uri.substring(1); + uri = uri.substring(1) } - return uri; + return uri } - private String buildDataFileURI(final File sourceFile) { - String uri = FileUtil.asPath(sourceFile).replace(FileUtil.asPath(config.getDataFolder()), ""); + private fun buildDataFileURI(sourceFile: File?): String { + var uri: String = FileUtil.asPath(sourceFile).replace(asPath(config.dataFolder), "") // strip off leading / if (uri.startsWith(FileUtil.URI_SEPARATOR_CHAR)) { - uri = uri.substring(1, uri.length()); + uri = uri.substring(1, uri.length) } - return uri; + return uri } // TODO: Refactor - parametrize the following two methods into one. // commons-codec's URLCodec could be used when we add that dependency. - private String createUri(String uri) { + private fun createUri(uri: String?): String { try { - return FileUtil.URI_SEPARATOR_CHAR - + FilenameUtils.getPath(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. + return (FileUtil.URI_SEPARATOR_CHAR + + FilenameUtils.getPath(uri) + + URLEncoder.encode(FilenameUtils.getBaseName(uri), StandardCharsets.UTF_8.name()) + + config.outputExtension) + } catch (e: UnsupportedEncodingException) { + throw RuntimeException("Missing UTF-8 encoding??", e) // Won't happen unless JDK is broken. } } - private String createNoExtensionUri(String uri) { + private fun createNoExtensionUri(uri: String?): String { try { - return FileUtil.URI_SEPARATOR_CHAR - + FilenameUtils.getPath(uri) - + URLEncoder.encode(FilenameUtils.getBaseName(uri), StandardCharsets.UTF_8.name()) - + FileUtil.URI_SEPARATOR_CHAR - + "index" - + config.getOutputExtension(); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException("Missing UTF-8 encoding??", e); // Won't happen unless JDK is broken. + return (FileUtil.URI_SEPARATOR_CHAR + + FilenameUtils.getPath(uri) + + URLEncoder.encode(FilenameUtils.getBaseName(uri), StandardCharsets.UTF_8.name()) + + FileUtil.URI_SEPARATOR_CHAR + + "index" + + config.outputExtension) + } catch (e: UnsupportedEncodingException) { + throw RuntimeException("Missing UTF-8 encoding??", e) // Won't happen unless JDK is broken. } } - private boolean useNoExtensionUri(String uri) { - boolean noExtensionUri = config.getUriWithoutExtension(); - String noExtensionUriPrefix = config.getPrefixForUriWithoutExtension(); + private fun useNoExtensionUri(uri: String): Boolean { + val noExtensionUri = config.uriWithoutExtension + val noExtensionUriPrefix = config.prefixForUriWithoutExtension return noExtensionUri - && (noExtensionUriPrefix != null) - && (noExtensionUriPrefix.length() > 0) - && uri.startsWith(noExtensionUriPrefix); + && (noExtensionUriPrefix != null) + && (noExtensionUriPrefix.length > 0) + && uri.startsWith(noExtensionUriPrefix) } - private void crawlDataFile(final File sourceFile, final String sha1, final String uri, final String documentType) { + private fun crawlDataFile(sourceFile: File, sha1: String?, uri: String?, documentType: String?) { try { - DocumentModel document = parser.processFile(sourceFile); + val document = parser.processFile(sourceFile) if (document != null) { - document.setSha1(sha1); - document.setRendered(true); - document.setFile(sourceFile.getPath()); - document.setSourceUri(uri); - document.setType(documentType); + document.setSha1(sha1) + document.setRendered(true) + document.setFile(sourceFile.getPath()) + document.setSourceUri(uri) + document.setType(documentType) - db.addDocument(document); + db.addDocument(document) } else { - logger.warn("{} couldn't be parsed so it has been ignored!", sourceFile); + 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); + } catch (ex: Exception) { + throw RuntimeException("Failed crawling file: " + sourceFile.getPath() + " " + ex.message, ex) } } - private void processSourceFile(final File sourceFile, final String sha1, final String uri) { - DocumentModel document = parser.processFile(sourceFile); + private fun processSourceFile(sourceFile: File, sha1: String?, uri: String) { + val document = parser.processFile(sourceFile) if (document != null) { if (DocumentTypes.contains(document.getType())) { - addAdditionalDocumentAttributes(document, sourceFile, sha1, uri); + addAdditionalDocumentAttributes(document, sourceFile, sha1, uri) - if (config.getImgPathUpdate()) { + if (config.imgPathUpdate) { // Prevent image source url's from breaking - HtmlUtil.fixImageSourceUrls(document, config); + HtmlUtil.fixImageSourceUrls(document, config) } - db.addDocument(document); + db.addDocument(document) } else { - logger.warn("{} has an unknown document type '{}' and has been ignored!", sourceFile, document.getType()); + logger.warn( + "{} has an unknown document type '{}' and has been ignored!", + sourceFile, + document.getType() + ) } } else { - logger.warn("{} has an invalid header, it has been ignored!", sourceFile); + logger.warn("{} has an invalid header, it has been ignored!", sourceFile) } } - private void addAdditionalDocumentAttributes(DocumentModel document, File sourceFile, String sha1, String uri) { - document.setRootPath(getPathToRoot(sourceFile)); - document.setSha1(sha1); - document.setRendered(false); - document.setFile(sourceFile.getPath()); - document.setSourceUri(uri); - document.setUri(uri); - document.setCached(true); - - if (document.getStatus().equals(ModelAttributes.Status.PUBLISHED_DATE) - && (document.getDate() != null) - && new Date().after(document.getDate())) { - document.setStatus(ModelAttributes.Status.PUBLISHED); + private fun addAdditionalDocumentAttributes(document: DocumentModel, sourceFile: File, sha1: String?, uri: String) { + document.setRootPath(getPathToRoot(sourceFile)) + document.setSha1(sha1) + document.setRendered(false) + document.setFile(sourceFile.getPath()) + document.setSourceUri(uri) + document.setUri(uri) + document.setCached(true) + + if (document.getStatus() == ModelAttributes.Status.PUBLISHED_DATE + && (document.getDate() != null) + && Date().after(document.getDate()) + ) { + document.setStatus(ModelAttributes.Status.PUBLISHED) } - if (config.getUriWithoutExtension()) { - document.setNoExtensionUri(uri.replace("/index.html", "/")); + if (config.uriWithoutExtension) { + document.setNoExtensionUri(uri.replace("/index.html", "/")) } } - private String getPathToRoot(File sourceFile) { - return FileUtil.getUriPathToContentRoot(config, sourceFile); + private fun getPathToRoot(sourceFile: File?): String { + return FileUtil.getUriPathToContentRoot(config, sourceFile) } - private DocumentStatus findDocumentStatus(String uri, String sha1) { - DocumentList match = db.getDocumentStatus(uri); + private fun findDocumentStatus(uri: String?, sha1: String?): DocumentStatus { + val match = db.getDocumentStatus(uri) if (!match.isEmpty()) { - DocumentModel document = match.get(0); - String oldHash = document.getSha1(); - if (!oldHash.equals(sha1) || !document.getRendered()) { - return DocumentStatus.UPDATED; + val document = match.get(0) + val oldHash = document.getSha1() + if (oldHash != sha1 || !document.getRendered()) { + return DocumentStatus.UPDATED } else { - return DocumentStatus.IDENTICAL; + return DocumentStatus.IDENTICAL } } else { - return DocumentStatus.NEW; + return DocumentStatus.NEW } } + companion object { + private val logger: Logger = LoggerFactory.getLogger(Crawler::class.java) + } } diff --git a/jbake-core/src/main/java/org/jbake/app/DBUtil.kt b/jbake-core/src/main/java/org/jbake/app/DBUtil.kt index 33568b450..c3161f11f 100644 --- a/jbake-core/src/main/java/org/jbake/app/DBUtil.kt +++ b/jbake-core/src/main/java/org/jbake/app/DBUtil.kt @@ -1,48 +1,46 @@ -package org.jbake.app; +package org.jbake.app -import com.orientechnologies.orient.core.db.record.OTrackedList; -import com.orientechnologies.orient.core.record.OElement; -import com.orientechnologies.orient.core.sql.executor.OResult; -import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.model.DocumentModel; +import com.orientechnologies.orient.core.db.record.OTrackedList +import com.orientechnologies.orient.core.sql.executor.OResult +import org.jbake.app.configuration.JBakeConfiguration +import org.jbake.model.DocumentModel -import java.util.ArrayList; +object DBUtil { + private var contentStore: ContentStore? = null -public class DBUtil { - private static ContentStore contentStore; - - @Deprecated - public static ContentStore createDataStore(final String type, String name) { + @Deprecated("") + fun createDataStore(type: String?, name: String?): ContentStore { if (contentStore == null) { - contentStore = new ContentStore(type, name); + contentStore = ContentStore(type, name) } - return contentStore; + return contentStore!! } - @Deprecated - public static void updateSchema(final ContentStore db) { - db.updateSchema(); + @Deprecated("") + fun updateSchema(db: ContentStore) { + db.updateSchema() } - public static ContentStore createDataStore(JBakeConfiguration configuration) { + @JvmStatic + fun createDataStore(configuration: JBakeConfiguration): ContentStore { if (contentStore == null) { - contentStore = new ContentStore(configuration.getDatabaseStore(), configuration.getDatabasePath()); + contentStore = ContentStore(configuration.databaseStore, configuration.databasePath) } - return contentStore; + return contentStore!! } - public static void closeDataStore() { - contentStore = null; + fun closeDataStore() { + contentStore = null } - public static DocumentModel documentToModel(OResult doc) { - DocumentModel result = new DocumentModel(); + fun documentToModel(doc: OResult): DocumentModel { + val result = DocumentModel() - for (String key : doc.getPropertyNames()) { - result.put(key, doc.getProperty(key)); + for (key in doc.getPropertyNames()) { + result.put(key, doc.getProperty(key)) } - return result; + return result } /** @@ -51,18 +49,16 @@ public class DBUtil { * @param entry Entry input to be converted * @return input entry as String[] */ - @SuppressWarnings("unchecked") - public static String[] toStringArray(Object entry) { - if (entry instanceof String[]) { - return (String[]) entry; - } else if (entry instanceof OTrackedList) { - OTrackedList list = (OTrackedList) entry; - return list.toArray(new String[list.size()]); - } else if (entry instanceof ArrayList) { - ArrayList list = (ArrayList) entry; - return list.toArray(new String[list.size()]); + fun toStringArray(entry: Any): Array { + if (entry is Array) { + return entry as Array + } else if (entry is OTrackedList<*>) { + val list = entry as OTrackedList + return list.toTypedArray() + } else if (entry is ArrayList<*>) { + val list = entry as ArrayList + return list.toTypedArray() } - return new String[0]; + return arrayOfNulls(0) } - } diff --git a/jbake-core/src/main/java/org/jbake/app/DocumentList.kt b/jbake-core/src/main/java/org/jbake/app/DocumentList.kt index d297ff387..24c4c9000 100644 --- a/jbake-core/src/main/java/org/jbake/app/DocumentList.kt +++ b/jbake-core/src/main/java/org/jbake/app/DocumentList.kt @@ -1,10 +1,8 @@ -package org.jbake.app; +package org.jbake.app -import com.orientechnologies.orient.core.sql.executor.OResult; -import com.orientechnologies.orient.core.sql.executor.OResultSet; -import org.jbake.model.DocumentModel; - -import java.util.LinkedList; +import com.orientechnologies.orient.core.sql.executor.OResultSet +import org.jbake.model.DocumentModel +import java.util.* /** * Wraps an OrientDB document iterator into a model usable by @@ -12,16 +10,15 @@ import java.util.LinkedList; * * @author Cédric Champeau */ -public class DocumentList extends LinkedList { +class DocumentList : LinkedList() { - public static DocumentList wrap(OResultSet docs) { - DocumentList list = new DocumentList<>(); + fun wrap(docs: OResultSet): DocumentList { + val list = DocumentList() while (docs.hasNext()) { - OResult next = docs.next(); - list.add(DBUtil.documentToModel(next)); + val next = docs.next() + list.add(DBUtil.documentToModel(next)) } - docs.close(); - return list; + docs.close() + return list } - } diff --git a/jbake-core/src/main/java/org/jbake/app/FileUtil.kt b/jbake-core/src/main/java/org/jbake/app/FileUtil.kt index c80dbf9e2..be12bb568 100644 --- a/jbake-core/src/main/java/org/jbake/app/FileUtil.kt +++ b/jbake-core/src/main/java/org/jbake/app/FileUtil.kt @@ -1,27 +1,19 @@ -package org.jbake.app; - -import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.parser.Engines; - -import java.io.File; -import java.io.FileFilter; -import java.io.FileInputStream; -import java.io.FilenameFilter; -import java.io.IOException; -import java.io.InputStream; -import java.net.URLDecoder; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.security.MessageDigest; +package org.jbake.app + +import org.jbake.app.configuration.JBakeConfiguration +import org.jbake.parser.Engines +import java.io.* +import java.net.URLDecoder +import java.nio.file.Paths +import java.security.MessageDigest /** * Provides File related functions * - * @author Jonathan Bullock jonbullock@gmail.com + * @author Jonathan Bullock [jonbullock@gmail.com](mailto:jonbullock@gmail.com) */ -public class FileUtil { - - public static final String URI_SEPARATOR_CHAR = "/"; +object FileUtil { + const val URI_SEPARATOR_CHAR: String = "/" /** * Filters files based on their file extension. @@ -29,53 +21,51 @@ public class FileUtil { * @param config the jbake configuration * @return Object for filtering files */ - public static FileFilter getFileFilter(JBakeConfiguration config) { - return new FileFilter() { - - @Override - public boolean accept(File pathname) { + fun getFileFilter(config: JBakeConfiguration): FileFilter { + return object : FileFilter { + override fun accept(pathname: File): Boolean { //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)); + && Engines.Companion.getRecognizedExtensions() + .contains(fileExt(pathname))) || (directoryOnlyIfNotIgnored(pathname, config)) } - }; + } } - /** - * Filters files based on their file extension. - * - * @return Object for filtering files - * @deprecated use {@link #getFileFilter(JBakeConfiguration)} instead - */ - @Deprecated - public static FileFilter getFileFilter() { - return new FileFilter() { - - @Override - public boolean accept(File pathname) { + @get:Deprecated("use {@link #getFileFilter(JBakeConfiguration)} instead") + val fileFilter: FileFilter + /** + * Filters files based on their file extension. + * + * @return Object for filtering files + */ + get() = object : FileFilter { + override fun accept(pathname: File): Boolean { //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)); + && Engines.Companion.getRecognizedExtensions() + .contains(fileExt(pathname))) || (directoryOnlyIfNotIgnored( + pathname + )) } - }; - } - - /** - * Filters files based on their file extension - only find data files (i.e. files with .yaml or .yml extension) - * - * @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)); + val dataFileFilter: FileFilter + /** + * Filters files based on their file extension - only find data files (i.e. files with .yaml or .yml extension) + * + * @return Object for filtering files + */ + get() = object : FileFilter { + override fun accept(pathname: File): Boolean { + return "yaml".equals( + fileExt(pathname), + ignoreCase = true + ) || "yml".equals(fileExt(pathname), ignoreCase = true) } - }; - } + } /** * Gets the list of files that are not content files based on their extension. @@ -83,42 +73,35 @@ public class FileUtil { * @param config the jbake configuration * @return FileFilter object */ - public static FileFilter getNotContentFileFilter(JBakeConfiguration config) { - return new FileFilter() { - - @Override - public boolean accept(File pathname) { + fun getNotContentFileFilter(config: JBakeConfiguration): FileFilter { + return object : FileFilter { + override fun accept(pathname: File): Boolean { //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.isHidden() && (pathname.isFile() //extension should not be from registered content extensions + && !Engines.Companion.getRecognizedExtensions().contains(fileExt(pathname))) + || (directoryOnlyIfNotIgnored(pathname, config)) } - }; + } } - /** - * Gets the list of files that are not content files based on their extension. - * - * @return FileFilter object - * @deprecated use {@link #getNotContentFileFilter(JBakeConfiguration)} instead - */ - @Deprecated - public static FileFilter getNotContentFileFilter() { - return new FileFilter() { - - @Override - public boolean accept(File pathname) { + @get:Deprecated("use {@link #getNotContentFileFilter(JBakeConfiguration)} instead") + val notContentFileFilter: FileFilter + /** + * Gets the list of files that are not content files based on their extension. + * + * @return FileFilter object + */ + get() = object : FileFilter { + override fun accept(pathname: File): Boolean { //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.isHidden() && (pathname.isFile() //extension should not be from registered content extensions + && !Engines.Companion.getRecognizedExtensions() + .contains(fileExt(pathname))) + || (directoryOnlyIfNotIgnored(pathname)) } - }; - } + } /** * Ignores directory (and children) if it contains a file named in the @@ -128,19 +111,18 @@ public class FileUtil { * @param config the jbake configuration * @return true if file is directory and not ignored */ - public static boolean directoryOnlyIfNotIgnored(File file, JBakeConfiguration config) { - boolean accept = false; + fun directoryOnlyIfNotIgnored(file: File, config: JBakeConfiguration): Boolean { + var accept = false - FilenameFilter ignoreFile = new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return name.equalsIgnoreCase(config.getIgnoreFileName()); + val ignoreFile: FilenameFilter = object : FilenameFilter { + override fun accept(dir: File?, name: String): Boolean { + return name.equals(config.ignoreFileName, ignoreCase = true) } - }; + } - accept = file.isDirectory() && (file.listFiles(ignoreFile).length == 0); + accept = file.isDirectory() && (file.listFiles(ignoreFile).size == 0) - return accept; + return accept } /** @@ -148,60 +130,62 @@ public class FileUtil { * * @param file the file to test * @return true if file is directory and not ignored - * @deprecated use {@link #directoryOnlyIfNotIgnored(File, JBakeConfiguration)} instead */ - @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"); + @Deprecated("use {@link #directoryOnlyIfNotIgnored(File, JBakeConfiguration)} instead") + fun directoryOnlyIfNotIgnored(file: File): Boolean { + var accept = false + + val ignoreFile: FilenameFilter = object : FilenameFilter { + override fun accept(dir: File?, name: String): Boolean { + return name.equals(".jbakeignore", ignoreCase = true) } - }; + } - accept = file.isDirectory() && (file.listFiles(ignoreFile).length == 0); + accept = file.isDirectory() && (file.listFiles(ignoreFile).size == 0) - return accept; + return accept } - public static boolean isExistingFolder(File f) { - return null != f && f.exists() && f.isDirectory(); + fun isExistingFolder(f: File?): Boolean { + return null != f && f.exists() && f.isDirectory() } - /** - * Works out the folder where JBake is running from. - * - * @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 { - 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!"); - } - File codeFolder = codeFile.getParentFile().getParentFile(); - if (!codeFolder.exists()) { - throw new Exception("Cannot locate running location of JBake!"); - } + @JvmStatic + @get:Throws(Exception::class) + val runningLocation: File + /** + * Works out the folder where JBake is running from. + * + * @return File referencing folder JBake is running from + * @throws Exception when application is not able to work out where is JBake running from + */ + get() { + val codePath = + FileUtil::class.java.getProtectionDomain().getCodeSource().getLocation().getPath() + val decodedPath = URLDecoder.decode(codePath, "UTF-8") + val codeFile = File(decodedPath) + if (!codeFile.exists()) { + throw Exception("Cannot locate running location of JBake!") + } + val codeFolder = codeFile.getParentFile().getParentFile() + if (!codeFolder.exists()) { + throw Exception("Cannot locate running location of JBake!") + } - return codeFolder; - } + return codeFolder + } - public static String fileExt(File src) { - String name = src.getName(); - return fileExt(name); + fun fileExt(src: File): String { + val name = src.getName() + return fileExt(name) } - public static String fileExt(String name) { - int idx = name.lastIndexOf('.'); + fun fileExt(name: String): String { + val idx = name.lastIndexOf('.') if (idx > 0) { - return name.substring(idx + 1); + return name.substring(idx + 1) } else { - return ""; + return "" } } @@ -212,34 +196,36 @@ public class FileUtil { * @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 { - byte[] buffer = new byte[1024]; - MessageDigest complete = MessageDigest.getInstance("SHA-1"); - updateDigest(complete, sourceFile, buffer); - byte[] bytes = complete.digest(); - StringBuilder sb = new StringBuilder(); - for (byte b : bytes) { - sb.append(String.format("%02x", b)); + @Throws(Exception::class) + fun sha1(sourceFile: File): String { + val buffer = ByteArray(1024) + val complete = MessageDigest.getInstance("SHA-1") + updateDigest(complete, sourceFile, buffer) + val bytes = complete.digest() + val sb = StringBuilder() + for (b in bytes) { + sb.append(String.format("%02x", b)) } - return sb.toString(); + return sb.toString() } - private static void updateDigest(final MessageDigest digest, final File sourceFile, final byte[] buffer) throws IOException { + @Throws(IOException::class) + private fun updateDigest(digest: MessageDigest, sourceFile: File, buffer: ByteArray) { if (sourceFile.isFile()) { - try (InputStream fis = new FileInputStream(sourceFile)) { - int numRead; + FileInputStream(sourceFile).use { fis -> + var numRead: Int do { - numRead = fis.read(buffer); + numRead = fis.read(buffer) if (numRead > 0) { - digest.update(buffer, 0, numRead); + digest.update(buffer, 0, numRead) } - } while (numRead != -1); + } while (numRead != -1) } } else if (sourceFile.isDirectory()) { - File[] files = sourceFile.listFiles(); + val files = sourceFile.listFiles() if (files != null) { - for (File file : files) { - updateDigest(digest, file, buffer); + for (file in files) { + updateDigest(digest, file, buffer) } } } @@ -248,40 +234,41 @@ public class FileUtil { /** * platform independent file.getPath() * - * @param file the file to transform, or {@code null} - * @return The result of file.getPath() with all path Separators beeing a "/", or {@code null} + * @param file the file to transform, or `null` + * @return The result of file.getPath() with all path Separators beeing a "/", or `null` * Needed to transform Windows path separators into slashes. */ - public static String asPath(File file) { + fun asPath(file: File?): String? { if (file == null) { - return null; + return null } - return asPath(file.getPath()); + return asPath(file.getPath()) } /** * platform independent file.getPath() * - * @param path the path to transform, or {@code null} + * @param path the path to transform, or `null` * @return The result will have all platform path separators replaced by "/". */ - public static String asPath(String path) { + fun asPath(path: String?): String? { if (path == null) { - return null; + return null } // On windows we have to replace the backslash - if (!File.separator.equals(FileUtil.URI_SEPARATOR_CHAR)) { - return path.replace(File.separator, FileUtil.URI_SEPARATOR_CHAR); + if (File.separator != URI_SEPARATOR_CHAR) { + return path.replace(File.separator, URI_SEPARATOR_CHAR) } else { - return path; + return path } } /** * Given a file inside content it return * the relative path to get to the root. - *

+ * + * * Example: /content and /content/tags/blog will return '../..' * * @param sourceFile the file to calculate relative path for @@ -289,31 +276,31 @@ public class FileUtil { * @param config the jbake configuration * @return the relative path to get to the root */ - static public String getPathToRoot(JBakeConfiguration config, File rootPath, File sourceFile) { - - Path r = Paths.get(rootPath.toURI()); - Path s = Paths.get(sourceFile.getParentFile().toURI()); - Path relativePath = s.relativize(r); + fun getPathToRoot(config: JBakeConfiguration, rootPath: File, sourceFile: File): String { + val r = Paths.get(rootPath.toURI()) + val s = Paths.get(sourceFile.getParentFile().toURI()) + val relativePath = s.relativize(r) - StringBuilder sb = new StringBuilder(); + val sb = StringBuilder() - sb.append(asPath(relativePath.toString())); + sb.append(asPath(relativePath.toString())) - if (config.getUriWithoutExtension()) { - sb.append("/.."); + if (config.uriWithoutExtension) { + sb.append("/..") } - if (sb.length() > 0) { // added as calling logic assumes / at end. - sb.append("/"); + if (sb.length > 0) { // added as calling logic assumes / at end. + sb.append("/") } - return sb.toString(); + return sb.toString() } - static public String getUriPathToDestinationRoot(JBakeConfiguration config, File sourceFile) { - return getPathToRoot(config, config.getDestinationFolder(), sourceFile); + fun getUriPathToDestinationRoot(config: JBakeConfiguration, sourceFile: File): String { + return FileUtil.getPathToRoot(config, config.destinationFolder!!, sourceFile) } - static public String getUriPathToContentRoot(JBakeConfiguration config, File sourceFile) { - return getPathToRoot(config, config.getContentFolder(), sourceFile); + @JvmStatic + fun getUriPathToContentRoot(config: JBakeConfiguration, sourceFile: File): String { + return FileUtil.getPathToRoot(config, config.contentFolder!!, sourceFile) } /** @@ -324,10 +311,11 @@ public class FileUtil { * @return true if the file is somewhere in the provided directory, false if it is not. * @throws IOException if the canonical path for either of the input directories can't be determined. */ - public static boolean isFileInDirectory(File file, File directory) throws IOException { + @JvmStatic + @Throws(IOException::class) + fun isFileInDirectory(file: File, directory: File): Boolean { return (file.exists() - && !file.isHidden() - && directory.isDirectory() - && file.getCanonicalPath().startsWith(directory.getCanonicalPath())); + && !file.isHidden() && directory.isDirectory() + && file.getCanonicalPath().startsWith(directory.getCanonicalPath())) } } diff --git a/jbake-core/src/main/java/org/jbake/app/JBakeException.kt b/jbake-core/src/main/java/org/jbake/app/JBakeException.kt index f3e858a4a..7c4809115 100644 --- a/jbake-core/src/main/java/org/jbake/app/JBakeException.kt +++ b/jbake-core/src/main/java/org/jbake/app/JBakeException.kt @@ -1,36 +1,29 @@ -package org.jbake.app; +package org.jbake.app -import org.jbake.launcher.SystemExit; +import org.jbake.launcher.SystemExit /** * This runtime exception is thrown by JBake API to indicate an processing * error. - *

+ * + * * It always contains an error message and if available the cause. */ -public class JBakeException extends RuntimeException { - private static final long serialVersionUID = 1L; - - final private SystemExit exit; - - /** - * - * @param message - * The error message. - * @param cause - * The causing exception or null if no cause - * available. - */ - public JBakeException(final SystemExit exit, final String message, final Throwable cause) { - super(message, cause); - this.exit = exit; - } - - public JBakeException(final SystemExit exit, final String message) { - this(exit, message, null); +class JBakeException +/** + * + * @param message + * The error message. + * @param cause + * The causing exception or `null` if no cause + * available. + */ @JvmOverloads constructor(private val exit: SystemExit, message: String?, cause: Throwable? = null) : + RuntimeException(message, cause) { + fun getExit(): Int { + return exit.getStatus() } - public int getExit() { - return exit.getStatus(); + companion object { + private const val serialVersionUID = 1L } } diff --git a/jbake-core/src/main/java/org/jbake/app/Oven.kt b/jbake-core/src/main/java/org/jbake/app/Oven.kt index ead7ce2cf..d2b913894 100644 --- a/jbake-core/src/main/java/org/jbake/app/Oven.kt +++ b/jbake-core/src/main/java/org/jbake/app/Oven.kt @@ -1,52 +1,47 @@ -package org.jbake.app; - -import org.apache.commons.configuration2.CompositeConfiguration; -import org.apache.commons.lang3.LocaleUtils; -import org.jbake.app.configuration.DefaultJBakeConfiguration; -import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.app.configuration.JBakeConfigurationFactory; -import org.jbake.app.configuration.JBakeConfigurationInspector; -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.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.util.ArrayList; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; -import java.util.ServiceLoader; +package org.jbake.app + +import org.apache.commons.configuration2.CompositeConfiguration +import org.apache.commons.lang3.LocaleUtils +import org.jbake.app.configuration.DefaultJBakeConfiguration +import org.jbake.app.configuration.JBakeConfiguration +import org.jbake.app.configuration.JBakeConfigurationFactory +import org.jbake.app.configuration.JBakeConfigurationInspector +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.slf4j.Logger +import org.slf4j.LoggerFactory +import java.io.File +import java.util.* /** * All the baking happens in the Oven! * - * @author Jonathan Bullock jonbullock@gmail.com + * @author Jonathan Bullock [jonbullock@gmail.com](mailto:jonbullock@gmail.com) */ -public class Oven { - - private static final Logger LOGGER = LoggerFactory.getLogger(Oven.class); - - private final Utensils utensils; - private final List errors = new LinkedList<>(); - private int renderedCount = 0; +class Oven { + @JvmField + val utensils: Utensils + private val errors: MutableList = LinkedList() + private var renderedCount = 0 /** * @param source Project source directory * @param destination The destination folder * @param isClearCache Should the cache be cleaned * @throws Exception if configuration is not loaded correctly - * @deprecated Use {@link #Oven(JBakeConfiguration)} instead - * Delegate c'tor to prevent API break for the moment. */ - @Deprecated - public Oven(final File source, final File destination, final boolean isClearCache) throws Exception { - this(new JBakeConfigurationFactory().createDefaultJbakeConfiguration(source, destination, isClearCache)); - } + @Deprecated( + """Use {@link #Oven(JBakeConfiguration)} instead + Delegate c'tor to prevent API break for the moment.""" + ) + constructor( + source: File, + destination: File?, + isClearCache: Boolean + ) : this(JBakeConfigurationFactory().createDefaultJbakeConfiguration(source, destination, isClearCache)) /** * @param source Project source directory @@ -54,54 +49,55 @@ public class Oven { * @param config Project configuration * @param isClearCache Should the cache be cleaned * @throws Exception if configuration is not loaded correctly - * @deprecated Use {@link #Oven(JBakeConfiguration)} instead - * Creates a new instance of the Oven with references to the source and destination folders. */ - @Deprecated - public Oven(final File source, final File destination, final CompositeConfiguration config, final boolean isClearCache) throws Exception { - this(new JBakeConfigurationFactory().createDefaultJbakeConfiguration(source, destination, config, isClearCache)); - } + @Deprecated( + """Use {@link #Oven(JBakeConfiguration)} instead + Creates a new instance of the Oven with references to the source and destination folders.""" + ) + constructor(source: File?, destination: File?, config: CompositeConfiguration?, isClearCache: Boolean) : this( + JBakeConfigurationFactory().createDefaultJbakeConfiguration(source, destination, config, isClearCache) + ) /** - * Create an Oven instance by a {@link JBakeConfiguration} - *

- * It creates default {@link Utensils} needed to bake sites. + * Create an Oven instance by a [JBakeConfiguration] * - * @param config The project configuration. see {@link JBakeConfiguration} + * + * It creates default [Utensils] needed to bake sites. + * + * @param config The project configuration. see [JBakeConfiguration] */ - public Oven(JBakeConfiguration config) { - this.utensils = UtensilsFactory.createDefaultUtensils(config); + constructor(config: JBakeConfiguration?) { + this.utensils = UtensilsFactory.createDefaultUtensils(config) } /** - * Create an Oven instance with given {@link Utensils} + * Create an Oven instance with given [Utensils] * * @param utensils All Utensils necessary to bake */ - public Oven(Utensils utensils) { - checkConfiguration(utensils.getConfiguration()); - this.utensils = utensils; - } - - @Deprecated - public CompositeConfiguration getConfig() { - return ((DefaultJBakeConfiguration) utensils.getConfiguration()).getCompositeConfiguration(); - } - - // TODO: do we want to use this. Else, config could be final - @Deprecated - public void setConfig(final CompositeConfiguration config) { - ((DefaultJBakeConfiguration) utensils.getConfiguration()).setCompositeConfiguration(config); - } + constructor(utensils: Utensils) { + checkConfiguration(utensils.getConfiguration()) + this.utensils = utensils + } + + @get:Deprecated("") + @set:Deprecated("") + var config: CompositeConfiguration + get() = (utensils.getConfiguration() as DefaultJBakeConfiguration).compositeConfiguration + // TODO: do we want to use this. Else, config could be final + set(config) { + (utensils.getConfiguration() as DefaultJBakeConfiguration).compositeConfiguration = config + } /** * Checks source path contains required sub-folders (i.e. templates) and setups up variables for them. * - * @deprecated There is no need for this method anymore. Validation is now part of the instantiation. - * Can be removed with 3.0.0. */ - @Deprecated - public void setupPaths() { + @Deprecated( + """There is no need for this method anymore. Validation is now part of the instantiation. + Can be removed with 3.0.0.""" + ) + fun setupPaths() { /* nothing to do here */ } @@ -111,19 +107,19 @@ public class Oven { * * @throws JBakeException If template or contents folder don't exist */ - private void checkConfiguration(JBakeConfiguration configuration) { - JBakeConfigurationInspector inspector = new JBakeConfigurationInspector(configuration); - inspector.inspect(); + private fun checkConfiguration(configuration: JBakeConfiguration) { + val inspector = JBakeConfigurationInspector(configuration) + inspector.inspect() } /** * Sets the Locale for the JVM * */ - private void setLocale() { - String localeString = getUtensils().getConfiguration().getJvmLocale(); - Locale locale = localeString != null ? LocaleUtils.toLocale(localeString) : Locale.getDefault(); - Locale.setDefault(locale); + private fun setLocale() { + val localeString = this.utensils.getConfiguration().jvmLocale + val locale = if (localeString != null) LocaleUtils.toLocale(localeString) else Locale.getDefault() + Locale.setDefault(locale) } /** @@ -131,61 +127,59 @@ public class Oven { * * @param fileToBake The file to bake */ - public void bake(File fileToBake) { - Asset asset = utensils.getAsset(); - if(asset.isAssetFile(fileToBake)) { - LOGGER.info("Baking a change to an asset [" + fileToBake.getPath() + "]"); - asset.copySingleFile(fileToBake); + fun bake(fileToBake: File) { + val asset = utensils.getAsset() + if (asset.isAssetFile(fileToBake)) { + LOGGER.info("Baking a change to an asset [" + fileToBake.getPath() + "]") + asset.copySingleFile(fileToBake) } else { - LOGGER.info("Playing it safe and running a full bake..."); - bake(); + LOGGER.info("Playing it safe and running a full bake...") + bake() } } /** * All the good stuff happens in here... */ - public void bake() { - - ContentStore contentStore = utensils.getContentStore(); - JBakeConfiguration config = utensils.getConfiguration(); - Crawler crawler = utensils.getCrawler(); - Asset asset = utensils.getAsset(); - setLocale(); + fun bake() { + val contentStore = utensils.getContentStore() + val config = utensils.getConfiguration() + val crawler = utensils.getCrawler() + val asset = utensils.getAsset() + setLocale() try { - - final long start = new Date().getTime(); - LOGGER.info("Baking has started..."); - contentStore.startup(); - updateDocTypesFromConfiguration(); - contentStore.updateSchema(); - contentStore.updateAndClearCacheIfNeeded(config.getClearCache(), config.getTemplateFolder()); + val start = Date().getTime() + LOGGER.info("Baking has started...") + contentStore.startup() + updateDocTypesFromConfiguration() + contentStore.updateSchema() + contentStore.updateAndClearCacheIfNeeded(config.clearCache, config.templateFolder) // process source content - crawler.crawl(); + crawler.crawl() // process data files - crawler.crawlDataFiles(); + crawler.crawlDataFiles() // render content - renderContent(); + renderContent() // copy assets - asset.copy(); - asset.copyAssetsFromContent(config.getContentFolder()); + asset.copy() + asset.copyAssetsFromContent(config.contentFolder) - errors.addAll(asset.getErrors()); + errors.addAll(asset.getErrors()) - LOGGER.info("Baking finished!"); - long end = new Date().getTime(); - LOGGER.info("Baked {} items in {}ms", renderedCount, end - start); + LOGGER.info("Baking finished!") + val end = Date().getTime() + LOGGER.info("Baked {} items in {}ms", renderedCount, end - start) if (!errors.isEmpty()) { - LOGGER.error("Failed to bake {} item(s)!", errors.size()); + LOGGER.error("Failed to bake {} item(s)!", errors.size) } } finally { - contentStore.close(); - contentStore.shutdown(); + contentStore.close() + contentStore.shutdown() } } @@ -193,48 +187,48 @@ public class Oven { * Iterates over the configuration, searching for keys like "template.index.file=..." * in order to register new document types. */ - private void updateDocTypesFromConfiguration() { - resetDocumentTypesAndExtractors(); - JBakeConfiguration config = utensils.getConfiguration(); + private fun updateDocTypesFromConfiguration() { + resetDocumentTypesAndExtractors() + val config = utensils.getConfiguration() - ModelExtractorsDocumentTypeListener listener = new ModelExtractorsDocumentTypeListener(); - DocumentTypes.addListener(listener); + val listener = ModelExtractorsDocumentTypeListener() + DocumentTypes.addListener(listener) - for (String docType : config.getDocumentTypes()) { - DocumentTypes.addDocumentType(docType); + for (docType in config.documentTypes!!) { + DocumentTypes.addDocumentType(docType) } // needs manually setting as this isn't defined in same way as document types for content files - DocumentTypes.addDocumentType(config.getDataFileDocType()); + DocumentTypes.addDocumentType(config.dataFileDocType) } - private void resetDocumentTypesAndExtractors() { - DocumentTypes.resetDocumentTypes(); - ModelExtractors.getInstance().reset(); + private fun resetDocumentTypesAndExtractors() { + DocumentTypes.resetDocumentTypes() + ModelExtractors.Companion.getInstance().reset() } /** - * Load {@link RenderingTool} instances and delegate rendering of documents to them + * Load [RenderingTool] instances and delegate rendering of documents to them */ - private void renderContent() { - JBakeConfiguration config = utensils.getConfiguration(); - Renderer renderer = utensils.getRenderer(); - ContentStore contentStore = utensils.getContentStore(); + private fun renderContent() { + val config = utensils.getConfiguration() + val renderer = utensils.getRenderer() + val contentStore = utensils.getContentStore() - for (RenderingTool tool : ServiceLoader.load(RenderingTool.class)) { + for (tool in ServiceLoader.load(RenderingTool::class.java)) { try { - renderedCount += tool.render(renderer, contentStore, config); - } catch (RenderingException e) { - errors.add(e); + renderedCount += tool.render(renderer, contentStore, config) + } catch (e: RenderingException) { + errors.add(e) } } } - public List getErrors() { - return new ArrayList<>(errors); + fun getErrors(): MutableList { + return ArrayList(errors) } - public Utensils getUtensils() { - return utensils; + companion object { + private val LOGGER: Logger = LoggerFactory.getLogger(Oven::class.java) } } diff --git a/jbake-core/src/main/java/org/jbake/app/Parser.kt b/jbake-core/src/main/java/org/jbake/app/Parser.kt index 129b01abf..5355a0d34 100644 --- a/jbake-core/src/main/java/org/jbake/app/Parser.kt +++ b/jbake-core/src/main/java/org/jbake/app/Parser.kt @@ -1,46 +1,41 @@ -package org.jbake.app; +package org.jbake.app -import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.model.DocumentModel; -import org.jbake.parser.Engines; -import org.jbake.parser.ParserEngine; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; +import org.jbake.app.configuration.JBakeConfiguration +import org.jbake.model.DocumentModel +import org.jbake.parser.Engines +import org.jbake.parser.ParserEngine +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.io.File /** * Parses a File for content. * - * @author Jonathan Bullock jonbullock@gmail.com + * @author Jonathan Bullock [jonbullock@gmail.com](mailto:jonbullock@gmail.com) */ -public class Parser { - private static final Logger LOGGER = LoggerFactory.getLogger(Parser.class); - - private JBakeConfiguration config; - - /** - * Creates a new instance of Parser. - * - * @param config Project configuration - */ - public Parser(JBakeConfiguration config) { - this.config = config; - } - +class Parser +/** + * Creates a new instance of Parser. + * + * @param config Project configuration + */(private val config: JBakeConfiguration?) { /** * Process the file by parsing the contents. * * @param file File input for parsing * @return The contents of the file */ - public DocumentModel processFile(File file) { - ParserEngine engine = Engines.get(FileUtil.fileExt(file)); + fun processFile(file: File): DocumentModel? { + val engine: ParserEngine? = Engines.Companion.get(FileUtil.fileExt(file)) if (engine == null) { - LOGGER.error("Unable to find suitable markup engine for {}", file); - return null; + LOGGER.error("Unable to find suitable markup engine for {}", file) + return null } - return engine.parse(config, file); + return engine.parse(config, file) + } + + companion object { + private val LOGGER: Logger = LoggerFactory.getLogger(Parser::class.java) } } diff --git a/jbake-core/src/main/java/org/jbake/app/Renderer.kt b/jbake-core/src/main/java/org/jbake/app/Renderer.kt index 5508fd327..880373640 100644 --- a/jbake-core/src/main/java/org/jbake/app/Renderer.kt +++ b/jbake-core/src/main/java/org/jbake/app/Renderer.kt @@ -1,77 +1,76 @@ -package org.jbake.app; - -import org.apache.commons.configuration2.CompositeConfiguration; -import org.jbake.app.configuration.DefaultJBakeConfiguration; -import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.app.configuration.JBakeConfigurationFactory; -import org.jbake.model.DocumentModel; -import org.jbake.model.ModelAttributes; -import org.jbake.template.DelegatingTemplateEngine; -import org.jbake.template.model.TemplateModel; -import org.jbake.util.PagingHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -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; +package org.jbake.app + +import org.apache.commons.configuration2.CompositeConfiguration +import org.jbake.app.configuration.DefaultJBakeConfiguration +import org.jbake.app.configuration.JBakeConfiguration +import org.jbake.app.configuration.JBakeConfigurationFactory +import org.jbake.model.DocumentModel +import org.jbake.model.ModelAttributes +import org.jbake.template.DelegatingTemplateEngine +import org.jbake.template.model.TemplateModel +import org.jbake.util.PagingHelper +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.io.* +import java.nio.file.Files +import java.util.* /** * Render output to a file. * - * @author Jonathan Bullock jonbullock@gmail.com + * @author Jonathan Bullock [jonbullock@gmail.com](mailto:jonbullock@gmail.com) */ -public class Renderer { - private static final String MASTERINDEX_TEMPLATE_NAME = "masterindex"; - private static final String SITEMAP_TEMPLATE_NAME = "sitemap"; - private static final String FEED_TEMPLATE_NAME = "feed"; - private static final String ARCHIVE_TEMPLATE_NAME = "archive"; - private static final String ERROR404_TEMPLATE_NAME = "error404"; - - private final Logger logger = LoggerFactory.getLogger(Renderer.class); - private final JBakeConfiguration config; - private final DelegatingTemplateEngine renderingEngine; - private final ContentStore db; +class Renderer { + private val logger: Logger = LoggerFactory.getLogger(Renderer::class.java) + private val config: JBakeConfiguration + private val renderingEngine: DelegatingTemplateEngine + private val db: ContentStore /** * @param db The database holding the content * @param destination The destination folder * @param templatesPath The templates folder * @param config Project configuration - * @deprecated Use {@link #Renderer(ContentStore, JBakeConfiguration)} instead. - * Creates a new instance of Renderer with supplied references to folders. */ - @Deprecated - public Renderer(ContentStore db, File destination, File templatesPath, CompositeConfiguration config) { - this(db, new JBakeConfigurationFactory().createDefaultJbakeConfiguration(templatesPath.getParentFile(), config)); - DefaultJBakeConfiguration configuration = ((DefaultJBakeConfiguration) this.config); - configuration.setDestinationFolder(destination); - configuration.setTemplateFolder(templatesPath); + @Deprecated( + """Use {@link #Renderer(ContentStore, JBakeConfiguration)} instead. + Creates a new instance of Renderer with supplied references to folders.""" + ) + constructor(db: ContentStore, destination: File?, templatesPath: File, config: CompositeConfiguration?) : this( + db, + JBakeConfigurationFactory().createDefaultJbakeConfiguration(templatesPath.getParentFile(), config) + ) { + val configuration = (this.config as DefaultJBakeConfiguration) + configuration.setDestinationFolder(destination) + configuration.setTemplateFolder(templatesPath) } // TOqDO: should all content be made available to all templates via this class?? - /** * @param db The database holding the content * @param destination The destination folder * @param templatesPath The templates folder * @param config Project configuration * @param renderingEngine The instance of DelegatingTemplateEngine to use - * @deprecated Use {@link #Renderer(ContentStore, JBakeConfiguration, DelegatingTemplateEngine)} instead. - * Creates a new instance of Renderer with supplied references to folders and the instance of DelegatingTemplateEngine to use. */ - @Deprecated - public Renderer(ContentStore db, File destination, File templatesPath, CompositeConfiguration config, DelegatingTemplateEngine renderingEngine) { - this(db, new JBakeConfigurationFactory().createDefaultJbakeConfiguration(templatesPath.getParentFile(), config), renderingEngine); - DefaultJBakeConfiguration configuration = ((DefaultJBakeConfiguration) this.config); - configuration.setDestinationFolder(destination); - configuration.setTemplateFolder(templatesPath); + @Deprecated( + """Use {@link #Renderer(ContentStore, JBakeConfiguration, DelegatingTemplateEngine)} instead. + Creates a new instance of Renderer with supplied references to folders and the instance of DelegatingTemplateEngine to use.""" + ) + constructor( + db: ContentStore, + destination: File?, + templatesPath: File, + config: CompositeConfiguration?, + renderingEngine: DelegatingTemplateEngine + ) : this( + db, + JBakeConfigurationFactory().createDefaultJbakeConfiguration(templatesPath.getParentFile(), config), + renderingEngine + ) { + val configuration = (this.config as DefaultJBakeConfiguration) + configuration.setDestinationFolder(destination) + configuration.setTemplateFolder(templatesPath) } /** @@ -80,10 +79,10 @@ public class Renderer { * @param db The database holding the content * @param config Project configuration */ - public Renderer(ContentStore db, JBakeConfiguration config) { - this.config = config; - this.renderingEngine = new DelegatingTemplateEngine(db, config); - this.db = db; + constructor(db: ContentStore, config: JBakeConfiguration) { + this.config = config + this.renderingEngine = DelegatingTemplateEngine(db, config) + this.db = db } /** @@ -93,14 +92,14 @@ public class Renderer { * @param config The application specific configuration * @param renderingEngine The instance of DelegatingTemplateEngine to use */ - public Renderer(ContentStore db, JBakeConfiguration config, DelegatingTemplateEngine renderingEngine) { - this.config = config; - this.renderingEngine = renderingEngine; - this.db = db; + constructor(db: ContentStore, config: JBakeConfiguration, renderingEngine: DelegatingTemplateEngine) { + this.config = config + this.renderingEngine = renderingEngine + this.db = db } - private String findTemplateName(String docType) { - return config.getTemplateByDocType(docType); + private fun findTemplateName(docType: String?): String? { + return config.getTemplateByDocType(docType) } /** @@ -109,64 +108,70 @@ public class Renderer { * @param content The content to renderDocument * @throws Exception if IOException or SecurityException are raised */ - public void render(DocumentModel content) throws Exception { - String docType = content.getType(); - String outputFilename = config.getDestinationFolder().getPath() + File.separatorChar + content.getUri(); + @Throws(Exception::class) + fun render(content: DocumentModel) { + val docType = content.getType() + var outputFilename = (config.destinationFolder!!.getPath() + File.separatorChar).toString() + content.getUri() if (outputFilename.lastIndexOf('.') > outputFilename.lastIndexOf(File.separatorChar)) { - outputFilename = outputFilename.substring(0, outputFilename.lastIndexOf('.')); + outputFilename = outputFilename.substring(0, outputFilename.lastIndexOf('.')) } // delete existing versions if they exist in case status has changed either way - String outputExtension = config.getOutputExtensionByDocType(docType); - File draftFile = new File(outputFilename, config.getDraftSuffix() + outputExtension); + val outputExtension = config.getOutputExtensionByDocType(docType) + val draftFile = File(outputFilename, config.draftSuffix + outputExtension) if (draftFile.exists()) { - Files.delete(draftFile.toPath()); + Files.delete(draftFile.toPath()) } - File publishedFile = new File(outputFilename + outputExtension); + val publishedFile = File(outputFilename + outputExtension) if (publishedFile.exists()) { - Files.delete(publishedFile.toPath()); + Files.delete(publishedFile.toPath()) } - if (content.getStatus().equals(ModelAttributes.Status.DRAFT)) { - outputFilename = outputFilename + config.getDraftSuffix(); + if (content.getStatus() == ModelAttributes.Status.DRAFT) { + outputFilename = outputFilename + config.draftSuffix } - File outputFile = new File(outputFilename + outputExtension); - TemplateModel model = new TemplateModel(); - model.setContent(content); - model.setRenderer(renderingEngine); + val outputFile = File(outputFilename + outputExtension) + val model = TemplateModel() + model.setContent(content) + model.setRenderer(renderingEngine) try { - try (Writer out = createWriter(outputFile)) { - renderingEngine.renderDocument(model, findTemplateName(docType), out); + createWriter(outputFile).use { out -> + renderingEngine.renderDocument(model, findTemplateName(docType), out) } - logger.info("Rendering [{}]... done!", outputFile); - } catch (Exception e) { - logger.error("Rendering [{}]... failed!", outputFile, e); - throw new Exception("Failed to render file " + outputFile.getAbsolutePath() + ". Cause: " + e.getMessage(), e); + logger.info("Rendering [{}]... done!", outputFile) + } catch (e: Exception) { + logger.error("Rendering [{}]... failed!", outputFile, e) + throw Exception("Failed to render file " + outputFile.getAbsolutePath() + ". Cause: " + e.message, e) } } - private Writer createWriter(File file) throws IOException { + @Throws(IOException::class) + private fun createWriter(file: File): Writer { if (!file.exists()) { - file.getParentFile().mkdirs(); - file.createNewFile(); + file.getParentFile().mkdirs() + file.createNewFile() } - return new OutputStreamWriter(new FileOutputStream(file), config.getRenderEncoding()); + return OutputStreamWriter(FileOutputStream(file), config.renderEncoding) } - private void render(RenderingConfig renderConfig) throws Exception { - File outputFile = renderConfig.getPath(); + @Throws(Exception::class) + private fun render(renderConfig: RenderingConfig) { + val outputFile = renderConfig.path try { - try (Writer out = createWriter(outputFile)) { - renderingEngine.renderDocument(renderConfig.getModel(), renderConfig.getTemplate(), out); + createWriter(outputFile).use { out -> + renderingEngine.renderDocument( + renderConfig.model, + renderConfig.template, out + ) } - logger.info("Rendering {} [{}]... done!", renderConfig.getName(), outputFile); - } catch (Exception e) { - logger.error("Rendering {} [{}]... failed!", renderConfig.getName(), outputFile, e); - throw new Exception("Failed to render " + renderConfig.getName(), e); + logger.info("Rendering {} [{}]... done!", renderConfig.name, outputFile) + } catch (e: Exception) { + logger.error("Rendering {} [{}]... failed!", renderConfig.name, outputFile, e) + throw Exception("Failed to render " + renderConfig.name, e) } } @@ -176,51 +181,57 @@ public class Renderer { * @param indexFile The name of the output file * @throws Exception if IOException or SecurityException are raised */ - public void renderIndex(String indexFile) throws Exception { - render(new DefaultRenderingConfig(indexFile, MASTERINDEX_TEMPLATE_NAME)); + @Throws(Exception::class) + fun renderIndex(indexFile: String?) { + render(DefaultRenderingConfig(indexFile, MASTERINDEX_TEMPLATE_NAME)) } - public void renderIndexPaging(String indexFile) throws Exception { - long totalPosts = db.getPublishedCount("post"); - int postsPerPage = config.getPostsPerPage(); + @Throws(Exception::class) + fun renderIndexPaging(indexFile: String?) { + val totalPosts = db.getPublishedCount("post") + val postsPerPage = config.postsPerPage - if (totalPosts == 0) { + if (totalPosts == 0L) { //paging makes no sense. render single index file instead - renderIndex(indexFile); + renderIndex(indexFile) } else { - PagingHelper pagingHelper = new PagingHelper(totalPosts, postsPerPage); + val pagingHelper = PagingHelper(totalPosts, postsPerPage) - TemplateModel model = new TemplateModel(); - model.setRenderer(renderingEngine); - model.setNumberOfPages(pagingHelper.getNumberOfPages()); + val model = TemplateModel() + model.setRenderer(renderingEngine) + model.setNumberOfPages(pagingHelper.getNumberOfPages()) try { - db.setLimit(postsPerPage); - for (int pageStart = 0, page = 1; pageStart < totalPosts; pageStart += postsPerPage, page++) { - String fileName = indexFile; + db.setLimit(postsPerPage) + var pageStart = 0 + var page = 1 + while (pageStart < totalPosts) { + var fileName = indexFile - db.setStart(pageStart); - model.setCurrentPageNuber(page); - String previous = pagingHelper.getPreviousFileName(page); - model.setPreviousFilename(previous); - String nextFileName = pagingHelper.getNextFileName(page); - model.setNextFileName(nextFileName); + db.setStart(pageStart) + model.setCurrentPageNuber(page) + val previous = pagingHelper.getPreviousFileName(page) + model.setPreviousFilename(previous) + val nextFileName = pagingHelper.getNextFileName(page) + model.setNextFileName(nextFileName) - DocumentModel contentModel = buildSimpleModel(MASTERINDEX_TEMPLATE_NAME); + val contentModel = buildSimpleModel(MASTERINDEX_TEMPLATE_NAME) if (page > 1) { - contentModel.setRootPath("../"); + contentModel.setRootPath("../") } - model.setContent(contentModel); + model.setContent(contentModel) // Add page number to file name - fileName = pagingHelper.getCurrentFileName(page, fileName); - ModelRenderingConfig renderConfig = new ModelRenderingConfig(fileName, model, MASTERINDEX_TEMPLATE_NAME); - render(renderConfig); + fileName = pagingHelper.getCurrentFileName(page, fileName) + val renderConfig = ModelRenderingConfig(fileName, model, MASTERINDEX_TEMPLATE_NAME) + render(renderConfig) + pageStart += postsPerPage + page++ } - db.resetPagination(); - } catch (Exception e) { - throw new Exception("Failed to render index. Cause: " + e.getMessage(), e); + db.resetPagination() + } catch (e: Exception) { + throw Exception("Failed to render index. Cause: " + e.message, e) } } } @@ -230,11 +241,13 @@ public class Renderer { * * @param sitemapFile configuration for site map * @throws Exception if can't create correct default rendering config - * @see About Sitemaps - * @see Sitemap protocol + * @see [About Sitemaps](https://support.google.com/webmasters/answer/156184?hl=en&ref_topic=8476) + * + * @see [Sitemap protocol](http://www.sitemaps.org/) */ - public void renderSitemap(String sitemapFile) throws Exception { - render(new DefaultRenderingConfig(sitemapFile, SITEMAP_TEMPLATE_NAME)); + @Throws(Exception::class) + fun renderSitemap(sitemapFile: String?) { + render(DefaultRenderingConfig(sitemapFile, SITEMAP_TEMPLATE_NAME)) } /** @@ -243,8 +256,9 @@ public class Renderer { * @param feedFile The name of the output file * @throws Exception if default rendering configuration is not loaded correctly */ - public void renderFeed(String feedFile) throws Exception { - render(new DefaultRenderingConfig(feedFile, FEED_TEMPLATE_NAME)); + @Throws(Exception::class) + fun renderFeed(feedFile: String?) { + render(DefaultRenderingConfig(feedFile, FEED_TEMPLATE_NAME)) } /** @@ -253,8 +267,9 @@ public class Renderer { * @param archiveFile The name of the output file * @throws Exception if default rendering configuration is not loaded correctly */ - public void renderArchive(String archiveFile) throws Exception { - render(new DefaultRenderingConfig(archiveFile, ARCHIVE_TEMPLATE_NAME)); + @Throws(Exception::class) + fun renderArchive(archiveFile: String?) { + render(DefaultRenderingConfig(archiveFile, ARCHIVE_TEMPLATE_NAME)) } /** @@ -263,8 +278,9 @@ public class Renderer { * @param errorFile The name of the output file * @throws Exception if default rendering configuration is not loaded correctly */ - public void renderError404(String errorFile) throws Exception { - render(new DefaultRenderingConfig(errorFile, ERROR404_TEMPLATE_NAME)); + @Throws(Exception::class) + fun renderError404(errorFile: String?) { + render(DefaultRenderingConfig(errorFile, ERROR404_TEMPLATE_NAME)) } /** @@ -274,59 +290,69 @@ public class Renderer { * @return Number of rendered tags * @throws Exception if cannot render tags correctly */ - public int renderTags(String tagPath) throws Exception { - int renderedCount = 0; - final List errors = new LinkedList<>(); + @Throws(Exception::class) + fun renderTags(tagPath: String?): Int { + var renderedCount = 0 + val errors: MutableList = LinkedList() - for (String tag : db.getAllTags()) { + for (tag in db.getAllTags()) { try { - TemplateModel model = new TemplateModel(); - model.setRenderer(renderingEngine); - model.setTag(tag); - DocumentModel map = buildSimpleModel(ModelAttributes.TAG.toString()); - 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()))); - - renderedCount++; - } catch (Exception e) { - errors.add(e); + val model = TemplateModel() + model.setRenderer(renderingEngine) + model.setTag(tag) + val map = buildSimpleModel(ModelAttributes.TAG.toString()) + val path = + File(config.destinationFolder + File.separator + tagPath + File.separator + tag + config.outputExtension) + + map.setRootPath(FileUtil.getUriPathToDestinationRoot(config, path)) + model.setContent(map) + + render( + ModelRenderingConfig( + path, + ModelAttributes.TAG.toString(), + model, + findTemplateName(ModelAttributes.TAG.toString()) + ) + ) + + renderedCount++ + } catch (e: Exception) { + errors.add(e) } } - if (config.getRenderTagsIndex()) { + if (config.renderTagsIndex) { try { // Add an index file at root folder of tags. // This will prevent directory listing and also provide an option to // display all tags page. - TemplateModel model = new TemplateModel(); - model.setRenderer(renderingEngine); - DocumentModel map = buildSimpleModel(ModelAttributes.TAGS.toString()); - File path = new File(config.getDestinationFolder() + File.separator + tagPath + File.separator + "index" + config.getOutputExtension()); + val model = TemplateModel() + model.setRenderer(renderingEngine) + val map = buildSimpleModel(ModelAttributes.TAGS.toString()) + val path = + File(config.destinationFolder + File.separator + tagPath + File.separator + "index" + config.outputExtension) - map.setRootPath(FileUtil.getUriPathToDestinationRoot(config, path)); - model.setContent(map); + map.setRootPath(FileUtil.getUriPathToDestinationRoot(config, path)) + model.setContent(map) - render(new ModelRenderingConfig(path, "tagindex", model, findTemplateName("tagsindex"))); - renderedCount++; - } catch (Exception e) { - errors.add(e); + render(ModelRenderingConfig(path, "tagindex", model, findTemplateName("tagsindex"))) + renderedCount++ + } catch (e: Exception) { + errors.add(e) } } if (!errors.isEmpty()) { - StringBuilder sb = new StringBuilder(); - sb.append("Failed to render tags. Cause(s):"); - for (Throwable error : errors) { - sb.append("\n").append(error.getMessage()); + val sb = StringBuilder() + sb.append("Failed to render tags. Cause(s):") + for (error in errors) { + sb.append("\n").append(error.message) } - throw new Exception(sb.toString(), errors.get(0)); + throw Exception(sb.toString(), errors.get(0)) } else { - return renderedCount; + return renderedCount } } @@ -334,88 +360,86 @@ public class Renderer { * Builds simple map of values, which are exposed when rendering index/archive/sitemap/feed/tags. * * @param type - * @return a basic {@link DocumentModel} + * @return a basic [DocumentModel] */ - private DocumentModel buildSimpleModel(String type) { - DocumentModel content = new DocumentModel(); - content.setType(type); - content.setRootPath(""); + private fun buildSimpleModel(type: String?): DocumentModel { + val content = DocumentModel() + content.setType(type) + content.setRootPath("") // add any more keys here that need to have a default value to prevent need to perform null check in templates - return content; + return content } private interface RenderingConfig { + val path: File - File getPath(); + val name: String? - String getName(); + val template: String? - String getTemplate(); - - TemplateModel getModel(); + val model: TemplateModel? } - private abstract static class AbstractRenderingConfig implements RenderingConfig { - - protected final File path; - protected final String name; - protected final String template; - - public AbstractRenderingConfig(File path, String name, String template) { - super(); - this.path = path; - this.name = name; - this.template = template; - } - - @Override - public File getPath() { - return path; + private abstract class AbstractRenderingConfig( + protected val path: File?, + protected val name: String?, + protected val template: String? + ) : RenderingConfig { + override fun getPath(): File? { + return path } - @Override - public String getName() { - return name; + override fun getName(): String? { + return name } - @Override - public String getTemplate() { - return template; + override fun getTemplate(): String? { + return template } - } - public class ModelRenderingConfig extends AbstractRenderingConfig { - private final TemplateModel model; + inner class ModelRenderingConfig : AbstractRenderingConfig { + private val model: TemplateModel? - public ModelRenderingConfig(String fileName, TemplateModel model, String templateType) { - super(new File(config.getDestinationFolder(), fileName), fileName, findTemplateName(templateType)); - this.model = model; + constructor( + fileName: String?, + model: TemplateModel?, + templateType: String? + ) : super(File(config.destinationFolder, fileName), fileName, findTemplateName(templateType)) { + this.model = model } - public ModelRenderingConfig(File path, String name, TemplateModel model, String template) { - super(path, name, template); - this.model = model; + constructor(path: File?, name: String?, model: TemplateModel?, template: String?) : super( + path, + name, + template + ) { + this.model = model } - @Override - public TemplateModel getModel() { - return model; + override fun getModel(): TemplateModel? { + return model } } - class DefaultRenderingConfig extends AbstractRenderingConfig { + internal inner class DefaultRenderingConfig : AbstractRenderingConfig { + private val content: DocumentModel - private final DocumentModel content; - - private DefaultRenderingConfig(File path, String allInOneName) { - super(path, allInOneName, findTemplateName(allInOneName)); - this.content = buildSimpleModel(allInOneName); + private constructor(path: File?, allInOneName: String?) : super( + path, + allInOneName, + findTemplateName(allInOneName) + ) { + this.content = buildSimpleModel(allInOneName) } - public DefaultRenderingConfig(String filename, String allInOneName) { - super(new File(config.getDestinationFolder(), File.separator + filename), allInOneName, findTemplateName(allInOneName)); - this.content = buildSimpleModel(allInOneName); + constructor(filename: String?, allInOneName: String?) : super( + File( + config.destinationFolder, + File.separator + filename + ), allInOneName, findTemplateName(allInOneName) + ) { + this.content = buildSimpleModel(allInOneName) } /** @@ -423,26 +447,32 @@ public class Renderer { * * @param allInOneName */ - public DefaultRenderingConfig(String allInOneName) { - this(new File(config.getDestinationFolder().getPath() + File.separator + allInOneName + config.getOutputExtension()), - allInOneName); - } - - @Override - public TemplateModel getModel() { - TemplateModel model = new TemplateModel(); - model.setRenderer(renderingEngine); - model.setContent(content); - - if (config.getPaginateIndex()) { - model.setNumberOfPages(0); - model.setCurrentPageNuber(0); - model.setPreviousFilename(""); - model.setNextFileName(""); + constructor(allInOneName: String?) : this( + File(config.destinationFolder!!.getPath() + File.separator + allInOneName + config.outputExtension), + allInOneName + ) + + override fun getModel(): TemplateModel { + val model = TemplateModel() + model.setRenderer(renderingEngine) + model.setContent(content) + + if (config.paginateIndex) { + model.setNumberOfPages(0) + model.setCurrentPageNuber(0) + model.setPreviousFilename("") + model.setNextFileName("") } - return model; + return model } + } + companion object { + private const val MASTERINDEX_TEMPLATE_NAME = "masterindex" + private const val SITEMAP_TEMPLATE_NAME = "sitemap" + private const val FEED_TEMPLATE_NAME = "feed" + private const val ARCHIVE_TEMPLATE_NAME = "archive" + private const val ERROR404_TEMPLATE_NAME = "error404" } } diff --git a/jbake-core/src/main/java/org/jbake/app/Utensils.kt b/jbake-core/src/main/java/org/jbake/app/Utensils.kt index 648278cfe..a7805ba28 100644 --- a/jbake-core/src/main/java/org/jbake/app/Utensils.kt +++ b/jbake-core/src/main/java/org/jbake/app/Utensils.kt @@ -1,55 +1,20 @@ -package org.jbake.app; +package org.jbake.app -import org.jbake.app.configuration.JBakeConfiguration; +import org.jbake.app.configuration.JBakeConfiguration /** * A helper class to wrap all the utensils that are needed to bake. */ -public class Utensils { - private JBakeConfiguration configuration; - private ContentStore contentStore; - private Crawler crawler; - private Renderer renderer; - private Asset asset; - - public JBakeConfiguration getConfiguration() { - return configuration; - } - - public void setConfiguration(JBakeConfiguration configuration) { - this.configuration = configuration; - } - - public ContentStore getContentStore() { - return contentStore; - } - - public void setContentStore(ContentStore contentStore) { - this.contentStore = contentStore; - } - - public Crawler getCrawler() { - return crawler; - } - - public void setCrawler(Crawler crawler) { - this.crawler = crawler; - } - - public Renderer getRenderer() { - return renderer; - } - - public void setRenderer(Renderer renderer) { - this.renderer = renderer; - } - - public Asset getAsset() { - return asset; - } - - public void setAsset(Asset asset) { - this.asset = asset; - } +class Utensils { + @JvmField + var configuration: JBakeConfiguration? = null + @JvmField + var contentStore: ContentStore? = null + @JvmField + var crawler: Crawler? = null + @JvmField + var renderer: Renderer? = null + @JvmField + var asset: Asset? = null } diff --git a/jbake-core/src/main/java/org/jbake/app/UtensilsFactory.kt b/jbake-core/src/main/java/org/jbake/app/UtensilsFactory.kt index 5e2038193..e19469ab8 100644 --- a/jbake-core/src/main/java/org/jbake/app/UtensilsFactory.kt +++ b/jbake-core/src/main/java/org/jbake/app/UtensilsFactory.kt @@ -1,31 +1,29 @@ -package org.jbake.app; +package org.jbake.app -import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.app.configuration.JBakeConfigurationInspector; +import org.jbake.app.configuration.JBakeConfiguration +import org.jbake.app.configuration.JBakeConfigurationInspector /** - * A factory to create a {@link Utensils} object + * A factory to create a [Utensils] object */ -public class UtensilsFactory { - +object UtensilsFactory { /** - * Create default {@link Utensils} by a given {@link JBakeConfiguration} - * @param config a {@link JBakeConfiguration} - * @return a default {@link Utensils} instance + * Create default [Utensils] by a given [JBakeConfiguration] + * @param config a [JBakeConfiguration] + * @return a default [Utensils] instance */ - public static Utensils createDefaultUtensils(JBakeConfiguration config) { - - JBakeConfigurationInspector inspector = new JBakeConfigurationInspector(config); - inspector.inspect(); + fun createDefaultUtensils(config: JBakeConfiguration): Utensils { + val inspector = JBakeConfigurationInspector(config) + inspector.inspect() - Utensils utensils = new Utensils(); - utensils.setConfiguration(config); - ContentStore contentStore = DBUtil.createDataStore(config); - utensils.setContentStore(contentStore); - utensils.setCrawler(new Crawler(contentStore, config)); - utensils.setRenderer(new Renderer(contentStore, config)); - utensils.setAsset(new Asset(config)); + val utensils = Utensils() + utensils.setConfiguration(config) + val contentStore = DBUtil.createDataStore(config) + utensils.setContentStore(contentStore) + utensils.setCrawler(Crawler(contentStore, config)) + utensils.setRenderer(Renderer(contentStore, config)) + utensils.setAsset(Asset(config)) - return utensils; + return utensils } } diff --git a/jbake-core/src/main/java/org/jbake/app/ZipUtil.kt b/jbake-core/src/main/java/org/jbake/app/ZipUtil.kt index 481b94a10..e79f80665 100644 --- a/jbake-core/src/main/java/org/jbake/app/ZipUtil.kt +++ b/jbake-core/src/main/java/org/jbake/app/ZipUtil.kt @@ -1,46 +1,45 @@ -package org.jbake.app; +package org.jbake.app -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; +import java.io.File +import java.io.FileOutputStream +import java.io.IOException +import java.io.InputStream +import java.util.zip.ZipEntry +import java.util.zip.ZipInputStream /** * Provides Zip file related functions * - * @author Jonathan Bullock jonbullock@gmail.com - * + * @author Jonathan Bullock [jonbullock@gmail.com](mailto:jonbullock@gmail.com) */ -public class ZipUtil { - +object ZipUtil { /** * Extracts content of Zip file to specified output path. * - * @param is {@link InputStream} InputStream of Zip file + * @param is [InputStream] InputStream of Zip file * @param outputFolder folder where Zip file should be extracted to * @throws IOException if IOException occurs */ - public static void extract(InputStream is, File outputFolder) throws IOException { - ZipInputStream zis = new ZipInputStream(is); - ZipEntry entry; - byte[] buffer = new byte[1024]; + @Throws(IOException::class) + fun extract(`is`: InputStream, outputFolder: File) { + val zis = ZipInputStream(`is`) + var entry: ZipEntry? + val buffer = ByteArray(1024) - while ((entry = zis.getNextEntry()) != null) { - File outputFile = new File(outputFolder.getCanonicalPath() + File.separatorChar + entry.getName()); - File outputParent = new File(outputFile.getParent()); - outputParent.mkdirs(); + while ((zis.getNextEntry().also { entry = it }) != null) { + val outputFile = File(outputFolder.getCanonicalPath() + File.separatorChar + entry!!.getName()) + val outputParent = File(outputFile.getParent()) + outputParent.mkdirs() if (entry.isDirectory()) { if (!outputFile.exists()) { - outputFile.mkdir(); + outputFile.mkdir() } } else { - try (FileOutputStream fos = new FileOutputStream(outputFile)) { - int len; - while ((len = zis.read(buffer)) > 0) { - fos.write(buffer, 0, len); + FileOutputStream(outputFile).use { fos -> + var len: Int + while ((zis.read(buffer).also { len = it }) > 0) { + fos.write(buffer, 0, len) } } } diff --git a/jbake-core/src/main/java/org/jbake/app/configuration/ConfigUtil.kt b/jbake-core/src/main/java/org/jbake/app/configuration/ConfigUtil.kt index c0c6260f4..d84d2a95f 100644 --- a/jbake-core/src/main/java/org/jbake/app/configuration/ConfigUtil.kt +++ b/jbake-core/src/main/java/org/jbake/app/configuration/ConfigUtil.kt @@ -1,94 +1,99 @@ -package org.jbake.app.configuration; - -import org.apache.commons.configuration2.CompositeConfiguration; -import org.apache.commons.configuration2.PropertiesConfiguration; -import org.apache.commons.configuration2.SystemConfiguration; -import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder; -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.launcher.SystemExit; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.net.URL; -import java.nio.charset.Charset; +package org.jbake.app.configuration + +import org.apache.commons.configuration2.CompositeConfiguration +import org.apache.commons.configuration2.PropertiesConfiguration +import org.apache.commons.configuration2.SystemConfiguration +import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder +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.launcher.SystemExit +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.io.File +import java.net.URL +import java.nio.charset.Charset /** * Provides Configuration related functions. * - * @author Jonathan Bullock jonbullock@gmail.com + * @author Jonathan Bullock [jonbullock@gmail.com](mailto:jonbullock@gmail.com) */ -public class ConfigUtil { - - public static final char LIST_DELIMITER = ','; - public static final String DEFAULT_ENCODING = "UTF-8"; - private static final Logger LOGGER = LoggerFactory.getLogger(ConfigUtil.class); - public static final String LEGACY_CONFIG_FILE = "custom.properties"; - public static final String CONFIG_FILE = "jbake.properties"; - public static final String DEFAULT_CONFIG_FILE = "default.properties"; - private String encoding = DEFAULT_ENCODING; - - private CompositeConfiguration load(File source, File propertiesFile) throws ConfigurationException { +class ConfigUtil { + var encoding: String = DEFAULT_ENCODING + private set + @Throws(ConfigurationException::class) + private fun load(source: File, propertiesFile: File?): CompositeConfiguration { if (!source.exists()) { - throw new JBakeException(SystemExit.CONFIGURATION_ERROR, "The given source folder '" + source.getAbsolutePath() + "' does not exist."); + throw JBakeException( + SystemExit.CONFIGURATION_ERROR, + "The given source folder '" + source.getAbsolutePath() + "' does not exist." + ) } if (!source.isDirectory()) { - throw new JBakeException(SystemExit.CONFIGURATION_ERROR,"The given source folder is not a directory."); + throw JBakeException(SystemExit.CONFIGURATION_ERROR, "The given source folder is not a directory.") } - File legacyConfigFile = new File(source, LEGACY_CONFIG_FILE); - File customConfigFile = propertiesFile != null ? propertiesFile : new File(source, CONFIG_FILE); + val legacyConfigFile = File(source, LEGACY_CONFIG_FILE) + val customConfigFile = if (propertiesFile != null) propertiesFile else File(source, CONFIG_FILE) - CompositeConfiguration config = new CompositeConfiguration(); - config.setListDelimiterHandler(new DefaultListDelimiterHandler(LIST_DELIMITER)); + val config = CompositeConfiguration() + config.setListDelimiterHandler(DefaultListDelimiterHandler(LIST_DELIMITER)) if (legacyConfigFile.exists()) { - displayLegacyConfigFileWarningIfRequired(); - config.addConfiguration(getFileBasedPropertiesConfiguration(legacyConfigFile)); + displayLegacyConfigFileWarningIfRequired() + config.addConfiguration(getFileBasedPropertiesConfiguration(legacyConfigFile)) } if (customConfigFile.exists()) { - config.addConfiguration(getFileBasedPropertiesConfiguration(customConfigFile)); + config.addConfiguration(getFileBasedPropertiesConfiguration(customConfigFile)) } - URL defaultPropertiesLocation = this.getClass().getClassLoader().getResource(DEFAULT_CONFIG_FILE); + val defaultPropertiesLocation = this.javaClass.getClassLoader().getResource(DEFAULT_CONFIG_FILE) if (defaultPropertiesLocation != null) { - config.addConfiguration(getFileBasedPropertiesConfiguration(defaultPropertiesLocation)); + config.addConfiguration(getFileBasedPropertiesConfiguration(defaultPropertiesLocation)) } - config.addConfiguration(new SystemConfiguration()); - return config; + config.addConfiguration(SystemConfiguration()) + return config } - private PropertiesConfiguration getFileBasedPropertiesConfiguration(File propertiesFile) throws ConfigurationException { - FileBasedConfigurationBuilder builder = - new FileBasedConfigurationBuilder<>(PropertiesConfiguration.class) - .configure(new Parameters().properties() - .setFile(propertiesFile) - .setEncoding(encoding) - .setThrowExceptionOnMissing(true) - .setListDelimiterHandler(new DefaultListDelimiterHandler(LIST_DELIMITER)) - .setIncludesAllowed(false)); - return builder.getConfiguration(); + @Throws(ConfigurationException::class) + private fun getFileBasedPropertiesConfiguration(propertiesFile: File?): PropertiesConfiguration? { + val builder = + FileBasedConfigurationBuilder(PropertiesConfiguration::class.java) + .configure( + Parameters().properties() + .setFile(propertiesFile) + .setEncoding(encoding) + .setThrowExceptionOnMissing(true) + .setListDelimiterHandler(DefaultListDelimiterHandler(LIST_DELIMITER)) + .setIncludesAllowed(false) + ) + return builder.getConfiguration() } - private PropertiesConfiguration getFileBasedPropertiesConfiguration(URL propertiesFile) throws ConfigurationException { - FileBasedConfigurationBuilder builder = - new FileBasedConfigurationBuilder<>(PropertiesConfiguration.class) - .configure(new Parameters().properties() - .setURL(propertiesFile) - .setEncoding(encoding) - .setThrowExceptionOnMissing(true) - .setListDelimiterHandler(new DefaultListDelimiterHandler(LIST_DELIMITER)) - .setIncludesAllowed(false)); - return builder.getConfiguration(); + @Throws(ConfigurationException::class) + private fun getFileBasedPropertiesConfiguration(propertiesFile: URL?): PropertiesConfiguration? { + val builder = + FileBasedConfigurationBuilder(PropertiesConfiguration::class.java) + .configure( + Parameters().properties() + .setURL(propertiesFile) + .setEncoding(encoding) + .setThrowExceptionOnMissing(true) + .setListDelimiterHandler(DefaultListDelimiterHandler(LIST_DELIMITER)) + .setIncludesAllowed(false) + ) + return builder.getConfiguration() } - private void displayLegacyConfigFileWarningIfRequired() { - LOGGER.warn("You have defined a part of your JBake configuration in {}", LEGACY_CONFIG_FILE); - LOGGER.warn("Usage of this file is being deprecated, please rename this file to: {} to remove this warning", CONFIG_FILE); + private fun displayLegacyConfigFileWarningIfRequired() { + LOGGER.warn("You have defined a part of your JBake configuration in {}", LEGACY_CONFIG_FILE) + LOGGER.warn( + "Usage of this file is being deprecated, please rename this file to: {} to remove this warning", + CONFIG_FILE + ) } /** @@ -99,12 +104,13 @@ public class ConfigUtil { * @return the configuration * @throws JBakeException if unable to configure */ - public JBakeConfiguration loadConfig(File source, File propertiesFile) throws JBakeException { + @Throws(JBakeException::class) + fun loadConfig(source: File, propertiesFile: File?): JBakeConfiguration { try { - CompositeConfiguration configuration = load(source, propertiesFile); - return new DefaultJBakeConfiguration(source, configuration); - } catch (ConfigurationException e) { - throw new JBakeException(SystemExit.CONFIGURATION_ERROR, e.getMessage(), e); + val configuration = load(source, propertiesFile) + return DefaultJBakeConfiguration(source, configuration) + } catch (e: ConfigurationException) { + throw JBakeException(SystemExit.CONFIGURATION_ERROR, e.message, e) } } @@ -114,24 +120,29 @@ public class ConfigUtil { * @param source the source directory of the project * @return the configuration * @throws ConfigurationException if unable to configure - * @deprecated use {@link #loadConfig(File, File)} instead */ - @Deprecated - public JBakeConfiguration loadConfig(File source) throws ConfigurationException { - return loadConfig(source, null); + @Deprecated("use {@link #loadConfig(File, File)} instead") + @Throws(ConfigurationException::class) + fun loadConfig(source: File): JBakeConfiguration { + return loadConfig(source, null) } - public String getEncoding() { - return this.encoding; - } - - public ConfigUtil setEncoding(String encoding) { + fun setEncoding(encoding: String): ConfigUtil { if (Charset.isSupported(encoding)) { - this.encoding = encoding; + this.encoding = encoding } else { - this.encoding = DEFAULT_ENCODING; - LOGGER.warn("Unsupported encoding '{}'. Using default encoding '{}'", encoding, this.encoding); + this.encoding = DEFAULT_ENCODING + LOGGER.warn("Unsupported encoding '{}'. Using default encoding '{}'", encoding, this.encoding) } - return this; + return this + } + + companion object { + const val LIST_DELIMITER: Char = ',' + const val DEFAULT_ENCODING: String = "UTF-8" + private val LOGGER: Logger = LoggerFactory.getLogger(ConfigUtil::class.java) + const val LEGACY_CONFIG_FILE: String = "custom.properties" + const val CONFIG_FILE: String = "jbake.properties" + const val DEFAULT_CONFIG_FILE: String = "default.properties" } } diff --git a/jbake-core/src/main/java/org/jbake/app/configuration/DefaultJBakeConfiguration.kt b/jbake-core/src/main/java/org/jbake/app/configuration/DefaultJBakeConfiguration.kt index 223b0f624..a45dc87d4 100644 --- a/jbake-core/src/main/java/org/jbake/app/configuration/DefaultJBakeConfiguration.kt +++ b/jbake-core/src/main/java/org/jbake/app/configuration/DefaultJBakeConfiguration.kt @@ -1,714 +1,630 @@ -package org.jbake.app.configuration; - -import org.apache.commons.configuration2.CompositeConfiguration; -import org.apache.commons.configuration2.Configuration; -import org.apache.commons.configuration2.MapConfiguration; -import org.apache.commons.configuration2.SystemConfiguration; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static org.jbake.app.configuration.PropertyList.*; +package org.jbake.app.configuration + +import org.apache.commons.configuration2.CompositeConfiguration +import org.apache.commons.configuration2.MapConfiguration +import org.apache.commons.configuration2.SystemConfiguration +import org.apache.commons.lang3.StringUtils +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.io.File +import java.util.* +import java.util.regex.Matcher +import java.util.regex.Pattern /** - * The default implementation of a {@link JBakeConfiguration} + * The default implementation of a [JBakeConfiguration] */ -public class DefaultJBakeConfiguration implements JBakeConfiguration { - - - public static final String DEFAULT_TYHMELEAF_TEMPLATE_MODE = "HTML"; - private static final String SOURCE_FOLDER_KEY = "sourceFolder"; - private static final String DESTINATION_FOLDER_KEY = "destinationFolder"; - private static final String ASSET_FOLDER_KEY = "assetFolder"; - private static final String TEMPLATE_FOLDER_KEY = "templateFolder"; - private static final String CONTENT_FOLDER_KEY = "contentFolder"; - private static final String DATA_FOLDER_KEY = "dataFolder"; - private static final Pattern TEMPLATE_DOC_PATTERN = Pattern.compile("(?:template\\.)([a-zA-Z0-9-_]+)(?:\\.file)"); - private static final String DOCTYPE_FILE_POSTFIX = ".file"; - private static final String DOCTYPE_EXTENSION_POSTFIX = ".extension"; - private static final String DOCTYPE_TEMPLATE_PREFIX = "template."; - private final Logger logger = LoggerFactory.getLogger(DefaultJBakeConfiguration.class); - private CompositeConfiguration compositeConfiguration; +class DefaultJBakeConfiguration : JBakeConfiguration { + private val logger: Logger = LoggerFactory.getLogger(DefaultJBakeConfiguration::class.java) + @JvmField + var compositeConfiguration: CompositeConfiguration /** * Some deprecated implementations just need access to the configuration without access to the source folder * * @param configuration The project configuration - * @deprecated use {@link #DefaultJBakeConfiguration(File, CompositeConfiguration)} instead */ - @Deprecated - public DefaultJBakeConfiguration(CompositeConfiguration configuration) { - this.compositeConfiguration = configuration; + @Deprecated("use {@link #DefaultJBakeConfiguration(File, CompositeConfiguration)} instead") + constructor(configuration: CompositeConfiguration) { + this.compositeConfiguration = configuration } - public DefaultJBakeConfiguration(File sourceFolder, CompositeConfiguration configuration) { - this.compositeConfiguration = configuration; - setSourceFolder(sourceFolder); - setupPaths(); + constructor(sourceFolder: File?, configuration: CompositeConfiguration) { + this.compositeConfiguration = configuration + setSourceFolder(sourceFolder) + setupPaths() } - @Override - public Object get(String key) { - return compositeConfiguration.getProperty(key); + override fun get(key: String?): Any? { + return compositeConfiguration.getProperty(key) } - @Override - public String getArchiveFileName() { - return getAsString(ARCHIVE_FILE.getKey()); + override fun getArchiveFileName(): String { + return getAsString(PropertyList.ARCHIVE_FILE.getKey()) } - private boolean getAsBoolean(String key) { - return compositeConfiguration.getBoolean(key, false); + private fun getAsBoolean(key: String?): Boolean { + return compositeConfiguration.getBoolean(key, false) } - private File getAsFolder(String key) { - return (File) get(key); + private fun getAsFolder(key: String?): File? { + return get(key) as File? } - private int getAsInt(String key, int defaultValue) { - return compositeConfiguration.getInt(key, defaultValue); + private fun getAsInt(key: String?, defaultValue: Int): Int { + return compositeConfiguration.getInt(key, defaultValue) } - private List getAsList(String key) { - return compositeConfiguration.getList(String.class, key); + private fun getAsList(key: String?): MutableList? { + return compositeConfiguration.getList(String::class.java, key) } - private String getAsString(String key) { - return compositeConfiguration.getString(key); + private fun getAsString(key: String?): String { + return compositeConfiguration.getString(key) } - private String getAsString(String key, String defaultValue) { - return compositeConfiguration.getString(key, defaultValue); + private fun getAsString(key: String?, defaultValue: String?): String? { + return compositeConfiguration.getString(key, defaultValue) } - @Override - public List getAsciidoctorAttributes() { - return getAsList(ASCIIDOCTOR_ATTRIBUTES.getKey()); + override fun getAsciidoctorAttributes(): MutableList? { + return getAsList(PropertyList.ASCIIDOCTOR_ATTRIBUTES.getKey()) } - public List getAsciidoctorOption(String optionKey) { - Configuration subConfig = compositeConfiguration.subset(ASCIIDOCTOR_OPTION.getKey()); + override fun getAsciidoctorOption(optionKey: String?): MutableList? { + val subConfig = compositeConfiguration.subset(PropertyList.ASCIIDOCTOR_OPTION.getKey()) if (subConfig.containsKey(optionKey)) { - return subConfig.getList(String.class, optionKey); + return subConfig.getList(String::class.java, optionKey) } else { - logger.warn("Cannot find asciidoctor option '{}.{}'", ASCIIDOCTOR_OPTION.getKey(), optionKey); - return Collections.emptyList(); + logger.warn("Cannot find asciidoctor option '{}.{}'", PropertyList.ASCIIDOCTOR_OPTION.getKey(), optionKey) + return mutableListOf() } } - @Override - public List getAsciidoctorOptionKeys() { - List options = new ArrayList<>(); - Configuration subConfig = compositeConfiguration.subset(ASCIIDOCTOR_OPTION.getKey()); + override fun getAsciidoctorOptionKeys(): MutableList { + val options: MutableList = ArrayList() + val subConfig = compositeConfiguration.subset(PropertyList.ASCIIDOCTOR_OPTION.getKey()) - Iterator iterator = subConfig.getKeys(); + val iterator = subConfig.getKeys() while (iterator.hasNext()) { - String key = iterator.next(); - options.add(key); + val key = iterator.next() + options.add(key) } - return options; + return options } - @Override - public File getAssetFolder() { - return getAsFolder(ASSET_FOLDER_KEY); + override fun getAssetFolder(): File? { + return getAsFolder(ASSET_FOLDER_KEY) } - public void setAssetFolder(File assetFolder) { + fun setAssetFolder(assetFolder: File?) { if (assetFolder != null) { - setProperty(ASSET_FOLDER_KEY, assetFolder); + setProperty(ASSET_FOLDER_KEY, assetFolder) } } - @Override - public String getAssetFolderName() { - return getAsString(ASSET_FOLDER.getKey()); - } - - @Override - public boolean getAssetIgnoreHidden() { - return getAsBoolean(ASSET_IGNORE_HIDDEN.getKey()); + override fun getAssetFolderName(): String { + return getAsString(PropertyList.ASSET_FOLDER.getKey()) } - public void setAssetIgnoreHidden(boolean assetIgnoreHidden) { - setProperty(ASSET_IGNORE_HIDDEN.getKey(), assetIgnoreHidden); + override fun getAssetIgnoreHidden(): Boolean { + return getAsBoolean(PropertyList.ASSET_IGNORE_HIDDEN.getKey()) } - @Override - public String getAttributesExportPrefixForAsciidoctor() { - return getAsString(ASCIIDOCTOR_ATTRIBUTES_EXPORT_PREFIX.getKey(), ""); + fun setAssetIgnoreHidden(assetIgnoreHidden: Boolean) { + setProperty(PropertyList.ASSET_IGNORE_HIDDEN.getKey(), assetIgnoreHidden) } - @Override - public String getBuildTimeStamp() { - return getAsString(BUILD_TIMESTAMP.getKey()); + override fun getAttributesExportPrefixForAsciidoctor(): String? { + return getAsString(PropertyList.ASCIIDOCTOR_ATTRIBUTES_EXPORT_PREFIX.getKey(), "") } - @Override - public boolean getClearCache() { - return getAsBoolean(CLEAR_CACHE.getKey()); + override fun getBuildTimeStamp(): String { + return getAsString(PropertyList.BUILD_TIMESTAMP.getKey()) } - public void setClearCache(boolean clearCache) { - setProperty(CLEAR_CACHE.getKey(), clearCache); + override fun getClearCache(): Boolean { + return getAsBoolean(PropertyList.CLEAR_CACHE.getKey()) } - public CompositeConfiguration getCompositeConfiguration() { - return compositeConfiguration; + fun setClearCache(clearCache: Boolean) { + setProperty(PropertyList.CLEAR_CACHE.getKey(), clearCache) } - public void setCompositeConfiguration(CompositeConfiguration configuration) { - this.compositeConfiguration = configuration; + override fun getContentFolder(): File? { + return getAsFolder(CONTENT_FOLDER_KEY) } - @Override - public File getContentFolder() { - return getAsFolder(CONTENT_FOLDER_KEY); - } - - public void setContentFolder(File contentFolder) { + fun setContentFolder(contentFolder: File?) { if (contentFolder != null) { - setProperty(CONTENT_FOLDER_KEY, contentFolder); + setProperty(CONTENT_FOLDER_KEY, contentFolder) } } - @Override - public String getContentFolderName() { - return getAsString(CONTENT_FOLDER.getKey()); + override fun getContentFolderName(): String { + return getAsString(PropertyList.CONTENT_FOLDER.getKey()) } - @Override - public File getDataFolder() { - return getAsFolder(DATA_FOLDER_KEY); + override fun getDataFolder(): File? { + return getAsFolder(DATA_FOLDER_KEY) } - public void setDataFolder(File dataFolder) { + fun setDataFolder(dataFolder: File?) { if (dataFolder != null) { - setProperty(DATA_FOLDER_KEY, dataFolder); + setProperty(DATA_FOLDER_KEY, dataFolder) } } - @Override - public String getDataFolderName() { - return getAsString(DATA_FOLDER.getKey()); + override fun getDataFolderName(): String { + return getAsString(PropertyList.DATA_FOLDER.getKey()) } - @Override - public String getDataFileDocType() { - return getAsString(DATA_FILE_DOCTYPE.getKey()); + override fun getDataFileDocType(): String { + return getAsString(PropertyList.DATA_FILE_DOCTYPE.getKey()) } - public void setDataFileDocType(String dataFileDocType) { - setProperty(DATA_FILE_DOCTYPE.getKey(), dataFileDocType); + fun setDataFileDocType(dataFileDocType: String?) { + setProperty(PropertyList.DATA_FILE_DOCTYPE.getKey(), dataFileDocType) } - @Override - public String getDatabasePath() { - return getAsString(DB_PATH.getKey()); + override fun getDatabasePath(): String { + return getAsString(PropertyList.DB_PATH.getKey()) } - public void setDatabasePath(String path) { - setProperty(DB_PATH.getKey(), path); + fun setDatabasePath(path: String?) { + setProperty(PropertyList.DB_PATH.getKey(), path) } - @Override - public String getDatabaseStore() { - return getAsString(DB_STORE.getKey()); + override fun getDatabaseStore(): String { + return getAsString(PropertyList.DB_STORE.getKey()) } - public void setDatabaseStore(String storeType) { - setProperty(DB_STORE.getKey(), storeType); + fun setDatabaseStore(storeType: String?) { + setProperty(PropertyList.DB_STORE.getKey(), storeType) } - - @Override - public String getDateFormat() { - return getAsString(DATE_FORMAT.getKey()); + override fun getDateFormat(): String { + return getAsString(PropertyList.DATE_FORMAT.getKey()) } - @Override - public String getDefaultStatus() { - return getAsString(DEFAULT_STATUS.getKey(), ""); + override fun getDefaultStatus(): String? { + return getAsString(PropertyList.DEFAULT_STATUS.getKey(), "") } - public void setDefaultStatus(String status) { - setProperty(DEFAULT_STATUS.getKey(), status); + fun setDefaultStatus(status: String?) { + setProperty(PropertyList.DEFAULT_STATUS.getKey(), status) } - @Override - public String getDefaultType() { - return getAsString(DEFAULT_TYPE.getKey(), ""); + override fun getDefaultType(): String? { + return getAsString(PropertyList.DEFAULT_TYPE.getKey(), "") } - public void setDefaultType(String type) { - setProperty(DEFAULT_TYPE.getKey(), type); + fun setDefaultType(type: String?) { + setProperty(PropertyList.DEFAULT_TYPE.getKey(), type) } - @Override - public File getDestinationFolder() { - return getAsFolder(DESTINATION_FOLDER_KEY); + override fun getDestinationFolder(): File? { + return getAsFolder(DESTINATION_FOLDER_KEY) } - public void setDestinationFolder(File destinationFolder) { + override fun setDestinationFolder(destinationFolder: File?) { if (destinationFolder != null) { - setProperty(DESTINATION_FOLDER_KEY, destinationFolder); + setProperty(DESTINATION_FOLDER_KEY, destinationFolder) } } - @Override - public List getDocumentTypes() { - List docTypes = new ArrayList<>(); - Iterator keyIterator = compositeConfiguration.getKeys(); + override fun getDocumentTypes(): MutableList { + val docTypes: MutableList = ArrayList() + val keyIterator = compositeConfiguration.getKeys() while (keyIterator.hasNext()) { - String key = keyIterator.next(); - Matcher matcher = TEMPLATE_DOC_PATTERN.matcher(key); + val key = keyIterator.next() + val matcher: Matcher = TEMPLATE_DOC_PATTERN.matcher(key) if (matcher.find()) { - docTypes.add(matcher.group(1)); + docTypes.add(matcher.group(1)) } } - return docTypes; + return docTypes } - @Override - public String getDraftSuffix() { - return getAsString(DRAFT_SUFFIX.getKey(), ""); + override fun getDraftSuffix(): String? { + return getAsString(PropertyList.DRAFT_SUFFIX.getKey(), "") } - @Override - public String getError404FileName() { - return getAsString(ERROR404_FILE.getKey()); + override fun getError404FileName(): String { + return getAsString(PropertyList.ERROR404_FILE.getKey()) } - @Override - public String getExampleProjectByType(String templateType) { - return getAsString("example.project." + templateType); + override fun getExampleProjectByType(templateType: String?): String { + return getAsString("example.project." + templateType) } - @Override - public boolean getExportAsciidoctorAttributes() { - return getAsBoolean(ASCIIDOCTOR_ATTRIBUTES_EXPORT.getKey()); + override fun getExportAsciidoctorAttributes(): Boolean { + return getAsBoolean(PropertyList.ASCIIDOCTOR_ATTRIBUTES_EXPORT.getKey()) } - @Override - public String getFeedFileName() { - return getAsString(FEED_FILE.getKey()); + override fun getFeedFileName(): String { + return getAsString(PropertyList.FEED_FILE.getKey()) } - @Override - public String getIgnoreFileName() { - return getAsString(IGNORE_FILE.getKey()); + override fun getIgnoreFileName(): String { + return getAsString(PropertyList.IGNORE_FILE.getKey()) } - @Override - public String getIndexFileName() { - return getAsString(INDEX_FILE.getKey()); + override fun getIndexFileName(): String { + return getAsString(PropertyList.INDEX_FILE.getKey()) } - @Override - public Iterator getKeys() { - return compositeConfiguration.getKeys(); + override fun getKeys(): MutableIterator { + return compositeConfiguration.getKeys() } - @Override - public List getMarkdownExtensions() { - return getAsList(MARKDOWN_EXTENSIONS.getKey()); + override fun getMarkdownExtensions(): MutableList? { + return getAsList(PropertyList.MARKDOWN_EXTENSIONS.getKey()) } - public void setMarkdownExtensions(String... extensions) { - setProperty(MARKDOWN_EXTENSIONS.getKey(), StringUtils.join(extensions, ",")); + fun setMarkdownExtensions(vararg extensions: String?) { + setProperty(PropertyList.MARKDOWN_EXTENSIONS.getKey(), StringUtils.join(extensions, ",")) } - @Override - public String getOutputExtension() { - return getAsString(OUTPUT_EXTENSION.getKey()); + override fun getOutputExtension(): String { + return getAsString(PropertyList.OUTPUT_EXTENSION.getKey()) } - public void setOutputExtension(String outputExtension) { - setProperty(OUTPUT_EXTENSION.getKey(), outputExtension); + fun setOutputExtension(outputExtension: String?) { + setProperty(PropertyList.OUTPUT_EXTENSION.getKey(), outputExtension) } - @Override - public String getOutputExtensionByDocType(String docType) { - String templateExtensionKey = DOCTYPE_TEMPLATE_PREFIX + docType + DOCTYPE_EXTENSION_POSTFIX; - String defaultOutputExtension = getOutputExtension(); - return getAsString(templateExtensionKey, defaultOutputExtension); + override fun getOutputExtensionByDocType(docType: String): String? { + val templateExtensionKey: String = DOCTYPE_TEMPLATE_PREFIX + docType + DOCTYPE_EXTENSION_POSTFIX + val defaultOutputExtension = getOutputExtension() + return getAsString(templateExtensionKey, defaultOutputExtension) } - @Override - public boolean getPaginateIndex() { - return getAsBoolean(PAGINATE_INDEX.getKey()); + override fun getPaginateIndex(): Boolean { + return getAsBoolean(PropertyList.PAGINATE_INDEX.getKey()) } - public void setPaginateIndex(boolean paginateIndex) { - setProperty(PAGINATE_INDEX.getKey(), paginateIndex); + fun setPaginateIndex(paginateIndex: Boolean) { + setProperty(PropertyList.PAGINATE_INDEX.getKey(), paginateIndex) } - @Override - public int getPostsPerPage() { - return getAsInt(POSTS_PER_PAGE.getKey(), 5); + override fun getPostsPerPage(): Int { + return getAsInt(PropertyList.POSTS_PER_PAGE.getKey(), 5) } - public void setPostsPerPage(int postsPerPage) { - setProperty(POSTS_PER_PAGE.getKey(), postsPerPage); + fun setPostsPerPage(postsPerPage: Int) { + setProperty(PropertyList.POSTS_PER_PAGE.getKey(), postsPerPage) } - @Override - public String getPrefixForUriWithoutExtension() { - return getAsString(URI_NO_EXTENSION_PREFIX.getKey()); + override fun getPrefixForUriWithoutExtension(): String { + return getAsString(PropertyList.URI_NO_EXTENSION_PREFIX.getKey()) } - public void setPrefixForUriWithoutExtension(String prefix) { - setProperty(URI_NO_EXTENSION_PREFIX.getKey(), prefix); + fun setPrefixForUriWithoutExtension(prefix: String?) { + setProperty(PropertyList.URI_NO_EXTENSION_PREFIX.getKey(), prefix) } - @Override - public boolean getRenderArchive() { - return getAsBoolean(RENDER_ARCHIVE.getKey()); + override fun getRenderArchive(): Boolean { + return getAsBoolean(PropertyList.RENDER_ARCHIVE.getKey()) } - @Override - public String getRenderEncoding() { - return getAsString(RENDER_ENCODING.getKey()); + override fun getRenderEncoding(): String { + return getAsString(PropertyList.RENDER_ENCODING.getKey()) } - @Override - public String getOutputEncoding() { - return getAsString(OUTPUT_ENCODING.getKey()); + override fun getOutputEncoding(): String { + return getAsString(PropertyList.OUTPUT_ENCODING.getKey()) } - @Override - public boolean getRenderError404() { - return getAsBoolean(RENDER_ERROR404.getKey()); + override fun getRenderError404(): Boolean { + return getAsBoolean(PropertyList.RENDER_ERROR404.getKey()) } - @Override - public boolean getRenderFeed() { - return getAsBoolean(RENDER_FEED.getKey()); + override fun getRenderFeed(): Boolean { + return getAsBoolean(PropertyList.RENDER_FEED.getKey()) } - @Override - public boolean getRenderIndex() { - return getAsBoolean(RENDER_INDEX.getKey()); + override fun getRenderIndex(): Boolean { + return getAsBoolean(PropertyList.RENDER_INDEX.getKey()) } - @Override - public boolean getRenderSiteMap() { - return getAsBoolean(RENDER_SITEMAP.getKey()); + override fun getRenderSiteMap(): Boolean { + return getAsBoolean(PropertyList.RENDER_SITEMAP.getKey()) } - @Override - public boolean getRenderTags() { - return getAsBoolean(RENDER_TAGS.getKey()); + override fun getRenderTags(): Boolean { + return getAsBoolean(PropertyList.RENDER_TAGS.getKey()) } - @Override - public boolean getRenderTagsIndex() { - return compositeConfiguration.getBoolean(RENDER_TAGS_INDEX.getKey(), false); + override fun getRenderTagsIndex(): Boolean { + return compositeConfiguration.getBoolean(PropertyList.RENDER_TAGS_INDEX.getKey(), false) } - public void setRenderTagsIndex(boolean enable) { - compositeConfiguration.setProperty(RENDER_TAGS_INDEX.getKey(), enable); + fun setRenderTagsIndex(enable: Boolean) { + compositeConfiguration.setProperty(PropertyList.RENDER_TAGS_INDEX.getKey(), enable) } - @Override - public boolean getSanitizeTag() { - return getAsBoolean(TAG_SANITIZE.getKey()); + override fun getSanitizeTag(): Boolean { + return getAsBoolean(PropertyList.TAG_SANITIZE.getKey()) } - @Override - public int getServerPort() { - return getAsInt(SERVER_PORT.getKey(), 8080); + override fun getServerPort(): Int { + return getAsInt(PropertyList.SERVER_PORT.getKey(), 8080) } - public void setServerPort(int port) { - setProperty(SERVER_PORT.getKey(), port); + fun setServerPort(port: Int) { + setProperty(PropertyList.SERVER_PORT.getKey(), port) } - @Override - public String getSiteHost() { - return getAsString(SITE_HOST.getKey(), "http://www.jbake.org"); + override fun getSiteHost(): String? { + return getAsString(PropertyList.SITE_HOST.getKey(), "http://www.jbake.org") } - public void setSiteHost(String siteHost) { - setProperty(SITE_HOST.getKey(), siteHost); + fun setSiteHost(siteHost: String?) { + setProperty(PropertyList.SITE_HOST.getKey(), siteHost) } - @Override - public String getSiteMapFileName() { - return getAsString(SITEMAP_FILE.getKey()); + override fun getSiteMapFileName(): String { + return getAsString(PropertyList.SITEMAP_FILE.getKey()) } - @Override - public File getSourceFolder() { - return getAsFolder(SOURCE_FOLDER_KEY); + override fun getSourceFolder(): File? { + return getAsFolder(SOURCE_FOLDER_KEY) } - public void setSourceFolder(File sourceFolder) { - setProperty(SOURCE_FOLDER_KEY, sourceFolder); - setupPaths(); + fun setSourceFolder(sourceFolder: File?) { + setProperty(SOURCE_FOLDER_KEY, sourceFolder) + setupPaths() } - @Override - public String getTagPathName() { - return getAsString(TAG_PATH.getKey()); + override fun getTagPathName(): String { + return getAsString(PropertyList.TAG_PATH.getKey()) } - @Override - public String getTemplateEncoding() { - return getAsString(TEMPLATE_ENCODING.getKey()); + override fun getTemplateEncoding(): String { + return getAsString(PropertyList.TEMPLATE_ENCODING.getKey()) } - @Override - public String getTemplateByDocType(String docType) { - String templateKey = DOCTYPE_TEMPLATE_PREFIX + docType + DOCTYPE_FILE_POSTFIX; - String templateFileName = getAsString(templateKey); + override fun getTemplateByDocType(docType: String): String? { + val templateKey: String = DOCTYPE_TEMPLATE_PREFIX + docType + DOCTYPE_FILE_POSTFIX + val templateFileName = getAsString(templateKey) if (templateFileName != null) { - return templateFileName; + return templateFileName } - logger.warn("Cannot find configuration key '{}' for document type '{}'", templateKey, docType); - return null; + logger.warn("Cannot find configuration key '{}' for document type '{}'", templateKey, docType) + return null } - @Override - public File getTemplateFileByDocType(String docType) { - String templateFileName = getTemplateByDocType(docType); + override fun getTemplateFileByDocType(docType: String): File? { + val templateFileName = getTemplateByDocType(docType) if (templateFileName != null) { - return new File(getTemplateFolder(), templateFileName); + return File(getTemplateFolder(), templateFileName) } - return null; + return null } - @Override - public File getTemplateFolder() { - return getAsFolder(TEMPLATE_FOLDER_KEY); + override fun getTemplateFolder(): File? { + return getAsFolder(TEMPLATE_FOLDER_KEY) } - public void setTemplateFolder(File templateFolder) { + fun setTemplateFolder(templateFolder: File?) { if (templateFolder != null) { - setProperty(TEMPLATE_FOLDER_KEY, templateFolder); + setProperty(TEMPLATE_FOLDER_KEY, templateFolder) } } - @Override - public String getTemplateFolderName() { - return getAsString(TEMPLATE_FOLDER.getKey()); + override fun getTemplateFolderName(): String { + return getAsString(PropertyList.TEMPLATE_FOLDER.getKey()) } - @Override - public String getThymeleafLocale() { - return getAsString(THYMELEAF_LOCALE.getKey()); + override fun getThymeleafLocale(): String { + return getAsString(PropertyList.THYMELEAF_LOCALE.getKey()) } - @Override - public boolean getUriWithoutExtension() { - return getAsBoolean(URI_NO_EXTENSION.getKey()); + override fun getUriWithoutExtension(): Boolean { + return getAsBoolean(PropertyList.URI_NO_EXTENSION.getKey()) } - public void setUriWithoutExtension(boolean withoutExtension) { - setProperty(URI_NO_EXTENSION.getKey(), withoutExtension); + fun setUriWithoutExtension(withoutExtension: Boolean) { + setProperty(PropertyList.URI_NO_EXTENSION.getKey(), withoutExtension) } - @Override - public String getVersion() { - return getAsString(VERSION.getKey()); + override fun getVersion(): String { + return getAsString(PropertyList.VERSION.getKey()) } - public void setDestinationFolderName(String folderName) { - setProperty(DESTINATION_FOLDER.getKey(), folderName); - setupDefaultDestination(); + fun setDestinationFolderName(folderName: String?) { + setProperty(PropertyList.DESTINATION_FOLDER.getKey(), folderName) + setupDefaultDestination() } - public void setExampleProject(String type, String fileName) { - String projectKey = "example.project." + type; - setProperty(projectKey, fileName); + fun setExampleProject(type: String, fileName: String?) { + val projectKey = "example.project." + type + setProperty(projectKey, fileName) } - @Override - public void setProperty(String key, Object value) { - - compositeConfiguration.setProperty(key, value); + override fun setProperty(key: String?, value: Any?) { + compositeConfiguration.setProperty(key, value) } - @Override - public String getThymeleafModeByType(String type) { - String key = "template_" + type + "_thymeleaf_mode"; - return getAsString(key, DEFAULT_TYHMELEAF_TEMPLATE_MODE); + override fun getThymeleafModeByType(type: String): String? { + val key = "template_" + type + "_thymeleaf_mode" + return getAsString(key, DEFAULT_TYHMELEAF_TEMPLATE_MODE) } - @Override - public String getServerContextPath() { - return getAsString(SERVER_CONTEXT_PATH.getKey()); + override fun getServerContextPath(): String { + return getAsString(PropertyList.SERVER_CONTEXT_PATH.getKey()) } - @Override - public String getServerHostname() { - return getAsString(SERVER_HOSTNAME.getKey()); + override fun getServerHostname(): String { + return getAsString(PropertyList.SERVER_HOSTNAME.getKey()) } - @Override - public Map asHashMap() { - HashMap configModel = new HashMap<>(); - Iterator configKeys = this.getKeys(); + override fun asHashMap(): MutableMap { + val configModel = HashMap() + val configKeys = this.getKeys() while (configKeys.hasNext()) { - String key = configKeys.next(); - Object valueObject; + val key = configKeys.next() + val valueObject: Any? - if (key.equals(PAGINATE_INDEX.getKey())) { - valueObject = this.getPaginateIndex(); + if (key == PropertyList.PAGINATE_INDEX.getKey()) { + valueObject = this.getPaginateIndex() } else { - valueObject = this.get(key); + valueObject = this.get(key) } //replace "." in key so you can use dot notation in templates - configModel.put(key.replace(".", "_"), valueObject); + configModel.put(key.replace(".", "_"), valueObject) } - return configModel; + return configModel } - public void setTemplateExtensionForDocType(String docType, String extension) { - String templateExtensionKey = DOCTYPE_TEMPLATE_PREFIX + docType + DOCTYPE_EXTENSION_POSTFIX; - setProperty(templateExtensionKey, extension); + fun setTemplateExtensionForDocType(docType: String, extension: String?) { + val templateExtensionKey: String = DOCTYPE_TEMPLATE_PREFIX + docType + DOCTYPE_EXTENSION_POSTFIX + setProperty(templateExtensionKey, extension) } - public void setTemplateFileNameForDocType(String docType, String fileName) { - String templateKey = DOCTYPE_TEMPLATE_PREFIX + docType + DOCTYPE_FILE_POSTFIX; - setProperty(templateKey, fileName); + fun setTemplateFileNameForDocType(docType: String, fileName: String?) { + val templateKey: String = DOCTYPE_TEMPLATE_PREFIX + docType + DOCTYPE_FILE_POSTFIX + setProperty(templateKey, fileName) } - private void setupPaths() { - setupDefaultDestination(); - setupDefaultAssetFolder(); - setupDefaultTemplateFolder(); - setupDefaultContentFolder(); - setupDefaultDataFolder(); + private fun setupPaths() { + setupDefaultDestination() + setupDefaultAssetFolder() + setupDefaultTemplateFolder() + setupDefaultContentFolder() + setupDefaultDataFolder() } - private void setupDefaultDestination() { - String destinationPath = getAsString(DESTINATION_FOLDER.getKey()); + private fun setupDefaultDestination() { + val destinationPath = getAsString(PropertyList.DESTINATION_FOLDER.getKey()) - File destination = new File(destinationPath); - if ( destination.isAbsolute() ) { - setDestinationFolder(destination); + val destination = File(destinationPath) + if (destination.isAbsolute()) { + setDestinationFolder(destination) } else { - setDestinationFolder(new File(getSourceFolder(), destinationPath)); + setDestinationFolder(File(getSourceFolder(), destinationPath)) } } - private void setupDefaultAssetFolder() { - String assetFolder = getAsString(ASSET_FOLDER.getKey()); + private fun setupDefaultAssetFolder() { + val assetFolder = getAsString(PropertyList.ASSET_FOLDER.getKey()) - File asset = new File(assetFolder); - if(asset.isAbsolute()) { - setAssetFolder(asset); + val asset = File(assetFolder) + if (asset.isAbsolute()) { + setAssetFolder(asset) } else { - setAssetFolder(new File(getSourceFolder(), assetFolder)); + setAssetFolder(File(getSourceFolder(), assetFolder)) } } - private void setupDefaultTemplateFolder() { - String templateFolder = getAsString(TEMPLATE_FOLDER.getKey()); + private fun setupDefaultTemplateFolder() { + val templateFolder = getAsString(PropertyList.TEMPLATE_FOLDER.getKey()) - File template = new File(templateFolder); - if(template.isAbsolute()) { - setTemplateFolder(template); + val template = File(templateFolder) + if (template.isAbsolute()) { + setTemplateFolder(template) } else { - setTemplateFolder(new File(getSourceFolder(), templateFolder)); + setTemplateFolder(File(getSourceFolder(), templateFolder)) } } - private void setupDefaultDataFolder() { - String dataFolder = getAsString(DATA_FOLDER.getKey()); + private fun setupDefaultDataFolder() { + val dataFolder = getAsString(PropertyList.DATA_FOLDER.getKey()) - File data = new File(dataFolder); - if(data.isAbsolute()) { - setDataFolder(data); + val data = File(dataFolder) + if (data.isAbsolute()) { + setDataFolder(data) } else { - setDataFolder(new File(getSourceFolder(), dataFolder)); + setDataFolder(File(getSourceFolder(), dataFolder)) } } - private void setupDefaultContentFolder() { - setContentFolder(new File(getSourceFolder(), getContentFolderName())); + private fun setupDefaultContentFolder() { + setContentFolder(File(getSourceFolder(), getContentFolderName())) } - @Override - public String getHeaderSeparator() { - return getAsString(HEADER_SEPARATOR.getKey()); + override fun getHeaderSeparator(): String { + return getAsString(PropertyList.HEADER_SEPARATOR.getKey()) } - public void setHeaderSeparator(String headerSeparator) { - setProperty(HEADER_SEPARATOR.getKey(), headerSeparator); + fun setHeaderSeparator(headerSeparator: String?) { + setProperty(PropertyList.HEADER_SEPARATOR.getKey(), headerSeparator) } - @Override - public boolean getImgPathPrependHost() { - return getAsBoolean(IMG_PATH_PREPEND_HOST.getKey()); + override fun getImgPathPrependHost(): Boolean { + return getAsBoolean(PropertyList.IMG_PATH_PREPEND_HOST.getKey()) } - public void setImgPathPrependHost(boolean imgPathPrependHost) { - setProperty(IMG_PATH_PREPEND_HOST.getKey(), imgPathPrependHost); + fun setImgPathPrependHost(imgPathPrependHost: Boolean) { + setProperty(PropertyList.IMG_PATH_PREPEND_HOST.getKey(), imgPathPrependHost) } - @Override - public boolean getImgPathUpdate() { - return getAsBoolean(IMG_PATH_UPDATE.getKey()); + override fun getImgPathUpdate(): Boolean { + return getAsBoolean(PropertyList.IMG_PATH_UPDATE.getKey()) } - public void setImgPathUPdate(boolean imgPathUpdate) { - setProperty(IMG_PATH_UPDATE.getKey(), imgPathUpdate); + fun setImgPathUPdate(imgPathUpdate: Boolean) { + setProperty(PropertyList.IMG_PATH_UPDATE.getKey(), imgPathUpdate) } - public List getJbakeProperties() { - - List jbakeKeys = new ArrayList<>(); + override fun getJbakeProperties(): MutableList { + val jbakeKeys: MutableList = ArrayList() - for (int i = 0; i < compositeConfiguration.getNumberOfConfigurations(); i++) { - Configuration configuration = compositeConfiguration.getConfiguration(i); + for (i in 0.. it = configuration.getKeys(); it.hasNext(); ) { - String key = it.next(); - Property property = PropertyList.getPropertyByKey(key); + if (configuration !is SystemConfiguration) { + val it = configuration.getKeys() + while (it.hasNext()) { + val key = it.next() + val property = PropertyList.getPropertyByKey(key) if (!jbakeKeys.contains(property)) { - jbakeKeys.add(property); + jbakeKeys.add(property) } } } } - Collections.sort(jbakeKeys); - return jbakeKeys; + Collections.sort(jbakeKeys) + return jbakeKeys } - @Override - public void addConfiguration(Properties properties) { - compositeConfiguration.addConfiguration(new MapConfiguration(properties)); + override fun addConfiguration(properties: Properties?) { + compositeConfiguration.addConfiguration(MapConfiguration(properties)) } - @Override - public String getAbbreviatedGitHash() { - return getAsString(GIT_HASH.getKey()); + override fun getAbbreviatedGitHash(): String { + return getAsString(PropertyList.GIT_HASH.getKey()) } - @Override - public String getJvmLocale() { - return getAsString(JVM_LOCALE.getKey()); + override fun getJvmLocale(): String { + return getAsString(PropertyList.JVM_LOCALE.getKey()) } - @Override - public TimeZone getFreemarkerTimeZone() { - String timezone = getAsString(FREEMARKER_TIMEZONE.getKey()); + override fun getFreemarkerTimeZone(): TimeZone? { + val timezone = getAsString(PropertyList.FREEMARKER_TIMEZONE.getKey()) if (StringUtils.isNotEmpty(timezone)) { - return TimeZone.getTimeZone(timezone); + return TimeZone.getTimeZone(timezone) } - return null; + return null + } + + companion object { + const val DEFAULT_TYHMELEAF_TEMPLATE_MODE: String = "HTML" + private const val SOURCE_FOLDER_KEY = "sourceFolder" + private const val DESTINATION_FOLDER_KEY = "destinationFolder" + private const val ASSET_FOLDER_KEY = "assetFolder" + private const val TEMPLATE_FOLDER_KEY = "templateFolder" + private const val CONTENT_FOLDER_KEY = "contentFolder" + private const val DATA_FOLDER_KEY = "dataFolder" + private val TEMPLATE_DOC_PATTERN: Pattern = Pattern.compile("(?:template\\.)([a-zA-Z0-9-_]+)(?:\\.file)") + private const val DOCTYPE_FILE_POSTFIX = ".file" + private const val DOCTYPE_EXTENSION_POSTFIX = ".extension" + private const val DOCTYPE_TEMPLATE_PREFIX = "template." } } diff --git a/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfiguration.kt b/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfiguration.kt index 98e2625db..6fd600f07 100644 --- a/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfiguration.kt +++ b/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfiguration.kt @@ -1,36 +1,33 @@ -package org.jbake.app.configuration; +package org.jbake.app.configuration -import java.io.File; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.TimeZone; +import java.io.File +import java.util.* /** * JBakeConfiguration gives you access to the project configuration. Typically located in a file called jbake.properties. * - * Use one of {@link JBakeConfigurationFactory} methods to create an instance. + * Use one of [JBakeConfigurationFactory] methods to create an instance. */ -public interface JBakeConfiguration { - +interface JBakeConfiguration { /** * Get property value by a given key from the configuration * * @param key a key for the property like site.host * @return the value of the property */ - Object get(String key); + fun get(key: String?): Any? /** - * @return Output filename for archive file, is only used when {@link #getRenderArchive()} is true + * @return Output filename for archive file, is only used when [.getRenderArchive] is true */ - String getArchiveFileName(); + //@JvmField + val archiveFileName: String? /** * @return attributes to be set when processing input */ - List getAsciidoctorAttributes(); + ////@JvmField + val asciidoctorAttributes: MutableList? /** * Get an asciidoctor option by it's key @@ -38,113 +35,131 @@ public interface JBakeConfiguration { * @param optionKey an option key * @return the value of the option key */ - Object getAsciidoctorOption(String optionKey); + fun getAsciidoctorOption(optionKey: String?): Any? /** * Get a list of asciidoctor options * * @return list of asciidoctor options */ - List getAsciidoctorOptionKeys(); + //@JvmField + val asciidoctorOptionKeys: MutableList? /** * @return the folder where assets are stored, they are copied directly in output folder and not processed */ - File getAssetFolder(); + //@JvmField + val assetFolder: File /** * @return name of folder for assets */ - String getAssetFolderName(); + //@JvmField + val assetFolderName: String? /** * @return Flag indicating if hidden asset resources should be ignored */ - boolean getAssetIgnoreHidden(); + //@JvmField + val assetIgnoreHidden: Boolean /** * @return Prefix to be used when exporting JBake properties to Asciidoctor */ - String getAttributesExportPrefixForAsciidoctor(); + //@JvmField + val attributesExportPrefixForAsciidoctor: String? /** * @return Timestamp that records when JBake build was made */ - String getBuildTimeStamp(); + //@JvmField + val buildTimeStamp: String? /** * @return Flag indicating to flash the database cache */ - boolean getClearCache(); + //@JvmField + val clearCache: Boolean /** * @return the content folder */ - File getContentFolder(); + //@JvmField + val contentFolder: File /** * @return name of Folder where content (that's to say files to be transformed) resides in */ - String getContentFolderName(); + //@JvmField + val contentFolderName: String? /** * @return the data folder */ - File getDataFolder(); + //@JvmField + val dataFolder: File? /** * @return name of Folder where data files reside in */ - String getDataFolderName(); + val dataFolderName: String? /** * @return docType for data files */ - String getDataFileDocType(); + //@JvmField + val dataFileDocType: String? /** * @return Folder to store database files in */ - String getDatabasePath(); + //@JvmField + val databasePath: String? /** * @return name to identify if database is kept in memory (memory) or persisted to disk (plocal) */ - String getDatabaseStore(); + //@JvmField + val databaseStore: String? /** * @return How date is formated */ - String getDateFormat(); + //@JvmField + val dateFormat: String? /** * @return Default status to use (in order to avoid putting it in all files) */ - String getDefaultStatus(); + //@JvmField + val defaultStatus: String? /** * @return Default type to use (in order to avoid putting it in all files) */ - String getDefaultType(); + //@JvmField + val defaultType: String? /** * @return The destination folder to render and copy files to */ - File getDestinationFolder(); - - void setDestinationFolder(File destination); + //@JvmField + var destinationFolder: File? - List getDocumentTypes(); + //@JvmField + val documentTypes: MutableList? /** * @return Suffix used to identify draft files */ - String getDraftSuffix(); + //@JvmField + val draftSuffix: String? /** - * @return Output filename for error404 file, is only used when {@link #getRenderError404()} is true + * @return Output filename for error404 file, is only used when [.getRenderError404] is true */ - String getError404FileName(); + //@JvmField + val error404FileName: String? /** * Get name for example project name by given template type @@ -152,192 +167,227 @@ public interface JBakeConfiguration { * @param templateType a template type * @return example project name */ - String getExampleProjectByType(String templateType); + fun getExampleProjectByType(templateType: String?): String? /** * @return Flag indicating if JBake properties should be made available to Asciidoctor */ - boolean getExportAsciidoctorAttributes(); + //@JvmField + val exportAsciidoctorAttributes: Boolean /** - * @return Output filename for feed file, is only used when {@link #getRenderFeed()} is true + * @return Output filename for feed file, is only used when [.getRenderFeed] is true */ - String getFeedFileName(); + //@JvmField + val feedFileName: String? /** * @return String used to separate the header from the body */ - String getHeaderSeparator(); + //@JvmField + val headerSeparator: String? /** * @return Filename to use to ignore a directory in addition to ".jbakeignore" */ - String getIgnoreFileName(); + //@JvmField + val ignoreFileName: String? /** - * @return Output filename for index, is only used when {@link #getRenderIndex()} is true + * @return Output filename for index, is only used when [.getRenderIndex] is true */ - String getIndexFileName(); + //@JvmField + val indexFileName: String? /** * Get an iterator of available configuration keys * * @return an iterator of configuration keys */ - Iterator getKeys(); + //@JvmField + val keys: MutableIterator? /** * A list of markdown extensions - *

- * markdown.extension=HARDWRAPS,AUTOLINKS,FENCED_CODE_BLOCKS,DEFINITIONS + * + * + * `markdown.extension=HARDWRAPS,AUTOLINKS,FENCED_CODE_BLOCKS,DEFINITIONS` * * @return list of markdown extensions as string */ - List getMarkdownExtensions(); + //@JvmField + val markdownExtensions: MutableList? /** * @return file extension to be used for all output files */ - String getOutputExtension(); + //@JvmField + val outputExtension: String? - String getOutputExtensionByDocType(String docType); + fun getOutputExtensionByDocType(docType: String?): String? /** * @return Flag indicating if there should be pagination when rendering index */ - boolean getPaginateIndex(); + //@JvmField + val paginateIndex: Boolean /** * @return How many posts per page on index */ - int getPostsPerPage(); + //@JvmField + val postsPerPage: Int /** * @return URI prefix for content that should be given extension-less output URI's */ - String getPrefixForUriWithoutExtension(); + //@JvmField + val prefixForUriWithoutExtension: String? /** * @return Flag indicating if archive file should be generated */ - boolean getRenderArchive(); + //@JvmField + val renderArchive: Boolean /** * @return Encoding used when rendering files */ - String getRenderEncoding(); + //@JvmField + val renderEncoding: String? /** * @return Output encoding for freemarker url escaping */ - String getOutputEncoding(); + //@JvmField + val outputEncoding: String? /** * @return Flag indicating if error404 file should be generated */ - boolean getRenderError404(); + //@JvmField + val renderError404: Boolean /** * @return Flag indicating if feed file should be generated */ - boolean getRenderFeed(); + //@JvmField + val renderFeed: Boolean /** * @return Flag indicating if index file should be generated */ - boolean getRenderIndex(); + //@JvmField + val renderIndex: Boolean /** * @return Flag indicating if sitemap file should be generated */ - boolean getRenderSiteMap(); + //@JvmField + val renderSiteMap: Boolean /** * @return Flag indicating if tag files should be generated */ - boolean getRenderTags(); + //@JvmField + val renderTags: Boolean /** * @return Flag indicating if tag index file should be generated */ - boolean getRenderTagsIndex(); + //@JvmField + val renderTagsIndex: Boolean /** * @return Flag indicating if the tag value should be sanitized */ - boolean getSanitizeTag(); + //@JvmField + val sanitizeTag: Boolean /** * @return Port used when running Jetty server */ - int getServerPort(); + //@JvmField + val serverPort: Int /** * @return the host url of the site e.g. http://jbake.org */ - String getSiteHost(); + //@JvmField + val siteHost: String? /** - * @return Sitemap template file name. Used only when {@link #getRenderSiteMap()} is set to true + * @return Sitemap template file name. Used only when [.getRenderSiteMap] is set to true */ - String getSiteMapFileName(); + //@JvmField + val siteMapFileName: String? /** * @return the source folder of the project */ - File getSourceFolder(); + //@JvmField + val sourceFolder: File? /** - * @return Tags output path, used only when {@link #getRenderTags()} is true + * @return Tags output path, used only when [.getRenderTags] is true */ - String getTagPathName(); + //@JvmField + val tagPathName: String? /** * @return Encoding to be used for template files */ - String getTemplateEncoding(); + //@JvmField + val templateEncoding: String? - String getTemplateByDocType(String doctype); + fun getTemplateByDocType(doctype: String?): String? - File getTemplateFileByDocType(String doctype); + fun getTemplateFileByDocType(doctype: String?): File? /** * @return the template folder */ - File getTemplateFolder(); + //@JvmField + val templateFolder: File? /** * @return name of folder where template files are looked for */ - String getTemplateFolderName(); + //@JvmField + val templateFolderName: String? /** * @return Locale used for Thymeleaf template rendering */ - String getThymeleafLocale(); + //@JvmField + val thymeleafLocale: String? /** * @return Flag indicating if content matching prefix below should be given extension-less URI's */ - boolean getUriWithoutExtension(); + //@JvmField + val uriWithoutExtension: Boolean /** - * @return Flag indicating if image paths should be prepended with {@link #getSiteHost()} value - only has an effect if - * {@link #getImgPathUpdate()} is set to true + * @return Flag indicating if image paths should be prepended with [.getSiteHost] value - only has an effect if + * [.getImgPathUpdate] is set to true */ - boolean getImgPathPrependHost(); + //@JvmField + val imgPathPrependHost: Boolean /** * @return Flag indicating if image paths in content should be updated with absolute path (using URI value of content file), - * see {@link #getImgPathUpdate()} which allows you to control the absolute path used + * see [.getImgPathUpdate] which allows you to control the absolute path used */ - boolean getImgPathUpdate(); + //@JvmField + val imgPathUpdate: Boolean /** * @return Version of JBake */ - String getVersion(); + //@JvmField + val version: String? /** * Set a property value for the given key @@ -345,39 +395,45 @@ public interface JBakeConfiguration { * @param key the key for the property * @param value the value of the property */ - void setProperty(String key, Object value); + fun setProperty(key: String?, value: Any?) /** * * @param type the documents type - * @return the the thymeleaf render mode ( defaults to {@link DefaultJBakeConfiguration#DEFAULT_TYHMELEAF_TEMPLATE_MODE} ) + * @return the the thymeleaf render mode ( defaults to [DefaultJBakeConfiguration.DEFAULT_TYHMELEAF_TEMPLATE_MODE] ) */ - String getThymeleafModeByType(String type); + fun getThymeleafModeByType(type: String?): String? - String getServerContextPath(); + //@JvmField + val serverContextPath: String? - String getServerHostname(); + //@JvmField + val serverHostname: String? /** * @return Abbreviated hash of latest git commit */ - String getAbbreviatedGitHash(); + //@JvmField + val abbreviatedGitHash: String? /** * @return Locale to set in the JVM */ - String getJvmLocale(); + //@JvmField + val jvmLocale: String? /** * * @return TimeZone to use within Freemarker */ - TimeZone getFreemarkerTimeZone(); + //@JvmField + val freemarkerTimeZone: TimeZone? - Map asHashMap(); + fun asHashMap(): MutableMap? - List getJbakeProperties(); + //@JvmField + val jbakeProperties: MutableList? - void addConfiguration(Properties properties); + fun addConfiguration(properties: Properties?) } diff --git a/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationFactory.kt b/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationFactory.kt index 1ff3fa764..42ea231ae 100644 --- a/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationFactory.kt +++ b/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationFactory.kt @@ -1,24 +1,23 @@ -package org.jbake.app.configuration; +package org.jbake.app.configuration +import org.apache.commons.configuration2.CompositeConfiguration +import org.jbake.app.JBakeException +import java.io.File -import org.apache.commons.configuration2.CompositeConfiguration; -import org.jbake.app.JBakeException; - -import java.io.File; /** - * A {@link JBakeConfiguration} factory + * A [JBakeConfiguration] factory */ -public class JBakeConfigurationFactory { - - private ConfigUtil configUtil; +class JBakeConfigurationFactory { + @JvmField + var configUtil: ConfigUtil - public JBakeConfigurationFactory() { - this.configUtil = new ConfigUtil(); + init { + this.configUtil = ConfigUtil() } /** - * Creates a {@link DefaultJBakeConfiguration} using default.properties and jbake.properties + * Creates a [DefaultJBakeConfiguration] using default.properties and jbake.properties * * @param sourceFolder The source folder of the project * @param destination The destination folder to render and copy files to @@ -26,12 +25,17 @@ public class JBakeConfigurationFactory { * @return A configuration by given parameters * @throws JBakeException if loading the configuration fails */ - public DefaultJBakeConfiguration createDefaultJbakeConfiguration(File sourceFolder, File destination, boolean isClearCache) throws JBakeException { - return createDefaultJbakeConfiguration(sourceFolder, destination, (File) null, isClearCache); + @Throws(JBakeException::class) + fun createDefaultJbakeConfiguration( + sourceFolder: File, + destination: File?, + isClearCache: Boolean + ): DefaultJBakeConfiguration { + return createDefaultJbakeConfiguration(sourceFolder, destination, null as File?, isClearCache) } /** - * Creates a {@link DefaultJBakeConfiguration} + * Creates a [DefaultJBakeConfiguration] * @param sourceFolder The source folder of the project * @param destination The destination folder to render and copy files to * @param propertiesFile The properties file for the project @@ -39,66 +43,85 @@ public class JBakeConfigurationFactory { * @return A configuration by given parameters * @throws JBakeException if loading the configuration fails */ - public DefaultJBakeConfiguration createDefaultJbakeConfiguration(File sourceFolder, File destination, File propertiesFile, boolean isClearCache) throws JBakeException { - DefaultJBakeConfiguration configuration = (DefaultJBakeConfiguration) getConfigUtil().loadConfig(sourceFolder, propertiesFile); - configuration.setDestinationFolder(destination); - configuration.setClearCache(isClearCache); - return configuration; + @Throws(JBakeException::class) + fun createDefaultJbakeConfiguration( + sourceFolder: File, + destination: File?, + propertiesFile: File?, + isClearCache: Boolean + ): DefaultJBakeConfiguration { + val configuration = this.configUtil.loadConfig(sourceFolder, propertiesFile) as DefaultJBakeConfiguration + configuration.setDestinationFolder(destination) + configuration.setClearCache(isClearCache) + return configuration } /** - * Creates a {@link DefaultJBakeConfiguration} + * Creates a [DefaultJBakeConfiguration] * * This is a compatibility factory method * * @param sourceFolder The source folder of the project * @param destination The destination folder to render and copy files to - * @param compositeConfiguration A given {@link CompositeConfiguration} + * @param compositeConfiguration A given [CompositeConfiguration] * @param isClearCache Whether to clear database cache or not * @return A configuration by given parameters - * @deprecated use {@link #createDefaultJbakeConfiguration(File, File, File, boolean)} instead */ - @Deprecated - public DefaultJBakeConfiguration createDefaultJbakeConfiguration(File sourceFolder, File destination, CompositeConfiguration compositeConfiguration, boolean isClearCache) throws JBakeException { - DefaultJBakeConfiguration configuration = new DefaultJBakeConfiguration(sourceFolder, compositeConfiguration); - configuration.setDestinationFolder(destination); - configuration.setClearCache(isClearCache); - return configuration; + @Deprecated("use {@link #createDefaultJbakeConfiguration(File, File, File, boolean)} instead") + @Throws(JBakeException::class) + fun createDefaultJbakeConfiguration( + sourceFolder: File?, + destination: File?, + compositeConfiguration: CompositeConfiguration?, + isClearCache: Boolean + ): DefaultJBakeConfiguration { + val configuration = DefaultJBakeConfiguration(sourceFolder, compositeConfiguration) + configuration.setDestinationFolder(destination) + configuration.setClearCache(isClearCache) + return configuration } /** - * Creates a {@link DefaultJBakeConfiguration} + * Creates a [DefaultJBakeConfiguration] * * This is a compatibility factory method * * @param sourceFolder The source folder of the project * @param destination The destination folder to render and copy files to - * @param compositeConfiguration A given {@link CompositeConfiguration} + * @param compositeConfiguration A given [CompositeConfiguration] * @return A configuration by given parameters - * @deprecated use {@link #createDefaultJbakeConfiguration(File, File, File, boolean)} instead */ - @Deprecated - public DefaultJBakeConfiguration createDefaultJbakeConfiguration(File sourceFolder, File destination, CompositeConfiguration compositeConfiguration) throws JBakeException { - DefaultJBakeConfiguration configuration = new DefaultJBakeConfiguration(sourceFolder, compositeConfiguration); - configuration.setDestinationFolder(destination); - return configuration; + @Deprecated("use {@link #createDefaultJbakeConfiguration(File, File, File, boolean)} instead") + @Throws(JBakeException::class) + fun createDefaultJbakeConfiguration( + sourceFolder: File?, + destination: File?, + compositeConfiguration: CompositeConfiguration? + ): DefaultJBakeConfiguration { + val configuration = DefaultJBakeConfiguration(sourceFolder, compositeConfiguration) + configuration.setDestinationFolder(destination) + return configuration } /** - * Creates a {@link DefaultJBakeConfiguration} + * Creates a [DefaultJBakeConfiguration] * * * @param sourceFolder The source folder of the project - * @param config A {@link CompositeConfiguration} + * @param config A [CompositeConfiguration] * @return A configuration by given parameters */ - @Deprecated - public DefaultJBakeConfiguration createDefaultJbakeConfiguration(File sourceFolder, CompositeConfiguration config) throws JBakeException { - return new DefaultJBakeConfiguration(sourceFolder,config); + @Deprecated("") + @Throws(JBakeException::class) + fun createDefaultJbakeConfiguration( + sourceFolder: File?, + config: CompositeConfiguration? + ): DefaultJBakeConfiguration { + return DefaultJBakeConfiguration(sourceFolder, config) } /** - * Creates a {@link DefaultJBakeConfiguration} with value site.host replaced + * Creates a [DefaultJBakeConfiguration] with value site.host replaced * by http://localhost:[server.port]. * The server.port is read from the project properties file. * @@ -107,15 +130,19 @@ public class JBakeConfigurationFactory { * @param isClearCache Whether to clear database cache or not * @return A configuration by given parameters * @throws JBakeException if loading the configuration fails - * @deprecated use {@link #createJettyJbakeConfiguration(File, File, File, boolean)} instead */ - @Deprecated - public DefaultJBakeConfiguration createJettyJbakeConfiguration(File sourceFolder, File destinationFolder, boolean isClearCache) throws JBakeException { - return createJettyJbakeConfiguration(sourceFolder, destinationFolder, (File)null, isClearCache); + @Deprecated("use {@link #createJettyJbakeConfiguration(File, File, File, boolean)} instead") + @Throws(JBakeException::class) + fun createJettyJbakeConfiguration( + sourceFolder: File, + destinationFolder: File?, + isClearCache: Boolean + ): DefaultJBakeConfiguration { + return createJettyJbakeConfiguration(sourceFolder, destinationFolder, null as File?, isClearCache) } /** - * Creates a {@link DefaultJBakeConfiguration} with value site.host replaced + * Creates a [DefaultJBakeConfiguration] with value site.host replaced * by http://localhost:[server.port]. * The server.port is read from the project properties file. * @@ -126,24 +153,22 @@ public class JBakeConfigurationFactory { * @return A configuration by given parameters * @throws JBakeException if loading the configuration fails */ - public DefaultJBakeConfiguration createJettyJbakeConfiguration(File sourceFolder, File destinationFolder, File propertiesFile, boolean isClearCache) throws JBakeException { - DefaultJBakeConfiguration configuration = (DefaultJBakeConfiguration) getConfigUtil().loadConfig(sourceFolder, propertiesFile); - configuration.setDestinationFolder(destinationFolder); - configuration.setClearCache(isClearCache); - configuration.setSiteHost("http://" + configuration.getServerHostname() + ":" +configuration.getServerPort() + configuration.getServerContextPath()); - return configuration; - } - - public ConfigUtil getConfigUtil() { - return configUtil; - } - - public void setConfigUtil(ConfigUtil configUtil) { - this.configUtil = configUtil; + @Throws(JBakeException::class) + fun createJettyJbakeConfiguration( + sourceFolder: File, + destinationFolder: File?, + propertiesFile: File?, + isClearCache: Boolean + ): DefaultJBakeConfiguration { + val configuration = this.configUtil.loadConfig(sourceFolder, propertiesFile) as DefaultJBakeConfiguration + configuration.setDestinationFolder(destinationFolder) + configuration.setClearCache(isClearCache) + configuration.setSiteHost("http://" + configuration.getServerHostname() + ":" + configuration.getServerPort() + configuration.getServerContextPath()) + return configuration } - public JBakeConfigurationFactory setEncoding(String charset) { - this.configUtil.setEncoding(charset); - return this; + fun setEncoding(charset: String): JBakeConfigurationFactory { + this.configUtil.setEncoding(charset) + return this } } diff --git a/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationInspector.kt b/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationInspector.kt index abe3737cf..e196afea2 100644 --- a/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationInspector.kt +++ b/jbake-core/src/main/java/org/jbake/app/configuration/JBakeConfigurationInspector.kt @@ -1,76 +1,80 @@ -package org.jbake.app.configuration; - -import org.jbake.app.FileUtil; -import org.jbake.app.JBakeException; -import org.jbake.launcher.SystemExit; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; - -import static org.jbake.app.configuration.PropertyList.CONTENT_FOLDER; -import static org.jbake.app.configuration.PropertyList.TEMPLATE_FOLDER; - -public class JBakeConfigurationInspector { - - private static final Logger LOGGER = LoggerFactory.getLogger(JBakeConfigurationInspector.class); - - private final JBakeConfiguration configuration; - - public JBakeConfigurationInspector(JBakeConfiguration configuration) { - this.configuration = configuration; +package org.jbake.app.configuration + +import org.jbake.app.FileUtil +import org.jbake.app.JBakeException +import org.jbake.launcher.SystemExit +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.io.File + +class JBakeConfigurationInspector(private val configuration: JBakeConfiguration) { + @Throws(JBakeException::class) + fun inspect() { + ensureSource() + ensureTemplateFolder() + ensureContentFolder() + ensureDestination() + checkAssetFolder() } - public void inspect() throws JBakeException { - ensureSource(); - ensureTemplateFolder(); - ensureContentFolder(); - ensureDestination(); - checkAssetFolder(); - } - - private void ensureSource() throws JBakeException { - File source = configuration.getSourceFolder(); + @Throws(JBakeException::class) + private fun ensureSource() { + val source = configuration.getSourceFolder() if (!FileUtil.isExistingFolder(source)) { - throw new JBakeException(SystemExit.CONFIGURATION_ERROR, "Error: Source folder must exist: " + source.getAbsolutePath()); + throw JBakeException( + SystemExit.CONFIGURATION_ERROR, + "Error: Source folder must exist: " + source.getAbsolutePath() + ) } if (!configuration.getSourceFolder().canRead()) { - throw new JBakeException(SystemExit.CONFIGURATION_ERROR, "Error: Source folder is not readable: " + source.getAbsolutePath()); + throw JBakeException( + SystemExit.CONFIGURATION_ERROR, + "Error: Source folder is not readable: " + source.getAbsolutePath() + ) } } - private void ensureTemplateFolder() { - File path = configuration.getTemplateFolder(); - checkRequiredFolderExists(TEMPLATE_FOLDER.getKey(), path); + private fun ensureTemplateFolder() { + val path = configuration.getTemplateFolder() + checkRequiredFolderExists(PropertyList.TEMPLATE_FOLDER.getKey(), path) } - private void ensureContentFolder() { - File path = configuration.getContentFolder(); - checkRequiredFolderExists(CONTENT_FOLDER.getKey(), path); + private fun ensureContentFolder() { + val path = configuration.getContentFolder() + checkRequiredFolderExists(PropertyList.CONTENT_FOLDER.getKey(), path) } - private void ensureDestination() { - File destination = configuration.getDestinationFolder(); + private fun ensureDestination() { + val destination = configuration.getDestinationFolder() if (!destination.exists()) { - destination.mkdirs(); + destination.mkdirs() } if (!destination.canWrite()) { - throw new JBakeException(SystemExit.CONFIGURATION_ERROR, "Error: Destination folder is not writable: " + destination.getAbsolutePath()); + throw JBakeException( + SystemExit.CONFIGURATION_ERROR, + "Error: Destination folder is not writable: " + destination.getAbsolutePath() + ) } } - private void checkAssetFolder() { - File path = configuration.getAssetFolder(); + private fun checkAssetFolder() { + val path = configuration.getAssetFolder() if (!path.exists()) { - LOGGER.warn("No asset folder '{}' was found!", path.getAbsolutePath()); + LOGGER.warn("No asset folder '{}' was found!", path.getAbsolutePath()) } } - private void checkRequiredFolderExists(String folderName, File path) { + private fun checkRequiredFolderExists(folderName: String?, path: File) { if (!FileUtil.isExistingFolder(path)) { - throw new JBakeException(SystemExit.CONFIGURATION_ERROR, "Error: Required folder cannot be found! Expected to find [" + folderName + "] at: " + path.getAbsolutePath()); + throw JBakeException( + SystemExit.CONFIGURATION_ERROR, + "Error: Required folder cannot be found! Expected to find [" + folderName + "] at: " + path.getAbsolutePath() + ) } } + companion object { + private val LOGGER: Logger = LoggerFactory.getLogger(JBakeConfigurationInspector::class.java) + } } diff --git a/jbake-core/src/main/java/org/jbake/app/configuration/Property.kt b/jbake-core/src/main/java/org/jbake/app/configuration/Property.kt index 3ea349763..e38a92a3c 100644 --- a/jbake-core/src/main/java/org/jbake/app/configuration/Property.kt +++ b/jbake-core/src/main/java/org/jbake/app/configuration/Property.kt @@ -1,72 +1,42 @@ -package org.jbake.app.configuration; +package org.jbake.app.configuration -import java.util.Objects; +import java.util.* -public class Property implements Comparable { - - private final String key; - private final String description; - private final Group group; - - public Property(String key, String description) { - this(key, description, Group.DEFAULT); - } - - public Property(String key, String description, Group group) { - this.key = key; - this.description = description; - this.group = group; - } - - public String getKey() { - return key; - } - - public String getDescription() { - return description; - } - - public Group getGroup() { - return group; +class Property @JvmOverloads constructor( + @JvmField val key: String?, + @JvmField val description: String?, + @JvmField val group: Group? = Group.DEFAULT +) : Comparable { + override fun toString(): String { + return this.key!! } - @Override - public String toString() { - return getKey(); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; + override fun equals(o: Any?): Boolean { + if (this === o) { + return true } - if (o == null || getClass() != o.getClass()) { - return false; + if (o == null || javaClass != o.javaClass) { + return false } - Property property = (Property) o; - return Objects.equals(key, property.key) && - Objects.equals(description, property.description) && - group == property.group; + val property = o as Property + return key == property.key && + description == property.description && group == property.group } - @Override - public int hashCode() { - return Objects.hash(key, description, group); + override fun hashCode(): Int { + return Objects.hash(key, description, group) } - @Override - public int compareTo(Property other) { - int result = this.getGroup().compareTo(other.getGroup()); + override fun compareTo(other: Property): Int { + var result = this.group!!.compareTo(other.group!!) if (result == 0) { - result = this.getKey().compareTo(other.getKey()); + result = this.key!!.compareTo(other.key!!) } - return result; + return result } - public enum Group { + enum class Group { DEFAULT, CUSTOM } - - } diff --git a/jbake-core/src/main/java/org/jbake/app/configuration/PropertyList.kt b/jbake-core/src/main/java/org/jbake/app/configuration/PropertyList.kt index 99db20081..83d6b70cd 100644 --- a/jbake-core/src/main/java/org/jbake/app/configuration/PropertyList.kt +++ b/jbake-core/src/main/java/org/jbake/app/configuration/PropertyList.kt @@ -1,371 +1,376 @@ -package org.jbake.app.configuration; +package org.jbake.app.configuration -import java.lang.reflect.Field; - -import static org.jbake.app.configuration.Property.Group.CUSTOM; - -public abstract class PropertyList { - - public static final Property ARCHIVE_FILE = new Property( +object PropertyList { + @JvmField + val ARCHIVE_FILE: Property = Property( "archive.file", "Output filename for archive file" - ); + ) - public static final Property ASCIIDOCTOR_ATTRIBUTES = new Property( + @JvmField + val ASCIIDOCTOR_ATTRIBUTES: Property = Property( "asciidoctor.attributes", "attributes to be set when processing input" - ); + ) - public static final Property ASCIIDOCTOR_ATTRIBUTES_EXPORT = new Property( + val ASCIIDOCTOR_ATTRIBUTES_EXPORT: Property = Property( "asciidoctor.attributes.export", "Prefix to be used when exporting JBake properties to Asciidoctor" - ); + ) - public static final Property ASCIIDOCTOR_ATTRIBUTES_EXPORT_PREFIX = new Property( + val ASCIIDOCTOR_ATTRIBUTES_EXPORT_PREFIX: Property = Property( "asciidoctor.attributes.export.prefix", "prefix that should be used when JBake config options are exported" - ); + ) - public static final Property ASCIIDOCTOR_OPTION = new Property( + val ASCIIDOCTOR_OPTION: Property = Property( "asciidoctor.option", "default asciidoctor options" - ); + ) - public static final Property ASSET_FOLDER = new Property( + @JvmField + val ASSET_FOLDER: Property = Property( "asset.folder", "folder that contains all asset files" - ); + ) - public static final Property ASSET_IGNORE_HIDDEN = new Property( + val ASSET_IGNORE_HIDDEN: Property = Property( "asset.ignore", "Flag indicating if hidden asset resources should be ignored" - ); + ) - public static final Property BUILD_TIMESTAMP = new Property( + val BUILD_TIMESTAMP: Property = Property( "build.timestamp", - "timestamp jbake was build"); + "timestamp jbake was build" + ) - public static final Property CLEAR_CACHE = new Property( + val CLEAR_CACHE: Property = Property( "db.clear.cache", "clear database cache" - ); + ) - public static final Property CONTENT_FOLDER = new Property( + val CONTENT_FOLDER: Property = Property( "content.folder", "folder that contains all content files" - ); + ) - public static final Property DATA_FOLDER = new Property( + val DATA_FOLDER: Property = Property( "data.folder", "folder that contains all data files" - ); + ) - public static final Property DATA_FILE_DOCTYPE = new Property( + @JvmField + val DATA_FILE_DOCTYPE: Property = Property( "data.file.docType", "document type to use for data files" - ); + ) - public static final Property DATE_FORMAT = new Property( + val DATE_FORMAT: Property = Property( "date.format", "default date format used in content files" - ); + ) - public static final Property DB_STORE = new Property( + val DB_STORE: Property = Property( "db.store", "database store (plocal, memory)" - ); + ) - public static final Property DB_PATH = new Property( + val DB_PATH: Property = Property( "db.path", "database path for persistent storage" - ); + ) - public static final Property DEFAULT_STATUS = new Property( + val DEFAULT_STATUS: Property = Property( "default.status", "default document status" - ); + ) - public static final Property DEFAULT_TYPE = new Property( + val DEFAULT_TYPE: Property = Property( "default.type", "default document type" - ); + ) - public static final Property DESTINATION_FOLDER = new Property( + @JvmField + val DESTINATION_FOLDER: Property = Property( "destination.folder", "path to destination folder by default" - ); + ) - public static final Property DRAFT_SUFFIX = new Property( + val DRAFT_SUFFIX: Property = Property( "draft.suffix", "draft content suffix" - ); + ) - public static final Property ERROR404_FILE = new Property( + val ERROR404_FILE: Property = Property( "error404.file", "filename to use for 404 error" - ); + ) - public static final Property FEED_FILE = new Property( + val FEED_FILE: Property = Property( "feed.file", "filename to use for feed" - ); + ) - public static final Property FREEMARKER_TIMEZONE = new Property( + val FREEMARKER_TIMEZONE: Property = Property( "freemarker.timezone", "TimeZone to use within Freemarker" - ); + ) - public static final Property GIT_HASH = new Property( + val GIT_HASH: Property = Property( "git.hash", "abbreviated git hash" - ); + ) - public static final Property HEADER_SEPARATOR = new Property( + val HEADER_SEPARATOR: Property = Property( "header.separator", "String used to separate the header from the body" - ); + ) - public static final Property IGNORE_FILE = new Property( + @JvmField + val IGNORE_FILE: Property = Property( "ignore.file", "file used to ignore a directory" - ); + ) - public static final Property IMG_PATH_UPDATE = new Property( + val IMG_PATH_UPDATE: Property = Property( "img.path.update", "update image path?" - ); + ) - public static final Property IMG_PATH_PREPEND_HOST = new Property( + val IMG_PATH_PREPEND_HOST: Property = Property( "img.path.prepend.host", "Prepend site.host to image paths" - ); + ) - public static final Property INDEX_FILE = new Property( + val INDEX_FILE: Property = Property( "index.file", "filename to use for index file" - ); + ) - public static final Property JVM_LOCALE = new Property( + @JvmField + val JVM_LOCALE: Property = Property( "jvm.locale", "locale for the jvm" - ); + ) - public static final Property MARKDOWN_EXTENSIONS = new Property( + val MARKDOWN_EXTENSIONS: Property = Property( "markdown.extensions", "comma delimited default markdown extensions; for available extensions: http://www.decodified.com/pegdown/api/org/pegdown/Extensions.html" - ); + ) - public static final Property OUTPUT_ENCODING = new Property( + val OUTPUT_ENCODING: Property = Property( "freemarker.outputencoding", "default output_encoding setting for freemarker" - ); + ) - public static final Property OUTPUT_EXTENSION = new Property( + @JvmField + val OUTPUT_EXTENSION: Property = Property( "output.extension", "file extension for output content files" - ); + ) - public static final Property PAGINATE_INDEX = new Property( + @JvmField + val PAGINATE_INDEX: Property = Property( "index.paginate", "paginate index?" - ); + ) - public static final Property POSTS_PER_PAGE = new Property( + val POSTS_PER_PAGE: Property = Property( "index.posts_per_page", "number of post per page for pagination" - ); + ) - public static final Property RENDER_ARCHIVE = new Property( + val RENDER_ARCHIVE: Property = Property( "render.archive", "render archive file?" - ); + ) - public static final Property RENDER_ENCODING = new Property( + val RENDER_ENCODING: Property = Property( "render.encoding", "character encoding MIME name used in templates. use one of http://www.iana.org/assignments/character-sets/character-sets.xhtml" - ); + ) - public static final Property RENDER_ERROR404 = new Property( + val RENDER_ERROR404: Property = Property( "render.error404", "render 404 page?" - ); + ) - public static final Property RENDER_FEED = new Property( + val RENDER_FEED: Property = Property( "render.feed", "render feed file?" - ); + ) - public static final Property RENDER_INDEX = new Property( + val RENDER_INDEX: Property = Property( "render.index", "render index file?" - ); + ) - public static final Property RENDER_SITEMAP = new Property( + val RENDER_SITEMAP: Property = Property( "render.sitemap", "render sitemap.xml file?" - ); + ) - public static final Property RENDER_TAGS = new Property( + val RENDER_TAGS: Property = Property( "render.tags", "render tag files?" - ); + ) - public static final Property RENDER_TAGS_INDEX = new Property( + val RENDER_TAGS_INDEX: Property = Property( "render.tagsindex", "render tag index file?" - ); + ) - public static final Property SERVER_PORT = new Property( + val SERVER_PORT: Property = Property( "server.port", "default server port" - ); + ) - public static final Property SERVER_HOSTNAME = new Property( + val SERVER_HOSTNAME: Property = Property( "server.hostname", "default server hostname" - ); + ) - public static final Property SERVER_CONTEXT_PATH = new Property( + val SERVER_CONTEXT_PATH: Property = Property( "server.contextPath", "default server context path" - ); + ) - public static final Property SITE_HOST = new Property( + val SITE_HOST: Property = Property( "site.host", "site host" - ); + ) - public static final Property SITEMAP_FILE = new Property( + val SITEMAP_FILE: Property = Property( "sitemap.file", "filename to use for sitemap file" - ); + ) - public static final Property TAG_SANITIZE = new Property( + @JvmField + val TAG_SANITIZE: Property = Property( "tag.sanitize", "sanitize tag value before it is used as filename (i.e. replace spaces with hyphens)" - ); + ) - public static final Property TAG_PATH = new Property( + @JvmField + val TAG_PATH: Property = Property( "tag.path", "folder name to use for tag files" - ); + ) - public static final Property TEMPLATE_FOLDER = new Property( + @JvmField + val TEMPLATE_FOLDER: Property = Property( "template.folder", "folder that contains all template files" - ); + ) - public static final Property TEMPLATE_ENCODING = new Property( + val TEMPLATE_ENCODING: Property = Property( "template.encoding", "character encoding MIME name used in templates. use one of http://www.iana.org/assignments/character-sets/character-sets.xhtml" - ); + ) - public static final Property TEMPLATE_MASTERINDEX_FILE = new Property( + val TEMPLATE_MASTERINDEX_FILE: Property = Property( "template.masterindex.file", "filename of masterindex template file" - ); + ) - public static final Property TEMPLATE_FEED_FILE = new Property( + val TEMPLATE_FEED_FILE: Property = Property( "template.feed.file", "filename of feed template file" - ); + ) - public static final Property TEMPLATE_ARCHIVE_FILE = new Property( + val TEMPLATE_ARCHIVE_FILE: Property = Property( "template.archive.file", "filename of archive template file" - ); + ) - public static final Property TEMPLATE_TAG_FILE = new Property( + val TEMPLATE_TAG_FILE: Property = Property( "template.tag.file", "filename of tag template file" - ); + ) - public static final Property TEMPLATE_TAGSINDEX_FILE = new Property( + val TEMPLATE_TAGSINDEX_FILE: Property = Property( "template.tagsindex.file", "filename of tag index template file" - ); + ) - public static final Property TEMPLATE_SITEMAP_FILE = new Property( + val TEMPLATE_SITEMAP_FILE: Property = Property( "template.sitemap.file", "filename of sitemap template file" - ); + ) - public static final Property TEMPLATE_POST_FILE = new Property( + val TEMPLATE_POST_FILE: Property = Property( "template.post.file", "filename of post template file" - ); + ) - public static final Property TEMPLATE_PAGE_FILE = new Property( + val TEMPLATE_PAGE_FILE: Property = Property( "template.page.file", "filename of page template file" - ); + ) - public static final Property EXAMPLE_PROJECT_FREEMARKER = new Property( + val EXAMPLE_PROJECT_FREEMARKER: Property = Property( "example.project.freemarker", "zip file containing example project structure using freemarker templates" - ); + ) - public static final Property EXAMPLE_PROJECT_GROOVY = new Property( + val EXAMPLE_PROJECT_GROOVY: Property = Property( "example.project.groovy", "zip file containing example project structure using groovy templates" - ); + ) - public static final Property EXAMPLE_PROJECT_GROOVY_MTE = new Property( + val EXAMPLE_PROJECT_GROOVY_MTE: Property = Property( "example.project.groovy-mte", "zip file containing example project structure using groovy markup templates" - ); + ) - public static final Property EXAMPLE_PROJECT_THYMELEAF = new Property( + val EXAMPLE_PROJECT_THYMELEAF: Property = Property( "example.project.thymeleaf", "zip file containing example project structure using thymeleaf templates" - ); + ) - public static final Property EXAMPLE_PROJECT_JADE = new Property( + val EXAMPLE_PROJECT_JADE: Property = Property( "example.project.jade", "zip file containing example project structure using jade templates" - ); + ) - public static final Property MARKDOWN_MAX_PARSINGTIME = new Property( + val MARKDOWN_MAX_PARSINGTIME: Property = Property( "markdown.maxParsingTimeInMillis", "millis to parse single markdown page. See PegDown Parse configuration for details" - ); + ) - public static final Property THYMELEAF_LOCALE = new Property( + val THYMELEAF_LOCALE: Property = Property( "thymeleaf.locale", "default thymeleafe locale" - ); + ) - public static final Property URI_NO_EXTENSION = new Property( + val URI_NO_EXTENSION: Property = Property( "uri.noExtension", "enable extension-less URI option?" - ); + ) - public static final Property URI_NO_EXTENSION_PREFIX = new Property( + val URI_NO_EXTENSION_PREFIX: Property = Property( "uri.noExtension.prefix", "Set to a prefix path (starting with a slash) for which to generate extension-less URI's (i.e. a folder with index.html in)" - ); + ) - public static final Property VERSION = new Property( + val VERSION: Property = Property( "version", "jbake application version" - ); - - private PropertyList() { - } - - public static Property getPropertyByKey(String key) { + ) - for (Field field : PropertyList.class.getFields()) { + @JvmStatic + fun getPropertyByKey(key: String?): Property { + for (field in PropertyList::class.java.getFields()) { try { - Property property = (Property) field.get(null); + val property = field.get(null) as Property - if (property.getKey().equals(key)) { - return property; + if (property.getKey() == key) { + return property } - } catch (IllegalAccessException e) { - return new Property(key, "", CUSTOM); + } catch (e: IllegalAccessException) { + return Property(key, "", Property.Group.CUSTOM) } } - return new Property(key, "", CUSTOM); + return Property(key, "", Property.Group.CUSTOM) } } diff --git a/jbake-core/src/main/java/org/jbake/launcher/BakeWatcher.kt b/jbake-core/src/main/java/org/jbake/launcher/BakeWatcher.kt index 3512cb83d..23804fd58 100644 --- a/jbake-core/src/main/java/org/jbake/launcher/BakeWatcher.kt +++ b/jbake-core/src/main/java/org/jbake/launcher/BakeWatcher.kt @@ -1,37 +1,37 @@ -package org.jbake.launcher; +package org.jbake.launcher -import org.apache.commons.configuration2.CompositeConfiguration; -import org.apache.commons.vfs2.FileObject; -import org.apache.commons.vfs2.FileSystemException; -import org.apache.commons.vfs2.FileSystemManager; -import org.apache.commons.vfs2.VFS; -import org.apache.commons.vfs2.impl.DefaultFileMonitor; -import org.jbake.app.configuration.JBakeConfiguration; -import org.jbake.app.configuration.JBakeConfigurationFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.configuration2.CompositeConfiguration +import org.apache.commons.vfs2.FileSystemException +import org.apache.commons.vfs2.VFS +import org.apache.commons.vfs2.impl.DefaultFileMonitor +import org.jbake.app.configuration.JBakeConfiguration +import org.jbake.app.configuration.JBakeConfigurationFactory +import org.slf4j.Logger +import org.slf4j.LoggerFactory /** * Delegate responsible for watching the file system for changes. * * @author jmcgarr@gmail.com */ -public class BakeWatcher { - - private final Logger logger = LoggerFactory.getLogger(BakeWatcher.class); +class BakeWatcher { + private val logger: Logger = LoggerFactory.getLogger(BakeWatcher::class.java) /** * Starts watching the file system for changes to trigger a bake. * - * @deprecated use {@link BakeWatcher#start(JBakeConfiguration)} instead - * * @param res Commandline options * @param config Configuration settings */ - @Deprecated - public void start(final LaunchOptions res, CompositeConfiguration config) { - JBakeConfiguration configuration = new JBakeConfigurationFactory().createDefaultJbakeConfiguration(res.getSource(), config); - start(configuration); + @Deprecated( + """use {@link BakeWatcher#start(JBakeConfiguration)} instead + + """ + ) + fun start(res: LaunchOptions, config: CompositeConfiguration?) { + val configuration: JBakeConfiguration = + JBakeConfigurationFactory().createDefaultJbakeConfiguration(res.getSource(), config) + start(configuration) } /** @@ -39,24 +39,27 @@ public class BakeWatcher { * * @param config JBakeConfiguration settings */ - public void start(JBakeConfiguration config) { + fun start(config: JBakeConfiguration) { try { - FileSystemManager fsMan = VFS.getManager(); - FileObject listenPath = fsMan.resolveFile(config.getContentFolder().toURI()); - FileObject templateListenPath = fsMan.resolveFile(config.getTemplateFolder().toURI()); - FileObject assetPath = fsMan.resolveFile(config.getAssetFolder().toURI()); - FileObject dataPath = fsMan.resolveFile(config.getDataFolder().toURI()); + val fsMan = VFS.getManager() + val listenPath = fsMan.resolveFile(config.contentFolder!!.toURI()) + val templateListenPath = fsMan.resolveFile(config.templateFolder!!.toURI()) + val assetPath = fsMan.resolveFile(config.assetFolder!!.toURI()) + val dataPath = fsMan.resolveFile(config.dataFolder!!.toURI()) - logger.info("Watching for (content, data, template, asset) changes in [{}]", config.getSourceFolder().getPath()); - DefaultFileMonitor monitor = new DefaultFileMonitor(new CustomFSChangeListener(config)); - monitor.setRecursive(true); - monitor.addFile(listenPath); - monitor.addFile(templateListenPath); - monitor.addFile(assetPath); - monitor.addFile(dataPath); - monitor.start(); - } catch (FileSystemException e) { - logger.error("Problems watching filesystem changes", e); + logger.info( + "Watching for (content, data, template, asset) changes in [{}]", + config.sourceFolder!!.getPath() + ) + val monitor = DefaultFileMonitor(CustomFSChangeListener(config)) + monitor.setRecursive(true) + monitor.addFile(listenPath) + monitor.addFile(templateListenPath) + monitor.addFile(assetPath) + monitor.addFile(dataPath) + monitor.start() + } catch (e: FileSystemException) { + logger.error("Problems watching filesystem changes", e) } } } diff --git a/jbake-core/src/main/java/org/jbake/launcher/Baker.kt b/jbake-core/src/main/java/org/jbake/launcher/Baker.kt index 536625c98..b80b3a788 100644 --- a/jbake-core/src/main/java/org/jbake/launcher/Baker.kt +++ b/jbake-core/src/main/java/org/jbake/launcher/Baker.kt @@ -1,47 +1,48 @@ -package org.jbake.launcher; +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 java.text.MessageFormat; -import java.util.List; +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 java.text.MessageFormat /** * Delegate class responsible for launching a Bake. * * @author jmcgarr@gmail.com */ -public class Baker { - +class Baker { /** * @param options The given cli options * @param config The project configuration - * @deprecated use {@link Baker#bake(JBakeConfiguration)} instead */ - @Deprecated - public void bake(final LaunchOptions options, final CompositeConfiguration config) { - JBakeConfiguration configuration = new JBakeConfigurationFactory().createDefaultJbakeConfiguration(options.getSource(), options.getDestination(), config, options.isClearCache()); - bake(configuration); + @Deprecated("use {@link Baker#bake(JBakeConfiguration)} instead") + fun bake(options: LaunchOptions, config: CompositeConfiguration?) { + val configuration: JBakeConfiguration = JBakeConfigurationFactory().createDefaultJbakeConfiguration( + options.getSource(), + options.getDestination(), + config, + options.isClearCache() + ) + bake(configuration) } - public void bake(final JBakeConfiguration config) { - final Oven oven = new Oven(config); - oven.bake(); + fun bake(config: JBakeConfiguration?) { + val oven = Oven(config) + oven.bake() - final List errors = oven.getErrors(); + val errors = oven.getErrors() if (!errors.isEmpty()) { - final StringBuilder msg = new StringBuilder(); + val msg = StringBuilder() // TODO: decide, if we want the all errors here - msg.append( MessageFormat.format("JBake failed with {0} errors:\n", errors.size())); - int errNr = 1; - for (final Throwable error : errors) { - msg.append(MessageFormat.format("{0}. {1}\n", errNr, error.getMessage())); - ++errNr; + msg.append(MessageFormat.format("JBake failed with {0} errors:\n", errors.size)) + var errNr = 1 + for (error in errors) { + msg.append(MessageFormat.format("{0}. {1}\n", errNr, error.message)) + ++errNr } - throw new JBakeException(SystemExit.ERROR ,msg.toString(), errors.get(0)); + throw JBakeException(SystemExit.ERROR, msg.toString(), errors.get(0)) } } } diff --git a/jbake-core/src/main/java/org/jbake/launcher/CustomFSChangeListener.kt b/jbake-core/src/main/java/org/jbake/launcher/CustomFSChangeListener.kt index 3c6006177..26c66d482 100644 --- a/jbake-core/src/main/java/org/jbake/launcher/CustomFSChangeListener.kt +++ b/jbake-core/src/main/java/org/jbake/launcher/CustomFSChangeListener.kt @@ -1,45 +1,39 @@ -package org.jbake.launcher; - -import org.apache.commons.vfs2.FileChangeEvent; -import org.apache.commons.vfs2.FileListener; -import org.apache.commons.vfs2.FileObject; -import org.jbake.app.Oven; -import org.jbake.app.configuration.JBakeConfiguration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; - -public class CustomFSChangeListener implements FileListener { - - private static final Logger LOGGER = LoggerFactory.getLogger(CustomFSChangeListener.class); - - private final JBakeConfiguration config; - - public CustomFSChangeListener(JBakeConfiguration config) { - this.config = config; +package org.jbake.launcher + +import org.apache.commons.vfs2.FileChangeEvent +import org.apache.commons.vfs2.FileListener +import org.apache.commons.vfs2.FileObject +import org.jbake.app.Oven +import org.jbake.app.configuration.JBakeConfiguration +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.io.File + +class CustomFSChangeListener(private val config: JBakeConfiguration?) : FileListener { + @Throws(Exception::class) + override fun fileCreated(event: FileChangeEvent) { + LOGGER.info("File created event detected: {}", event.getFileObject().getURL()) + exec(event.getFileObject()) } - @Override - public void fileCreated(FileChangeEvent event) throws Exception { - LOGGER.info("File created event detected: {}", event.getFileObject().getURL()); - exec(event.getFileObject()); + @Throws(Exception::class) + override fun fileDeleted(event: FileChangeEvent) { + LOGGER.info("File deleted event detected: {}", event.getFileObject().getURL()) + exec(event.getFileObject()) } - @Override - public void fileDeleted(FileChangeEvent event) throws Exception { - LOGGER.info("File deleted event detected: {}", event.getFileObject().getURL()); - exec(event.getFileObject()); + @Throws(Exception::class) + override fun fileChanged(event: FileChangeEvent) { + LOGGER.info("File changed event detected: {}", event.getFileObject().getURL()) + exec(event.getFileObject()) } - @Override - public void fileChanged(FileChangeEvent event) throws Exception { - LOGGER.info("File changed event detected: {}", event.getFileObject().getURL()); - exec(event.getFileObject()); + private fun exec(file: FileObject) { + val oven = Oven(config) + oven.bake(File(file.getName().getPath())) } - private void exec(FileObject file) { - final Oven oven = new Oven(config); - oven.bake(new File(file.getName().getPath())); + companion object { + private val LOGGER: Logger = LoggerFactory.getLogger(CustomFSChangeListener::class.java) } } diff --git a/jbake-core/src/main/java/org/jbake/launcher/Init.kt b/jbake-core/src/main/java/org/jbake/launcher/Init.kt index ae1dd1bca..2f3d223ab 100644 --- a/jbake-core/src/main/java/org/jbake/launcher/Init.kt +++ b/jbake-core/src/main/java/org/jbake/launcher/Init.kt @@ -1,35 +1,23 @@ -package org.jbake.launcher; +package org.jbake.launcher -import org.apache.commons.configuration2.CompositeConfiguration; -import org.jbake.app.ZipUtil; -import org.jbake.app.configuration.DefaultJBakeConfiguration; -import org.jbake.app.configuration.JBakeConfiguration; - -import java.io.File; -import java.io.FileInputStream; +import org.apache.commons.configuration2.CompositeConfiguration +import org.jbake.app.ZipUtil +import org.jbake.app.configuration.DefaultJBakeConfiguration +import org.jbake.app.configuration.JBakeConfiguration +import java.io.File +import java.io.FileInputStream /** * Initialises sample folder structure with pre-defined template * - * @author Jonathan Bullock jonbullock@gmail.com - * + * @author Jonathan Bullock [jonbullock@gmail.com](mailto:jonbullock@gmail.com) */ -public class Init { - - private final JBakeConfiguration config; - +class Init(private val config: JBakeConfiguration) { /** * @param config The project configuration - * @deprecated use {@link Init#Init(JBakeConfiguration)} instead */ - @Deprecated - public Init(CompositeConfiguration config) { - this(new DefaultJBakeConfiguration(config)); - } - - public Init(JBakeConfiguration config) { - this.config = config; - } + @Deprecated("use {@link Init#Init(JBakeConfiguration)} instead") + constructor(config: CompositeConfiguration) : this(DefaultJBakeConfiguration(config)) /** * Performs checks on output folder before extracting template file @@ -39,41 +27,46 @@ public class Init { * @param templateType Type of the template to be used * @throws Exception if required folder structure can't be achieved without content overwriting */ - public void run(File outputFolder, File templateLocationFolder, String templateType) throws Exception { + @Throws(Exception::class) + fun run(outputFolder: File, templateLocationFolder: File?, templateType: String?) { if (!outputFolder.canWrite()) { - throw new Exception("Output folder is not writeable!"); + throw Exception("Output folder is not writeable!") } - File[] contents = outputFolder.listFiles(); - boolean safe = true; + val contents = outputFolder.listFiles() + var safe = true if (contents != null) { - for (File content : contents) { + for (content in contents) { if (content.isDirectory()) { - if (content.getName().equalsIgnoreCase(config.getTemplateFolderName())) { - safe = false; + if (content.getName().equals(config.templateFolderName, ignoreCase = true)) { + safe = false } - if (content.getName().equalsIgnoreCase(config.getContentFolderName())) { - safe = false; + if (content.getName().equals(config.contentFolderName, ignoreCase = true)) { + safe = false } - if (content.getName().equalsIgnoreCase(config.getAssetFolderName())) { - safe = false; + if (content.getName().equals(config.assetFolderName, ignoreCase = true)) { + safe = false } } } } if (!safe) { - throw new Exception(String.format("Output folder '%s' already contains structure!", - outputFolder.getAbsolutePath())); + throw Exception( + String.format( + "Output folder '%s' already contains structure!", + outputFolder.getAbsolutePath() + ) + ) } if (config.getExampleProjectByType(templateType) != null) { - File templateFile = new File(templateLocationFolder, config.getExampleProjectByType(templateType)); + val templateFile = File(templateLocationFolder, config.getExampleProjectByType(templateType)) if (!templateFile.exists()) { - throw new Exception("Cannot find example project file: " + templateFile.getPath()); + throw Exception("Cannot find example project file: " + templateFile.getPath()) } - ZipUtil.extract(new FileInputStream(templateFile), outputFolder); + ZipUtil.extract(FileInputStream(templateFile), outputFolder) } else { - throw new Exception("Cannot locate example project type: " + templateType); + throw Exception("Cannot locate example project type: " + templateType) } } } diff --git a/jbake-core/src/main/java/org/jbake/launcher/JettyServer.kt b/jbake-core/src/main/java/org/jbake/launcher/JettyServer.kt index cff105932..f4191ccf5 100644 --- a/jbake-core/src/main/java/org/jbake/launcher/JettyServer.kt +++ b/jbake-core/src/main/java/org/jbake/launcher/JettyServer.kt @@ -1,39 +1,35 @@ -package org.jbake.launcher; - -import org.eclipse.jetty.server.Handler; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.server.handler.ContextHandler; -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.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.Closeable; -import java.io.IOException; - +package org.jbake.launcher + +import org.eclipse.jetty.server.Handler +import org.eclipse.jetty.server.Server +import org.eclipse.jetty.server.ServerConnector +import org.eclipse.jetty.server.handler.ContextHandler +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.slf4j.Logger +import org.slf4j.LoggerFactory +import java.io.Closeable +import java.io.IOException /** * Provides Jetty server related functions * - * @author Jonathan Bullock jonbullock@gmail.com + * @author Jonathan Bullock [jonbullock@gmail.com](mailto:jonbullock@gmail.com) */ -public class JettyServer implements Closeable { - private static final Logger LOGGER = LoggerFactory.getLogger(JettyServer.class); +class JettyServer : Closeable { + private var server: Server? = null - private Server server; - - @Deprecated - public void run(String resourceBase, String port) { - LOGGER.warn("DEPRECATED. This method will be removed in the next major release. Use run(String resourceBase, JBakeConfiguration config) instead."); - run(resourceBase, "/", "localhost", Integer.parseInt(port)); + @Deprecated("") + fun run(resourceBase: String?, port: String) { + LOGGER.warn("DEPRECATED. This method will be removed in the next major release. Use run(String resourceBase, JBakeConfiguration config) instead.") + run(resourceBase, "/", "localhost", port.toInt()) } - public void run(String resourceBase, JBakeConfiguration configuration) { - run(resourceBase, configuration.getServerContextPath(), configuration.getServerHostname(), configuration.getServerPort()); + fun run(resourceBase: String?, configuration: JBakeConfiguration) { + run(resourceBase, configuration.serverContextPath, configuration.serverHostname, configuration.serverPort) } /** @@ -42,51 +38,59 @@ public class JettyServer implements Closeable { * @param resourceBase Base directory for resources to be served * @param port Required server port */ - private void run(String resourceBase, String contextPath, String hostname, int port) { + private fun run(resourceBase: String?, contextPath: String?, hostname: String?, port: Int) { try { - server = new Server(); - ServerConnector connector = new ServerConnector(server); - connector.setHost(hostname); - 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); - - ContextHandler contextHandler = new ContextHandler(); - contextHandler.setContextPath(contextPath); - contextHandler.setHandler(resource_handler); - - HandlerList handlers = new HandlerList(); - - handlers.setHandlers(new Handler[]{contextHandler, new DefaultHandler()}); - server.setHandler(handlers); - - LOGGER.info("Serving out contents of: [{}] on http://{}:{}{}", resourceBase, hostname, port, contextHandler.getContextPath()); - LOGGER.info("(To stop server hit CTRL-C)"); - - server.start(); - server.join(); - } catch (Exception e) { - throw new JBakeException(SystemExit.SERVER_ERROR, "unable to start the server", e); + server = Server() + val connector = ServerConnector(server) + connector.setHost(hostname) + connector.setPort(port) + server!!.addConnector(connector) + + val resource_handler = ResourceHandler() + resource_handler.setDirectoriesListed(true) + resource_handler.setWelcomeFiles(arrayOf("index", "index.html")) + resource_handler.setResourceBase(resourceBase) + + val contextHandler = ContextHandler() + contextHandler.setContextPath(contextPath) + contextHandler.setHandler(resource_handler) + + val handlers = HandlerList() + + handlers.setHandlers(arrayOf(contextHandler, DefaultHandler())) + server!!.setHandler(handlers) + + LOGGER.info( + "Serving out contents of: [{}] on http://{}:{}{}", + resourceBase, + hostname, + port, + contextHandler.getContextPath() + ) + LOGGER.info("(To stop server hit CTRL-C)") + + server!!.start() + server!!.join() + } catch (e: Exception) { + throw JBakeException(SystemExit.SERVER_ERROR, "unable to start the server", e) } } - public boolean isStarted() { - return server != null && server.isStarted(); - } + val isStarted: Boolean + get() = server != null && server!!.isStarted() - @Override - public void close() throws IOException { - if (server.isRunning()) { + @Throws(IOException::class) + override fun close() { + if (server!!.isRunning()) { try { - server.stop(); - } catch (Exception e) { - LOGGER.error("unable to stop server"); + server!!.stop() + } catch (e: Exception) { + LOGGER.error("unable to stop server") } } + } + companion object { + private val LOGGER: Logger = LoggerFactory.getLogger(JettyServer::class.java) } } diff --git a/jbake-core/src/main/java/org/jbake/launcher/LaunchOptions.kt b/jbake-core/src/main/java/org/jbake/launcher/LaunchOptions.kt index c4bd9cfc2..51754391a 100644 --- a/jbake-core/src/main/java/org/jbake/launcher/LaunchOptions.kt +++ b/jbake-core/src/main/java/org/jbake/launcher/LaunchOptions.kt @@ -1,123 +1,113 @@ -package org.jbake.launcher; +package org.jbake.launcher -import org.jbake.app.configuration.ConfigUtil; -import picocli.CommandLine.ArgGroup; -import picocli.CommandLine.Command; -import picocli.CommandLine.Option; -import picocli.CommandLine.Parameters; +import org.jbake.app.configuration.ConfigUtil +import picocli.CommandLine +import java.io.File -import java.io.File; - -@Command( - description = "JBake is a Java based, open source, static site/blog generator for developers & designers", +@CommandLine.Command( + description = ["JBake is a Java based, open source, static site/blog generator for developers & designers"], name = "jbake", usageHelpAutoWidth = true ) -public class LaunchOptions { - @Parameters(index = "0", description = "source folder of site content (with templates and assets), if not supplied will default to current directory", arity = "0..1") - private String source; - - @Parameters(index = "1", description = "destination folder for output, if not supplied will default to a folder called \"output\" in the current directory", arity = "0..1") - private String destination; - - @Option(names = {"-b", "--bake"}, description = "performs a bake") - private boolean bake; - - @ArgGroup(exclusive = false, heading = "%n%nJBake initialization%n%n") - private InitOptions initGroup; - - @Option(names = {"-s", "--server"}, description = "runs HTTP server to serve out baked site, if no is supplied will default to a folder called \"output\" in the current directory") - private boolean runServer; - - @Option(names = {"-h", "--help"}, description = "prints this message", usageHelp = true) - private boolean helpRequested; - - @Option(names = {"--reset"}, description = "clears the local cache, enforcing rendering from scratch") - private boolean clearCache; - - @Option(names = {"-c", "--config"}, description = "use specified file for configuration (defaults to " + ConfigUtil.CONFIG_FILE +" in the source folder if not supplied)") - private String config; - - @Option(names = {"--prop-encoding"}, description = "use given encoding to load properties file. default: utf-8") - private String propertiesEncoding = "utf-8"; - - @Option(names = {"-ls", "--list-settings"}, description = "list configuration settings") - private boolean listConfig; - - public String getTemplate() { - return initGroup.template; - } - - public File getSource() { - if (source != null) { - return new File(source); +class LaunchOptions { + @CommandLine.Parameters( + index = "0", + description = ["source folder of site content (with templates and assets), if not supplied will default to current directory"], + arity = "0..1" + ) + val sourceValue: String? = null + + @CommandLine.Parameters( + index = "1", + description = ["destination folder for output, if not supplied will default to a folder called \"output\" in the current directory"], + arity = "0..1" + ) + val destinationValue: String? = null + + @CommandLine.Option(names = ["-b", "--bake"], description = ["performs a bake"]) + val isBake: Boolean = false + get() = field || (this.sourceValue != null && this.destinationValue != null) + + @CommandLine.ArgGroup(exclusive = false, heading = "%n%nJBake initialization%n%n") + private val initGroup: InitOptions? = null + + @CommandLine.Option( + names = ["-s", "--server"], + description = ["runs HTTP server to serve out baked site, if no is supplied will default to a folder called \"output\" in the current directory"] + ) + val isRunServer: Boolean = false + + @CommandLine.Option(names = ["-h", "--help"], description = ["prints this message"], usageHelp = true) + private val helpRequested = false + + @CommandLine.Option(names = ["--reset"], description = ["clears the local cache, enforcing rendering from scratch"]) + val isClearCache: Boolean = false + + @CommandLine.Option( + names = ["-c", "--config"], + description = ["use specified file for configuration (defaults to " + ConfigUtil.CONFIG_FILE + " in the source folder if not supplied)"] + ) + val configValue: String? = null + + @JvmField + @CommandLine.Option( + names = ["--prop-encoding"], + description = ["use given encoding to load properties file. default: utf-8"] + ) + val propertiesEncoding: String = "utf-8" + + @CommandLine.Option(names = ["-ls", "--list-settings"], description = ["list configuration settings"]) + val isListConfig: Boolean = false + + val template: String? + get() = initGroup.template + + fun getSource(): File { + if (this.sourceValue != null) { + return File(this.sourceValue) } else { - return new File(System.getProperty("user.dir")); + return File(System.getProperty("user.dir")) } } - public String getSourceValue() { - return source; - } - - public File getDestination() { - if (destination != null) { - return new File(destination); + fun getDestination(): File { + if (this.destinationValue != null) { + return File(this.destinationValue) } else { - return new File(getSource(), "output"); + return File(getSource(), "output") } } - public String getDestinationValue() { - return destination; - } - - public File getConfig() { - if (config != null) { - return new File(config); + fun getConfig(): File { + if (this.configValue != null) { + return File(this.configValue) } else { - return new File(getSource(), "jbake.properties"); + return File(getSource(), "jbake.properties") } } - public String getConfigValue() { - return config; - } - - public boolean isHelpNeeded() { - return helpRequested || !(isListConfig() || isBake() || isRunServer() || isInit() || source != null || destination != null); - } - - public boolean isRunServer() { - return runServer; - } - - public boolean isInit() { - return (initGroup != null && initGroup.init); - } - - public boolean isClearCache() { - return clearCache; - } - - public boolean isBake() { - return bake || (source != null && destination != null); - } - - public boolean isListConfig() { - return listConfig; - } - - public String getPropertiesEncoding() { - return propertiesEncoding; - } - - static class InitOptions { - - @Option(names = {"-i", "--init"}, paramLabel = "", description = "initialises required folder structure with default templates (defaults to current directory if is not supplied)", required = true) - private boolean init; - - @Option(names = {"-t", "--template"}, defaultValue = "freemarker", fallbackValue = "freemarker", description = "use specified template engine for default templates (uses Freemarker if